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.