forge-workflow 0.0.5 → 0.0.7

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.
Files changed (164) hide show
  1. package/.claude/commands/dev.md +6 -1
  2. package/.claude/commands/plan.md +59 -14
  3. package/.claude/commands/premerge.md +10 -0
  4. package/.claude/commands/review.md +7 -1
  5. package/.claude/commands/ship.md +95 -47
  6. package/.claude/commands/status.md +42 -0
  7. package/.claude/commands/validate.md +7 -1
  8. package/.claude/commands/verify.md +52 -4
  9. package/.claude/rules/workflow.md +16 -0
  10. package/.claude/scripts/greptile-resolve.sh +32 -0
  11. package/.cline/workflows/dev.md +6 -1
  12. package/.cline/workflows/plan.md +59 -14
  13. package/.cline/workflows/premerge.md +10 -0
  14. package/.cline/workflows/review.md +7 -1
  15. package/.cline/workflows/ship.md +95 -47
  16. package/.cline/workflows/status.md +42 -0
  17. package/.cline/workflows/validate.md +7 -1
  18. package/.cline/workflows/verify.md +52 -4
  19. package/.codex/skills/dev/SKILL.md +6 -1
  20. package/.codex/skills/plan/SKILL.md +59 -14
  21. package/.codex/skills/premerge/SKILL.md +10 -0
  22. package/.codex/skills/review/SKILL.md +7 -1
  23. package/.codex/skills/ship/SKILL.md +95 -47
  24. package/.codex/skills/status/SKILL.md +42 -0
  25. package/.codex/skills/validate/SKILL.md +7 -1
  26. package/.codex/skills/verify/SKILL.md +52 -4
  27. package/.cursor/commands/dev.md +6 -1
  28. package/.cursor/commands/plan.md +59 -14
  29. package/.cursor/commands/premerge.md +10 -0
  30. package/.cursor/commands/review.md +7 -1
  31. package/.cursor/commands/ship.md +95 -47
  32. package/.cursor/commands/status.md +42 -0
  33. package/.cursor/commands/validate.md +7 -1
  34. package/.cursor/commands/verify.md +52 -4
  35. package/.cursorrules +149 -0
  36. package/.github/prompts/dev.prompt.md +6 -1
  37. package/.github/prompts/plan.prompt.md +59 -14
  38. package/.github/prompts/premerge.prompt.md +10 -0
  39. package/.github/prompts/review.prompt.md +7 -1
  40. package/.github/prompts/ship.prompt.md +95 -47
  41. package/.github/prompts/status.prompt.md +42 -0
  42. package/.github/prompts/validate.prompt.md +7 -1
  43. package/.github/prompts/verify.prompt.md +52 -4
  44. package/.kilocode/workflows/dev.md +6 -1
  45. package/.kilocode/workflows/plan.md +59 -14
  46. package/.kilocode/workflows/premerge.md +10 -0
  47. package/.kilocode/workflows/review.md +7 -1
  48. package/.kilocode/workflows/ship.md +95 -47
  49. package/.kilocode/workflows/status.md +42 -0
  50. package/.kilocode/workflows/validate.md +7 -1
  51. package/.kilocode/workflows/verify.md +52 -4
  52. package/.opencode/commands/dev.md +6 -1
  53. package/.opencode/commands/plan.md +59 -14
  54. package/.opencode/commands/premerge.md +10 -0
  55. package/.opencode/commands/review.md +7 -1
  56. package/.opencode/commands/ship.md +95 -47
  57. package/.opencode/commands/status.md +42 -0
  58. package/.opencode/commands/validate.md +7 -1
  59. package/.opencode/commands/verify.md +52 -4
  60. package/.roo/commands/dev.md +6 -1
  61. package/.roo/commands/plan.md +59 -14
  62. package/.roo/commands/premerge.md +10 -0
  63. package/.roo/commands/review.md +7 -1
  64. package/.roo/commands/ship.md +95 -47
  65. package/.roo/commands/status.md +42 -0
  66. package/.roo/commands/validate.md +7 -1
  67. package/.roo/commands/verify.md +52 -4
  68. package/AGENTS.md +97 -0
  69. package/CLAUDE.md +10 -0
  70. package/README.md +2 -2
  71. package/bin/forge-cmd.js +5 -1
  72. package/bin/forge-preflight.js +15 -2
  73. package/bin/forge.js +211 -9
  74. package/docs/ENHANCED_ONBOARDING.md +96 -86
  75. package/docs/ROADMAP.md +2 -2
  76. package/docs/TOOLCHAIN.md +23 -0
  77. package/docs/VALIDATION.md +1 -1
  78. package/lefthook.yml +11 -0
  79. package/lib/agents/README.md +46 -1
  80. package/lib/agents/cline.plugin.json +11 -4
  81. package/lib/agents/codex.plugin.json +2 -2
  82. package/lib/agents/copilot.plugin.json +5 -5
  83. package/lib/agents/cursor.plugin.json +1 -1
  84. package/lib/agents/kilocode.plugin.json +1 -1
  85. package/lib/agents/opencode.plugin.json +7 -4
  86. package/lib/agents/roo.plugin.json +10 -3
  87. package/lib/agents-config.js +129 -81
  88. package/lib/codex-skills.js +50 -0
  89. package/lib/commands/_registry.js +173 -0
  90. package/lib/commands/clean.js +181 -0
  91. package/lib/commands/commands-reset.js +147 -0
  92. package/lib/commands/dev.js +84 -0
  93. package/lib/commands/plan.js +18 -0
  94. package/lib/commands/push.js +196 -0
  95. package/lib/commands/recommend.js +1 -1
  96. package/lib/commands/setup.js +4295 -0
  97. package/lib/commands/ship.js +20 -0
  98. package/lib/commands/status.js +210 -44
  99. package/lib/commands/sync.js +71 -0
  100. package/lib/commands/team.js +37 -0
  101. package/lib/commands/test.js +207 -0
  102. package/lib/commands/validate.js +13 -0
  103. package/lib/commands/worktree.js +310 -0
  104. package/lib/detect-agent.js +38 -8
  105. package/lib/detection-utils.js +405 -0
  106. package/lib/docs-command.js +51 -0
  107. package/lib/docs-copy.js +50 -0
  108. package/lib/file-utils.js +260 -0
  109. package/lib/forge-context.js +42 -0
  110. package/lib/freshness-token.js +148 -0
  111. package/lib/frontmatter.js +79 -0
  112. package/lib/greptile-match.js +80 -0
  113. package/lib/husky-migration.js +113 -12
  114. package/lib/lefthook-check.js +27 -6
  115. package/lib/plugin-manager.js +225 -72
  116. package/lib/project-discovery.js +39 -5
  117. package/lib/reset.js +309 -0
  118. package/lib/runtime-health.js +305 -0
  119. package/lib/shell-utils.js +50 -0
  120. package/lib/task-ownership.js +117 -0
  121. package/lib/ui-utils.js +43 -0
  122. package/lib/validation-utils.js +163 -0
  123. package/lib/workflow/enforce-stage.js +179 -0
  124. package/lib/workflow/stages.js +201 -0
  125. package/lib/workflow/state.js +332 -0
  126. package/opencode.json +67 -0
  127. package/package.json +16 -6
  128. package/scripts/beads-context.sh +165 -22
  129. package/scripts/beads-context.test.js +5 -1
  130. package/scripts/check-agents.js +103 -0
  131. package/scripts/check-forge-token.js +98 -0
  132. package/scripts/conflict-detect.sh +2 -2
  133. package/scripts/dep-guard.sh +6 -28
  134. package/scripts/file-index.sh +117 -23
  135. package/scripts/forge-team/index.sh +86 -0
  136. package/scripts/forge-team/lib/agent-prompt.sh +52 -0
  137. package/scripts/forge-team/lib/claim.sh +256 -0
  138. package/scripts/forge-team/lib/dashboard.sh +341 -0
  139. package/scripts/forge-team/lib/epic.sh +332 -0
  140. package/scripts/forge-team/lib/hooks.sh +253 -0
  141. package/scripts/forge-team/lib/identity.sh +235 -0
  142. package/scripts/forge-team/lib/sync-github.sh +317 -0
  143. package/scripts/forge-team/lib/verify.sh +284 -0
  144. package/scripts/forge-team/lib/workload.sh +296 -0
  145. package/scripts/forge-team/tests/agent-prompt.test.sh +72 -0
  146. package/scripts/forge-team/tests/claim.test.sh +179 -0
  147. package/scripts/forge-team/tests/dashboard.test.sh +170 -0
  148. package/scripts/forge-team/tests/dispatcher.test.sh +79 -0
  149. package/scripts/forge-team/tests/epic.test.sh +176 -0
  150. package/scripts/forge-team/tests/hooks.test.sh +239 -0
  151. package/scripts/forge-team/tests/identity.test.sh +176 -0
  152. package/scripts/forge-team/tests/integration.test.sh +371 -0
  153. package/scripts/forge-team/tests/sync-github.test.sh +209 -0
  154. package/scripts/forge-team/tests/verify.test.sh +314 -0
  155. package/scripts/forge-team/tests/workflow-integration.test.sh +43 -0
  156. package/scripts/forge-team/tests/workload.test.sh +209 -0
  157. package/scripts/lib/eval-runner.js +39 -0
  158. package/scripts/lib/jsonl-lock.sh +48 -0
  159. package/scripts/lib/sanitize.sh +116 -0
  160. package/scripts/pr-coordinator.sh +756 -0
  161. package/scripts/smart-status.sh +58 -21
  162. package/scripts/sync-commands.js +49 -20
  163. package/scripts/sync-utils.sh +24 -29
  164. package/scripts/test.js +18 -1
@@ -43,6 +43,36 @@ BEHIND=$(git rev-list --count HEAD..origin/"$BASE")
43
43
 
44
44
  This is NOT a full rebase — just a check. The rebase happens in /validate where the full test suite runs afterward.
45
45
 
46
+ ### Parallel PR coordination (soft block)
47
+
48
+ Before creating the PR, check merge readiness:
49
+
50
+ ```bash
51
+ # Run merge simulation against base branch
52
+ bash scripts/pr-coordinator.sh merge-sim "$(git branch --show-current)" 2>&1
53
+
54
+ # Show recommended merge order
55
+ bash scripts/pr-coordinator.sh merge-order 2>&1 || true
56
+
57
+ # Auto-label the PR after creation (called after gh pr create below)
58
+ # bash scripts/pr-coordinator.sh auto-label <issue-id>
59
+ ```
60
+
61
+ If merge simulation finds conflicts:
62
+ - Display conflicted files
63
+ - Ask: "Merge conflicts detected with base branch. These PRs should merge first: [list]. Proceed with PR creation anyway? (y/n)"
64
+ - If `n`: exit cleanly
65
+ - If `y`: log override via `bd comments add <id> "Ship override: creating PR despite merge conflicts"`, then continue
66
+
67
+ After PR creation completes:
68
+ ```bash
69
+ # Auto-label the newly created PR
70
+ bash scripts/pr-coordinator.sh auto-label <issue-id>
71
+
72
+ # Check for stale worktrees (informational)
73
+ bash scripts/pr-coordinator.sh stale-worktrees 2>&1 || true
74
+ ```
75
+
46
76
  ### Step 3: Update Beads
47
77
  ```bash
48
78
  bd update <id> --status done
@@ -57,68 +87,86 @@ Use `--force-with-lease` because `/validate` may have rebased the branch, rewrit
57
87
  git push --force-with-lease -u origin <branch-name>
58
88
  ```
59
89
 
60
- ### Step 5: Create PR
90
+ ### Step 5: Create PR Using Project's PR Template
61
91
 
62
- Use the narrative PR template below. Lead with WHY (Problem/Root Cause/Fix/Value) — this is what reviewers need to understand first. Keep implementation details (test coverage, security review, design doc) in a collapsible section so they're available but don't clutter the summary.
92
+ **CRITICAL**: Always use the project's own PR template. Never use a hardcoded body.
63
93
 
64
- If no Beads issue exists (hotfix, external contribution), skip the "Closes" line.
94
+ **Step 5a: Locate the PR template**
65
95
 
96
+ Check for a PR template in the project (in order of precedence):
66
97
  ```bash
67
- gh pr create --title "<type>: <concise description>" --body "$(cat <<'EOF'
68
- ## Problem
69
- [What was broken, what need existed, or what user pain this addresses]
70
-
71
- ## Root Cause
72
- [Why it happened, why it was missing, or what gap existed]
98
+ # Check standard locations
99
+ PR_TEMPLATE=""
100
+ for path in .github/pull_request_template.md .github/PULL_REQUEST_TEMPLATE.md docs/pull_request_template.md pull_request_template.md; do
101
+ if [ -f "$path" ]; then
102
+ PR_TEMPLATE="$path"
103
+ break
104
+ fi
105
+ done
106
+ ```
73
107
 
74
- ## Fix
75
- [What this PR does to solve it — approach, not implementation details]
108
+ **Step 5b: Read and populate the template**
76
109
 
77
- ## Value
78
- [Who benefits, what improves, what risk is removed]
110
+ If a PR template exists:
111
+ 1. **Read the template file** using the Read tool
112
+ 2. **Fill in every section** with actual data from the current PR context:
113
+ - Replace HTML comments (`<!-- ... -->`) with real content
114
+ - Check applicable checkboxes (`- [x]`)
115
+ - Fill in beads issue IDs (replace `beads-xxx` with actual ID)
116
+ - Fill in test results, validation status, and other concrete data
117
+ - Reference the design doc: `docs/plans/YYYY-MM-DD-<slug>-design.md`
118
+ 3. **Do NOT remove any sections** — fill them all, even if "N/A"
119
+ 4. **Do NOT restructure the template** — keep the project's chosen format
79
120
 
80
- ## Beads
81
- Closes: <issue-id>
121
+ If no PR template exists, use this minimal fallback:
122
+ ```
123
+ ## Summary
124
+ [1-3 sentences: what this PR does and why]
82
125
 
83
- <details>
84
- <summary>Implementation Details</summary>
126
+ ## Changes
127
+ [Bulleted list of key changes]
85
128
 
86
- ### Test Coverage
87
- - Tests: [count] passing
88
- - Scenarios covered: [list key scenarios]
129
+ ## Testing
130
+ [How it was tested, test results]
89
131
 
90
- ### Security Review
91
- - OWASP Top 10: [summary — applicable risks and mitigations]
92
- - Automated scan: [result]
132
+ ## Beads
133
+ Closes beads-xxx
93
134
 
94
- ### Design Doc
95
- See: docs/plans/YYYY-MM-DD-<slug>-design.md
135
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
136
+ ```
96
137
 
97
- ### Decisions Log
98
- See: docs/plans/YYYY-MM-DD-<slug>-decisions.md (if any undocumented decisions arose during /dev)
138
+ **Step 5c: Create the PR**
99
139
 
100
- ### Key Decisions
101
- [From design doc 3-5 key decisions with reasoning]
140
+ ```bash
141
+ gh pr create --title "<type>: <concise description>" --body "<populated-template-content>"
142
+ ```
102
143
 
103
- ### Documentation Updated
104
- [List docs updated in this PR, or "None no doc-facing changes"]
144
+ Rules for the PR body:
145
+ - **Use the project's template structure** never substitute your own format
146
+ - **Fill in concrete data** — commit counts, test results, actual file paths, real beads IDs
147
+ - **Check applicable checkboxes** — `[x]` for items that apply, `[ ]` for items that don't
148
+ - **Include "Closes beads-xxx"** in the Beads section (required for auto-close in /verify)
105
149
 
106
- ### Validation
107
- - [x] Type check passing
108
- - [x] Lint passing (0 errors, 0 warnings)
109
- - [x] All tests passing
110
- - [x] Security review completed
150
+ ### Step 6: Validate Context and Record Stage Transition
151
+ ```bash
152
+ bash scripts/beads-context.sh validate <id>
153
+ bash scripts/beads-context.sh stage-transition <id> ship review \
154
+ --summary "<PR created, checks pending>" \
155
+ --decisions "<template sections filled, beads linked>" \
156
+ --artifacts "<PR URL, branch name>" \
157
+ --next "<review focus areas>"
158
+ ```
111
159
 
112
- </details>
160
+ ### Team sync after PR
113
161
 
114
- 🤖 Generated with [Claude Code](https://claude.com/claude-code)
115
- EOF
116
- )"
117
- ```
162
+ After PR is created, sync issue state to GitHub and verify 1:1 mapping:
118
163
 
119
- ### Step 6: Record Stage Transition
120
164
  ```bash
121
- bash scripts/beads-context.sh stage-transition <id> ship review
165
+ # Sync issue state to GitHub
166
+ bash scripts/forge-team/index.sh sync 2>&1 || true
167
+
168
+ # Verify 1:1 mapping
169
+ bash scripts/forge-team/index.sh verify 2>&1 || true
122
170
  ```
123
171
 
124
172
  ## Example Output
@@ -153,9 +201,9 @@ Stage 7: /verify → Post-merge CI check on main
153
201
 
154
202
  ## Tips
155
203
 
156
- - **Lead with why**: Problem Root Cause Fix Value is what reviewers need first
157
- - **Collapsible details**: Design doc, decisions log, test coverage go in `<details>` available but not in the way
158
- - **Document security**: OWASP Top 10 review in collapsible section
159
- - **Test coverage**: Show all test scenarios passing
204
+ - **Use the project's PR template**: Always read `.github/pull_request_template.md` (or equivalent) and populate it never substitute your own format
205
+ - **Fill every section**: Even if "N/A"empty/missing sections cause review friction
206
+ - **Include "Closes beads-xxx"**: Required for auto-close in /verify
207
+ - **Concrete data only**: Test counts, file paths, commit SHAs — not placeholder text
160
208
  - **Wait for checks**: Let GitHub Actions, Greptile, SonarCloud run
161
209
  - **NO auto-merge**: Always wait for /review phase
@@ -21,6 +21,7 @@ bash scripts/sync-utils.sh auto-sync
21
21
  ```
22
22
 
23
23
  ### Step 1: Smart Status (ranked issues with conflict detection)
24
+
24
25
  ```bash
25
26
  bash scripts/smart-status.sh
26
27
  ```
@@ -28,6 +29,35 @@ This script dynamically computes and displays all issues ranked by composite sco
28
29
 
29
30
  For full context on any issue: `bd show <id>`
30
31
 
32
+ ### Step 1b: Reconcile stale in-progress issues
33
+
34
+ Check if any in-progress issues were already merged but not closed (can happen if `/verify` was skipped or backup was restored from stale snapshot):
35
+
36
+ ```bash
37
+ # Detect default branch dynamically (prefer main over master)
38
+ DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||')
39
+ if [ -z "$DEFAULT_BRANCH" ]; then
40
+ if git rev-parse --verify main >/dev/null 2>&1; then DEFAULT_BRANCH="main"
41
+ elif git rev-parse --verify master >/dev/null 2>&1; then DEFAULT_BRANCH="master"
42
+ else echo "ERROR: No main or master branch found — skipping stale reconciliation" >&2; DEFAULT_BRANCH=""; fi
43
+ fi
44
+
45
+ # For each in_progress issue, check if its PR was already merged
46
+ if [ -n "$DEFAULT_BRANCH" ]; then
47
+ bd list --status=in_progress --json 2>/dev/null | jq -r '.[].id' | while read id; do
48
+ # Search git log for the issue ID in commit messages (fixed-strings for literal match)
49
+ if git log --oneline --first-parent "$DEFAULT_BRANCH" --fixed-strings --grep="$id" | grep -q .; then
50
+ echo "STALE: $id — found in git history, likely already merged"
51
+ fi
52
+ done
53
+ fi
54
+ ```
55
+
56
+ If stale issues are found, close them:
57
+ ```bash
58
+ bd close <id> --force --reason="Already merged — detected during status reconciliation"
59
+ ```
60
+
31
61
  ### Step 2: Review Recent Commits
32
62
  ```bash
33
63
  git log --oneline -10
@@ -38,6 +68,18 @@ git log --oneline -10
38
68
  - **Continuing work**: In-progress issues found, resume where left off
39
69
  - **Review needed**: Work marked complete, needs review/merge
40
70
 
71
+ ### Team context
72
+
73
+ Show current developer's active work and team overview:
74
+
75
+ ```bash
76
+ # Show my active issues
77
+ bash scripts/forge-team/index.sh workload --me 2>&1 || true
78
+
79
+ # One-line team summary
80
+ bash scripts/forge-team/index.sh dashboard 2>&1 | head -5 || true
81
+ ```
82
+
41
83
  ## Next Steps
42
84
 
43
85
  - **If starting new work**: Run `/plan <feature-name>`
@@ -225,7 +225,13 @@ until ALL FOUR show fresh output in this session:
225
225
  "Should pass", "was passing earlier", and "I'm confident" are not evidence.
226
226
  Run the commands. Show the output. THEN declare done.
227
227
 
228
- 5. Stage transition: Run `bash scripts/beads-context.sh stage-transition <id> validate ship` exit 0 confirmed
228
+ 5. Context check: Run `bash scripts/beads-context.sh validate <id>` and address any warnings
229
+ 6. Stage transition: Run the following → exit 0 confirmed:
230
+ bash scripts/beads-context.sh stage-transition <id> validate ship \
231
+ --summary "<all checks pass/fail summary>" \
232
+ --decisions "<any failures diagnosed and fixed>" \
233
+ --artifacts "<scripts and commands run>" \
234
+ --next "<ship readiness notes>"
229
235
  </HARD-GATE>
230
236
  ```
231
237
 
@@ -142,19 +142,67 @@ Branch: <branch-name> deleted ✓
142
142
  bd create --title="Post-merge: <description of issue>" --type=bug --priority=1
143
143
  ```
144
144
 
145
- ### Step 8: Close Beads Issue (if healthy)
145
+ ### Step 8: Close Beads Issues (if healthy)
146
146
 
147
- If everything is clean, close the Beads issue:
147
+ If everything is clean, close all Beads issues referenced in the merged PR.
148
+
149
+ **Auto-detect beads issues from PR body and branch name:**
150
+
151
+ ```bash
152
+ # Get PR body and branch name
153
+ PR_BODY=$(gh pr view <number> --json body --jq '.body')
154
+ PR_BRANCH=$(gh pr view <number> --json headRefName --jq '.headRefName')
155
+
156
+ # Extract beads IDs from PR body (matches "Closes beads-xxx", "closes forge-xxx", etc.)
157
+ # Patterns: "Closes <prefix>-<id>", "Fixes <prefix>-<id>", "Resolves <prefix>-<id>"
158
+ BEADS_IDS=$(echo "$PR_BODY" | grep -oiE '(closes|fixes|resolves):?\s+[a-z]+-[a-z0-9]+' | grep -oiE '[a-z]+-[a-z0-9]{3,6}$')
159
+
160
+ # Validate each ID exists in beads
161
+ VALID_IDS=""
162
+ for id in $BEADS_IDS; do
163
+ if bd show "$id" >/dev/null 2>&1; then
164
+ VALID_IDS="$VALID_IDS $id"
165
+ fi
166
+ done
167
+ BEADS_IDS="$VALID_IDS"
168
+
169
+ # Also check branch name for beads ID — extract segment after last /
170
+ # then validate with bd show to avoid false matches like "pr-templa"
171
+ BRANCH_SLUG=$(echo "$PR_BRANCH" | sed 's|.*/||')
172
+ BRANCH_ID=$(echo "$BRANCH_SLUG" | grep -oE '[a-z]+-[a-z0-9]{3,6}' | head -1)
173
+ if [ -n "$BRANCH_ID" ] && ! bd show "$BRANCH_ID" >/dev/null 2>&1; then
174
+ BRANCH_ID="" # Not a valid beads ID — discard
175
+ fi
176
+ ```
177
+
178
+ **Close each matched issue:**
148
179
 
149
180
  ```bash
150
- bd close <id> --reason="Merged and verified on master"
181
+ # Close issues found in PR body
182
+ for id in $BEADS_IDS; do
183
+ bd close "$id" --reason="Merged and verified on master (PR #<number>)" 2>&1 || echo "Warning: could not close $id"
184
+ done
185
+
186
+ # If no issues found in body, try branch name match (skip if already closed above)
187
+ if [ -z "$BEADS_IDS" ] && [ -n "$BRANCH_ID" ]; then
188
+ bd close "$BRANCH_ID" --reason="Merged and verified on master (PR #<number>)" 2>&1 || echo "Warning: could not close $BRANCH_ID"
189
+ elif [ -n "$BRANCH_ID" ] && ! echo "$BEADS_IDS" | grep -qw "$BRANCH_ID"; then
190
+ bd close "$BRANCH_ID" --reason="Merged and verified on master (PR #<number>)" 2>&1 || echo "Warning: could not close $BRANCH_ID"
191
+ fi
192
+ ```
193
+
194
+ **If no beads issues detected at all**, prompt the user:
195
+ ```
196
+ ⚠ No beads issue ID found in PR body or branch name.
197
+ If this PR closes a beads issue, run: bd close <id> --reason="Merged and verified on master (PR #<number>)"
151
198
  ```
152
199
 
153
200
  ```
154
201
  <HARD-GATE: /verify exit>
155
202
  Do NOT declare /verify complete until:
156
203
  1. gh run list --branch master --limit 3 shows actual CI output (not "should be fine")
157
- 2. If healthy: Beads issue is closed (bd close <id> run and confirmed)
204
+ 2. If healthy: Beads issues extracted from PR body/branch and closed (bd close run and confirmed)
205
+ - If no beads ID found: user was warned and given manual close command
158
206
  3. If issues found: Beads tracking issue created for every problem
159
207
  4. Worktree removed (or confirmed already gone) — OR Step 6 was intentionally skipped because CI was unhealthy; if skipped, state explicitly: "cleanup deferred, CI was not healthy"
160
208
  "It should be fine" is not evidence. Run the command. Show the output.
package/.cursorrules ADDED
@@ -0,0 +1,149 @@
1
+ # Forge - 7-Stage TDD Workflow
2
+
3
+ A TDD-first workflow for AI coding agents. Ship features with confidence.
4
+
5
+ ## Commands (7 Stages)
6
+
7
+ | Stage | Command | Description |
8
+ |-------|---------|-------------|
9
+ | utility | `/status` | Check current context, active work, recent completions |
10
+ | 1 | `/plan` | Design intent Q&A → research → branch + task list |
11
+ | 2 | `/dev` | Subagent-driven TDD per task (spec + quality review) |
12
+ | 3 | `/validate` | Validation (type/lint/security/tests) |
13
+ | 4 | `/ship` | Create PR with full documentation |
14
+ | 5 | `/review` | Address ALL PR feedback |
15
+ | 6 | `/premerge` | Complete docs on feature branch, hand off PR to user |
16
+ | 7 | `/verify` | Post-merge health check (CI on main) |
17
+
18
+ ## Workflow Flow
19
+
20
+ ```
21
+ /plan → /dev → /validate → /ship → /review → /premerge → /verify
22
+ ```
23
+
24
+ ## Core Principles
25
+
26
+ - **TDD-First**: Write tests BEFORE implementation (RED-GREEN-REFACTOR)
27
+ - **Design-First**: One-question-at-a-time Q&A captures design intent upfront
28
+ - **HARD-GATEs**: Every stage exit has explicit pass criteria — run the commands, show the output
29
+ - **Security Built-In**: OWASP Top 10 analysis for every feature
30
+
31
+ ## Prerequisites
32
+
33
+ - Git, GitHub CLI (`gh`)
34
+ - Beads (recommended): `bun add -g @beads/bd && bd init`
35
+
36
+ ## Quick Start
37
+
38
+ 1. `/status` - Check where you are
39
+ 2. `/plan <feature-slug>` - Design intent → research → branch + task list
40
+ 3. `/dev` - Implement with TDD
41
+ 4. `/validate` - Validate everything
42
+ 5. `/ship` - Create PR
43
+ 6. `/review <pr-number>` - Address all feedback
44
+ 7. `/premerge <pr-number>` - Docs + hand off to user
45
+
46
+ ## Stage Details
47
+
48
+ ### Utility: Status (`/status`)
49
+
50
+ Check current context before starting work:
51
+ - Active issues (via Beads if installed)
52
+ - Recent completions
53
+ - Current branch state
54
+
55
+ ### 1. Plan (`/plan <feature-slug>`)
56
+
57
+ Three phases:
58
+ - **Phase 1**: Design intent Q&A (one-question-at-a-time with user)
59
+ - **Phase 2**: Technical research (web + codebase, OWASP Top 10)
60
+ - **Phase 3**: Create branch + task list (TDD-ordered)
61
+
62
+ ### 2. Development (`/dev`)
63
+
64
+ Subagent-driven TDD per task:
65
+ - Implementer subagent: RED-GREEN-REFACTOR enforced by HARD-GATE
66
+ - Spec compliance reviewer: checks every task
67
+ - Code quality reviewer: checks after spec compliance
68
+ - Decision gate: 7-dimension scoring when spec gap found
69
+
70
+ ### 3. Validate (`/validate`)
71
+
72
+ Validate everything (HARD-GATE exit — fresh output required):
73
+ - Type checking
74
+ - Linting (0 errors, 0 warnings)
75
+ - All tests passing
76
+ - Security scan (OWASP Top 10)
77
+
78
+ ### 4. Ship (`/ship`)
79
+
80
+ Create pull request:
81
+ - Push branch
82
+ - Create PR with design doc reference
83
+ - Link to Beads issue
84
+
85
+ ### 5. Review (`/review <pr-number>`)
86
+
87
+ Address ALL feedback:
88
+ - GitHub Actions failures
89
+ - Greptile inline comments (reply + resolve each)
90
+ - SonarCloud issues
91
+ - Other CI/CD tool feedback
92
+
93
+ ### 6. Premerge (`/premerge <pr-number>`)
94
+
95
+ Complete docs and hand off (NEVER merges):
96
+ - Update CLAUDE.md, AGENTS.md, GEMINI.md, README as needed
97
+ - Commit docs to feature branch
98
+ - Hand off PR URL to user for merge
99
+
100
+ ### 7. Verify (`/verify`)
101
+
102
+ Post-merge health check:
103
+ - CI on main: all checks green
104
+ - Close Beads issue
105
+ - Confirm merge landed
106
+
107
+ ## Directory Structure
108
+
109
+ ```
110
+ your-project/
111
+ ├── AGENTS.md # Universal (Windsurf, Cursor, Kilo, OpenCode, Cline, Roo, Aider)
112
+ ├── CLAUDE.md # Claude Code
113
+ ├── GEMINI.md # Google Antigravity
114
+ ├── .cursorrules # Cursor
115
+
116
+ ├── .claude/commands/ # Claude Code commands
117
+ └── docs/
118
+ ├── plans/
119
+ │ ├── YYYY-MM-DD-<slug>-design.md
120
+ │ └── YYYY-MM-DD-<slug>-tasks.md
121
+ └── TOOLCHAIN.md
122
+ ```
123
+
124
+ ## Supported Agents
125
+
126
+ This workflow works with ALL major AI coding agents:
127
+
128
+ | Agent | Instructions | Commands |
129
+ |-------|-------------|----------|
130
+ | Claude Code | CLAUDE.md | .claude/commands/ |
131
+ | Google Antigravity | GEMINI.md | .agent/workflows/ |
132
+ | Cursor | .cursorrules | .cursor/rules/ |
133
+ | Windsurf | AGENTS.md | .windsurf/workflows/ |
134
+ | Kilo Code | AGENTS.md | .kilocode/workflows/ |
135
+ | OpenCode | AGENTS.md | .opencode/commands/ |
136
+ | Cline | AGENTS.md | - |
137
+ | Roo Code | AGENTS.md | .roo/commands/ |
138
+ | Continue | AGENTS.md | .continue/prompts/ |
139
+ | GitHub Copilot | .github/copilot-instructions.md | .github/prompts/ |
140
+ | Aider | AGENTS.md (via .aider.conf.yml) | In-chat |
141
+ | Codex CLI | AGENTS.md | In-chat |
142
+
143
+ ## License
144
+
145
+ MIT
146
+
147
+ ---
148
+
149
+ See `AGENTS.md` for the complete workflow guide.
@@ -277,7 +277,12 @@ Do NOT declare /dev complete until:
277
277
  ### Beads update
278
278
 
279
279
  ```bash
280
- bash scripts/beads-context.sh stage-transition <id> dev validate
280
+ bash scripts/beads-context.sh validate <id>
281
+ bash scripts/beads-context.sh stage-transition <id> dev validate \
282
+ --summary "<N tasks done, M decision gates fired>" \
283
+ --decisions "<key spec gaps and how they were resolved>" \
284
+ --artifacts "<changed source files and test files>" \
285
+ --next "<validation priorities — lint issues, type concerns>"
281
286
  ```
282
287
 
283
288
  ---
@@ -78,6 +78,44 @@ If exit code 0: proceed silently to Phase 1.
78
78
 
79
79
  ---
80
80
 
81
+ ### Parallel PR coordination check (soft block)
82
+
83
+ Before proceeding to Phase 1, check for merge conflicts and dependency issues with in-flight PRs:
84
+
85
+ ```bash
86
+ # Run merge simulation if on a feature branch
87
+ current_branch="$(git branch --show-current)"
88
+ if [[ "$current_branch" != "master" ]] && [[ "$current_branch" != "main" ]]; then
89
+ bash scripts/pr-coordinator.sh merge-sim "$current_branch" 2>&1 || true
90
+ fi
91
+
92
+ # Show current merge queue
93
+ bash scripts/pr-coordinator.sh merge-order 2>&1 || true
94
+
95
+ # Check for stale worktrees (informational)
96
+ bash scripts/pr-coordinator.sh stale-worktrees 2>&1 || true
97
+ ```
98
+
99
+ If merge conflicts or unmet dependencies are found:
100
+ - Display the findings to the developer
101
+ - Ask: "In-flight PRs have potential conflicts. Proceed with planning anyway? (y/n)"
102
+ - If `n`: exit cleanly, no side effects
103
+ - If `y`: log override via `bd comments add <id> "PR coordination override: proceeding despite in-flight conflicts"`, then continue to Phase 1
104
+
105
+ ---
106
+
107
+ ### Team identity verification
108
+
109
+ Before starting planning, verify team identity is mapped:
110
+
111
+ ```bash
112
+ bash scripts/forge-team/index.sh verify 2>&1 || true
113
+ ```
114
+
115
+ If verify reports issues, address them before proceeding (the output will include `FORGE_AGENT_7f3a:PROMPT:` directives with exact commands to run).
116
+
117
+ ---
118
+
81
119
  ## Phase 1: Design Intent (Brainstorming)
82
120
 
83
121
  **Goal**: Capture WHAT to build — purpose, constraints, success criteria, edge cases, approach.
@@ -155,7 +193,6 @@ Questions to cover (adapt to feature, don't ask mechanical copies):
155
193
  3. **Success criteria** — How will we know it's done? What is the minimum viable result?
156
194
  4. **Edge cases** — What happens when [key dependency] fails / [input] is missing / [state] is ambiguous?
157
195
  5. **Technical preferences** — Library A or B? Pattern X or Y? (when real options exist)
158
- 6. **Ambiguity policy** — If a spec gap is found mid-dev, should the agent: (a) make a reasonable choice and document it, or (b) pause and wait for input?
159
196
 
160
197
  ### Step 3: Propose approaches
161
198
 
@@ -174,7 +211,7 @@ Save to `docs/plans/YYYY-MM-DD-<slug>-design.md` with these sections:
174
211
  - **Approach selected**: which option and why
175
212
  - **Constraints**: hard limits
176
213
  - **Edge cases**: decisions made during Q&A
177
- - **Ambiguity policy**: agent's fallback when spec gaps arise mid-dev
214
+ - **Ambiguity policy**: Use 7-dimension rubric scoring per /dev decision gate. >= 80% confidence: proceed and document. < 80%: stop and ask.
178
215
 
179
216
  Commit the design doc:
180
217
  ```bash
@@ -388,6 +425,9 @@ Expected output: <what running the test/code produces when done>
388
425
  - Feature logic SECOND
389
426
  - Integration/wiring THIRD
390
427
  - Uncertain/ambiguous tasks LAST (so they can be deferred if blocked)
428
+ - **File ownership**: Each task MUST include an `OWNS:` line listing files it will modify
429
+ - No two tasks in the same wave can own the same file
430
+ - Cross-wave ownership is allowed (sequential execution prevents conflicts)
391
431
 
392
432
  **YAGNI filter** (after initial task draft, before saving):
393
433
 
@@ -469,10 +509,15 @@ Do NOT proceed to /dev until ALL are confirmed:
469
509
  </HARD-GATE>
470
510
  ```
471
511
 
472
- After all HARD-GATE items pass, record the stage transition on the Beads issue:
512
+ After all HARD-GATE items pass, validate context and record the stage transition:
473
513
 
474
514
  ```bash
475
- bash scripts/beads-context.sh stage-transition <id> plan dev
515
+ bash scripts/beads-context.sh validate <id>
516
+ bash scripts/beads-context.sh stage-transition <id> plan dev \
517
+ --summary "<design approach chosen, task count>" \
518
+ --decisions "<key trade-offs resolved during Q&A>" \
519
+ --artifacts "docs/plans/YYYY-MM-DD-<slug>-design.md docs/plans/YYYY-MM-DD-<slug>-tasks.md" \
520
+ --next "<first dev task focus area>"
476
521
  ```
477
522
 
478
523
  ---
@@ -481,20 +526,20 @@ bash scripts/beads-context.sh stage-transition <id> plan dev
481
526
 
482
527
  ```
483
528
  ✓ Phase 1: Design intent captured
484
- - Design doc: docs/plans/2026-02-26-stripe-billing-design.md
485
- - Approach: Stripe SDK v4 (selected over v3)
486
- - Ambiguity policy: Make conservative choice + document in decisions log
529
+ - Design doc: docs/plans/<date>-<slug>-design.md
530
+ - Approach: <selected approach> (selected over <alternatives>)
531
+ - Ambiguity policy: Rubric scoring (>= 80% proceed, < 80% ask)
487
532
 
488
533
  ✓ Phase 2: Technical research complete
489
- - OWASP Top 10: 3 risks identified, 3 mitigations planned
490
- - TDD scenarios: 5 identified
491
- - Sources: 8 references
534
+ - OWASP Top 10: <N> risks identified, <N> mitigations planned
535
+ - TDD scenarios: <N> identified
536
+ - Sources: <N> references
492
537
 
493
538
  ✓ Phase 3: Setup complete
494
- - Beads: forge-xyz (in_progress)
495
- - Branch: feat/stripe-billing
496
- - Worktree: .worktrees/stripe-billing (baseline: 24/24 tests passing)
497
- - Task list: docs/plans/2026-02-26-stripe-billing-tasks.md (8 tasks)
539
+ - Beads: <issue-id> (in_progress)
540
+ - Branch: feat/<slug>
541
+ - Worktree: .worktrees/<slug> (baseline: <N>/<N> tests passing)
542
+ - Task list: docs/plans/<date>-<slug>-tasks.md (<N> tasks)
498
543
 
499
544
  ⏸️ Task list ready for review. Confirm to proceed.
500
545
 
@@ -125,6 +125,16 @@ Output:
125
125
  After you merge, run /verify to confirm everything landed correctly.
126
126
  ```
127
127
 
128
+ ### Step 6: Validate Context and Record Stage Transition
129
+
130
+ ```bash
131
+ bash scripts/beads-context.sh validate <id>
132
+ bash scripts/beads-context.sh stage-transition <id> premerge verify \
133
+ --summary "<docs updated, CI green, PR ready>" \
134
+ --artifacts "<updated doc files, PR URL>" \
135
+ --next "<merge instructions for user>"
136
+ ```
137
+
128
138
  ```
129
139
  <HARD-GATE: /premerge exit>
130
140
  Do NOT run gh pr merge.
@@ -366,7 +366,13 @@ Do NOT declare /review complete until:
366
366
  1. bash .claude/scripts/greptile-resolve.sh stats <pr-number> shows "All Greptile threads resolved"
367
367
  2. ALL human reviewer comments are either resolved or have a reply with explanation
368
368
  3. gh pr checks <pr-number> shows all checks passing
369
- 4. Stage transition: Run `bash scripts/beads-context.sh stage-transition <id> review premerge` exit 0 confirmed
369
+ 4. Context check: Run `bash scripts/beads-context.sh validate <id>` and address any warnings
370
+ 5. Stage transition: Run the following → exit 0 confirmed:
371
+ bash scripts/beads-context.sh stage-transition <id> review premerge \
372
+ --summary "<all feedback addressed summary>" \
373
+ --decisions "<comment resolutions — valid fixes and justified rejections>" \
374
+ --artifacts "<fixed files, commit SHAs>" \
375
+ --next "<doc update needs for premerge>"
370
376
  </HARD-GATE>
371
377
  ```
372
378