Getting started
Zuke is a code-first, strongly-typed build automation system for Deno & TypeScript. Builds are plain TypeScript classes — targets are class fields, dependencies are real references, and Zuke runs everything in topological order. This guide gets you from zero to your first green build.
Install
Zuke runs on Deno and ships on JSR. Install the CLI globally, then let it scaffold a project:
# Install the CLI globally with Deno
deno install -A -g -n zuke jsr:@zuke/cli
# Scaffold zuke.ts, launchers, and config in your project
zuke setup
# Run it — the ./zuke launcher bootstraps Deno if needed
./zuke
No Deno yet? The generated ./zuke launcher will install a
pinned, known-good version on first run — so contributors don't need to set
anything up by hand.
Scaffold a build
zuke setup creates a zuke.ts at your project root
alongside the zuke / zuke.ps1 launchers and a small
zuke.json. The zuke.ts file is your build —
edit it like any other TypeScript module.
Your first target
A target is a class field built with target(). Give it a
description, declare what it dependsOn using
this.* references, and provide the work in
executes:
import { Build, run, target } from "jsr:@zuke/core";
import { DenoTasks } from "jsr:@zuke/deno";
class MyBuild extends Build {
clean = target()
.description("Remove build output")
.executes(async () => {
await $`rm -rf dist`;
});
compile = target()
.description("Type-check the project")
.dependsOn(this.clean)
.executes(async () => {
await DenoTasks.check((s) => s.paths("mod.ts"));
});
}
if (import.meta.main) {
await run(MyBuild);
}
Because compile depends on this.clean, Zuke runs
clean first — automatically and exactly once. Rename
clean and the reference moves with it; there are no strings to
keep in sync.
Running targets
Invoke any target through the launcher:
./zuke compile # run a target (and its dependencies)
./zuke --list # list every available target
./zuke # run the default target
Zuke prints per-target status (✔ / ✘ /
⊘), timings, and a final summary. A target named
default runs when you pass no arguments.
Next steps
- Core concepts — targets, dependencies, the
$shell, and parameters. - Examples — real-world build files for Node, Deno libraries, and Docker.
- JSR packages — the full set of typed tool wrappers.