CommunityRedacción y edicióngithub.com

zuke-build/zuke

🥷 A code-first, strongly-typed build automation system for Deno.

¿Qué es zuke?

zuke is a Claude Code agent skill that 🥷 A code-first, strongly-typed build automation system for Deno.

Compatible conClaude Code~Codex CLI~Cursor
npx skills add zuke-build/zuke

Installed? Explore more Redacción y edición skills: steipete/notion, affaan-m/seo, affaan-m/brand-voice · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Set up Zuke in a project

Zuke defines builds as a TypeScript class run on Deno. Each target is a class field; targets reference each other by this.<field> (never strings). Packages are imported from JSR (jsr:@zuke/...), not npm.

The fast path: zuke setup

The @zuke/cli tool scaffolds everything. Install it once, then run setup in the target project:

deno install -A -g -n zuke jsr:@zuke/cli   # once, globally
zuke setup                                  # in the project root
./zuke                                       # run the build

No global install? The same wizard runs directly:

deno run -A jsr:@zuke/cli setup

setup flags: --dir <path>, --name <ClassName>, --force (overwrite existing files), --yes (non-interactive), --launcher-name <name> (write the launcher under a different name when a zuke/ directory already occupies it — a directory collision now fails with an actionable error instead of silently skipping the launcher).

To read a @zuke/* package's API without a Node repo's @types/node noise, run zuke doc <package> (e.g. zuke doc core) — it runs deno doc in an isolated directory.

Migrating an existing project: zuke import

If the project already has package.json scripts or a Makefile, prefer zuke import over setup — it reads them and generates a zuke.ts with a target per task, a working starting point instead of a blank build:

zuke import                  # auto-detects package.json, then a Makefile
zuke import --from makefile   # or pin the source (package.json | makefile)

Each script/target becomes a target(); a command maps to CmdTasks.exec(...) — a placeholder, not the destination: before accepting it, check the package catalogue (llms.txt's ## Packages list, or the table in zuke-write-build's cheatsheet) for a @zuke/<tool> wrapper matching that command and replace the placeholder with it — leaving CmdTasks.exec in place for a tool that has a typed wrapper is a bug, not a shortcut. An && chain becomes sequential steps, a run/prerequisite delegation becomes .dependsOn(...), and anything too shell-specific to translate (pipes, redirects, env assignments) is preserved behind a // TODO so the file still compiles. It scaffolds the launchers and deno.json exactly like setup, and takes the same --dir, --name, --force, --yes flags. Afterwards, use the zuke-write-build skill to finish replacing any remaining generated CmdTasks.exec calls with typed *Tasks wrappers.

What zuke setup writes

  • zuke.ts — a starter build class with a sample target and a default.
  • ./zuke + ./zuke.ps1 — launchers that locate the project and run zuke.ts with the Deno on PATH. If Deno is missing they point at the official install docs and exit rather than piping an install script into a shell, which would download and execute code unverified. They pass --frozen once a deno.lock exists, so the first run writes the lockfile and every run after verifies it.
  • deno.json — merged to add a zuke task, plus fmt/lint/test if absent. The merge is all-or-nothing: if a zuke task is already declared the file is left alone entirely, and an unparseable one is skipped with a notice.
  • zuke.json{ "name": "..." }, which marks the repo root.
  • .gitignore — created or appended so .zuke/ is ignored (the cache and durable run state live there); untouched if it already covers it.

Running the build

./zuke                 # run the default target  (Windows: .\zuke.ps1)
./zuke <target>        # run a specific target
./zuke --list          # list every target
./zuke --list --json   # the whole build surface (commands, flags, targets) as JSON
./zuke <target> --dry-run   # print the plan without executing

The CLI is self-describing: ./zuke --help prints the usage grammar plus the build's live targets and parameters, so an agent discovers the real command surface instead of guessing. For an AI client to operate the build through typed calls, zuke mcp runs a Model Context Protocol server over it (register with claude mcp add zuke -- deno run -A zuke.ts mcp; add --allow-run to let the agent execute targets, not just inspect them).

If Deno is already installed you can also use deno task zuke <target> or deno run -A zuke.ts <target>. The -A flag grants permissions, since targets typically run processes and touch files. These are not quite equivalent to the launcher: the scaffolded zuke task deliberately omits --frozen, so it may heal a stale lockfile where ./zuke would fail on it.

Manual setup (no CLI)

Create zuke.ts in the project root, extend Build, declare targets with target(), and call await run(MyBuild) at the bottom:

import { Build, run, target } from "jsr:@zuke/core";
import { DenoTasks } from "jsr:@zuke/deno";

class CI extends Build {
  lint = target().executes(() => DenoTasks.lint());
  test = target().dependsOn(this.lint)
    .executes(() => DenoTasks.test((s) => s.allowAll()));
  default = target().dependsOn(this.test).executes(() => {});
}

await run(CI);

Run with deno run -A zuke.ts test. (For the ./zuke launcher experience, prefer zuke setup, which drops the launcher scripts in for you.)

Finding the exact API — never guess

Every external tool has a typed *Tasks wrapper; do not fall back to Deno.Command or hand-rolled shell. First confirm a wrapper exists at all — llms.txt's ## Packages catalogue or the table in zuke-write-build's cheatsheet is the only way to answer that; a per-package deno doc needs a name to target, so it cannot reveal that one exists. Once you know the package name, get its exact signatures:

Once the project is scaffolded, use the zuke-write-build skill to add and edit targets.

Skills relacionados

steipete/notion

Notion CLI/API for pages, Markdown content, data sources, files, comments, search, Workers, and raw API calls.

community

affaan-m/seo

Audit, plan, and implement SEO improvements across technical SEO, on-page optimization, structured data, Core Web Vitals, and content strategy. Use when the user wants better search visibility, SEO remediation, schema markup, sitemap/robots work, or keyword mapping.

community

affaan-m/brand-voice

Build a source-derived writing style profile from real posts, essays, launch notes, docs, or site copy, then reuse that profile across content, outreach, and social workflows. Use when the user wants voice consistency without generic AI writing tropes.

community

affaan-m/crosspost

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

community

affaan-m/x-api

X/Twitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.

community

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

community