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.
- package/.claude/commands/dev.md +6 -1
- package/.claude/commands/plan.md +59 -14
- package/.claude/commands/premerge.md +10 -0
- package/.claude/commands/review.md +7 -1
- package/.claude/commands/ship.md +95 -47
- package/.claude/commands/status.md +42 -0
- package/.claude/commands/validate.md +7 -1
- package/.claude/commands/verify.md +52 -4
- package/.claude/rules/workflow.md +16 -0
- package/.claude/scripts/greptile-resolve.sh +32 -0
- package/.cline/workflows/dev.md +6 -1
- package/.cline/workflows/plan.md +59 -14
- package/.cline/workflows/premerge.md +10 -0
- package/.cline/workflows/review.md +7 -1
- package/.cline/workflows/ship.md +95 -47
- package/.cline/workflows/status.md +42 -0
- package/.cline/workflows/validate.md +7 -1
- package/.cline/workflows/verify.md +52 -4
- package/.codex/skills/dev/SKILL.md +6 -1
- package/.codex/skills/plan/SKILL.md +59 -14
- package/.codex/skills/premerge/SKILL.md +10 -0
- package/.codex/skills/review/SKILL.md +7 -1
- package/.codex/skills/ship/SKILL.md +95 -47
- package/.codex/skills/status/SKILL.md +42 -0
- package/.codex/skills/validate/SKILL.md +7 -1
- package/.codex/skills/verify/SKILL.md +52 -4
- package/.cursor/commands/dev.md +6 -1
- package/.cursor/commands/plan.md +59 -14
- package/.cursor/commands/premerge.md +10 -0
- package/.cursor/commands/review.md +7 -1
- package/.cursor/commands/ship.md +95 -47
- package/.cursor/commands/status.md +42 -0
- package/.cursor/commands/validate.md +7 -1
- package/.cursor/commands/verify.md +52 -4
- package/.cursorrules +149 -0
- package/.github/prompts/dev.prompt.md +6 -1
- package/.github/prompts/plan.prompt.md +59 -14
- package/.github/prompts/premerge.prompt.md +10 -0
- package/.github/prompts/review.prompt.md +7 -1
- package/.github/prompts/ship.prompt.md +95 -47
- package/.github/prompts/status.prompt.md +42 -0
- package/.github/prompts/validate.prompt.md +7 -1
- package/.github/prompts/verify.prompt.md +52 -4
- package/.kilocode/workflows/dev.md +6 -1
- package/.kilocode/workflows/plan.md +59 -14
- package/.kilocode/workflows/premerge.md +10 -0
- package/.kilocode/workflows/review.md +7 -1
- package/.kilocode/workflows/ship.md +95 -47
- package/.kilocode/workflows/status.md +42 -0
- package/.kilocode/workflows/validate.md +7 -1
- package/.kilocode/workflows/verify.md +52 -4
- package/.opencode/commands/dev.md +6 -1
- package/.opencode/commands/plan.md +59 -14
- package/.opencode/commands/premerge.md +10 -0
- package/.opencode/commands/review.md +7 -1
- package/.opencode/commands/ship.md +95 -47
- package/.opencode/commands/status.md +42 -0
- package/.opencode/commands/validate.md +7 -1
- package/.opencode/commands/verify.md +52 -4
- package/.roo/commands/dev.md +6 -1
- package/.roo/commands/plan.md +59 -14
- package/.roo/commands/premerge.md +10 -0
- package/.roo/commands/review.md +7 -1
- package/.roo/commands/ship.md +95 -47
- package/.roo/commands/status.md +42 -0
- package/.roo/commands/validate.md +7 -1
- package/.roo/commands/verify.md +52 -4
- package/AGENTS.md +97 -0
- package/CLAUDE.md +10 -0
- package/README.md +2 -2
- package/bin/forge-cmd.js +5 -1
- package/bin/forge-preflight.js +15 -2
- package/bin/forge.js +211 -9
- package/docs/ENHANCED_ONBOARDING.md +96 -86
- package/docs/ROADMAP.md +2 -2
- package/docs/TOOLCHAIN.md +23 -0
- package/docs/VALIDATION.md +1 -1
- package/lefthook.yml +11 -0
- package/lib/agents/README.md +46 -1
- package/lib/agents/cline.plugin.json +11 -4
- package/lib/agents/codex.plugin.json +2 -2
- package/lib/agents/copilot.plugin.json +5 -5
- package/lib/agents/cursor.plugin.json +1 -1
- package/lib/agents/kilocode.plugin.json +1 -1
- package/lib/agents/opencode.plugin.json +7 -4
- package/lib/agents/roo.plugin.json +10 -3
- package/lib/agents-config.js +129 -81
- package/lib/codex-skills.js +50 -0
- package/lib/commands/_registry.js +173 -0
- package/lib/commands/clean.js +181 -0
- package/lib/commands/commands-reset.js +147 -0
- package/lib/commands/dev.js +84 -0
- package/lib/commands/plan.js +18 -0
- package/lib/commands/push.js +196 -0
- package/lib/commands/recommend.js +1 -1
- package/lib/commands/setup.js +4295 -0
- package/lib/commands/ship.js +20 -0
- package/lib/commands/status.js +210 -44
- package/lib/commands/sync.js +71 -0
- package/lib/commands/team.js +37 -0
- package/lib/commands/test.js +207 -0
- package/lib/commands/validate.js +13 -0
- package/lib/commands/worktree.js +310 -0
- package/lib/detect-agent.js +38 -8
- package/lib/detection-utils.js +405 -0
- package/lib/docs-command.js +51 -0
- package/lib/docs-copy.js +50 -0
- package/lib/file-utils.js +260 -0
- package/lib/forge-context.js +42 -0
- package/lib/freshness-token.js +148 -0
- package/lib/frontmatter.js +79 -0
- package/lib/greptile-match.js +80 -0
- package/lib/husky-migration.js +113 -12
- package/lib/lefthook-check.js +27 -6
- package/lib/plugin-manager.js +225 -72
- package/lib/project-discovery.js +39 -5
- package/lib/reset.js +309 -0
- package/lib/runtime-health.js +305 -0
- package/lib/shell-utils.js +50 -0
- package/lib/task-ownership.js +117 -0
- package/lib/ui-utils.js +43 -0
- package/lib/validation-utils.js +163 -0
- package/lib/workflow/enforce-stage.js +179 -0
- package/lib/workflow/stages.js +201 -0
- package/lib/workflow/state.js +332 -0
- package/opencode.json +67 -0
- package/package.json +16 -6
- package/scripts/beads-context.sh +165 -22
- package/scripts/beads-context.test.js +5 -1
- package/scripts/check-agents.js +103 -0
- package/scripts/check-forge-token.js +98 -0
- package/scripts/conflict-detect.sh +2 -2
- package/scripts/dep-guard.sh +6 -28
- package/scripts/file-index.sh +117 -23
- package/scripts/forge-team/index.sh +86 -0
- package/scripts/forge-team/lib/agent-prompt.sh +52 -0
- package/scripts/forge-team/lib/claim.sh +256 -0
- package/scripts/forge-team/lib/dashboard.sh +341 -0
- package/scripts/forge-team/lib/epic.sh +332 -0
- package/scripts/forge-team/lib/hooks.sh +253 -0
- package/scripts/forge-team/lib/identity.sh +235 -0
- package/scripts/forge-team/lib/sync-github.sh +317 -0
- package/scripts/forge-team/lib/verify.sh +284 -0
- package/scripts/forge-team/lib/workload.sh +296 -0
- package/scripts/forge-team/tests/agent-prompt.test.sh +72 -0
- package/scripts/forge-team/tests/claim.test.sh +179 -0
- package/scripts/forge-team/tests/dashboard.test.sh +170 -0
- package/scripts/forge-team/tests/dispatcher.test.sh +79 -0
- package/scripts/forge-team/tests/epic.test.sh +176 -0
- package/scripts/forge-team/tests/hooks.test.sh +239 -0
- package/scripts/forge-team/tests/identity.test.sh +176 -0
- package/scripts/forge-team/tests/integration.test.sh +371 -0
- package/scripts/forge-team/tests/sync-github.test.sh +209 -0
- package/scripts/forge-team/tests/verify.test.sh +314 -0
- package/scripts/forge-team/tests/workflow-integration.test.sh +43 -0
- package/scripts/forge-team/tests/workload.test.sh +209 -0
- package/scripts/lib/eval-runner.js +39 -0
- package/scripts/lib/jsonl-lock.sh +48 -0
- package/scripts/lib/sanitize.sh +116 -0
- package/scripts/pr-coordinator.sh +756 -0
- package/scripts/smart-status.sh +58 -21
- package/scripts/sync-commands.js +49 -20
- package/scripts/sync-utils.sh +24 -29
- package/scripts/test.js +18 -1
package/.cursor/commands/ship.md
CHANGED
|
@@ -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
|
-
|
|
92
|
+
**CRITICAL**: Always use the project's own PR template. Never use a hardcoded body.
|
|
63
93
|
|
|
64
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
75
|
-
[What this PR does to solve it — approach, not implementation details]
|
|
108
|
+
**Step 5b: Read and populate the template**
|
|
76
109
|
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
126
|
+
## Changes
|
|
127
|
+
[Bulleted list of key changes]
|
|
85
128
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
- Scenarios covered: [list key scenarios]
|
|
129
|
+
## Testing
|
|
130
|
+
[How it was tested, test results]
|
|
89
131
|
|
|
90
|
-
|
|
91
|
-
-
|
|
92
|
-
- Automated scan: [result]
|
|
132
|
+
## Beads
|
|
133
|
+
Closes beads-xxx
|
|
93
134
|
|
|
94
|
-
|
|
95
|
-
|
|
135
|
+
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
136
|
+
```
|
|
96
137
|
|
|
97
|
-
|
|
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
|
-
|
|
101
|
-
|
|
140
|
+
```bash
|
|
141
|
+
gh pr create --title "<type>: <concise description>" --body "<populated-template-content>"
|
|
142
|
+
```
|
|
102
143
|
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
###
|
|
107
|
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
|
|
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
|
-
|
|
160
|
+
### Team sync after PR
|
|
113
161
|
|
|
114
|
-
|
|
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
|
-
|
|
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
|
-
- **
|
|
157
|
-
- **
|
|
158
|
-
- **
|
|
159
|
-
- **
|
|
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.
|
|
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
|
|
145
|
+
### Step 8: Close Beads Issues (if healthy)
|
|
146
146
|
|
|
147
|
-
If everything is clean, close
|
|
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
|
-
|
|
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
|
|
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
|
|
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**:
|
|
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
|
|
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
|
|
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
|
|
485
|
-
- Approach:
|
|
486
|
-
- Ambiguity policy:
|
|
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:
|
|
490
|
-
- TDD scenarios:
|
|
491
|
-
- Sources:
|
|
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:
|
|
495
|
-
- Branch: feat
|
|
496
|
-
- Worktree: .worktrees
|
|
497
|
-
- Task list: docs/plans
|
|
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.
|
|
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
|
|