A risk-scaled delivery workflow for Claude Code, Codex, and OpenCode:
/team-plan → /team-build → /team-review → /team-ship
The workflow uses the smallest mechanism that satisfies the real requirements and failure boundaries. A four-file mechanical change should stay small; a one-file credential or destructive migration still receives security, rollback, and verification depth. Complexity must be justified by scale, repetition, concurrency, security, or failure impact—not by a fixed ceremony.
| Runtime | Plugin | Version | What it provides |
|---|---|---|---|
| Claude Code | bootstrap-workflow |
5.10.0 | The seven team-* skills and the safety gates |
| Codex / OpenCode | bootstrap-workflow-agents |
2.10.0 | The same, runtime-neutral |
| Claude Code / Codex / OpenCode | bootstrap-orchestrate |
3.0.0 | /orchestrate, an invoke-only skill, plus the five effort shims it dispatches to |
| Claude Code / Codex | wwbd |
1.3.0 | Boris Cherny-inspired engineering-judgment advisory skill |
| Claude Code / Codex | wwed |
1.0.0 | Musk's five-step algorithm as a subtraction and cycle-time advisory skill; pairs with wwbd |
| Claude Code / Codex | analytics-verify |
1.2.4 | Claim ledger, check script and independent-verifier loop for analytics and research deliverables, with an always-on nudge |
| Claude Code / Codex | test-audit |
1.0.0 | Authoring gate and evidence-first audit workflow for tests, with an always-on nudge; adapted from OpenClaw (MIT) |
| Claude Code / Codex / OpenCode | comment-rule |
2.0.0 | One comment checker for CI, merge gates and write-time feedback: no file:line or PR/issue/ticket history in comments; every new comment line listed for a reviewer to judge |
| Claude Code / Codex / NanoClaw | concise |
1.0.1 | Session-only concise, grammatical chat mode |
| Claude Code / Codex / NanoClaw | slack-humanizer |
1.0.1 | Slack messages drafted in the user's voice and posted as rich text, so lists render as real Slack lists |
Automatic delegation pressure is off. Working directly is the normal mode: nothing tells a session to reach for a sub-agent, and nothing gates a session that reads source, runs a check, or implements a fix itself.
bootstrap-orchestrate adds no standing delegation directive or dispatch-first gate.
Its hooks only route omitted model/effort fields and validate explicit Codex context;
the Codex SessionStart entry is a one-line reminder for the opt-in picker. Invoke the
skill when you want one sub-agent to do all the work in a single thread —
/orchestrate opus high <task>, or "use an opus subagent at high effort to …".
Two mechanisms used to create the pressure, and both were deleted rather than moved:
the standing SessionStart directive that told every session to load the skill, and
the dispatch-first PreToolUse guard, which warned and then BLOCKED a coordinator
that read implementation source or ran a check before dispatching.
The team-* skills still delegate when you invoke one — the shared workflow contract
they load says to hand substantive work to a sub-agent and keep it for the whole task.
That is deliberate: /team-build is an explicit request for the delegated workflow.
What is gone is the automatic pressure, not delegation itself.
A parameterized delegation prompt, and nothing else.
/orchestrate <model> <effort> <task>
The first two words are the model and the effort when they look like one; everything after is the task. Leave either out and a confident usable Jev route may fill it. When Jev is unavailable, abstains, or returns no usable route, the workflow adds no override: the coordinator may make its normal task-based choice, or leave the field omitted for the runtime's native inheritance and configuration. It dispatches ONE sub-agent, hands it the brief, and keeps that same sub-agent for every later round.
| Parameter | Meaning | Default |
|---|---|---|
{model} |
the sub-agent's model, as this runtime names it | confident picker route, normal coordinator choice, or native inheritance |
{effort_level} |
the effort the sub-agent runs at | confident picker route, deliberate coordinator choice, or native configuration |
{rounds} |
coordinate→delegate cycles before stopping | 3 |
{done} |
the completion signal | the deliverable is complete with acceptance evidence |
The task text can override the last two: "stop after 5 rounds", "until the numbers reconcile".
The retained owner implements, tests and repairs in one session. The coordinator
selects the deliverable's check before dispatch and verifies the reported artifact,
command, result and limitations. An explicit user choice of check or verification
owner takes precedence. Independent review, when required, uses a separate reviewer
with fresh context; owner testing does not establish independence. New bounded
Codex workers use fork_turns: "none" with a self-contained brief; followups resume
the same worker through build, test and repair.
There is no role behind it, no approved model floor, no helper CLI, and no cross-provider hop: a Claude session dispatches Anthropic models and a Codex session dispatches OpenAI models, because that is what each runtime's own tool accepts — ask for the other and the tool rejects it, which is the report. Dispatch goes through whatever the runtime already has:
| Runtime | Route | Caveat |
|---|---|---|
| Claude Code | Agent tool, bootstrap-orchestrate:worker-<level>, then SendMessage each round |
family alias only (fable/opus/sonnet/haiku); no specific version |
| Codex | spawn_agent with model + reasoning_effort + fork_turns: "none", then the same agent id each round |
|
| OpenCode | task tool, agent worker-<level> if present, else the default sub-agent |
nothing installs the shims on a bare OpenCode host, so effort may not be settable |
The two caveats are the two places a runtime would degrade silently: the Agent tool
takes only a family alias, so /orchestrate claude-opus-5 … gets opus and is told so;
and OpenCode runs a default sub-agent when the shim is absent, and says so. Each of
those sentences is gated by its own drift token and a mutation test.
On the last row: nothing in this repo installs the effort shims onto an OpenCode host —
a Codex-shaped manifest cannot ship agents, and OpenCode would not read model: inherit
or effort from one anyway. The skill therefore degrades out loud rather than pinning an
effort it cannot pin.
Picker abstention or failure does not choose a model or effort. Output records decision: "inherit",
pick: null, and provenance: "native" so a raw low-confidence suggestion cannot be mistaken for
an effective route. Existing explicit choices stay intact subject to the existing compatibility
caps; a coordinator may still deliberately select a normal model, role, or effort shim from the
task. Fields it leaves omitted follow the client's native inheritance and configuration rather
than a workflow-owned fallback.
A named role is never rewritten. Claude Code gives a per-call model precedence over a role's
own model frontmatter, inherit included, and a role's effective definition can live where a
hook cannot read it (managed settings, --agents). So the spawn hook fills model and effort only
for a roleless spawn (general-purpose or no type) or an effort shim; any other subagent_type —
built-ins such as Explore, project/user custom roles, plugin roles — keeps its installed model
and costs no picker call. To route a named role, name its model in the call.
On the Codex row: spawn_agent accepts model and reasoning_effort (SpawnAgentArgs,
codex-rs 0.154.0, core/src/tools/handlers/multi_agents/spawn.rs:229-230), exposed by
default (multi_agent_v2.expose_spawn_agent_model_overrides, core/src/config/mod.rs:1308).
The one thing the plugin ships besides the skill is five near-empty agent definitions,
agents/worker-<level>.md. They exist because Claude Code's Agent tool takes a
model per call but not an effort — effort can only be pinned in an agent
definition's frontmatter. So each shim pins one level, sets model: inherit so the
dispatch still chooses the model, and carries a single line of body. They are not
roles, and the drift gates assert exactly that: five files, model: inherit, and a
body too short to hold a contract.
scripts/plugin-enablement.mjs prints the composed session for any plugin set, and
scripts/plugin-enablement.test.mjs resolves and RUNS the hooks each state registers,
asserting that enabling bootstrap-orchestrate adds no directive and no gate:
node scripts/plugin-enablement.mjs bootstrap-workflow # disabled
node scripts/plugin-enablement.mjs bootstrap-workflow bootstrap-orchestrate # enabledThe workflow plugins expose the seven team skills; /orchestrate ships beside them
in its own plugin:
| Skill | Purpose |
|---|---|
/team-plan |
First planning entry point; writes the normative plan.md and runs its independent review |
/team-build |
Implements the approved plan with proportional testing and delegation |
/team-review |
Reviews a plan or implementation, verifies findings, and records evidence |
/team-auto |
Runs approved plan → build → review, then hands off to /team-ship |
/team-debug |
Diagnoses root cause from evidence before changing production code |
/team-ship |
Merges on readiness and posts an FYI; holds for a human only on the scheduled release and genuine decisions |
/team-retro |
Finds repeat mistakes in a delivery, session or time window and ranks how to make each impossible |
/team-plan absorbs requirements, constraints, architecture, acceptance criteria, and execution
decomposition. /team-review selects QA, drift, security, performance, best-practice, and domain
lenses only when the actual risk warrants them. A finding becomes MUST-FIX only after the lead
traces it to a violated invariant or concrete failure mode.
/team-auto shares a maximum of 3 corrective rounds across build/test/review, with one
reconsideration on repeated failure signatures. No progress or repeated workflow-created obstruction
stops the run; a second productive failure alone does not. It hands off to /team-ship, which merges on readiness with an FYI and holds only on its second tier (scheduled production release, irreversible data, credentials, external publishing, spend, direction).
Substantial work uses two minimal durable artifacts; simple tasks can report evidence in chat:
docs/specs/<feature>/plan.md— the approved product, design, and execution contract.docs/specs/<feature>/run.md— current stage, verified findings, actual reviewer/model details, and verification evidence valid for the exact artifact, environment and command.
docs/specs/<feature>/.team-auto-active is an ephemeral concurrency sentinel, not another review
document. It is removed on normal exit and recovered after two hours without refresh.
Independent other-family review is mandatory at both consequential gates:
/team-planreviews the raw proposed plan before consequential implementation./team-review --implementationreviews the approved plan plus raw implementation diff.
Routine work does not automatically need both gates; explicit requested reviews are honored. Choose the other family relative to the artifact author, not the coordinator. The review receives source artifacts, not the lead model's conclusions, and is non-mutating. Findings are hypotheses until verified by the lead. The plugin explicitly selects reviewer effort and ignores host and container Codex configuration; the Codex reviewer model is Codex's own current default, recorded from the run header.
Claude-authored artifact reviews use (high default, explicit validated overrides allowed):
codex exec \
--ignore-user-config \
-c 'model_reasoning_effort="high"' \
--ephemeral \
--yoloCodex-authored artifact reviews use:
claude -p \
--model opus \
--effort high \
--safe-mode \
--no-session-persistence \
--permission-mode plan \
--tools "" \
--strict-mcp-config \
--output-format jsonEach external reviewer runs in the foreground with a 60-minute process ceiling. For Codex,
--yolo avoids the inner sandbox that cannot create namespaces inside nested Docker; the NanoClaw
container is the external isolation boundary, while the review contract remains non-mutating and
supplies its source bundle on stdin. Missing or unauthenticated CLIs, unsupported flags, timeouts,
non-zero exits, and malformed or empty output are recorded distinctly in run.md. The workflow
does not retry automatically or call a same-family pass “diverse.” Manual work asks the user
whether to proceed with degraded coverage; /team-auto stops once.
The team-* skills hand substantive work — design, implementation, research,
debugging, judgment-heavy review — to a sub-agent, and keep that same sub-agent for
the whole task. Independent review still starts in a fresh context, because a reviewer
is chosen for independence from the artifact's author.
There is no approved model floor and no named worker role. Pick the model and the
effort at dispatch from the task shape, record what you actually picked, and retain it
for that sub-agent's build/test/fix loop. shared/workflow-contract.md carries the
effort rubric: low for mechanical work, the dispatched default for bounded
implementation, high for debugging without a known root cause or a trust-boundary
change, xhigh when high did not resolve it, max only on evidence that xhigh
was insufficient.
The previous release pinned all of this to one hand-edited JSON policy file in the
workflow plugin. It rendered a named worker agent definition, a Codex role TOML, a
SessionStart installer that copied the TOML into the user's Codex home, and a Node
CLI transport mirrored into four plugins. Every piece of that is deleted. Naming a
model and an effort at dispatch is the thing the policy existed to decide, and the
runtime's own sub-agent tool is the transport. Upgrading needs no cleanup on your
side: the role only ever reached a Codex home through that installer, and
node scripts/retire-bootstrap-agents.mjs removes marker-owned leftovers, and
worker-frontier is on its list — a home the old installer wrote to keeps that file
otherwise, still pinned to the old model and still offered as an agent type.
Record saved defaults, requested settings and actual runtime metadata separately: a saved setting does not prove what the session ran at. Existing conversational approval survives factual and test-detail plan refinements; new product, scope, trust and destructive boundaries keep their gates. Reuse evidence only for the unchanged artifact, environment and command, and invalidate it after relevant changes.
/plugin marketplace add davekim917/bootstrap
/plugin install bootstrap-workflow@davekim917-bootstrap
/plugin install bootstrap-orchestrate@davekim917-bootstrap
/plugin install wwbd@davekim917-bootstrap
/plugin install wwed@davekim917-bootstrap
/plugin install analytics-verify@davekim917-bootstrap
/plugin install test-audit@davekim917-bootstrap
/plugin install comment-rule@davekim917-bootstrap
/plugin install concise@davekim917-bootstrap
/plugin install slack-humanizer@davekim917-bootstrap
codex plugin marketplace add davekim917/bootstrap --ref main
codex plugin add bootstrap-workflow-agents@davekim917-bootstrap
codex plugin add bootstrap-orchestrate@davekim917-bootstrap
codex plugin add wwbd@davekim917-bootstrap
codex plugin add wwed@davekim917-bootstrap
codex plugin add analytics-verify@davekim917-bootstrap
codex plugin add test-audit@davekim917-bootstrap
codex plugin add comment-rule@davekim917-bootstrap
codex plugin add concise@davekim917-bootstrap
codex plugin add slack-humanizer@davekim917-bootstrapFor a local checkout at ~/plugins/bootstrap:
codex plugin marketplace add ~/plugins/bootstrap
codex plugin add bootstrap-workflow-agents@davekim917-bootstrap
codex plugin add bootstrap-orchestrate@davekim917-bootstrap
codex plugin add wwbd@davekim917-bootstrap
codex plugin add wwed@davekim917-bootstrap
codex plugin add analytics-verify@davekim917-bootstrap
codex plugin add test-audit@davekim917-bootstrap
codex plugin add comment-rule@davekim917-bootstrapCodex loads the plugin from its cache through .codex-plugin/plugin.json; do not copy workflow
skills or agent definitions into a user home.
codex plugin add is what writes the [plugins."<name>@davekim917-bootstrap"] stanza with
enabled = true into ~/.codex/config.toml. Enablement is per plugin and opt-in, so an
existing Codex install does not pick up bootstrap-orchestrate when the marketplace gains
it — run the add above (or add the stanza by hand) once per host.
Container Claude agents need no NanoClaw change. discoverPlugins walks ~/plugins three levels
deep for a .claude-plugin/plugin.json and hands each hit to the SDK as a plugins: entry, which
is what loads a plugin's declared hooks; plugins/bootstrap/plugins/wwbd matches at the third
level. For both Claude and Codex mappings, the shared picker keeps a container's inherited, scoped
native HTTPS proxy and never replaces it with the host's default OneCLI agent. Only a plain host
picker with neither inherited proxy nor direct authentication uses that existing OneCLI agent for
the fixed TypeSafe request. A container whose scoped route is missing gets an unavailable pick; it
cannot borrow the host identity. The guard recognizes Docker/Podman marker files and NanoClaw's
existing per-spawn NANOCLAW_ASSISTANT_NAME environment marker.
Neither plugin ships a nanoclaw-plugin.json, and neither should: that file's
preToolUseGuards is a de-duplication signal telling NanoClaw to stand down one of its OWN
built-in gates, and bash-email is the only value anything consumes. check-plugin-boundaries
fails if one appears in the orchestrate plugin.
WWBD is installed separately from the workflow plugin. After installing it, start a new Codex
session so its WWBD skill is available. Verify installation with codex plugin list.
Both runtimes get the same SessionStart reminder from the plugin's own hook; Codex additionally
discovers the advisory skill through its native plugin skill loader.
WWBD and WWED are the only plugins here that ship a standing directive, and they show how one is
delivered: the runtime's own plugin declares a SessionStart command hook that cats the
always-on.md in its own plugin root, and the hook's stdout is injected into the model's
context. Claude's hooks/wwbd-hooks.json resolves ${CLAUDE_PLUGIN_ROOT}; the Codex manifest
declares a second file, hooks/wwbd-codex-hooks.json, resolving ${PLUGIN_ROOT} — Codex does not
expand the Claude token. Nothing outside a plugin delivers a directive, so disabling the plugin
removes it on every runtime at once. Adding a hook to a plugin that had none means Codex asks once
to trust that plugin's hooks on the next session start.
comment-rule is the one place the comment rule lives. A comment belongs in code when, without
it, a reader (human or agent) would get something wrong: an external system's quirk, why the
obvious approach is wrong. Only a reviewer can judge that, so the checker blocks only the
mechanical forms, a comment that cites file:line or a PR/issue/ticket number, and lists every
new comment line for the reviewer to keep or cut. Comment growth is reported, never failed.
CI jobs, merge gates and the write-time hook all call the same checker:
node plugins/comment-rule/bin/comment-rule.mjs check --repo <repo> [--base <ref>] [--head <ref>] [--own-typescript] [--json]
node plugins/comment-rule/bin/comment-rule.mjs file <path>... [--json]
node plugins/comment-rule/bin/comment-rule.mjs count --repo <repo> [--json]check compares the merge base of --base (default: origin's default branch) and the head
(default: the working tree's tracked files) and exits 0 pass, 1 on a prohibited form, 2 could not
check. --json gives, per file, comment lines at base and head, the net, each new comment line,
and each prohibited form with its line. The write-time hook reports only prohibited forms.
count is the drift check: run it on a repo's default branch now and then and compare its total
with the last run; steady growth means reviewers are keeping comments they should cut.
- Languages, each with a real parser: TypeScript/JavaScript (the TypeScript compiler API),
Python (
tokenizecomments; docstrings and every other bare string statement count), SQL including dbt (--, nested/* */, dollar quoting, Jinja{# #}), and shell (#comments, not the shebang, not heredoc bodies). Extensionless files count only with a shell or Python shebang; every other file type is ignored. A file its parser cannot read (a Python syntax error, say) makescheckexit 2 rather than count it partly. - Every comment line counts: directives, trailing comments and blank lines inside a block
included. Lines split on
\r\n,\r,\n, U+2028 and U+2029. - Repository config
.comment-rule.jsonat the root, read from the tip of--base, never the head, so a change cannot exempt itself and a branch cut before the config landed still gets it (an unresolvable--baseexits 2):exclude(globs never counted),frozen(globs that are not counted once they exist at the base, e.g. applied migrations under a checksum, so deleting their comments earns nothing),ticketPrefixes(extra keys such asABCforABC-123),sqlDialect(ansi, the default and Postgres's rules;snowflakeadds//comments and backslash escapes;bigqueryandmysqladd#comments and backslash escapes). - TypeScript 5.x or 6.x is taken from the checked repository, then from the plugin
(
npm ci --ignore-scriptsinplugins/comment-rule), then from a global install. Without one, TypeScript files makecheckexit 2 rather than pass. CI passes--own-typescript, which skips the checked repository: a pull request controls those files, so it could ship its ownnode_modules/typescript. Python files needpython3; a helper with no result within 60 s (COMMENT_RULE_PYTHON_TIMEOUT_MS) makescheckexit 2 rather than hang.
Write-time feedback, never a block. After each edit the post-edit hook checks the edited file
against HEAD and, when the file gained a prohibited form, tells the agent which line. Each
finding is raised once per session; new comment lines alone are left to review. Claude runs it from Edit|Write|MultiEdit,
Codex from apply_patch; OpenCode has no hook manifest, so a host adds
plugins/comment-rule/hooks/opencode-comment-rule.mjs to its OpenCode config's plugin list,
which appends the same feedback to the edit tool's output. Any error leaves the edit silent.
Lost-constraint review. plugins/comment-rule/review/lost-constraint.md is the prompt for a
fresh-context review of a change that deletes or shortens comments ({{BASE}} set to the merge
base). No gate runs it, since only a model can judge it. It never answers "keep": each lost constraint comes back with the test, type,
assert or lint rule that replaces it and where that goes, or none with the reason code can't
check it. The comment stays until that enforcement exists in the change or on the base branch.
concise is opt-in and applies only to the current conversation. In Claude Code, Codex, or
NanoClaw, ask to "use the concise skill". Ask to "turn concise mode off" to restore the session's
usual response style. It never becomes a persistent preference, shared instruction, or always-on
mode. Start a fresh host session after installing the plugin so its skill catalog includes it.
The canonical skill for every runtime is
~/plugins/bootstrap/plugins/concise/skills/concise/SKILL.md. From the NanoClaw checkout, run the enabler to mirror its
skill to OpenCode; Claude and Codex read the declared plugin directly from the container mount:
pnpm exec tsx scripts/enable-agent-plugin.ts bootstrapRespawn the target agent after an update. Do not copy this skill into container/skills/ or create
a NanoClaw always-on ruleset.
slack-humanizer loads whenever an agent writes Slack text that goes out under the user's name. It
ships a default voice (short, direct, properly capitalized, no AI tells) and rich_text.py, which
turns an approved draft into a chat.postMessage payload with one rich_text block, so bullets and
numbered lists render as real Slack lists instead of typed • characters.
The plugin carries no person's or company's details. Those live in a private voice profile,
slack-voice.md, kept in the workgroup directory, the project root or user memory; the skill reads
it when present and describes how to build one from the user's own messages. NanoClaw agents get
the skill through the same enabler as concise.
Older Bootstrap releases leaked permanent Codex agent definitions into active runtime homes: six
advisor roles before 4.0.0/1.0.0, and worker-frontier up to workflow 5.6.0, installed by a
SessionStart hook this release removes. No version ships a permanent agent now. Preview the
marker-safe cleanup:
node scripts/retire-bootstrap-agents.mjsThen apply it:
node scripts/retire-bootstrap-agents.mjs --applyDry-run is the default. Apply mode removes only the seven retired basenames carrying the exact Bootstrap ownership marker. Before deletion it writes a timestamped quarantine preserving each file's full home-relative path and a manifest containing its absolute source and SHA-256 hash. Unmanaged collisions, unrelated agents, and plugin caches are preserved. Restart affected Claude, Codex/NanoClaw, or OpenCode sessions after cleanup so cached definitions are unloaded.
- Claude's workflow plugin installs from
plugins/workflow. - Codex/OpenCode's workflow plugin installs from
plugins/workflow-agents. /orchestrateinstalls fromplugins/orchestrateon every runtime — one directory with both manifests, thewwbdshape. It is invoke-only, with no standing directive, no hooks and no scripts, so it can be disabled without touching theteam-*skills or any safety guard.skills/shared/is carried by BOTH workflow plugins, not shared by reference: an installed marketplace cache materializes only the plugin's own subtree, so a relative path cannot cross a plugin boundary.sync-agent-skills.mjsgenerates the Codex copy fromplugins/workflow/skills/shared, andparity-lintfails on any divergence. The orchestrate plugin reads no shared contract, so it carries none.- Claude and Codex can also install the shared
plugins/wwbdadvisory plugin. - Reviewer identities are bounded prompt roles, never globally installed permanent agents.
- Mechanically portable skills and shared contracts are generated from the Claude source tree.
- Shared destructive and protected-file guards are authored once and vendored to the agent plugin.
- Both plugins retain destructive-command, outbound-email, self-approval, managed-clone, Snowflake-connector, and protected-file safety checks.
bootstrap-workflow-agentsdeclares exactly one hook event,PreToolUse, for those safety checks.check-plugin-boundariesenforces that closed list — theSessionStartentry that used to install a worker role into the user's Codex home went with the role.wwbddeclaresSessionStartonly, for its standing directive;bootstrap-orchestrateuses only its bounded spawn routing, context validation, and Codex picker-reminder hooks.- Planning and review artifacts are workflow contracts, not filesystem safety boundaries.
bootstrap/
├── .agents/plugins/marketplace.json
├── .claude-plugin/marketplace.json
├── plugins/
│ ├── workflow/
│ ├── workflow-agents/
│ ├── orchestrate/
│ ├── wwbd/
│ ├── comment-rule/
│ ├── concise/
│ └── slack-humanizer/
├── evals/
├── scripts/
└── deprecated/
node --test scripts/retire-bootstrap-agents.test.mjs
node --test scripts/plugin-enablement.test.mjs
node --test evals/harness/*.test.mjs
node scripts/check-plugin-boundaries.mjs
node scripts/check-parity.mjs
node --test plugins/comment-rule/test/comment-rule.test.mjs
python3 -m unittest discover -s plugins/slack-humanizer/skills/slack-humanizer -p 'test_*.py'
cd plugins/workflow/hooks && bun test && bun run check
cd plugins/workflow-agents/hooks && bun test && bun run checkUse node scripts/check-plugin-boundaries.mjs --strict-home after retirement cleanup to fail on
marker-owned retired agents still active in Claude, Codex sibling-home, or OpenCode agent roots.
- Claude Code for
bootstrap-workflowandbootstrap-orchestrate - Codex with native plugin support for
bootstrap-workflow-agentsandbootstrap-orchestrate - Bun for TypeScript hooks
- Node 22+ and
python3forcomment-rule
MIT