{"id":49196858,"url":"https://github.com/ikunin/sprintpilot","last_synced_at":"2026-05-30T22:00:59.772Z","repository":{"id":352014024,"uuid":"1213458411","full_name":"ikunin/sprintpilot","owner":"ikunin","description":"Sprint autopilot for BMad Method — drives stories from plan to PR-ready code with git worktrees, commits, and   stacked PRs. Plus 7 multi-agent skills: code review, codebase mapping, tech-debt assessment, reverse-architecture, migration planning, research, and multi-persona debate.","archived":false,"fork":false,"pushed_at":"2026-05-27T21:32:21.000Z","size":15025,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-27T22:17:27.985Z","etag":null,"topics":["autonomous-agents","bmad-method-addon","claude-code","code-review","codebase-analysis","cursor","git-workflow","migration-planning","multi-agent","sprint-autopilot"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/sprintpilot","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ikunin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-17T12:00:50.000Z","updated_at":"2026-05-27T21:32:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ikunin/sprintpilot","commit_stats":null,"previous_names":["ikunin/sprintpilot"],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/ikunin/sprintpilot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikunin%2Fsprintpilot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikunin%2Fsprintpilot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikunin%2Fsprintpilot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikunin%2Fsprintpilot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ikunin","download_url":"https://codeload.github.com/ikunin/sprintpilot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikunin%2Fsprintpilot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33711018,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["autonomous-agents","bmad-method-addon","claude-code","code-review","codebase-analysis","cursor","git-workflow","migration-planning","multi-agent","sprint-autopilot"],"created_at":"2026-04-23T11:33:24.878Z","updated_at":"2026-05-30T22:00:59.765Z","avatar_url":"https://github.com/ikunin.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sprintpilot — Autopilot \u0026 Multi-Agent Addon for BMad Method\n\n[![npm version](https://img.shields.io/npm/v/@ikunin/sprintpilot.svg?style=flat)](https://www.npmjs.com/package/@ikunin/sprintpilot)\n[![npm downloads](https://img.shields.io/npm/dm/@ikunin/sprintpilot.svg?style=flat)](https://www.npmjs.com/package/@ikunin/sprintpilot)\n[![License Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg?style=flat)](LICENSE)\n[![BMad Method](https://img.shields.io/badge/BMad%20Method-v6.2%2B-green.svg?style=flat)](https://github.com/bmad-code-org/BMAD-METHOD)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D20.12-brightgreen.svg?style=flat)](https://nodejs.org)\n[![Tools](https://img.shields.io/badge/tools-9%20supported-orange.svg?style=flat)](#compatibility)\n\nSprintpilot drives [BMad Method](https://github.com/bmad-code-org/BMAD-METHOD) v6 sprints to completion autonomously. One slash command turns your sprint plan into reviewed, tested, PR-ready code — story by story, with full git workflow.\n\n\u003e **Independent project.** Sprintpilot is not affiliated with or endorsed by BMad Code, LLC. See [TRADEMARK.md](TRADEMARK.md).\n\u003e Migrating from `bmad-autopilot-addon` v1? See [MIGRATION.md](MIGRATION.md).\n\n## What it does\n\nPer story, in one autonomous loop:\n\n- Creates an isolated worktree + branch, runs `bmad-dev-story` TDD-style (RED then GREEN), lints changed files only.\n- Stages explicitly (never `git add -A`), commits with a conventional message, runs **three parallel reviewers** on the diff.\n- Auto-applies every PATCH finding as a separate commit, pushes, opens a PR (or merges directly, or lands as you go — your choice).\n- Moves to the next story. At end-of-epic, writes a retrospective and lists PRs ready to merge.\n\nThe orchestrator (`_Sprintpilot/bin/autopilot.js`) is a deterministic Node state machine. It decides what runs next and enforces BMad's 7-step cycle. The LLM owns in-skill execution and small-judgment decisions. BMad skills are invoked verbatim — Sprintpilot never invents workflows of its own.\n\n## Quick Start\n\n```bash\n# 1. Install BMad Method (interactive — pick your tool when prompted)\nnpx bmad-method install --modules bmm,tea\n\n# 2. Install Sprintpilot (interactive — pick tool + complexity profile)\nnpx @ikunin/sprintpilot@latest\n\n# 3. In your IDE chat:\n/sprint-autopilot-on\n```\n\n**What you'll see next.** The orchestrator emits one BMad skill at a time and the LLM executes it. First skill is `bmad-create-story` for the next pending story in `sprint-status.yaml`. You'll watch RED→GREEN tests (scoped to affected files by default — `vitest --changed`, `jest --findRelatedTests`, `pytest --testmon`; CI runs the full suite as the safety net), a 3-reviewer review pass, patch commits, and a push or PR. The autopilot drives until `session_story_limit` stories are done (default 3), then halts cleanly. Re-run `/sprint-autopilot-on` to continue.\n\n**Start at a specific story or epic:**\n\n```\n/sprint-autopilot-on epic 4\n/sprint-autopilot-on stories 3.1, 3.2, 4.5\n/sprint-autopilot-on 4-8-realm-wide-matcher-and-session-lock\n/sprint-autopilot-on voice identity matcher\n```\n\nThe skill resolves the natural-language directive against `sprint-status.yaml` and queues the matching stories. Ambiguous matches surface a candidate list — never picks arbitrarily.\n\n**Non-interactive install:**\n\n```bash\nnpx @ikunin/sprintpilot@latest install --tools claude-code --profile medium --yes\n```\n\nRuns on Windows, macOS, and Linux.\n\n## Choose your workflow\n\nOne config decision shapes how code reaches `main`. Pick once at install (or edit `_Sprintpilot/modules/git/config.yaml` later):\n\n| Mode | When to use | One PR per | Code reaches `main` |\n|---|---|---|---|\n| **Stacked PRs** *(default)* | Team workflow where every story needs review before it lands | story | After human PR approval \u0026 merge |\n| **Land-as-you-go** | Solo / fast-iteration sprint, no end-of-sprint merge marathon | story | Right after each story (CI / review gated) |\n| **Direct merge** | Prototype, tutorial, internal tool without CI | — *(no PR opened)* | Right after each story's push |\n| **Reuse your branch** | Feature-branch workflow where you already have the branch | sprint | After human PR approval \u0026 merge |\n\nAll modes use isolated worktrees (`.worktrees/\u003cstory-key\u003e/`) so `main` never has half-finished story code. ASCII diagrams of each mode are in [Git workflow](#git-workflow-detailed) below.\n\n## Choose your profile\n\nThe right amount of process for a 2-story bugfix is different from a 30-story rebuild. One knob picks the balance:\n\n| Profile | Per-story flow | Branching | Parallel | Use it for |\n|---|---|---|---|---|\n| `nano` | `bmad-quick-dev` (one-shot) | one PR per epic | n/a | Tiny patch sprints, hot-fix runs |\n| `small` | Full 7-step BMad cycle | one PR per story | off | Single-developer projects, ≤ 10 stories |\n| `medium` *(default)* | Full 7-step BMad cycle | one PR per story | off | Most sprints — balanced |\n| `large` | Full 7-step BMad cycle | one PR per story | **on** (Claude Code) | Multi-epic sprints, 20+ stories |\n| `legacy` | Pinned legacy behavior | one PR per story | off | Existing installs that want zero change |\n\nPick at install: `--profile \u003cname\u003e`. Missing profile defaults to `medium`.\n\n**Nano safety net:** if `bmad-quick-dev` tests fail or its review classifies a finding as `high` severity, the autopilot escalates that session to the full 7-step cycle (session-scoped, never written back to config).\n\n## Running a session\n\nThe autopilot scans the host chat for your interjections every turn — you can steer it without learning a command vocabulary:\n\n- *\"skip this story, the spec is wrong\"* → `skip_story`\n- *\"close out epic 4 with retro, the remaining stories are deferred\"* → `trigger_retrospective`\n- *\"pause\"* → `pause` (halts cleanly; resume with `/sprint-autopilot-on`)\n- *\"continue, the diff is fine\"* → `force_continue` (accept a `verify_rejected` or `resume_divergence`)\n\nThe LLM maps your phrasing to the right command + arguments and emits a `user_input` signal. Full command vocabulary in [docs/USAGE.md](docs/USAGE.md#user-commands).\n\n### When it halts\n\nThe autopilot drives until one of these conditions is true:\n\n1. **`session_story_limit` reached** (default 3, nano 5) — checkpoints state, prints the handoff report, releases the lock. Re-run `/sprint-autopilot-on` to continue.\n2. **Sprint complete** — runs end-of-sprint cleanup, prints the final report. Done.\n3. **One of the 5 true blockers** — `creative_user_input_required`, `new_external_dependency`, `security_architectural_decision`, `contradictory_acceptance_criteria`, or 3 consecutive test failures with no forward progress. Halts with a `user_prompt`. Answer it and resume.\n4. **Retry budget exhausted on a single phase** — halts with the underlying issue surfaced. Inspect, fix, resume.\n5. **You explicitly pause** — `/pause` or any natural-language pause instruction.\n\nEverything else — the autopilot decides, logs the decision in one sentence to `decision-log.yaml`, and moves on.\n\n## Configuration\n\n### By use case\n\nMost projects only ever change a handful of settings. Pick the change you want, edit the listed key:\n\n**I want each story to land on `main` as soon as it's reviewed**\n→ `git.merge_strategy: land_as_you_go` (file: `_Sprintpilot/modules/git/config.yaml`)\n→ Optional: `git.land_when: ci_pass | ci_and_review | no_wait`\n\n**I want every story reviewed before it lands**\n→ Keep the default `git.merge_strategy: stacked`\n\n**I'm working on my own feature branch and want one PR at sprint-end**\n→ `git.reuse_user_branch: true`\n\n**I don't want PRs — merge directly to base**\n→ `git.push.create_pr: false`\n\n**I want lint failures to halt the sprint until fixed**\n→ `git.lint.enabled: true` + `git.lint.blocking: true` (file: `_Sprintpilot/modules/git/config.yaml`)\n→ Lint runs `scripts/post-green-gates.js` after `dev_green` verify passes.\n\n**My sprint is a hotfix or 1-2 small changes**\n→ `complexity_profile: nano` (file: `_Sprintpilot/modules/autopilot/config.yaml`)\n\n**My sprint is 20+ stories**\n→ `complexity_profile: large` — enables parallel story dispatch on Claude Code\n\n**I want the autopilot to run more (or fewer) stories before checkpointing**\n→ `autopilot.session_story_limit: \u003cN\u003e` — `0` is unlimited\n\n**I want to inspect worktrees after epic merge instead of auto-cleaning**\n→ `git.worktree.cleanup_on_merge: false`\n\n### Reference table\n\n| Setting | File | Default | What it controls |\n|---|---|---|---|\n| `complexity_profile` | `autopilot/config.yaml` | `medium` | Per-story flow + which optimization layers are enabled |\n| `autopilot.session_story_limit` | `autopilot/config.yaml` | `3` (nano: `5`) | Stories per session before checkpoint. `0` = unlimited |\n| `autopilot.retrospective_mode` | `autopilot/config.yaml` | `auto` | `auto` / `stop` / `skip` |\n| `git.merge_strategy` | `git/config.yaml` | `stacked` | `stacked` / `land_as_you_go` |\n| `git.push.create_pr` | `git/config.yaml` | `true` | `false` = direct merge to base |\n| `git.reuse_user_branch` | `git/config.yaml` | `false` | Commit every story onto the current user branch |\n| `git.land_when` | `git/config.yaml` | `ci_pass` | Land-as-you-go gating: `no_wait` / `ci_pass` / `ci_and_review` |\n| `git.land_wait_minutes` | `git/config.yaml` | `30` | Max wait for CI / review before halting |\n| `git.branch_prefix` | `git/config.yaml` | `story/` | Prefix for autopilot-created branches |\n| `git.lint.enabled` | `git/config.yaml` | `false` | Run post-GREEN lint pipeline |\n| `git.lint.blocking` | `git/config.yaml` | `false` | Lint failures reject verify (LLM fix-loops) |\n| `git.lint.output_limit` | `git/config.yaml` | `100` | Lines of lint output injected back as context |\n| `git.lint.linters.\u003clang\u003e` | `git/config.yaml` | (auto-detect) | Per-language preference; `[]` disables; `javascript` + `typescript` merge into `js-ts` |\n| `git.lock.stale_timeout_minutes` | `git/config.yaml` | `30` | `.autopilot.lock` older than this is auto-taken-over; `0` disables |\n| `git.worktree.health_check_on_boot` | `git/config.yaml` | `true` | Halt on orphan worktrees at session start |\n| `git.worktree.cleanup_on_merge` | `git/config.yaml` | `true` | Remove `.worktrees/\u003ckey\u003e/` after epic merge |\n| `ma.enabled` | `ma/config.yaml` | `true` | Enable parallel agent skills |\n\n**Profile-level overrides** — `parallel_stories`, `state_sharding`, `phase_timings`, `cache_shared_reads`, `conditional_boot_work` live in `_Sprintpilot/modules/autopilot/profiles/\u003cprofile\u003e.yaml`. Their effective value depends on the active `complexity_profile`.\n\nFull reference: [docs/CONFIGURATION.md](docs/CONFIGURATION.md).\n\n## Sessions\n\nA long sprint doesn't fit in one LLM context. The autopilot checkpoints every N stories, prints a handoff report, and resumes exactly where it left off in a fresh session.\n\n**Resume divergence detection.** On the next `autopilot start`, the orchestrator fingerprints `_bmad-output/`, `sprint-status.yaml`, and branch HEADs against the fingerprint stamped at the last halt. Two escape paths proceed without manual surgery:\n\n- **External-completion auto-acknowledge** — when the persisted `current_story` is `done` in sprint-status (you merged it manually, hot-fix, UI action), the stale identity is cleared and the next pending story is picked.\n- **`--accept-divergence` flag** — catch-all for divergence the auto-path doesn't cover.\n\n**Crash recovery.** On every boot, the autopilot health-checks `.worktrees/`. Orphan worktrees from crashed sessions are detected and surfaced. Stale `.autopilot.lock` files (older than `stale_timeout_minutes`) are auto-taken-over.\n\n**Fresh-context finalize.** When the last story hits `STORY_DONE`, the state machine transitions to `sprint_finalize_pending` instead of running cleanup in the same session. The next `/sprint-autopilot-on` reads the marker, runs deterministic cleanup with a clean context. One short extra session (~60–100 turns) for reliable end-of-sprint hygiene.\n\nFull handoff report format + ledger semantics: [docs/USAGE.md](docs/USAGE.md#handoff-report).\n\n## Skills\n\n| Command | What it does |\n|---|---|\n| `/sprint-autopilot-on` | Engage autonomous sprint execution |\n| `/sprint-autopilot-off` | Disengage and show status |\n| `/sprintpilot-update` | Check for updates and install the latest version |\n| `/sprintpilot-codebase-map` | 5-stream brownfield codebase analysis |\n| `/sprintpilot-assess` | Tech debt, dependency audit, migration assessment |\n| `/sprintpilot-reverse-architect` | Extract architecture document from existing code |\n| `/sprintpilot-migrate` | 12-step legacy migration planning |\n| `/sprintpilot-research` | Parallel web research fan-out |\n\nMulti-agent skill internals: [docs/USAGE.md](docs/USAGE.md#multi-agent-skills).\n\n## Compatibility\n\n**Tools.** Sprintpilot uses the universal `SKILL.md` format — same skills work everywhere:\n\n| Tool | Directory | Tool | Directory |\n|---|---|---|---|\n| Claude Code | `.claude/skills/` | Roo Code | `.roo/skills/` |\n| Cursor | `.cursor/skills/` | Trae | `.trae/skills/` |\n| Windsurf | `.windsurf/skills/` | Kiro | `.kiro/skills/` |\n| Gemini CLI | `.gemini/skills/` | GitHub Copilot | `.github/copilot/skills/` |\n| Cline | `.cline/skills/` | | |\n\nNon-interactive: `--tools \u003ctool1\u003e,\u003ctool2\u003e` (or `all`). Valid values: `claude-code`, `cursor`, `windsurf`, `gemini-cli`, `cline`, `roo`, `trae`, `kiro`, `github-copilot`.\n\n**Git platforms.**\n\n| Platform | CLI | Auto-detect | API fallback |\n|---|---|---|---|\n| GitHub | `gh` | `github.com` | No |\n| GitLab | `glab` | `gitlab.*` | No |\n| Bitbucket | `bb` | `bitbucket.org` | Yes (`BITBUCKET_TOKEN`) |\n| Gitea | `tea` | Explicit config | Yes (`GITEA_TOKEN` + `base_url`) |\n\nNo CLI installed? Falls back to **git_only mode** (direct merge, no PRs).\n\n**Linters** (auto-detected on changed files only). First found per language wins.\n\n| Language | Linters | Language | Linters |\n|---|---|---|---|\n| Python | ruff, flake8, pylint | Java | checkstyle, pmd |\n| JavaScript / TS | eslint, biome | C / C++ | cppcheck, clang-tidy |\n| Rust | cargo clippy | C# | dotnet format |\n| Go | golangci-lint | Swift | swiftlint |\n| Ruby | rubocop | PL/SQL | sqlfluff |\n| Kotlin | ktlint, detekt | PHP | phpstan, phpcs |\n\nMulti-language monorepos lint all languages in one pass. Override priority via `git.lint.linters.\u003clang\u003e: [list]`. See [docs/EXTENDING.md](docs/EXTENDING.md) to add more.\n\n## Troubleshooting\n\n**`resume_divergence` halts on every start.** Sprint-status or the working tree moved between sessions. If the persisted `current_story` is now `done`, the autopilot auto-acknowledges and proceeds — no action needed. For other divergences, pass `--accept-divergence`, or finish the externally-merged story first so sprint-status reflects reality.\n\n**`verify_rejected` on `dev_red`: \"no test_files reported\".** The verifier auto-detects test files from `git diff` + untracked files by language convention — if it still can't find any, the work didn't produce a test-shaped file. Check the actual changes; re-run `bmad-dev-story` if needed.\n\n**`verify_rejected` on `dev_red`: \"test file missing: \\\u003cpath\\\u003e\".** The LLM reported a path that doesn't exist. Relative paths resolve against `projectRoot` — verify the file is where the LLM said.\n\n**`verify_rejected` on `story_done`: \"git_steps_completed must be true\".** The flag is the canonical signal but the verifier also probes `git cat-file -e \u003ccommit\u003e` + `git ls-remote --heads origin \u003cbranch\u003e`. If both pass, the signal is accepted. If the probe fails, `git push` likely didn't complete — re-run the push step manually.\n\n**Epic won't close out with retrospective.** `remaining_stories_in_epic \u003e 0`. Either mark the deferred stories as `skipped` / `deferred` / `cancelled` / `wont_do` in sprint-status (all are accepted as terminal), or emit `trigger_retrospective` to force-route to RETROSPECTIVE.\n\n**`.autopilot.lock` held but no session is running.** The previous session crashed before releasing. Wait `git.lock.stale_timeout_minutes` (default 30) and the next `autopilot start` will auto-take-over. To skip the wait, `rm .autopilot.lock`.\n\n**LLM keeps inventing pause justifications (\"context budget\", \"natural checkpoint\").** The autopilot's `workflow.orchestrator.md` contract forbids LLM-initiated pause. If you're seeing this pattern in your ledger, the LLM isn't reading the contract — `/sprintpilot-update` may help, or check `_Sprintpilot/skills/sprint-autopilot-on/SKILL.md` is current.\n\nMore scenarios: [docs/USAGE.md](docs/USAGE.md#troubleshooting).\n\n## How it works\n\nThe orchestrator emits one typed Action at a time (`invoke_skill`, `run_script`, `git_op`, `parallel_batch`, `user_prompt`, `halt`) and consumes typed Signals from the LLM (`success`, `failure`, `blocked`, `propose_alternative`, `user_input`, `verify_override`). State writes go through a single chokepoint with critical-key carve-outs for crash recovery; non-critical writes coalesce at story boundaries.\n\n`verify.js` enforces BMad bookkeeping after every `success` signal: acceptance-criteria bullets exist, `[ ]` task boxes are flipped to `[x]`, `commit_sha` + `branch` are reported and verified, review findings are recorded. Auto-recovery paths handle common signal-format omissions (test_files / tests_run / git_steps_completed) by probing the underlying world rather than punishing the LLM for missing echo fields.\n\nFull architecture: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md). State-machine diagram, action / signal vocabulary, verify contracts, and the LLM-as-peer protocol.\n\n## Git workflow (detailed)\n\nThe 4 modes from [Choose your workflow](#choose-your-workflow) with their full branch graphs.\n\n### Stacked PRs (default)\n\nEach story branches from the previous story's branch and targets it. Reviewers see each story's diff in isolation while the next story is already in progress. When a PR merges on the platform, subsequent PRs auto-retarget.\n\n```\nmain ─────────────────────────────────────────────────────────\n  │                                          (artifacts only)\n  ├── story/1-1 ──→ push + PR #42 (→ main)\n  │        │\n  │        └── story/1-2 ──→ push + PR #43 (→ story/1-1)\n  │                 │\n  │                 └── story/1-3 ──→ push + PR #44 (→ story/1-2)\n  │\n  Epic 1 complete → retrospective\n  → \"Ready to merge: PR #42, #43, #44\"\n```\n\nTrade-off: zero waiting for review during the sprint, but you end up with a stack to merge afterward.\n\n### Land-as-you-go\n\nAfter every `STORY_DONE`, the orchestrator runs a `STORY_LAND` state to merge that story's PR immediately. Each subsequent story branches from the already-merged base, so there's no stack to unwind.\n\n```\nmain ── story/1-1 ──→ PR #42 ──→ ✓ CI / review ──→ merge ──→\n   │                                                         ╲\n   ├── story/1-2 ──→ PR #43 ──→ ✓ CI / review ──→ merge ──→  ╲\n   │                                                          ╲\n   └── story/1-3 ──→ PR #44 ──→ ✓ CI / review ──→ merge ──→  done\n```\n\nKnobs: `git.land_when` (`no_wait` / `ci_pass` / `ci_and_review`), `git.land_wait_minutes` (default 30). Rebase recovery is automatic; conflicts halt with a `user_prompt`.\n\nTrade-off: cleaner history, no end-of-sprint merge marathon — but each story blocks on CI before the next starts.\n\n### Direct merge (no PR)\n\nStories merge straight into the base after push — no PR, no human review gate. Use only for prototypes / tutorials / dev branches.\n\n```\nmain ── story/1-1 ──→ merge ── story/1-2 ──→ merge ── story/1-3 ──→ merge\n```\n\n### Reuse your branch\n\nYou create the branch; the autopilot detects it on boot and commits every story directly onto it. No `story/*` branches. One PR opens against `base_branch` at sprint-end.\n\n```\nmain ─────────────────────────────────────────────────\n  │\n  └── feature/payments-rewrite (your branch, you created it)\n        ├── feat(1): story 1-1 ─→ commit\n        ├── feat(1): story 1-2 ─→ commit\n        └── …                  ─→ push + PR (→ main, at sprint-end)\n```\n\n### Branch naming\n\n- Story granularity (default): `\u003cbranch_prefix\u003e\u003cstory-key\u003e` → `story/1-3-add-auth`\n- Epic granularity (nano): `\u003cbranch_prefix\u003eepic-\u003cepic-id\u003e` → `story/epic-1`\n- Reuse mode: no autopilot branches; your branch is used as-is\n\n### Pre-commit safety\n\nBefore every commit, deterministic Node scripts run against staged files:\n\n| Check | What it does |\n|---|---|\n| Explicit staging | `git add -- file1 file2` — never `-A`/`-u`/`.`. Cross-referenced against the story's `## File List`. |\n| Secrets scan | Greps for `API_KEY`, `SECRET`, `TOKEN`, `PASSWORD`, `aws_access`, `private_key`. WARN severity; allowlist via `.secrets-allowlist`. |\n| File size | Rejects files over `staging.max_file_size_mb` (default 1). |\n| Binary detection | Warns on binary files. |\n| Gitignore check | Verifies `.gitignore` covers `.autopilot.lock` and `.claude/.sprintpilot-backups/`. |\n\nDecision matrix and additional knobs: [`modules/git/branching-and-pr-strategy.md`](_Sprintpilot/modules/git/branching-and-pr-strategy.md).\n\n## Multi-Agent Intelligence\n\nBeyond the autopilot, multi-agent skills launch parallel subagents for tasks that benefit from diverse perspectives.\n\n**`/sprintpilot-codebase-map`** — 5 parallel agents scan an existing codebase: stack, architecture, quality, concerns, integrations. Output under `_bmad-output/codebase-analysis/`. Inspired by [GSD's map-codebase](https://github.com/gsd-build/get-shit-done) — see [NOTICES.md](NOTICES.md).\n\n**`/sprintpilot-assess`** — Dependency auditor (CVEs), debt classifier (prioritized), migration analyzer. Output: prioritized findings with severity / confidence / effort.\n\n**`/sprintpilot-reverse-architect`** — Component mapper + data flow tracer + pattern extractor. Output: BMad Method-compatible `architecture.md` that feeds `bmad-create-epics-and-stories`.\n\n**`/sprintpilot-migrate`** — 12-step migration planner with 4 subagent fan-outs. Strategy, compatibility matrix, phased roadmap, per-component cards, data + API migration, risk matrix.\n\n**`/sprintpilot-research`** — Fan out research across multiple topics in parallel; synthesized into a unified report.\n\nSkill internals + output schemas: [docs/USAGE.md](docs/USAGE.md#multi-agent-skills).\n\n## Requirements\n\n- [BMad Method](https://github.com/bmad-code-org/BMAD-METHOD) v6.2.1+ (tested through v6.8.0)\n- Node.js 20.12+\n- A supported AI code agent (see [Compatibility](#compatibility))\n- Git repository with at least one commit\n- Platform CLI for PR creation (optional — falls back to git_only mode)\n- BMad's own runtime prerequisites if you run a recent BMad: 6.3.0+ skill hooks invoke `_bmad/scripts/resolve_customization.py` (needs Python 3.10+ and [`uv`](https://github.com/astral-sh/uv)). Core skill logic still runs without them, but terminal `on_complete` hooks will fail.\n\n## Documentation\n\n- [Installation Guide](docs/INSTALLATION.md)\n- [Usage Guide](docs/USAGE.md) — handoff report, user commands, multi-agent skill internals, troubleshooting\n- [Architecture](docs/ARCHITECTURE.md) — state machine, action / signal vocabulary, verify contracts\n- [Configuration Reference](docs/CONFIGURATION.md) — every setting, default, profile override\n- [Extending (Platforms \u0026 Languages)](docs/EXTENDING.md)\n- [Contributing](docs/CONTRIBUTING.md)\n- [Changelog](CHANGELOG.md)\n\n## License\n\nApache 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikunin%2Fsprintpilot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fikunin%2Fsprintpilot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikunin%2Fsprintpilot/lists"}