delegate-skills
Create your fleet of lanes. One orchestrator, the right implementer for every job.
Discover the implementer CLIs already installed on your machine, organize them into lanes like
feature, tests, and ui, then delegate by lane — or choose one implementer directly. Either way,
you keep the review and the commit.
npx skills add amElnagdy/delegate-skillsThen ask your orchestrating agent to create the fleet:
Use $delegate-setup to discover my installed implementer CLIs and create a fleet for feature, tests, and UI work.
Or delegate directly:
Use $codex-delegate to have Codex implement the refactor in services/billing/, then review and commit it.
flowchart LR
S["$delegate-setup<br/>discover → propose → approve"] --> F["Example fleet"]
O["Your orchestrator"] --> F
F -->|"feature"| A["OpenCode"]
F -->|"tests"| B["Codex"]
F -->|"ui"| C["Cursor"]
A --> R["Review the diff<br/>Run the gates"]
B --> R
C --> R
R --> L["You land the commit"]
Choose how you delegate
Create a fleet
| Skill | Job |
|---|---|
delegate-setup |
Discover installed CLIs, propose fleet lanes, and write global or project config after you approve. Never dispatches work. |
A fleet is your set of named lanes. Each lane binds a kind of work to one implementer and optional dials such as model, effort, or variant. Setup discovers what is available, proposes a compact fleet, shows you the complete configuration, and writes only after explicit approval.
Configuration can apply globally or to one repository. Once it is ready, dispatch with the matching
*-delegate skill and --lane <name>. Explicit flags override lane dials, and the wrong implementer
skill for a lane fails loud. Project config is content-bound to explicit setup approval, so cloned or
edited project lanes fail closed until re-approved. See the
delegate-fleet.v1 schema for paths, supported dials,
and overlay behavior.
Delegate directly
Skip setup when you want one implementer or one-off dials. Pick the skill for a CLI you have:
| Skill | Implementer CLI | Write access (default) | Read-only run | Resume |
|---|---|---|---|---|
aider-delegate |
Aider (aider) — any OpenAI-compatible endpoint, including a local or self-hosted model via --api-base |
--yes-always with --no-suggest-shell-commands; no sandbox or permission modes; commits force-disabled 1 |
--read-only (--dry-run) |
--resume-last (chat history, per-worktree) |
agy-delegate |
Google Antigravity (agy) |
Antigravity's own permissions; bypass opt-in |
--read-only (plan mode) |
--resume-last, --conversation <id> |
claude-delegate |
Claude Code (claude) |
acceptEdits + explicit tool surface |
--read-only (plan mode) |
--resume-last, --session <id> |
cline-delegate |
Cline (cline) |
--auto-approve true in act mode; upstream sandbox not configured by the relay |
--plan + --auto-approve false (relay-enforced pair) |
— (headless JSON resume unsupported) |
codex-delegate |
OpenAI Codex (codex) |
--sandbox workspace-write |
--read-only |
--resume-last, --session <id> |
commandcode-delegate |
Command Code (cmd; cmdc on Windows) |
--yolo — the only headless write state; no sandbox 2 |
--read-only (withheld tools + plan) |
--continue-last, --session <id> |
cursor-delegate |
Cursor Agent (cursor-agent) |
--force; --no-force withholds command approval |
--read-only (plan mode) |
--resume-last, --session <id> |
grok-delegate |
Grok Build (grok) |
workspace-scoped; --full-access opt-in |
--read-only — best-effort 3 |
--resume-last, --session <id> |
kimi-delegate |
Kimi Code (kimi) |
auto permission mode, always |
— 4 | --resume-last, --session <id> |
opencode-delegate |
OpenCode (opencode) |
agent build (--model required) |
--read-only (agent plan) |
--resume-last, --session <id> |
pi-delegate |
Pi (pi) |
full local tools — no sandbox, no permission modes 4; project trust opt-in | --read-only (read,grep,find,ls) |
--resume-last, --session <id> |
omp-delegate |
Oh My Pi (omp) |
--yolo (tools.approvalMode: yolo); project .omp extras off unless --approve |
--read-only (read,grep,glob) |
--resume-last, --session <id> |
qoder-delegate |
Qoder (qodercli) |
auto permission mode; bypass opt-in |
--permission-mode plan |
--resume-last, --resume <id> |
vibe-delegate |
Mistral Vibe (vibe) |
accept-edits; --full-access opt-in |
--plan-only (plan agent) |
--resume-last, --session <id> |
copilot-delegate |
GitHub Copilot CLI (copilot) |
--allow-all-tools opt-in; headless auto-deny otherwise |
--read-only (--mode plan) |
--resume-last, --session <id> |
warp-delegate |
Warp Agent CLI (oz) |
full local tools — no sandbox, no permission modes 4 | — 4 | --conversation <id> |
zcode-delegate |
Z.AI ZCode (zcode) 5 |
--mode yolo |
--read-only (plan mode) |
--resume-last, --session <id> |
Each skill name links to its SKILL.md, which owns that implementer's prerequisites, flags, and
caveats. Building one for another CLI? Claim it first,
then see CONTRIBUTING.md.
Install
Browse first:
npx skills add amElnagdy/delegate-skills --listInstall the package, the setup skill, or one implementer skill:
npx skills add amElnagdy/delegate-skills
npx skills add amElnagdy/delegate-skills --skill delegate-setup
npx skills add amElnagdy/delegate-skills --skill codex-delegateTo pin an installation, append an existing release tag as @vMAJOR.MINOR.PATCH. The Skills CLI
installs by git ref, not by metadata.version in SKILL.md.
Install for a specific agent, or globally:
npx skills add amElnagdy/delegate-skills --skill codex-delegate --agent claude-code
npx skills add amElnagdy/delegate-skills --globalWorks with any orchestrating agent the Skills CLI supports.
How delegation works
Whether you choose the implementer directly or through a fleet lane, every dispatch follows the same review-first loop:
- Write a brief — self-contained task context; the implementer has no orchestrator chat history.
- Dispatch it with the bundled
relay.mjs. - Wait for completion — the relay writes a structured
result.json. - Review the diff — re-run the project's gates yourself; pair with guard skills.
- Land it — you commit, because committing belongs to the reviewer.
Use $claude-delegate to have a separate Claude Code session implement the parser fix, then review and commit it.
Use $opencode-delegate with --lane feature to implement the billing workflow, then review and commit it.
Use $codex-delegate to run this queue of migration tasks through Codex while I review each one.
Every relay speaks the same delegate-relay.result.v1 contract: status, exitCode, signal
(with a host-killed hint when the OOM killer ends a run), the implementer's own final report,
touchedFiles, and a session id where the CLI exposes one. Learn the loop once, swap the implementer
freely.
You feel it when a bounded task — a migration, a mechanical refactor, a removal sweep — comes back as a clean diff with a structured report, and you land it after re-running the gates yourself instead of typing it all by hand.
What counts as an implementer skill
Four invariants hold for every *-delegate skill. They are also the bar for a new implementer:
- A separate CLI edits a real working tree, and the diff is the deliverable. Not an API wrapper,
not a gateway — an implementer whose work you can read with
git diff. - The relay never commits. Committing belongs to the reviewer, always.
- Node built-ins only. No dependencies, no network calls of its own, no credentials, no telemetry.
The relay launches its implementer CLI and
git, plus the platform process launcher where a Windows shim or a process-tree kill needs one. - Autonomy is stated in the CLI's own terms, and whatever it cannot enforce is said plainly — see the two footnotes above.
This is a loop, not a forwarder: a forwarder hands over one task and returns the output. Here you dispatch, poll, review, and land, across one task or a queue. It stays complementary to a vendor's own plugin or subagents — those coordinate inside one agent; this keeps the contract portable across orchestrators, with the commit on the reviewer.
delegate-setup is the setup-skill exception: it discovers CLIs and writes an approved fleet map, but
never dispatches coding work.
Full checklist: CONTRIBUTING.md.
Requirements
- For a
*-delegateskill, its implementer CLI authenticated as you would at the terminal. Each implementer skill'sSKILL.mdcarries its own install and login commands. delegate-setuprequires no implementer CLI; it discovers whichever ones are available.- Node 18+ and
git. - An orchestrating agent that can run shell commands and read files.
- Shell examples assume bash/zsh (macOS/Linux, or Git Bash/WSL on Windows).
Trust and validation
This package is intentionally inspectable:
- All skill content is Markdown, plus small Node scripts. Each
*-delegateskill has exactly onescripts/relay.mjs. Thedelegate-setuputility shipsdiscover.mjs/config.mjs/lane.mjs(and a shared implementer table) instead of a relay — it never dispatches coding work. - Those scripts make no network calls of their own, read or write no credentials, send no telemetry, and
have no dependencies (Node built-ins only). Relays launch an implementer CLI and
git, plus the platform process launcher/termination utility where a Windows shim or process-tree kill requires one. Discover may invoke installed CLIs for--version/ model list probes (those CLIs may contact their own services). Read the script before you run it. - None of the relays ever commit — committing is always the orchestrator's job, after review.
Verification status — claims here are backed by runs, not assumptions.
True of every relay: argument handling, exit codes, result.json shape, supported resume mappings,
and signal reporting are verified, along with each implementer-specific guard.
Per skill — platform, CLI version, and what the run exercised:
-
aider-delegate— Windows,aider0.86.2: contract-tested against the shared smoke matrix, plus live headless--message-fileruns against a stub OpenAI-compatible endpoint on loopback. Those runs covered: an applied edit left uncommitted, with a pre-existing dirty file still uncommitted, proving--no-auto-commits/--no-dirty-commits; no.gitignorewritten, proving--no-gitignore; a--read-only(--dry-run) run that left the target file byte-identical; an endpoint returning 401, where aider exits 0 and the relay reportsfailedwithlitellm.AuthenticationError;aider_unavailable/127 writing a result file; and usage errors exiting 2 without one. Review follow-ups were re-verified the same way: a successful run whose report saysOPENAI_API_KEYthree times still reportscompleted; a reused--out-dirseeded with another run'sfinal.txtandresult.jsonpublishes neither; a plain exit 7 carries anerror; and a--read-onlyrun over a modified.aider.conf.ymlplus generated history and tags-cache warns about exactly the config file. Not run against a hosted provider model or a real local inference server, and not run on macOS or Linux. -
agy-delegate— Windows 10, native,agy1.1.12: headless--printwrite run editing one briefed file;--read-only--effort highrun whose brief ordered an immediate file write, in a directory the permission rules allowed: agy refused, wrote nothing, andresult.jsonreported effort high,readOnlytrue,readOnlyViolationfalse; argument validation for a bad--effortvalue and for--read-onlycombined with--dangerously-skip-permissions, both exiting 2; resume by--conversationwith a delta brief. macOS,agy1.0.16: headless edit run,--print=delivery, absolute--add-dirworkspace pin. -
claude-delegate— macOS,claude2.1.220: write run underacceptEdits; plan mode refusing an edit, with the Git tripwire true on a violation and false on a clean run;--session/--resume-lastresume;claude_unavailable/127 and usage errors exiting 2 without a result file; deny rules and the shell sandbox blockinggit commit,git push,git -C <dir> push, a nestedclaude, and a$HOMEwrite. -
cursor-delegate— Windows,cursor-agent2026.07.23-e383d2b: write run under--force; plan-mode--read-onlytouching nothing;--session <id>resume applying a delta brief; usage errors exiting 2. A maintainer-run native macOS plan-mode smoke against the same version captured model, session, and usage with no touched files. -
grok-delegate— macOS,grok0.2.101: streaming-json report capture, file-based brief delivery, resume; read-only is best-effort by measurement, hence the violation flag. -
kimi-delegate— macOS,kimi0.24.0: headless-pedit run, stream-json parsing, and both resume paths — the relay's--session/--resume-last, which drive Kimi's own--sessionand--continue. -
pi-delegate— macOS: stdin brief delivery, explicit provider and model selection, JSON session/provider/model/usage capture, and a--read-onlyrun leaving a clean tree. Write,--session, and--resume-lastruns are contributor-reported. -
omp-delegate— contract-tested, live run pending: stdin brief delivery,omp --mode jsonargv (--yolo,--tools read,grep,glob,--no-extensions --no-skills --no-rules,--thinking), session header /message_endparsing,--approveomitting the project-trust flags,--continueresume, assistantstopReason: errorreported as failed,omp_unavailable/127, and bounded--versionpreflight. Native Windows launch is a nativeomp.exe(noshell:true); that path is contract-tested via the smoke matrix's compiled fake, not against a live Oh My Pi install. -
qoder-delegate— macOS,qodercli1.0.47, by the contributor: Lite edit run,accept_edits, explicit model and 32768-token context window, no commit. -
commandcode-delegate— macOS,cmd1.26.0: live edit run verified. A relay dispatch against a throwaway git repository had Command Code fix a remainder-dropping bug in a money-splitting function and add three tests; the project gate was re-run independently by the orchestrator (2 tests before, 5 passing after), the diff matched the brief with no writes outside the two named files, andHEADwas untouched — the relay does not commit, and the run did not either. A second dispatch with--session <id>verified resume through the relay: a one-line delta brief amended exactly the comment it named, with the session id from the first run. A--read-onlydispatch verified the other direction, returningreadOnlyViolation: falseon a clean tree. Also verified negatively: separate live runs confirmed--tools-alland--permission-mode auto-acceptleave the headless write gate closed and only--yoloopens it.Live running surfaced a CLI limitation the relay now handles.
cmdends a run with arun_endevent embedding the whole conversation, then exits withprocess.exit, discarding whatever is still queued in its stdout pipe: both write runs lost theirresultline entirely (one cut ~8 KB intorun_end, the other losing its last ~780 events). So nothing load-bearing is read from that tail —sessionIdcomes fromrun_start, the first line of the stream, and the report from the lastmessage_endor its streamed deltas — the event log is written in batches so the relay drains the pipe as fast as it can,resultLinereportscomplete/truncated/absentso a consumer knows which fields are trustworthy. A complete non-success result converts a zero child exit to relay exit 1, while a lost result line falls back to the process exit code. Smoke cases pin that contract. On a long run the report itself can land in the discarded region. The diff is the deliverable, and a thin report means missing information, not a failed run.Native Windows launch is contract-tested against the installed
cmdc.cmdshape, including stdin brief delivery and thecmd.execollision guard. A live native Windows Command Code run remains unverified; upstream recommends WSL for stable Windows use. -
warp-delegate— macOS,oz0.2026.05.27.15.44.stable_01: live edit run verified. A relay dispatch against a throwaway git repository had Warp add a function plus four assertions across two files; both project gates were re-run independently by the orchestrator, the diff matched the brief, andHEADwas untouched. Verified end to end: version preflight, launch, ndjson parsing (run_started→runId/runUrl,conversation_started→conversationId), report extraction from{"type":"agent","text":…}events withagent_reasoningexcluded,touchedFiles, andstatus: "completed"/ exit 0. A second dispatch with--conversationverified resume: a delta brief saying only "the function you just added" — never naming it — produced exactly the right edit, withresumed: trueand the conversation id preserved. Also observed on a prior run:touchedFiles: []on a clean tree and exit 1 →status: "failed". Two caveats are documented in the skill rather than fixed, because they are Warp's behaviour and not the relay's:finalMessageis the agent's full narration rather than a distinct final-message event, and--cwdgoverned shell commands while the agent's file tool resolved bare relative paths against$HOME.--no-snapshot,--profile,--skill, and--mcpare contract-tested only. -
zcode-delegate— Windows,zcode0.16.1: read-only (plan) run leaving a clean tree with the Git tripwire false; write run underyolocreating the briefed file and reporting it intouchedFiles;--sessionresume with an attached delta brief, which recalled the earlier turn; single-document--jsonparsing;--versionpreflight; discovery resolving the CLI from the app bundle rather than PATH; and environment-variable auth under all three names ZCode accepts — against an isolated home whose config carried noapiKey, a keyless run failed first, thenZAI_API_KEY,ZCODE_API_KEY, andANTHROPIC_API_KEYeach completed the same read-only dispatch. Contract-tested:build/editrejection, the missing-CLI path, tolerance of the AI SDK banner that ZCode can print on stdout ahead of the JSON (observed in direct CLI probes; exercised in the suite by the fake), and the timeout matrix. The abort matrix is POSIX-only — Windows delivers no catchable SIGTERM — so for this relay it first runs in CI.zcode-delegateis also absent from the shared read-only tripwire scenario matrix, which runsclaudeandgrokonly — its tripwire helpers are parity-enforced byte-identical, but no zcode-specific worktree-state run is recorded. No macOS or Linux run is recorded. -
codex-delegate,opencode-delegate,vibe-delegate— contract-tested only: argument validation, bounded version preflight, missing binary, result parsing, and whole-process-tree timeout/abort cleanup. No end-to-end run is recorded here. -
cline-delegate— macOS,cline3.0.52: current-binary unauthenticated plan probe reachedrun_startwith the fixed positional instruction plus the real brief on stdin, accepted a provider-local model id, parsed the failingrun_result, and left the tree clean. Contract-tested: plan mode forcing--auto-approve false, the unsafe true conflict, argument validation, nullablesessionId/finalPath, bounded version preflight, missing binary, result parsing, and whole-process-tree timeout/abort cleanup. The contributor also reported a native Windows 3.0.51 edit run against the earlier positional-brief commit; that does not verify this exact stdin-based head on Windows. -
copilot-delegate— Windows,copilot1.0.78:--read-onlyplan-mode run completed with a clean tree and captured session id;--allow-all-toolsedit run created the requested file; the headless auto-deny path was exercised live (denial detected from the data-wrapped event shape, run reported failed with the--allow-all-toolshint);--session <id>and--resume-lastresume runs executed their delta briefs via the directive-wrapped-p @<file>prompt. Contract-tested: argv exactness (including the resume directive), denial shape,--read-only/--allow-all-toolsconflict validation, bounded version preflight, missing binary, result parsing, and whole-process-tree timeout/abort cleanup. -
delegate-setup— contract-tested: discover JSON shape, config validate/write/load, whole-lane project overlay, global write without creating.delegate/, and--laneresolve / wrong-skill / flag-override against relays. The smoke suite runs live discovery against installed CLIs (versions vary by machine). Native Windows discover smoke not yet claimed.
Not yet verified: native Windows launches for claude, exact-head cline, grok, kimi,
pi, qoder, vibe, and omp (codex/opencode/grok/commandcode have contract-tested .cmd shim handling;
Cursor serializes a pre-joined, quoted command; Qoder and Vibe target their documented native executables).
Claude's own shell sandbox is unsupported on native Windows regardless of launch mechanics, and upstream
Vibe officially targets UNIX. A native Linux cursor-agent run is unverified. The full delegate →
review → commit loop is designed for and run on Claude Code; other orchestrators (Cursor, …) are
designed-for but unproven.
Repository shape
Implementer skills share one shape; the setup utility has a different one:
skills/
├── <name>-delegate/
│ ├── SKILL.md
│ ├── scripts/relay.mjs
│ └── references/
│ ├── writing-the-brief.md
│ ├── dispatch-and-poll.md
│ ├── review-and-land.md
│ └── multi-task-queues.md
└── delegate-setup/
├── SKILL.md
├── scripts/
│ ├── discover.mjs
│ ├── config.mjs
│ ├── lane.mjs
│ └── implementers.mjs
└── references/
├── schema.md
└── setup-dialogue.md
Adding an implementer is a new directory plus two lines here: a table row, and a verification line once a run backs it.
Contributing? House rules, the controlled vocabulary, and the pre-publish checklist live in AGENTS.md — read it before opening a pull request, and point your agent at it too.
License
MIT — see LICENSE.
Footnotes
-
Aider is the one implementer here that commits by default. Its
--auto-commitsand--dirty-commitsboth default toTrue, the second of which commits your pre-existing uncommitted work before editing. The relay always passes--no-auto-commitsand--no-dirty-commits, and neither is configurable through it. ↩ -
Command Code's headless mode has two states and nothing between them: a
-prun withholds the write, edit, and shell tools, and--yolo(alias--dangerously-skip-permissions) allows every tool anywhere the process can reach.--permission-mode auto-acceptand--tools-alldo not lift the write gate. So an implementation run is full-trust with no path restriction — the brief's path list is guidance, not containment. A worktree isolates the checkout, while a container or another OS-enforced sandbox is required when writes outside the target tree are unacceptable.touchedFilesis a review aid based ongit status; it cannot show ignored files or writes outside the repository. ↩ -
grokcannot be prevented from writing headlessly. The relay reports a tri-statereadOnlyViolationtripwire for detected Git-visible changes; it does not enforce or attribute them. ↩ -
No CLI-enforced read-only mode.
touchedFilesand the diff are what you review against, not a guarantee: they are post-rungit statusin the workspace, so they cannot show ignored files, reverted edits, or writes outside the repository. ↩ ↩2 ↩3 ↩4 -
ZCode ships its CLI inside the desktop app — there is no
zcodeon PATH, no npm package, and the public docs cover only the GUI. The relay resolves it from--zcode-path/ZCODE_CLI, then PATH, then the installed app bundle. Of ZCode's four documented modes onlyplanandyolowork headlessly:buildandedithave no permission client there, so they block every write tool and exit 0 having changed nothing, and the relay rejects them rather than report that as success. ZCode offers--disallowed-toolsbut no--allowed-tools, so capability can be subtracted, never enumerated. Wherezcode loginfails withOAuth response is not valid JSON, the key comes fromZCODE_API_KEY/ANTHROPIC_API_KEY/ZAI_API_KEYinstead. ↩