Gsd-2 gsd-orchestrator
git clone https://github.com/gsd-build/gsd-2
T=$(mktemp -d) && git clone --depth=1 https://github.com/gsd-build/gsd-2 "$T" && mkdir -p ~/.claude/skills && cp -r "$T/gsd-orchestrator" ~/.claude/skills/gsd-build-gsd-2-gsd-orchestrator && rm -rf "$T"
gsd-orchestrator/SKILL.md<mental_model> GSD headless is a subprocess you launch and monitor. Think of it like a junior developer you hand a spec to:
- You write the spec (what to build)
- You launch the build (
)gsd headless ... new-milestone --context spec.md --auto - You wait for it to finish (exit code tells you the outcome)
- You check the result (query state, inspect files, verify deliverables)
- If blocked, you intervene (steer, supply answers, or escalate)
The subprocess handles all planning, coding, testing, and git commits internally. You never write application code yourself — GSD does that. </mental_model>
<critical_rules>
- Flags before command.
. Flags after the command are ignored.gsd headless [--flags] [command] [args] - Redirect stderr. JSON output goes to stdout. Progress goes to stderr. Always
when parsing JSON.2>/dev/null - Check exit codes. 0=success, 1=error, 10=blocked (needs you), 11=cancelled.
- Use
to poll. Instant (~50ms), no LLM cost. Use it between steps, notquery
for status.auto - Budget awareness. Track
from query results. Set limits before launching long runs.cost.total - One project directory per build. Each GSD project needs its own directory with a
folder. </critical_rules>.gsd/
Build something from scratch: Read
workflows/build-from-spec.md — write spec, init directory, launch, monitor, verify.
Check on a running or completed build: Read
workflows/monitor-and-poll.md — query state, interpret phases, handle blockers.
Execute with fine-grained control: Read
workflows/step-by-step.md — run one unit at a time with decision points.
Understand the JSON output: Read
references/json-result.md — field reference for HeadlessJsonResult.
Pre-supply answers or secrets: Read
references/answer-injection.md — answer file schema and injection mechanism.
Look up a specific command: Read
references/commands.md — full command reference with flags and examples.
</routing>
<quick_reference>
Launch a full build (spec to working code):
mkdir -p /tmp/my-project && cd /tmp/my-project && git init cat > spec.md << 'EOF' # Your Product Spec Here Build a ... EOF gsd headless --output-format json --context spec.md new-milestone --auto 2>/dev/null
Check project state (instant, free):
cd /path/to/project gsd headless query | jq '{phase: .state.phase, progress: .state.progress, cost: .cost.total}'
Resume work on an existing project:
cd /path/to/project gsd headless --output-format json auto 2>/dev/null
Run one step at a time:
RESULT=$(gsd headless --output-format json next 2>/dev/null) echo "$RESULT" | jq '{status: .status, phase: .phase, cost: .cost.total}'
</quick_reference>
<exit_codes>
| Code | Meaning | Your action |
|---|---|---|
| Success | Check deliverables, verify output, report completion |
| Error or timeout | Inspect stderr, check , retry or escalate |
| Blocked | Query state for blocker details, steer around it or escalate to human |
| Cancelled | Process was interrupted — resume with or restart |
| </exit_codes> |
<project_structure> GSD creates and manages all state in
.gsd/:
.gsd/ PROJECT.md # What this project is REQUIREMENTS.md # Capability contract DECISIONS.md # Architectural decisions (append-only) KNOWLEDGE.md # Persistent project knowledge (patterns, rules, lessons) STATE.md # Current phase and next action milestones/ M001-xxxxx/ M001-xxxxx-CONTEXT.md # Scope, constraints, assumptions M001-xxxxx-ROADMAP.md # Slices with checkboxes M001-xxxxx-SUMMARY.md # Completion summary slices/S01/ S01-PLAN.md # Tasks S01-SUMMARY.md # Slice summary tasks/ T01-PLAN.md # Individual task spec T01-SUMMARY.md # Task completion summary
State is derived from files on disk — checkboxes in ROADMAP.md and PLAN.md are the source of truth for completion. You never need to edit these files. GSD manages them. But you can read them to understand progress. </project_structure>
<flags> | Flag | Description | |------|-------------| | `--output-format <fmt>` | `text` (default), `json` (structured result at exit), `stream-json` (JSONL events) | | `--json` | Alias for `--output-format stream-json` — JSONL event stream to stdout | | `--bare` | Skip CLAUDE.md, AGENTS.md, user settings, user skills. Use for CI/ecosystem runs. | | `--resume <id>` | Resume a prior headless session by its session ID | | `--timeout N` | Overall timeout in ms (default: 300000, use 0 to disable) | | `--model ID` | Override LLM model | | `--supervised` | Forward interactive UI requests to orchestrator via stdout/stdin | | `--response-timeout N` | Timeout (ms) for orchestrator response in supervised mode (default: 30000) | | `--answers <path>` | Pre-supply answers and secrets from JSON file | | `--events <types>` | Filter JSONL to specific event types (comma-separated, implies `--json`) | | `--verbose` | Show tool calls in progress output | | `--context <path>` | Spec file path for `new-milestone` (use `-` for stdin) | | `--context-text <text>` | Inline spec text for `new-milestone` | | `--auto` | Chain into auto-mode after `new-milestone` | </flags><answer_injection> Pre-supply answers and secrets for fully autonomous runs:
gsd headless --answers answers.json --output-format json auto 2>/dev/null
{ "questions": { "question_id": "selected_option" }, "secrets": { "API_KEY": "sk-..." }, "defaults": { "strategy": "first_option" } }
- questions — question ID to answer (string for single-select, string[] for multi-select)
- secrets — env var to value, injected into child process environment
- defaults.strategy —
(default) or"first_option"
for unmatched questions"cancel"
See
references/answer-injection.md for the full mechanism.
</answer_injection>
<event_streaming> For real-time monitoring, use JSONL event streaming:
gsd headless --json auto 2>/dev/null | while read -r line; do TYPE=$(echo "$line" | jq -r '.type') case "$TYPE" in tool_execution_start) echo "Tool: $(echo "$line" | jq -r '.toolName')" ;; extension_ui_request) echo "GSD: $(echo "$line" | jq -r '.message // .title // empty')" ;; agent_end) echo "Session ended" ;; esac done
Filter to specific events:
--events agent_end,execution_complete,extension_ui_request
Available types:
agent_start, agent_end, tool_execution_start, tool_execution_end,
tool_execution_update, extension_ui_request, message_start, message_end,
message_update, turn_start, turn_end, cost_update, execution_complete.
</event_streaming>
<all_commands>
| Command | Purpose |
|---|---|
| Run all queued units until milestone complete or blocked (default) |
| Run exactly one unit, then exit |
| Instant JSON snapshot — state, next dispatch, costs (no LLM, ~50ms) |
| Create milestone from spec file |
| Force specific phase (research, plan, execute, complete, reassess, uat, replan) |
/ | Control auto-mode |
| Hard-steer plan mid-execution |
/ | Unit control |
| Queue/reorder milestones |
| View execution history |
| Health check + auto-fix |
| Add persistent project knowledge |
See
references/commands.md for the complete reference.
</all_commands>