bish-x/bx-dev-skill/bx-dev
Claude Code and agent skill by bish-x/bx-dev-skill
- community
Checking that the SKILL.md file is still in the repository.
Use only when the user invokes $bx-dev or explicitly asks to start/resume an ad-hoc bx-dev development session. Orchestrates Codex subagents for implementation/review on a session branch without an external issue tracker. Do not use for ordinary direct edits.
Install
npx vskill@latest install bish-x/bx-dev-skill/bx-devSKILL.md
bx-dev - Ad-hoc Development Session (public edition)
Codex Runtime Contract
This workflow was originally written for long-running Agent Teams. In bx-codex, public instructions use natural-language Codex subagent spawns. Most bx-dev teammates are single-shot: Lead spawns a role with a full brief, waits for one final response, consumes the report, then calls close_agent for that agent id. If a subagent is still live/running before its final response, Lead may use send_input for a correction. If the subagent is completed, closed, missing, or stale, Lead must spawn a fresh role with the full relevant context. The authoritative runtime contract is docs/CODEX-ORCHESTRATION.md.
When this skill is invoked, treat it as explicit user consent to use Codex subagents unless --solo is set. The legacy primitives TeamCreate, Task(team_name=...), SendMessage, WaitNextSendMessage, TaskList, TaskUpdate, TeamDelete, and shutdown_request do NOT exist in Codex — ignore any inline references to them as historical wording.
Runtime mapping:
| Legacy term in this file | Codex action | |
|---|---|---|
Task(... team_name=..., prompt=...) / TeamCreate | Spawn a fresh subagent via natural language: "Spawn the <name> subagent with the following input: ...". | |
SendMessage(recipient=teammate, content=...) | If that exact Codex agent is still live/running, use send_input with <content>. If it has completed, is closed, or no live id exists, spawn a fresh subagent of that role with updated full context including <content>. | |
Wait for SendMessage / WaitNextSendMessage | wait_agent against the spawned worker id recorded in codex_agents. | |
TaskList / TaskUpdate | Use the /plan slash command (or skip — Codex tracks state itself). | |
shutdown / shutdown_request / TeamDelete | close_agent(target=<agent_id>), then clear state.teammates.{role} and mark state.codex_agents.{role}.status = "closed". |
Keep teammates as logical role labels if existing state uses it, but store real Codex ids under codex_agents.{role}.agent_id.
You are Lead. Orchestrator. In team mode, you do NOT implement code, perform semantic code review, or conduct acceptance QA. You MAY run deterministic orchestration commands and gates: git status, git diff --stat, branch/PR probes, configured test commands, lint/build commands, and smoke commands needed to route the workflow. You coordinate teammates.
Exception: --solo flag — Lead works directly, no subagents. See "Solo Mode" section.
Global AGENTS.md rules (executor, delegation matrix) are DISABLED during bx-dev.
State Files
State JSON shape:
STATE FILE RULE: NEVER use apply_patch for .bx-dev/<session-id>/ state files. Use shell commands instead:
- state.json: all updates via
jq:
``bash jq '.field = "value"' .bx-dev/<session-id>/state.json > .bx-dev/<session-id>/state.json.tmp && mv .bx-dev/<session-id>/state.json.tmp .bx-dev/<session-id>/state.json ` For initial creation: echo '{"active":true, ...}' > .bx-dev/<session-id>/state.json`
- brief.md: overwrite via heredoc:
``bash cat > .bx-dev/<session-id>/brief.md <<'BRIEF' ...scout report... BRIEF ``
Delegation rule (team mode)
Lead works ONLY through Codex subagents for implementation, semantic review, and QA (when not --solo). Each role — Dev, Bug Reviewer, Security Reviewer, Compliance Reviewer, QA, Merger — is spawned as a fresh single-shot subagent via natural language: "Spawn the <name> subagent with the following input: ...". Dev, Bug Reviewer, Security Reviewer, Compliance Reviewer, and QA prompts are inline in this file. Merger uses the bundled templates/agents/bx-dev-merger.md template. Most follow-up work happens by spawning a fresh role with the new full context. The only exception is a live/running agent that has not produced a final response yet; Lead may send that agent a correction via send_input.
Lead does NOT do: write code, semantic review, code-quality assessment, or acceptance QA. Lead may run deterministic gates and git/runtime probes to route the workflow, but teammate judgement remains with subagents.
Exception: --solo mode — Lead does everything directly.
Rules
- Single-shot subagents only (when not --solo). Every teammate is a fresh spawn via natural language ("Spawn the <name> subagent with the following input: ..."). There is no team registration, no
team_name, no long-running session. - Lead does not implement or judge teammate work. Lead may do file reads,
subagent orchestration (natural-language spawn), git status/log/add/commit/push, deterministic test/lint/build/smoke gates, branch/PR probes, and shell commands for .bx-dev/<session-id>/ state files. Lead never uses apply_patch on state files.
- Dev does not commit/push — Lead does. Dev implements and returns the diff summary in its final response. Lead commits, pushes, and manages the session branch.
- Track and close teammates in state. Always keep
teammatesobject in state.json up to date. Update on every spawn. Immediately after consuming a subagent final response, callclose_agent(target=<agent_id>), then clear that role and markcodex_agents.<role>.status = "closed". - Wait for real subagent completion. Spawn first, persist the returned agent id in
codex_agents, then wait viawait_agent. Do not treat the spawn itself as the worker result. - No persistent Dev across tasks. Each task spawns a fresh Dev subagent with full briefing — single-shot model has no implicit context carryover. Lead must re-state the relevant prior context in each new spawn input.
- Reviewers are fresh per task. Spawn, review, results returned in the spawn response.
- `waiting_for` is still updated for recovery, but each wait is an explicit
wait_agenton the spawned worker id.
``bash jq '.waiting_for = "<role>"' .bx-dev/<session-id>/state.json > .bx-dev/<session-id>/state.json.tmp && mv .bx-dev/<session-id>/state.json.tmp .bx-dev/<session-id>/state.json ` Where <role> is "dev", "reviewers", "qa", "merger" (waiting on Merger subagent during Push Step 5 or Step 6 — team mode only), "exit-finalize" (waiting on Dev's finalize file/report pass in Exit Step 2), or "exit-kill" (waiting on Dev's background-kill report in Exit Step 4). Clear it with ""` when the spawn result arrives.
- Close every subagent after final response. This applies to Dev, QA,
reviewers, Merger, and any exit/finalize helper. The sequence is always: consume final response → persist report/state → close_agent(target=<agent_id>) → set codex_agents.<role>.status = "closed" → clear teammates.<role>.
- Spawn lifecycle transaction. Every spawn step for Dev, reviewers, QA,
Merger, and helper roles MUST follow this transaction before any wait: natural-language spawn → capture returned agent_id → persist codex_agents.<role> = {agent_id, role, status:"running"} and teammates.<role> = "<logical-name>" → set waiting_for → call wait_agent. After consuming the final report, close the agent and mark it closed before routing to the next step.
Liveness Doctrine (simplified)
Two invariants, NON-NEGOTIABLE.
Invariant 1 — Waiting protocol
Before waiting for any subagent result, set state.waiting_for to the role name. Then call wait_agent with the current codex_agents.<role>.agent_id. Clear waiting_for to "" when the final worker report is received. One atomic jq per set; batch co-updates into the same jq when they belong to the same logical step. The user can always interrupt.
KEY: "Idle · subagent running" in the HUD means the MAIN THREAD is idle in `wait_agent`, but the subagent is ACTIVELY WORKING. This is the NORMAL state during a subagent's task. Do NOT report this to user as "subagent went idle / dropped" — that misrepresents reality.
Invariant 1a — Interrupted waits and late notifications
If the user interrupts while Lead is in wait_agent, or if wait_agent is aborted and a subagent_notification lands afterward, Lead MUST treat the notification path as first-class completion:
- Do NOT immediately re-spawn the role.
- Inspect the recent thread events/messages for the waited role's final report.
- If a final report exists, consume it as the authoritative completion event:
- persist any payload into
.bx-dev/<session-id>/brief.md/context.mdas appropriate - call
close_agent(target=<agent_id>) - set
.waiting_for = "" - set
.teammates.<role> = null - set
.codex_agents.<role>.status = "closed"
- Resume the next workflow step from that final report.
- Only if no final report exists should Lead resume
wait_agentor enter Recovery.
Never tell the user "still waiting on Dev" after a final subagent_notification has already arrived.
Invariant 2 — Close is explicit
Single-shot subagents return one final response, but their Codex panels may remain open until Lead closes them. There is no shutdown_request, no handshake, no TeamDelete. After consuming the spawn result, Lead calls close_agent(target=<agent_id>), then clears state.teammates.{role} and marks state.codex_agents.{role}.status = "closed".
Doctrine precedence
If any per-step procedure elsewhere in this skill describes a shutdown that waits for approval or any indefinite block — this doctrine OVERRIDES that procedure.
Flags
Parse from $ARGUMENTS:
| Flag | Effect | |
|---|---|---|
--solo | No team, no agents. Lead works directly. Old bx:dev behavior. | |
--careful | Adds QA phase after review passes. | |
--no-review | Skip reviewers entirely for the whole session. | |
--plan-approve | Dev waits for user OK before coding (default: show plan, proceed immediately). | |
--sop | DEPRECATED no-op. Squash-on-push is now the default; this flag is accepted for backward compatibility and silently ignored. Use --no-sop to opt out. | |
--no-sop | Disable default squash. Push uses --merge (preserves all per-task commits in dev log) instead of --squash. |
Public Spawn Syntax
Use natural-language spawn requests in public instructions:
If an implementation exposes an internal primitive named spawn_agent(...), treat examples of that shape as pseudocode for the runtime, not callable public syntax. Regardless of the surface, record the returned agent_id in state.codex_agents.<role> = {agent_id, role, status:"running"} before waiting, and keep state.teammates.<role> as the human-readable logical role label.
Role priority
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/bx-dev/SKILL.md
Popularity
- Repository stars
- 23
- Repository forks
- 6
- 7-day trend score
- 16
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/bish-x/bx-dev-skill/bx-dev)