One-time per-repo configuration. Produces .atdd-pipeline.json at the repo root, which every other skill reads at the top of its workflow.
When to use
- First time the plugin runs in a repo.
- After moving the repo to a different tracker.
- Whenever
.atdd-pipeline.jsonis missing.
Interview
Ask, in order. If the answer is unclear, push back; do NOT guess.
- Tracker. Where do scenario sub-issues live?
github—ghCLI, parent / US / scenario hierarchy.local— markdown files under.atdd/issues/(no remote tracker, for offline / personal use).
- Repo for GitHub (only if tracker=github). Default: current
gh repo viewtarget. - Spec base path. Where to write
context.mdand.featurefiles. Default:specs/. - Test path conventions. One path per test level, used by
red-cycleto place new tests:use-case(default:tests/use-case/)e2e(default:tests/e2e/)ui(default:tests/ui/)
- Commit style.
conventional(default) orfreeform. - Reviewer execution.
parallel(default; uses theAgenttool on Claude Code) orsequential(Codex default, or low-budget mode). 6b. Stage 3 execution mode (stage3_mode).sequential(default; one scenario at a time) orworkflow(opt-in, experimental, Claude Code only — produces all scenarios in parallel via the shippedatdd-stage3dynamic workflow, serializing only the merge).workflowsilently falls back tosequentialwhen the Workflow tool is unavailable. Leave itsequentialunless you have readworkflows/atdd-stage3.workflow.mjsand want the parallel path. - Shared-language file. Default:
CONTEXT.mdat repo root. If absent, propose creating one and offergrill-with-docsfrom mattpocock skills as the way to populate it. - ADR directory. Default:
docs/adr/. Reviewers consult these. - Trunk branch. Default:
main. The final PR targets this; sub-PRs MUST NOT target it. - Integration branch pattern. Default:
atdd/<us-slug>/integration. Sub-PRs (one per scenario) target this branch; once all are merged, the orchestrator opens a single PR from this branch totrunk_branchand stops. - Auto-merge of sub-PRs. Default:
enabled. Knobs:idle_window_minutes(default5) — bot inactivity before considering review complete.max_fix_iterations(default3) — cap on/apply-pr-feedbackcycles per sub-PR.watch_timeout_minutes(default60) — wall-clock cap per sub-PR.merge_method(defaultsquash).bot_logins— extra login allowlist beyond GitHub'suser.type == "Bot"(defaults includecoderabbitai,coderabbitai[bot],github-actions[bot],codex,codex-bot).
Output
Write .atdd-pipeline.json at the repo root:
{
"version": 1,
"tracker": {
"kind": "github",
"repo": "owner/name"
},
"paths": {
"specs": "specs/",
"tests": {
"use-case": "tests/use-case/",
"e2e": "tests/e2e/",
"ui": "tests/ui/"
},
"context": "CONTEXT.md",
"adr": "docs/adr/"
},
"commits": "conventional",
"reviewers": {
"mode": "parallel"
},
"stage3_mode": "sequential",
"trunk_branch": "main",
"integration_branch_pattern": "atdd/{us_slug}/integration",
"auto_merge": {
"enabled": true,
"idle_window_minutes": 5,
"max_fix_iterations": 3,
"watch_timeout_minutes": 60,
"merge_method": "squash",
"bot_logins": [
"coderabbitai",
"coderabbitai[bot]",
"github-actions[bot]",
"codex",
"codex-bot"
]
}
}
Idempotency
If .atdd-pipeline.json already exists, read it, present the current values, ask only for fields the user wants to change. Never silently overwrite.
Sanity checks (post-write)
gh auth status(when tracker=github). Warn if not authenticated.- Each
paths.tests.*directory exists or its parent exists. If neither, ask before creating. paths.contextexists. If not, suggest invokinggrill-with-docsto bootstrap it.trunk_branchexists locally and on the remote (git rev-parse --verify origin/<trunk>). Warn otherwise.auto_merge.enabled == trueANDgh pr merge --helpsupports the chosenmerge_methodflag.
Handoff
After completion, suggest the next step: /atdd-run <us-slug> to drive the full pipeline, or /impact-map to capture a new story.