Typed, refactor-safe dependencies
Targets reference each other with this.target — not magic strings. Rename one and every reference updates. The compiler has your back.
Zuke is a code-first, strongly-typed build system. Define targets as TypeScript class fields, wire dependencies with a fluent API, and let Zuke resolve and run them in topological order — with zero runtime dependencies.
$deno install -A -g -n zuke jsr:@zuke/cli
$zuke setup
$./zuke
import { Build, run, target } from "jsr:@zuke/core";
import { DenoTasks } from "jsr:@zuke/deno";
class MyBuild extends Build {
clean = target()
.executes(async () => { await $`rm -rf dist`; });
compile = target()
.description("Type-check & bundle")
.dependsOn(this.clean, this.restore)
.executes(async () => {
await DenoTasks.check((s) => s.paths("mod.ts"));
});
}
if (import.meta.main) await run(MyBuild); Targets reference each other with this.target — not magic strings. Rename one and every reference updates. The compiler has your back.
Build logic is ordinary async functions with full editor support, types, and debugging. No YAML, no bespoke DSL to learn.
Declare what each target depends on; Zuke resolves the graph and runs everything in the right order, skipping what's already done.
The $ tagged template executes processes with sensible defaults and prevents injection — capture output, ignore failures, or fail fast.
Zuke ships on Deno with nothing else to install. The bootstrap launcher even installs Deno for you on first run.
Strongly-typed wrappers for Deno, npm, Bun, Docker, Kubernetes, Playwright, Terraform and more — all published to JSR.
Each target lists what it dependsOn. Zuke builds the
dependency graph, runs independent targets as far as it can, and
executes everything exactly once in the correct order.
this.build, never a string.↓ This is the actual graph that builds this website.
// The $ tagged template runs processes safely — no shell injection.
const sha = await $`git rev-parse HEAD`.text(); // trimmed stdout
await $`deno test -A`; // throws on non-zero
const code = await $`flaky-cmd`.noThrow().code(); // never throws
The $ tagged template from @zuke/core/shell
escapes interpolations automatically, so untrusted values can't break
out of a command. Chain .text(), .code(), or
.noThrow() for exactly the behaviour you want.
Every wrapper is a fluent, strongly-typed API over a real CLI — published to JSR, tree-shakeable, and refactor-safe.
Install, run, and publish across every major JS toolchain.
@zuke/deno test, check, fmt, lint, publish @zuke/npm ci, install, run scripts, publish @zuke/bun install, run, bun test @zuke/pnpm frozen installs, --filter workspaces @zuke/yarn Classic & Berry support Build images and ship to clusters from a typed pipeline.
@zuke/docker build, tag, push @zuke/docker-compose up, down, services @zuke/kubectl apply, rollout, contexts Keep the tree clean with first-class linters and formatters.
@zuke/oxlint ultra-fast Rust linter @zuke/eslint configs, --fix, caching @zuke/dprint pluggable formatting @zuke/cspell spell-check your sources Run unit and end-to-end suites with coverage wired in.
@zuke/jest projects, coverage thresholds @zuke/vitest watch, coverage, UI @zuke/playwright cross-browser e2e Execute and type-check TypeScript without a build step.
@zuke/tsx run TS directly on Node @zuke/tsgo the native Go TypeScript compiler Provision and deploy with infra-as-code, typed end to end.
@zuke/gcloud deploy, run, IAM @zuke/terraform init, plan, apply @zuke/tofu open-source Terraform Script Git and GitHub straight from your build.
@zuke/git tag, commit, rev-parse @zuke/gh releases, PRs, workflows Scan workflows and secrets as part of the gate.
@zuke/security zizmor, actionlint, gitleaks @zuke/core the Build base class, target() graph, and $ shell @zuke/cli the global `zuke` command: setup, run, list @zuke/cmd the typed process layer the wrappers are built on Install the CLI, scaffold a zuke.ts, and run your first target.
$deno install -A -g -n zuke jsr:@zuke/cli
$zuke setup
$./zuke --list