@ikunin/sprintpilot 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
Sprintpilot is an autonomous delivery addon **compatible with [BMad Method](https://github.com/bmad-code-org/BMAD-METHOD) v6**. One command takes your project from sprint plan to reviewed, tested, PR-ready code — with full git workflow and multi-agent intelligence.
|
|
12
12
|
|
|
13
|
-
> **Independent project.** Sprintpilot is not affiliated with or endorsed by BMad Code, LLC.
|
|
13
|
+
> **Independent project.** Sprintpilot is not affiliated with or endorsed by BMad Code, LLC. See [TRADEMARK.md](TRADEMARK.md).
|
|
14
14
|
|
|
15
15
|
> **Migrating from `bmad-autopilot-addon` v1?** See [MIGRATION.md](MIGRATION.md). `sprintpilot install` auto-detects v1 and cleanly replaces it.
|
|
16
16
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Git Branching and PR Strategy
|
|
2
2
|
|
|
3
|
-
How the
|
|
3
|
+
How the Sprintpilot manages branches, PRs, and merging across stories.
|
|
4
4
|
|
|
5
5
|
## Configuration
|
|
6
6
|
|
|
@@ -96,6 +96,6 @@ Regardless of the merge strategy, implementation artifacts (sprint-status.yaml,
|
|
|
96
96
|
|
|
97
97
|
| File | Owner | Autopilot access |
|
|
98
98
|
|------|-------|-----------------|
|
|
99
|
-
| `sprint-status.yaml` |
|
|
99
|
+
| `sprint-status.yaml` | BMad Method (dev-story, sprint-planning, retrospective) | Read only |
|
|
100
100
|
| `git-status.yaml` | Autopilot addon | Read/write |
|
|
101
101
|
| `autopilot-state.yaml` | Autopilot addon | Read/write |
|
|
@@ -177,7 +177,7 @@ Resolve:
|
|
|
177
177
|
<action>STOP</action>
|
|
178
178
|
</check>
|
|
179
179
|
|
|
180
|
-
<action>**Lock file** — run: `
|
|
180
|
+
<action>**Lock file** — run: `node {{project_root}}/_Sprintpilot/scripts/lock.js acquire`
|
|
181
181
|
Output will be one of:
|
|
182
182
|
- `ACQUIRED:<session-id>` → proceed
|
|
183
183
|
- `ACQUIRED_STALE:<session-id>` → stale lock removed, proceed
|
|
@@ -189,18 +189,18 @@ Resolve:
|
|
|
189
189
|
</check>
|
|
190
190
|
|
|
191
191
|
<action>**Detect platform** — run:
|
|
192
|
-
`
|
|
192
|
+
`node {{project_root}}/_Sprintpilot/scripts/detect-platform.js --provider {{git.platform.provider}}`
|
|
193
193
|
Output: `github`, `gitlab`, or `git_only`. Set `{{platform}}` to the output.
|
|
194
194
|
Log: "Platform detected: {{platform}}"
|
|
195
195
|
</action>
|
|
196
196
|
|
|
197
197
|
<action>**Worktree health check** — run:
|
|
198
|
-
`
|
|
198
|
+
`node {{project_root}}/_Sprintpilot/scripts/health-check.js --base-branch {{base_branch}} --status-file {{status_file}}`
|
|
199
199
|
Output classifies each worktree as CLEAN_DONE, COMMITTED, STALE, DIRTY, or ORPHAN.
|
|
200
200
|
- CLEAN_DONE: `git worktree remove .worktrees/<name>` + `git worktree prune`
|
|
201
201
|
- COMMITTED: log "Recoverable work found for <name> — will push via git -C"
|
|
202
202
|
Push the branch: `git -C .worktrees/<name> push -u origin <branch> 2>&1`
|
|
203
|
-
If `{{create_pr}}` is true AND platform != git_only: create PR via `
|
|
203
|
+
If `{{create_pr}}` is true AND platform != git_only: create PR via `node {{project_root}}/_Sprintpilot/scripts/create-pr.js ...`
|
|
204
204
|
If `{{create_pr}}` is false OR platform is git_only: merge directly — `git checkout -B {{base_branch}} origin/{{base_branch}} && git merge <branch> --no-edit && git push origin {{base_branch}}`
|
|
205
205
|
Then remove worktree.
|
|
206
206
|
- STALE: `git worktree remove .worktrees/<name> --force` + prune
|
|
@@ -230,7 +230,7 @@ Resolve:
|
|
|
230
230
|
**IMPORTANT:** sync-status.sh does full block replacement. If the story already has an entry in `{git_status_file}`, re-read its existing fields and pass ALL of them alongside `--merge-status`. If no entry exists yet, pass at minimum `--branch` and `--push-status "pushed"`.
|
|
231
231
|
- If `{{platform}}` is NOT git_only (github, gitlab, bitbucket, gitea) AND `{{create_pr}}` is true:
|
|
232
232
|
- Check if PR/MR already exists for this branch (platform-specific check via create-pr.sh or CLI)
|
|
233
|
-
- If no PR: create one via `
|
|
233
|
+
- If no PR: create one via `node {{project_root}}/_Sprintpilot/scripts/create-pr.js --platform {{platform}} ...`
|
|
234
234
|
- Log: "PR created/found for <story-key>"
|
|
235
235
|
- Update `{git_status_file}` via sync-status.sh: set `--merge-status "pr_pending"` for this story (same full-field requirement as above)
|
|
236
236
|
- If status IS "done" AND branch still exists AND `{{cleanup_on_merge}}` is true:
|
|
@@ -427,7 +427,7 @@ Resolve:
|
|
|
427
427
|
<!-- GIT: Enter worktree before dev-story -->
|
|
428
428
|
<check if="{{git_enabled}} AND {{next_skill}} is bmad-dev-story">
|
|
429
429
|
<action>**Sanitize branch name** — run:
|
|
430
|
-
`
|
|
430
|
+
`node {{project_root}}/_Sprintpilot/scripts/sanitize-branch.js "{{current_story}}" --prefix "{{branch_prefix}}" --max-length 60`
|
|
431
431
|
Output: sanitized name (without prefix). Set `{{branch_name}}` = output.
|
|
432
432
|
Full branch ref will be `{{branch_prefix}}{{branch_name}}`.
|
|
433
433
|
</action>
|
|
@@ -530,7 +530,7 @@ pr_base: {{pr_base}}
|
|
|
530
530
|
<!-- GIT: Lint, stage, and commit after dev-story -->
|
|
531
531
|
<check if="{{git_enabled}} AND {{in_worktree}}">
|
|
532
532
|
<action>**Lint changed files** — run:
|
|
533
|
-
`
|
|
533
|
+
`node {{project_root}}/_Sprintpilot/scripts/lint-changed.js --limit 100 --output-file lint-output.txt`
|
|
534
534
|
Log the output summary (non-blocking — lint never halts the autopilot).
|
|
535
535
|
Set `{{lint_result}}` from the summary line.
|
|
536
536
|
</action>
|
|
@@ -542,7 +542,7 @@ pr_base: {{pr_base}}
|
|
|
542
542
|
- `{patch-title}` → from review finding title, fallback to "code review fix"
|
|
543
543
|
Read the commit template from `git.commit_templates.story` in config (default: `feat({epic}): {story-title} ({story-key})`).
|
|
544
544
|
Then run:
|
|
545
|
-
`
|
|
545
|
+
`node {{project_root}}/_Sprintpilot/scripts/stage-and-commit.js --message "feat({{epic}}): {{story-title}} ({{current_story}})" --allowlist {{project_root}}/_Sprintpilot/.secrets-allowlist`
|
|
546
546
|
Output: commit SHA. Set `{{story_commit}}` = output.
|
|
547
547
|
Warnings (secrets, large files) printed to stderr — review but don't halt unless user says to.
|
|
548
548
|
</action>
|
|
@@ -588,7 +588,7 @@ pr_base: {{pr_base}}
|
|
|
588
588
|
<action>Sanitize branch name for `{{current_story}}` (same logic as step 3)</action>
|
|
589
589
|
<action>Check if branch already registered in `{git_status_file}` for this story → skip if so</action>
|
|
590
590
|
<action>Register branch in `{git_status_file}`:
|
|
591
|
-
`
|
|
591
|
+
`node {{project_root}}/_Sprintpilot/scripts/sync-status.js --story "{{current_story}}" --git-status-file "{{project_root}}/_bmad-output/implementation-artifacts/git-status.yaml" --branch "{{branch_prefix}}{{branch_name}}" --platform "{{platform}}" --base-branch "{{base_branch}}"`
|
|
592
592
|
</action>
|
|
593
593
|
</check>
|
|
594
594
|
|
|
@@ -741,7 +741,7 @@ Instruct: "Re-verify code review for story {{current_story}} — all patch findi
|
|
|
741
741
|
- `{lint-result}` → `{{lint_result}}`
|
|
742
742
|
- `{test-result}` → from last test run output
|
|
743
743
|
- `{patch-count}` → number of patch commits
|
|
744
|
-
3. Run: `
|
|
744
|
+
3. Run: `node {{project_root}}/_Sprintpilot/scripts/create-pr.js --platform {{platform}} --branch {{branch_prefix}}{{branch_name}} --base {{pr_base}} --title "{{story-title}} ({{current_story}})" --body "<filled template>"`
|
|
745
745
|
4. Output: PR URL or "SKIPPED". Set `{{pr_url}}` = output.
|
|
746
746
|
If creation fails → log warning, set `{{pr_url}}` = null, continue.
|
|
747
747
|
</action>
|
|
@@ -800,7 +800,7 @@ Instruct: "Re-verify code review for story {{current_story}} — all patch findi
|
|
|
800
800
|
</action>
|
|
801
801
|
|
|
802
802
|
<action>**Write git status** to addon's own file (NEVER modify sprint-status.yaml) — runs AFTER checkout to base branch so the file persists in the working tree for the commit below:
|
|
803
|
-
`
|
|
803
|
+
`node {{project_root}}/_Sprintpilot/scripts/sync-status.js --story "{{current_story}}" --git-status-file "{{project_root}}/_bmad-output/implementation-artifacts/git-status.yaml" --branch "{{branch_prefix}}{{branch_name}}" --commit "{{story_commit}}" --patch-commits "{{patch_commits_csv}}" --push-status "{{push_status}}" --merge-status "{{merge_status}}" --pr-url "{{pr_url}}" --lint-result "{{lint_result}}" --worktree "{{project_root}}/.worktrees/{{current_story}}" --platform "{{platform}}" --base-branch "{{base_branch}}"`
|
|
804
804
|
This writes to `git-status.yaml` (addon-owned). Sprint-status.yaml is BMAD-owned — updated by BMAD skills only.
|
|
805
805
|
</action>
|
|
806
806
|
|
|
@@ -1043,7 +1043,7 @@ If the skill is not available or fails, generate a minimal README.md:
|
|
|
1043
1043
|
|
|
1044
1044
|
<!-- GIT: Release lock -->
|
|
1045
1045
|
<check if="{{git_enabled}}">
|
|
1046
|
-
<action>Release lock: `
|
|
1046
|
+
<action>Release lock: `node {{project_root}}/_Sprintpilot/scripts/lock.js release`</action>
|
|
1047
1047
|
</check>
|
|
1048
1048
|
|
|
1049
1049
|
<action>Delete `{state_file}` — sprint complete</action>
|
package/package.json
CHANGED