Install once, use in every project. Kiro-style SDD workflow for Claude Code's terminal mode in VS Code.
agents/
orchestrator.md # Lifecycle coordinator — the only user-invocable agent
requirements-agent.md # Owns requirements.md, EARS syntax
design-agent.md # Owns design.md, requirement traceability
tasks-agent.md # Owns tasks.md, hierarchical task breakdown
spec-consistency-checker.md # Read-only cross-document auditor, runs before implementation
task-executor.md # Implements one task, worktree-isolated
task-tester.md # Writes tests for one task
task-validator.md # Validates implementation + tests against requirements, pass/fail
code-reviewer.md # Adversarial correctness/robustness review, per task + whole feature
security-reviewer.md # Security review (authz, secrets, injection, cloud exposure)
vault-reader.md # Read-only knowledge-vault interface, distills to a report
vault-writer.md # The only writer to the knowledge vault, audited choke-point
github-agent.md # The only writer to the remote (branches/PRs/labels), audited choke-point
commands/
sdd-init.md # /sdd-init — scaffold .specs/ in any project
sdd-feature.md # /sdd-feature <name> — create a new feature spec
sdd-status.md # /sdd-status — show progress across all features
sdd-resume.md # /sdd-resume <name> — resume work on a feature
hooks/ # Secret-handling safeguards (installed manually — see hooks/README.md)
secret-guard.py # PreToolUse: blocks secret dumps, allows sanctioned use
secret-redact.py # PostToolUse: scrubs secret-shaped strings from Bash output
ci-templates/ # CI enforcement layer — distributed by /sdd-init, dogfooded in .github/
workflows/
sdd-secret-scan.yml # Fails the check when a secret is detected in the diff
sdd-review-gate.yml # Requires ready-to-merge + no blocked:* label on PRs to main
sdd-build-test-lint.yml # Runs the project's build/test/lint entrypoint
scripts/
sdd-secret-scan.py # Shared scanner — same code the pre-push hook runs locally
hooks/
pre-push # Advisory local fast-feedback hook (mirrors the CI gates)
CLAUDE.md # Global instructions loaded in every session
steering-templates/ # Reference copies of default steering files
product.md
tech.md
structure.md
- Claude Code v2.1.32 or later (
claude --version) - VS Code with the Claude Code extension (by Anthropic)
- Opus 4.6 or later (for agent team orchestration). Agents are model-tiered via
model:frontmatter: Opus for planning (requirements, design) and for review (code-reviewer, security-reviewer — never downgraded, since a missed defect is a silent failure), Sonnet for the rest. The task-executor escalates to Opus automatically on a retry after a validator failure. - Python 3 on
PATH— only if you enable the secret-handling hooks (see below).
git clone <repo-url> sdd-global
cd sdd-global
chmod +x install.sh
./install.shOr if you downloaded the archive:
tar xzf sdd-global.tar.gz
cd sdd-global
chmod +x install.sh
./install.shThe installer will:
- Copy all 13 agents to
~/.claude/agents/ - Copy all 4 slash commands to
~/.claude/commands/ - Install the global CLAUDE.md to
~/.claude/CLAUDE.md- If you already have one, it offers to overwrite, append, or skip
- Check if
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMSis set- Offers to add it to your shell profile if missing
- Print VS Code settings.json recommendations
The installer does not set up the secret-handling hooks or
permissions.denyrules — those are machine-level config in~/.claude/settings.json. Enable them separately followinghooks/README.md. See Security & secret handling.
Open VS Code settings (Cmd+, or Ctrl+,) and add:
{
"claudeCode.useTerminal": true,
"claudeCode.environmentVariables": [
{
"name": "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS",
"value": "1"
}
]
}Source your shell profile or open a new terminal so the environment variable takes effect:
source ~/.zshrc # or ~/.bashrc, depending on your shellclaude --version
# v2.1.32 or later
echo $CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS
# 1claude
> /sdd-init
This creates .specs/steering/ with template files and .specs/features/ for your specs. Fill in the steering templates with your project's context.
> /sdd-feature user-auth
Or just say:
> New feature: user authentication with email and OAuth
The orchestrator walks you through:
- Requirements — clarifying questions, then EARS-format requirements → you confirm
- Design — architecture with requirement traceability → you confirm
- Tasks — hierarchical task list with testing sub-tasks → you confirm
- Consistency check — runs automatically after tasks are confirmed. An independent, read-only auditor cross-checks requirements ↔ design ↔ tasks ↔ steering. A FAIL blocks implementation until the flagged issues are resolved; no extra action needed on PASS.
- Implementation — per task, a five-stage pipeline:
executor → tester → validator → code-reviewer → security-reviewer. The validator checks spec conformance; the two reviewers (which run only after the validator passes) hunt the bugs and security holes a requirement-anchored check misses by construction. Any blocking review finding sends the task back to the executor on retry. - Feature review — runs automatically after the last task, before the feature is marked complete. The code-reviewer and security-reviewer review the whole feature diff for composition-level issues (integration seams, dead code, cross-task exposure) no per-task pass can see. A blocking finding halts completion until resolved or explicitly overridden.
Each planning phase requires your explicit confirmation; the consistency check, the per-task
reviews, and the feature review are automatic gates. The state is saved to .spec-state.json so you can resume anytime.
> /sdd-resume user-auth
Or in a new session:
> Resume feature: user-auth
> /sdd-status
Everything installs to ~/.claude/:
~/.claude/
├── CLAUDE.md # Global — loaded in every session
├── agents/ # Global — available in every project
│ ├── orchestrator.md
│ ├── requirements-agent.md
│ ├── design-agent.md
│ ├── tasks-agent.md
│ ├── spec-consistency-checker.md
│ ├── task-executor.md
│ ├── task-tester.md
│ ├── task-validator.md
│ ├── code-reviewer.md
│ ├── security-reviewer.md
│ ├── vault-reader.md
│ ├── vault-writer.md
│ └── github-agent.md
├── commands/ # Global — available in every project
│ ├── sdd-init.md
│ ├── sdd-feature.md
│ ├── sdd-status.md
│ └── sdd-resume.md
├── hooks/ # Secret-handling safeguards (manual install)
│ ├── secret-guard.py
│ └── secret-redact.py
└── settings.json # Machine config: permissions.deny + hook registration
Project-level files override global ones if they share the same name. So if a specific project needs a custom orchestrator, put it in <project>/.claude/agents/orchestrator.md and it takes priority.
Per-project artifacts live in the project repo:
<project>/
├── CLAUDE.md # Project-specific (optional, additive to global)
└── .specs/
├── steering/
│ ├── product.md # Product context
│ ├── tech.md # Stack and conventions
│ └── structure.md # Codebase layout
└── features/
└── <feature-name>/
├── requirements.md
├── design.md
├── tasks.md
└── .spec-state.json # gitignored
Agents run with real tools, so a secret they read (a .env, an API key, a private key) would
otherwise persist forever in the transcript. The framework treats secret values like the
knowledge vault — they never enter context — while still letting agents use secrets to do real
work (ssh, authenticated curl, API calls). Four layers, all enforced globally for the main session
and every subagent:
- Deny reads —
permissions.denyin~/.claude/settings.jsonblocks reading known secret stores (.env,~/.aws,~/.ssh,~/.kube,~/.config/gcloud,service-account*.json,*.tfvars,kubeconfig,*.pem/*.key,.netrc). - Use, don't read — agents reference secrets by env-var name (
$TOKEN,os.environ,python-dotenv) or let a binary read the key (ssh -i,curl --cert), so the value flows through the process, never the transcript. This is the "Secret Handling" section inCLAUDE.mdand in each agent. SECRET REQUESTescalation — when an agent needs a secret it can't get safely, it halts and returnsSECRET REQUEST: <need>(mirroringVAULT REQUEST) rather than guessing or working around a block. The operator provisions the env var (shellexportor a gitignored.env) and the agent is re-invoked.- Hooks (
hooks/) —secret-guard.py(PreToolUse) blocks secret dumps likeprintenvandcat .envwhile allowing sanctioned use;secret-redact.py(PostToolUse) scrubs secret-shaped strings from Bash output as a backstop.
Layers 1–3 ship in the agents/CLAUDE.md and are installed by install.sh. Layer 4 (hooks) and
the deny list are machine config and must be enabled manually — see hooks/README.md
for the exact settings.json block.
The framework bridges the local SDD lifecycle to GitHub through a single audited choke-point and a CI layer that re-runs the quality gates server-side.
-
github-agent— the remote scribe. Built in the exact shape ofvault-writer,github-agentis the only component that runsghorgit push. Invoked only by the orchestrator, it performs the remote mechanics — create/switch branches, commit and push to a feature branch, open and update pull requests (as draft during active development), transcribe existing validator/reviewer verdicts verbatim into PR comments, and set/clear labels. It is a scribe, not an author: it never invents content, never judges quality, and never merges. Tokens are used, never read —ghreadsGH_TOKEN/GITHUB_TOKENby name, and a missing token triggers aSECRET REQUESThalt (same "use, don't read" discipline as the secret-handling layer above). Thesecret-guard.pyhook additionally blocks GitHub-token dump vectors (e.g.gh auth token,printenv GH_TOKEN) while leaving sanctionedghuse untouched. -
Human merge gate. Merge to a protected branch (
main) is always a human action — no agent merges. It is gated by theready-to-mergelabel, which the orchestrator hasgithub-agentapply only after a whole-feature review passes. A blocking finding at any pipeline stage sets ablocked:<stage>label (blocked:validation,blocked:code-review,blocked:security-review,blocked:feature-review) and keeps the PR in draft; the label is cleared when the finding is resolved. -
Three CI workflow gates (
ci-templates/workflows/), each its own file so a future gate slots in without touching the others:sdd-secret-scan— runs the shared scanner (ci-templates/scripts/sdd-secret-scan.py) over the changed diff and fails the check when a secret is detected, reporting each match by type andpath:line, never the value. The scanner supports an inlinepragma: allowlist secretsuppression (which drops only its own line) and an explicit path-exclude list for the framework's own pattern/fixture files, so its detection stays tight without false positives on itself.sdd-review-gate— runs on pull requests tomainand fails unless theready-to-mergelabel is present and noblocked:*label remains. This is the server-side backstop to the human merge gate. Branch protection onmainmust require thesdd-review-gatecheck — the job'sname:issdd-review-gateso the required-check name can be pinned exactly.sdd-build-test-lint— runs the project's build/test/lint entrypoint (scripts/ci.shif present) and fails on any failure.
-
Pre-push hook.
ci-templates/hooks/pre-pushruns the same secret scanner and build/test/lint entrypoint locally before a push and blocks the push (non-zero exit) on failure, naming the failing check. It is the advisory fast-feedback layer; CI mirrors — never replaces — the local gates: even if the hook is absent or bypassed with--no-verify, the identical checks run in CI as the mandatory backstop. -
Distribution & dogfood.
/sdd-initdrops the workflow templates into a downstream project's.github/workflows/and makes the pre-push hook available, appending missing files without overwriting existing ones (idempotent, non-destructive).install.shoptionally installs the pre-push hook into the current repo. This repository dogfoods the same layer in its own.github/.
cd sdd-global
chmod +x uninstall.sh
./uninstall.shRemoves agents and commands. Leaves ~/.claude/CLAUDE.md intact (remove SDD sections manually if needed).
- Start fresh sessions between phases. The
.spec-state.jsoncarries progress. Don't run the whole lifecycle in one conversation — that's how you get context rot. - Use
/compactaggressively. When context fills past 50%, compress. - Opus for planning, Sonnet for execution. Model tiering ships in each agent's
model:frontmatter: Opus for requirements/design, Sonnet for tasks/execution/validation. The task-executor auto-escalates to Opus on a retry after a validator failure. Override per agent by editing its frontmatter. - Worktrees for parallel tasks. The task-executor has
isolation: worktree. For manual parallel work:claude --worktree task-3-api. - Never paste secrets into the chat. Provision them via a shell
exportor a gitignored.env; agents reference them by env-var name and escalate withSECRET REQUESTwhen one is missing. See Security & secret handling. - Keep the knowledge vault out of the main session. If your project has a large curated Obsidian/markdown vault, never read it into the orchestrator. Set its root under "Knowledge Vault" in
.specs/steering/tech.md; the orchestrator brokers all access throughvault-reader(reads → distilled report on disk) andvault-writer(the only writer). The bulk content lives and dies in the subagent's context, so the main session never bloats.