Commands

A command is a user-facing entry point: the thing you type to kick off specialized work. Commands contain no agent logic of their own — each command names exactly one target, either a workflow or an agent, and delegates to it. That indirection is what keeps prompts from being duplicated across commands.

On-disk layout

text
kits/<kit>/commands/<name>/
├── command.yaml     machine-readable metadata (validated by Zod)
└── prompt.md        the command's prompt template

command.yaml reference

yaml
name: create-feature # required, kebab-case
description: Implement a new feature via the feature-development workflow # required, <= 500 chars
version: 1 # required, positive integer
tags: # optional, defaults to []
  - feature
workflow: feature-development # EXACTLY ONE of workflow: / agent:

The target rule is strict: exactly one of workflow: or agent:, never both and never neither. Set both and validation fails with must not set both "workflow" and "agent". Because the target is machine-readable, doctor and validate catch dangling references (command names a workflow that does not exist) before a runtime sees them.

prompt.md structure

Required sections (enforced by agentkrew validate, minimum body 400 chars):

text
## Purpose
## Inputs
## Workflow
## Expected output
## Failure behavior

The ## Workflow section tells the runtime which target to invoke and in what order; for workflow targets it embeds the deterministic step plan (including parallel groups) so the session can drive the whole team without any runtime-specific machinery.

Argument templating is runtime-provided, not authored per runtime: Claude Code and OpenCode substitute $ARGUMENTS / $1..$n in the command body; Codex skills take the request as-is.

How you invoke them

Runtime Form Example
Claude Code slash command from .claude/commands/<name>.md /create-feature "Add checkout"
OpenCode slash command from .opencode/commands/<name>.md /fix-bug "empty CSV rows"
Codex cmd- skill: $cmd-<name>, /skills picker, or description match $cmd-ship

Codex has no custom-command facility, so commands render as skills with a cmd- prefix — same content, different typing.

Workflows additionally render as workflow-<name> entries (commands or skills depending on runtime), so a workflow is invocable even without a command, and a command and workflow of the same name (for example review) never collide.

Shipped commands

Engineer Kit (7):

Command Target Invokes
/create-feature workflow feature-development Plan → parallel build → test → audit → review → ship
/fix-bug workflow bug-fix Reproduce → root-cause → fix → regression test → review
/review workflow review Multi-agent review with aggregated findings
/multi-agent-review workflow review Same workflow, explicit multi-agent framing
/security-audit agent security-auditor Focused security pass
/test agent test-automator Focused test-suite work
/ship agent shipper Release gate: tests, lint, build, diff, security

Marketing Kit (6): /campaign-brief and /launch-plan (growth-strategist), /blog-post (content-marketer), /email-sequence and /landing-page (copywriter), /seo-audit (seo-specialist).

agentkrew list commands --installed is the live source of truth.

Inspecting commands

bash
agentkrew list commands --installed
agentkrew info create-feature --installed
agentkrew info create-feature --installed --json

Creating a custom command

Two supported paths:

  • Source checkout (contributor): add kits/<kit>/commands/<name>/{command.yaml,prompt.md} with exactly one target and the five required sections, then agentkrew validate --kit <kit>. The target must resolve to a real workflow or agent — the loader rejects dangling references.
  • Installed project: add a runtime-native command file (.claude/commands/<name>.md, .opencode/commands/<name>.md, or a .agents/skills/cmd-<name>/SKILL.md for Codex). agentkrew update only rewrites files it rendered, so yours survives updates; verify with agentkrew validate --installed.

See customization for the full authoring workflow.