@garygentry/feature-forge 0.2.2 → 0.2.4
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 +6 -1
- package/adapters/GENERATION-REPORT.md +5 -1
- package/adapters/claude/references/forge-config-schema.json +43 -4
- package/adapters/claude/references/pipeline-state-schema.json +3 -2
- package/adapters/claude/references/portable-root.md +2 -2
- package/adapters/claude/references/process-overview.md +10 -0
- package/adapters/claude/references/shared-conventions.md +17 -9
- package/adapters/claude/references/stage-exit-protocol.md +99 -0
- package/adapters/claude/scripts/epic-manifest.py +10 -0
- package/adapters/claude/scripts/forge-bootstrap.py +94 -16
- package/adapters/claude/scripts/forge-init.sh +13 -1
- package/adapters/claude/scripts/forge-session.py +636 -0
- package/adapters/claude/skills/forge/SKILL.md +60 -4
- package/adapters/claude/skills/forge-0-epic/SKILL.md +20 -15
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +6 -4
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/claude/skills/forge-1-prd/SKILL.md +14 -4
- package/adapters/claude/skills/forge-2-tech/SKILL.md +14 -3
- package/adapters/claude/skills/forge-3-specs/SKILL.md +14 -3
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +16 -5
- package/adapters/claude/skills/forge-5-loop/SKILL.md +20 -21
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +10 -5
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +41 -15
- package/adapters/claude/skills/forge-6-docs/SKILL.md +6 -6
- package/adapters/claude/skills/forge-bootstrap/SKILL.md +4 -4
- package/adapters/claude/skills/forge-fix/SKILL.md +27 -6
- package/adapters/claude/skills/forge-guide/SKILL.md +179 -0
- package/adapters/claude/skills/forge-init/SKILL.md +31 -1
- package/adapters/claude/skills/forge-verify/SKILL.md +46 -15
- package/adapters/claude/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/codex/references/forge-config-schema.json +43 -4
- package/adapters/codex/references/pipeline-state-schema.json +3 -2
- package/adapters/codex/references/portable-root.md +2 -2
- package/adapters/codex/references/process-overview.md +10 -0
- package/adapters/codex/references/shared-conventions.md +17 -9
- package/adapters/codex/references/stage-exit-protocol.md +99 -0
- package/adapters/codex/scripts/epic-manifest.py +10 -0
- package/adapters/codex/scripts/forge-bootstrap.py +94 -16
- package/adapters/codex/scripts/forge-init.sh +13 -1
- package/adapters/codex/scripts/forge-session.py +636 -0
- package/adapters/codex/skills/forge/SKILL.md +60 -4
- package/adapters/codex/skills/forge-0-epic/SKILL.md +21 -16
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +6 -4
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/codex/skills/forge-1-prd/SKILL.md +14 -4
- package/adapters/codex/skills/forge-2-tech/SKILL.md +15 -4
- package/adapters/codex/skills/forge-3-specs/SKILL.md +14 -3
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +16 -5
- package/adapters/codex/skills/forge-5-loop/SKILL.md +22 -23
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +10 -5
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +41 -15
- package/adapters/codex/skills/forge-6-docs/SKILL.md +6 -6
- package/adapters/codex/skills/forge-bootstrap/SKILL.md +4 -4
- package/adapters/codex/skills/forge-fix/SKILL.md +27 -6
- package/adapters/codex/skills/forge-guide/SKILL.md +188 -0
- package/adapters/codex/skills/forge-init/SKILL.md +31 -1
- package/adapters/codex/skills/forge-verify/SKILL.md +45 -14
- package/adapters/codex/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/copilot/references/forge-config-schema.json +43 -4
- package/adapters/copilot/references/pipeline-state-schema.json +3 -2
- package/adapters/copilot/references/portable-root.md +2 -2
- package/adapters/copilot/references/process-overview.md +10 -0
- package/adapters/copilot/references/shared-conventions.md +17 -9
- package/adapters/copilot/references/stage-exit-protocol.md +99 -0
- package/adapters/copilot/scripts/epic-manifest.py +10 -0
- package/adapters/copilot/scripts/forge-bootstrap.py +94 -16
- package/adapters/copilot/scripts/forge-init.sh +13 -1
- package/adapters/copilot/scripts/forge-session.py +636 -0
- package/adapters/copilot/skills/forge/forge.md +60 -4
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +21 -16
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +6 -4
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +14 -4
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +15 -4
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +14 -3
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +16 -5
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +22 -23
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +10 -5
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +41 -15
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +6 -6
- package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +4 -4
- package/adapters/copilot/skills/forge-fix/forge-fix.md +27 -6
- package/adapters/copilot/skills/forge-guide/forge-guide.md +188 -0
- package/adapters/copilot/skills/forge-init/forge-init.md +31 -1
- package/adapters/copilot/skills/forge-verify/forge-verify.md +45 -14
- package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/cursor/references/forge-config-schema.json +43 -4
- package/adapters/cursor/references/pipeline-state-schema.json +3 -2
- package/adapters/cursor/references/portable-root.md +2 -2
- package/adapters/cursor/references/process-overview.md +10 -0
- package/adapters/cursor/references/shared-conventions.md +17 -9
- package/adapters/cursor/references/stage-exit-protocol.md +99 -0
- package/adapters/cursor/scripts/epic-manifest.py +10 -0
- package/adapters/cursor/scripts/forge-bootstrap.py +94 -16
- package/adapters/cursor/scripts/forge-init.sh +13 -1
- package/adapters/cursor/scripts/forge-session.py +636 -0
- package/adapters/cursor/skills/forge/forge.mdc +60 -4
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +21 -16
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +6 -4
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +14 -4
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +15 -4
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +14 -3
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +16 -5
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +22 -23
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +10 -5
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +41 -15
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +6 -6
- package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +4 -4
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +27 -6
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +189 -0
- package/adapters/cursor/skills/forge-init/forge-init.mdc +31 -1
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +45 -14
- package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/gemini/gemini-extension.json +4 -0
- package/adapters/gemini/references/forge-config-schema.json +43 -4
- package/adapters/gemini/references/pipeline-state-schema.json +3 -2
- package/adapters/gemini/references/portable-root.md +2 -2
- package/adapters/gemini/references/process-overview.md +10 -0
- package/adapters/gemini/references/shared-conventions.md +17 -9
- package/adapters/gemini/references/stage-exit-protocol.md +99 -0
- package/adapters/gemini/scripts/epic-manifest.py +10 -0
- package/adapters/gemini/scripts/forge-bootstrap.py +94 -16
- package/adapters/gemini/scripts/forge-init.sh +13 -1
- package/adapters/gemini/scripts/forge-session.py +636 -0
- package/adapters/gemini/skills/forge/forge.md +60 -4
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +21 -16
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +6 -4
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +14 -4
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +15 -4
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +14 -3
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +16 -5
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +22 -23
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +10 -5
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +41 -15
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +6 -6
- package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +4 -4
- package/adapters/gemini/skills/forge-fix/forge-fix.md +27 -6
- package/adapters/gemini/skills/forge-guide/forge-guide.md +188 -0
- package/adapters/gemini/skills/forge-init/forge-init.md +31 -1
- package/adapters/gemini/skills/forge-verify/forge-verify.md +45 -14
- package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +1 -1
- package/dist/apply.js +34 -8
- package/dist/cli.js +40 -4
- package/dist/fsutil.d.ts +0 -12
- package/dist/fsutil.js +10 -1
- package/dist/manifest.d.ts +1 -1
- package/dist/plan.js +22 -2
- package/dist/rauf.d.ts +4 -4
- package/dist/rauf.js +3 -3
- package/dist/report.js +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -121,8 +121,7 @@ user requests additional flags, append them to the rendered run command.
|
|
|
121
121
|
## Launch detail (Step 3b — background process)
|
|
122
122
|
|
|
123
123
|
Launch the loop **backgrounded** so it survives session end and does not block the
|
|
124
|
-
session,
|
|
125
|
-
it live.
|
|
124
|
+
session, then supervise it live via the runner's structured event file.
|
|
126
125
|
|
|
127
126
|
> **Clean-tree precondition.** rauf refuses to run with uncommitted changes
|
|
128
127
|
> (*"Refusing to run the loop with uncommitted changes… pass --force"*). Step 3a's
|
|
@@ -132,22 +131,41 @@ it live.
|
|
|
132
131
|
> changes after that commit, surface it and let the user commit/stash or pass
|
|
133
132
|
> `--force`; never auto-pass `--force`.
|
|
134
133
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
**Do NOT redirect the run's stdout into `{loopRunner.stateDir}`.** rauf **persists
|
|
135
|
+
its own** `{stateDir}/events.ndjson` (structured) and `{stateDir}/{logFile}` (human)
|
|
136
|
+
natively, and **rotates** them at the start of every run (the prior run's files are
|
|
137
|
+
renamed into `{stateDir}/archive/`). A redirect like `… --ndjson >
|
|
138
|
+
{stateDir}/events.ndjson` therefore (a) is **redundant** — the runner writes that
|
|
139
|
+
file regardless — and (b) **collides** with the runner's own writer: the shell holds
|
|
140
|
+
a descriptor on the file the runner immediately rotates away, so the redirected
|
|
141
|
+
`--ndjson` stdout is orphaned into a bogus `archive/` file while the live
|
|
142
|
+
`events.ndjson` is the runner's native stream. It only *looks* clean by accident of
|
|
143
|
+
rotation timing. So:
|
|
144
|
+
|
|
145
|
+
- **Self-persisting runner (default — rauf writes `{stateDir}/events.ndjson`):**
|
|
146
|
+
launch the **plain `runCommand`** with `run_in_background: true` and **no
|
|
147
|
+
redirect** — the Bash tool already captures the run's stdout/stderr to the
|
|
148
|
+
background task's output file (use it to diagnose a launch refusal). Supervise by
|
|
149
|
+
arming the Monitor on the runner's **native** `{backlogDir}/{stateDir}/events.ndjson`
|
|
150
|
+
(Step 3d). Guard the very first run with the state dir:
|
|
138
151
|
|
|
139
152
|
```
|
|
140
|
-
mkdir -p {backlogDir}/{loopRunner.stateDir} && {rendered
|
|
153
|
+
mkdir -p {backlogDir}/{loopRunner.stateDir} && {rendered runCommand}
|
|
141
154
|
```
|
|
142
155
|
|
|
143
|
-
(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
with
|
|
148
|
-
human log (3d fallback) instead of the NDJSON file.
|
|
156
|
+
(Note: the `--ndjson` stdout stream and `loopRunner.eventStreamCommand` are **not**
|
|
157
|
+
used on this path — the native file already carries the same structured records.)
|
|
158
|
+
- **Stdout-only runner (no native event file):** render `eventStreamCommand` (it adds
|
|
159
|
+
`--ndjson`) and redirect its stdout to a file **outside `{stateDir}`** so it cannot
|
|
160
|
+
collide with any native file or be swept into `archive/`, then Monitor that file:
|
|
149
161
|
|
|
150
|
-
|
|
162
|
+
```
|
|
163
|
+
mkdir -p {backlogDir}/{loopRunner.stateDir} && {rendered eventStreamCommand} > {backlogDir}/forge-events.ndjson 2>&1
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
The background task's exit notification remains the single authoritative terminal
|
|
167
|
+
signal (Step 4). Loop runs can take significant time (minutes to hours depending on
|
|
168
|
+
backlog size).
|
|
151
169
|
|
|
152
170
|
## Arm a Monitor on the event stream (Step 3d)
|
|
153
171
|
|
|
@@ -161,16 +179,24 @@ terminal and exception state, not just the happy path — otherwise a crash or h
|
|
|
161
179
|
looks identical to "still running." Monitor command (NDJSON path):
|
|
162
180
|
|
|
163
181
|
```
|
|
164
|
-
tail -n +1 -
|
|
182
|
+
tail -n +1 -F {backlogDir}/{loopRunner.stateDir}/events.ndjson 2>/dev/null \
|
|
165
183
|
| jq -rc --unbuffered 'select(.type | test("item_completed|item_blocked|needs_human|signal_parsed|loop_completed|loop_error|loop_cancelled|llm_stuck_warning"))'
|
|
166
184
|
```
|
|
167
185
|
|
|
186
|
+
> **Use `tail -F` (follow by name), not `-f` (follow by descriptor).** The runner
|
|
187
|
+
> **rotates** `events.ndjson` at the start of each run (renames the prior file into
|
|
188
|
+
> `archive/`, creates a fresh one). A Monitor that attaches with `-f` during that
|
|
189
|
+
> brief rotation window would follow the **archived** inode and then see silence —
|
|
190
|
+
> indistinguishable from a healthy quiet loop. `-F` re-opens the live file by name,
|
|
191
|
+
> so it always tracks the runner's current native stream. (Send `tail`'s own
|
|
192
|
+
> rotation chatter to `/dev/null` so it can't reach the `jq` filter.)
|
|
193
|
+
|
|
168
194
|
- **Fallback (log tail, no NDJSON):** match the runner's **structured prose
|
|
169
195
|
prefixes**, never the `RAUF_*` tokens (those leak inside agent output and
|
|
170
196
|
false-match). For rauf:
|
|
171
197
|
|
|
172
198
|
```
|
|
173
|
-
tail -n +1 -
|
|
199
|
+
tail -n +1 -F {backlogDir}/{loopRunner.stateDir}/{loopRunner.logFile} 2>/dev/null \
|
|
174
200
|
| grep -E --line-buffered 'Item [^ ]+ (completed|blocked):|Item [^ ]+ needs human input|Loop completed|Loop error:|Circuit breaker:'
|
|
175
201
|
```
|
|
176
202
|
|
|
@@ -44,18 +44,18 @@ Check `.pipeline-state.json` for `stages.forge-verify-impl`. If it is **absent**
|
|
|
44
44
|
If the resolved feature has an `epic` back-pointer in its `.pipeline-state.json`, run:
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
47
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
48
48
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
49
49
|
python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
If `render-status` fails, skip the epic-level offer and proceed with the per-feature docs only; surface the error per the exit-1/exit-2 split in the **Feature Directory Resolution** block of `references/shared-conventions.md` (exit 1 → parse `{findings[]}` from stdout; exit 2 → surface the plain `Error:` stderr line verbatim).
|
|
53
53
|
|
|
54
|
-
**Only if `rollup.total > 0 AND rollup.complete == rollup.total`** (every member is complete-for-orchestration; the `total > 0` guard excludes an empty epic),
|
|
54
|
+
**Only if `rollup.total > 0 AND rollup.complete == rollup.total`** (every member is complete-for-orchestration; the `total > 0` guard excludes an empty epic), offer the extra doc as a statement the user can take or leave — not a forced question:
|
|
55
55
|
|
|
56
|
-
"All {total} features in the '{epic}' epic are complete.
|
|
56
|
+
"All {total} features in the '{epic}' epic are complete. I can also generate an **epic-level architecture document** spanning the features, alongside {feature}'s per-feature docs — say the word and I'll add it."
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
If the user asks for it, synthesize a doc at **`{docsDir}/{epic}/`** sourced from: the `EPIC.md` narrative, each member's per-feature docs, and the manifest contracts (each feature's `exposes`/`consumes`). When the epic-level doc is written, the Step 5 commit also stages `{docsDir}/{epic}/`.
|
|
59
59
|
|
|
60
60
|
If not all members are complete (or the feature has no `epic` back-pointer), **do not offer** — the per-feature doc flow proceeds unchanged.
|
|
61
61
|
|
|
@@ -97,7 +97,7 @@ Based on feature complexity and existing doc conventions, propose a doc plan:
|
|
|
97
97
|
└── adr-001-*.md — Architecture decision records (if significant decisions were made)
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
Present the plan and
|
|
100
|
+
Present the plan as a statement and invite edits before writing — not a forced confirmation gate: "Here's the doc plan I'll generate. Tell me if you want to add, remove, or restructure any documents; otherwise I'll proceed." Write the docs unless the user asks for changes.
|
|
101
101
|
|
|
102
102
|
## Step 3: Write Documentation
|
|
103
103
|
|
|
@@ -176,7 +176,7 @@ Write pipeline state conforming to `references/pipeline-state-schema.json`.
|
|
|
176
176
|
- Set `currentStage` to `complete`
|
|
177
177
|
- Record `artifacts`
|
|
178
178
|
- Set `stages.forge-6-docs.basedOnVersions` to include versions for all completed upstream stages. Always include forge-1-prd, forge-2-tech, forge-3-specs. Include forge-4-backlog and forge-5-loop ONLY if they have status `complete`.
|
|
179
|
-
2. If `gitCommitAfterStage` is true, follow the Git Commit Protocol in `references/shared-conventions.md`: stage files (`git add {docsDir}/{feature}/ {resolvedFeatureDir}/` — and **also** `{docsDir}/{epic}/` when an epic-level doc was written in Step 1), attempt commit with message `"{commitPrefix}({feature}): complete architecture docs"
|
|
179
|
+
2. If `gitCommitAfterStage` is true, follow the Git Commit Protocol in `references/shared-conventions.md`: stage files (`git add {docsDir}/{feature}/ {resolvedFeatureDir}/` — and **also** `{docsDir}/{epic}/` when an epic-level doc was written in Step 1), attempt commit with message `"{commitPrefix}({feature}): complete architecture docs"` (marking `stages.forge-6-docs.status` `complete` with `commitHash: null` in that commit), then record the artifact-commit hash via the protocol's two-commit follow-up (never `--amend`) only on success. If commit fails, leave status as `in-progress`.
|
|
180
180
|
4. Tell user: "Documentation complete. Feature pipeline for '{feature}' is finished!\n `/feature-forge:forge {feature}` to see the final pipeline status."
|
|
181
181
|
|
|
182
182
|
## Gotchas
|
|
@@ -59,7 +59,7 @@ Every bash invocation begins with the byte-identical portable-root prelude, then
|
|
|
59
59
|
helper. Pass `--specs-dir ./specs` (the default) so the gate allow-lists the specs directory.
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
62
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
63
63
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
64
64
|
python3 "$R/scripts/forge-bootstrap.py" check "<target-dir>" --json --specs-dir ./specs
|
|
65
65
|
```
|
|
@@ -136,7 +136,7 @@ when running under a Claude host (e.g. the host's question mechanism is availabl
|
|
|
136
136
|
`CLAUDE.md` only when `host == "claude"`.
|
|
137
137
|
|
|
138
138
|
```bash
|
|
139
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
139
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
140
140
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
141
141
|
python3 "$R/scripts/forge-bootstrap.py" scaffold "<target-dir>" --json --answers '<Answers JSON>'
|
|
142
142
|
```
|
|
@@ -144,7 +144,7 @@ python3 "$R/scripts/forge-bootstrap.py" scaffold "<target-dir>" --json --answers
|
|
|
144
144
|
### Step 5 — verify
|
|
145
145
|
|
|
146
146
|
```bash
|
|
147
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
147
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
148
148
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
149
149
|
python3 "$R/scripts/forge-bootstrap.py" verify "<target-dir>" --json --answers '<Answers JSON>'
|
|
150
150
|
```
|
|
@@ -170,7 +170,7 @@ and removes the sentinel before staging so it never enters history. Read
|
|
|
170
170
|
leave the sentinel in-progress (resumable) — do **not** declare success.
|
|
171
171
|
|
|
172
172
|
```bash
|
|
173
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
173
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
174
174
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
175
175
|
python3 "$R/scripts/forge-bootstrap.py" commit "<target-dir>" --json --answers '<Answers JSON>' [--stage-only]
|
|
176
176
|
```
|
|
@@ -9,6 +9,15 @@ alwaysApply: false
|
|
|
9
9
|
|
|
10
10
|
Apply fixes from the most recent forge-verify findings document, with step-level tracking for crash recovery.
|
|
11
11
|
|
|
12
|
+
Usually invoked by the user, but the `/feature-forge:forge` navigator may also invoke this skill
|
|
13
|
+
automatically when `autoFix: true` is configured **and** its preconditions hold (the findings
|
|
14
|
+
document has zero unresolved decision points, the working tree is clean, and a mandatory re-verify
|
|
15
|
+
passes afterward). The **fix application** below is identical either way — this skill is not
|
|
16
|
+
"auto-aware" about *applying* findings; it always applies the latest findings document. The
|
|
17
|
+
navigator owns the gating decisions, including the closing re-verify: the Step 6 gate is
|
|
18
|
+
presented **only on a direct invocation**, because under an `autoFix` chain the navigator runs the
|
|
19
|
+
mandatory re-verify itself.
|
|
20
|
+
|
|
12
21
|
## Prerequisites
|
|
13
22
|
|
|
14
23
|
Read and follow `references/shared-conventions.md` for feature name validation, configuration reading, and force mode handling before proceeding.
|
|
@@ -55,14 +64,26 @@ Follow the Git Commit Protocol in `references/shared-conventions.md`.
|
|
|
55
64
|
1. Update `{resolvedFeatureDir}/.pipeline-state.json`:
|
|
56
65
|
- Set the relevant `forge-verify-*` entry status to `findings-applied`
|
|
57
66
|
- Record `fixedAt` timestamp
|
|
58
|
-
|
|
67
|
+
- Record `verifiedStageVersion` = the current `version` of the production stage entry
|
|
68
|
+
this verify covers (e.g. fixing `tech` findings → `stages["forge-2-tech"].version`).
|
|
69
|
+
This keeps the navigator's freshness ledger accurate after a fix, so the verified
|
|
70
|
+
stage reads as `fresh` and auto-verify does not needlessly re-fire on an unchanged
|
|
71
|
+
artifact. (If the fix itself bumped the production stage's `version`, use the new
|
|
72
|
+
value so the ledger reflects what was actually verified/fixed.)
|
|
73
|
+
2. If `gitCommitAfterStage` is true, follow the Git Commit Protocol: stage files (`git add {resolvedFeatureDir}/` — or `{specsDir}/{epic}/` for an epic member so the member-state change commits atomically with the epic subtree), attempt commit with message `"{commitPrefix}({feature}): apply {mode} verification fixes"` (writing `commitHash: null` in that commit), then record the artifact-commit hash via the protocol's two-commit follow-up (never `--amend`) only on success.
|
|
74
|
+
|
|
75
|
+
## Step 6: Re-verify Gate
|
|
76
|
+
|
|
77
|
+
Fixes are applied and recorded (`findings-applied`), so the stage reads **fresh** in the navigator's ledger (Step 5 set `verifiedStageVersion` to the current version). A re-verify is nonetheless the only thing that *confirms* the fixes actually resolved the findings, so on a **direct/manual** `forge-fix` invocation, **prompt** it rather than leaving it as a passive suggestion — this is the same **Standard Verify Gate** the stage skills stamp (`references/stage-exit-protocol.md`).
|
|
78
|
+
|
|
79
|
+
**Skip this gate when the navigator invoked you as part of an `autoFix` chain** (`skills/forge/SKILL.md` §3b step 2b): there the navigator owns the mandatory re-verify, so a second gate here would block the unattended flow or double the re-verify. Just return and let the navigator proceed.
|
|
59
80
|
|
|
60
|
-
|
|
81
|
+
On a direct invocation, present the gate using the host's question mechanism with these three options — but only when the host has a question mechanism **and** the clean-room path is available (the host's subagent mechanism plus a dispatchable `forge-verifier` subagent):
|
|
82
|
+
- **Re-verify {feature} now** *(recommended)* — dispatch the clean-room `forge-verifier` subagent from this session in require-clean mode to confirm every finding is resolved; the digest returns here so any remaining issue keeps its context. One-time — it does **not** change config.
|
|
83
|
+
- **Re-verify now + enable auto-verify going forward** — re-verify now **and** patch `"autoVerify": true` into `forge.config.json` in place (preserve formatting and every other key) so future stages verify automatically, no prompt. This complements the `forge-init` opt-in. **Do not auto-commit this config change** — treat it like `notes`: a user-facing edit the user commits on their own cadence, never folded into a stage's artifact commit.
|
|
84
|
+
- **Skip for now** — proceed without re-verifying; the fixes are already recorded, so the stage stays `findings-applied` (fresh in the ledger). Run `/feature-forge:forge {feature}` when you want pipeline status.
|
|
61
85
|
|
|
62
|
-
|
|
63
|
-
"Fixes applied. Next steps:
|
|
64
|
-
- Run `/feature-forge:forge-verify {feature}` again to confirm all issues are resolved
|
|
65
|
-
- Or `/feature-forge:forge {feature}` to see pipeline status"
|
|
86
|
+
**Host / clean-room fallback (not a user-selectable option):** if the question mechanism, the host's subagent mechanism, or the `forge-verifier` subagent is unavailable, do **not** run clean-room — degrade to printing `/feature-forge:forge-verify {feature}` for the user to run inline/manually (mirroring `autoInvokeNextStage`), and offer the auto-verify enable as plain text only if a config write is possible.
|
|
66
87
|
|
|
67
88
|
---
|
|
68
89
|
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
# GENERATED — DO NOT EDIT. Source: skills/forge-guide/SKILL.md. Regenerate: python3 scripts/build-adapters.py
|
|
3
|
+
description: Explain what feature-forge is, when to use it, how to configure it, and its best practices — advisory guidance, not stage execution. Use when the user or another agent asks what feature-forge is, whether/when to adopt it, how the pipeline works conceptually, how to set up or configure forge.config.json, or for usage tips and best practices. Do NOT trigger to RUN a pipeline stage (use forge-1-prd … forge-6-docs), to show a specific feature's status (use forge), or for general software questions unrelated to feature-forge.
|
|
4
|
+
globs: []
|
|
5
|
+
alwaysApply: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Feature Forge — Usage & Best-Practices Guide
|
|
9
|
+
|
|
10
|
+
You are the **guide** for feature-forge: an advisor, not an operator. Your job is to
|
|
11
|
+
explain *what* forge is, *when* to use it, *how* to configure it, and *what the best
|
|
12
|
+
practices are* — in plain language, grounded in the repo's own docs. You do **not**
|
|
13
|
+
run pipeline stages; when the user is ready to act, point them at the right skill.
|
|
14
|
+
|
|
15
|
+
## How to answer
|
|
16
|
+
|
|
17
|
+
1. Identify the topic (the argument, or infer from the question).
|
|
18
|
+
2. **Ground yourself in the canonical source before answering** — read the mapped
|
|
19
|
+
reference file(s) below rather than answering from memory. These are the source
|
|
20
|
+
of truth and stay current as the pipeline evolves.
|
|
21
|
+
3. Answer concisely, then end with the concrete next command (`/feature-forge:forge-*`)
|
|
22
|
+
or doc pointer the user should go to.
|
|
23
|
+
|
|
24
|
+
| Topic | Read first |
|
|
25
|
+
|-------|-----------|
|
|
26
|
+
| Pipeline architecture, stage-by-stage flow | `references/process-overview.md` |
|
|
27
|
+
| Cross-stage conventions (naming, state, git, branch, epic injection) | `references/shared-conventions.md` |
|
|
28
|
+
| Config keys + defaults | `references/forge-config-schema.json` |
|
|
29
|
+
| Stack detection / language profiles | `references/stack-resolution.md`, `references/stacks/*.md` |
|
|
30
|
+
| Loop runner interface, signals & version gate | `references/ralph-loop-contract.md` |
|
|
31
|
+
| Deep dives, glossary, troubleshooting | `references/process-overview.md`, `references/shared-conventions.md` |
|
|
32
|
+
|
|
33
|
+
Those `references/` files are the guaranteed grounding path — they ship in every install.
|
|
34
|
+
The project's `README.md`, `COMPATIBILITY.md`, and the hosted docs site are richer but are
|
|
35
|
+
**not** part of an installed bundle, so treat them as optional enrichment (offer the docs-site
|
|
36
|
+
URL to a human) and never block an answer on opening them — fall back to the `references/`
|
|
37
|
+
files and your own knowledge.
|
|
38
|
+
|
|
39
|
+
Do NOT actually invoke stage skills or write files — this skill only explains and directs.
|
|
40
|
+
|
|
41
|
+
## What feature-forge is
|
|
42
|
+
|
|
43
|
+
A **feature development pipeline** that refines a vague idea into shipped code through
|
|
44
|
+
discrete, auditable stages — like a compiler for features. Each stage narrows scope and
|
|
45
|
+
adds structure, reading the previous stage's artifacts as standalone contracts:
|
|
46
|
+
|
|
47
|
+
- **PRD** — *what* to build (requirements only, no technology).
|
|
48
|
+
- **Tech spec** — *how* to build it (design, grounded in the codebase).
|
|
49
|
+
- **Implementation specs** — build-ready detail (types, signatures, contracts, tests).
|
|
50
|
+
- **Backlog** — self-contained work items for autonomous execution.
|
|
51
|
+
- **Loop** — a fresh-context runner implements each item, tests, and commits.
|
|
52
|
+
- **Docs** — architecture reference generated from the real implementation.
|
|
53
|
+
|
|
54
|
+
`REQ-XXX-NN` requirement IDs form a traceability spine from PRD through implementation.
|
|
55
|
+
**Verification gates** are available after any stage and run clean-room in a fresh subagent.
|
|
56
|
+
|
|
57
|
+
## When to use it — and when not
|
|
58
|
+
|
|
59
|
+
**Use forge when:** you have a well-defined feature or small epic to ship; you want
|
|
60
|
+
requirements captured cleanly before coding; you value traceability, thorough spec
|
|
61
|
+
verification, and autonomous loop execution with fresh context per item; you want
|
|
62
|
+
reproducible, auditable artifacts.
|
|
63
|
+
|
|
64
|
+
**Skip forge when:** the work is an exploratory spike with still-fluid requirements
|
|
65
|
+
(though Stage 1's interview can help clarify them); it's a one-line bug fix or trivial
|
|
66
|
+
patch where pipeline overhead isn't justified; or you're only extending mature code
|
|
67
|
+
along established patterns, where new specs become noise.
|
|
68
|
+
|
|
69
|
+
**Anti-patterns to warn against:** skipping the PRD and jumping to tech spec (the value
|
|
70
|
+
comes from separating *what* from *how*); treating specs as living contracts (they're
|
|
71
|
+
pre-implementation — drop an `AGENTS.md`/`CLAUDE.md` in the specs dir telling agents to
|
|
72
|
+
ignore drift); forcing an epic for a single feature; relying on conversation memory to
|
|
73
|
+
carry context across stages instead of reading upstream artifacts.
|
|
74
|
+
|
|
75
|
+
## The pipeline at a glance
|
|
76
|
+
|
|
77
|
+
| Stage | Skill | Produces |
|
|
78
|
+
|-------|-------|----------|
|
|
79
|
+
| 0 (optional) | `forge-0-epic` | `epic-manifest.json` + `EPIC.md` (members, deps, `exposes`/`consumes` contracts) |
|
|
80
|
+
| 1 | `forge-1-prd` | `PRD.md` with `REQ-*` IDs |
|
|
81
|
+
| 2 | `forge-2-tech` | `tech-spec.md`; detects stack + test/typecheck commands |
|
|
82
|
+
| 3 | `forge-3-specs` | numbered spec suite + `TRACEABILITY.md` |
|
|
83
|
+
| 4 | `forge-4-backlog` | `backlog.json` (self-contained items) |
|
|
84
|
+
| 5 | `forge-5-loop` | implemented code, tested + committed per item |
|
|
85
|
+
| 6 | `forge-6-docs` | architecture docs from the real code |
|
|
86
|
+
| any | `forge-verify` → `forge-fix` | findings report → applied fixes |
|
|
87
|
+
| any | `forge` | status dashboard / navigator |
|
|
88
|
+
|
|
89
|
+
Drive the whole thing with the **navigator**: `/feature-forge:forge <feature>` shows the
|
|
90
|
+
current stage and offers the next; with `autoInvokeNextStage` it launches it directly.
|
|
91
|
+
|
|
92
|
+
## Setup & configuration
|
|
93
|
+
|
|
94
|
+
**First-time setup:** `/feature-forge:forge-init` (existing repo) creates `forge.config.json`
|
|
95
|
+
with defaults. `/feature-forge:forge-bootstrap` scaffolds a *greenfield* (empty) repo to a
|
|
96
|
+
green baseline. On non-Claude agents, install via `npx @garygentry/feature-forge install`.
|
|
97
|
+
|
|
98
|
+
**Key `forge.config.json` knobs** (authoritative list: `references/forge-config-schema.json`):
|
|
99
|
+
|
|
100
|
+
- **Paths** — `specsDir` (`./specs`), `docsDir` (`./docs/architecture`), `backlogDir`.
|
|
101
|
+
- **Git** — `gitCommitAfterStage` (true), `commitPrefix` (`forge`); commits use a two-commit
|
|
102
|
+
protocol so the stage's commit hash is recorded in state without `--amend`.
|
|
103
|
+
- **Branch** — `branchPerFeature` (true), `branchPrefix` (`forge/`): isolate each feature.
|
|
104
|
+
- **Stack** — `stack`, `typeCheckCommand`, `testCommand`: null until Stage 2 auto-detects them.
|
|
105
|
+
- **Context** — `contextWindowTokens`, `contextWarnThreshold` (0.7): the navigator warns to
|
|
106
|
+
clear your session / start a fresh session past this fullness. On 1M-context models set `contextWindowTokens` explicitly.
|
|
107
|
+
- **Verification** — `autoVerify` (false), `autoVerifyStages`, `autoFix` (false).
|
|
108
|
+
- **Stage flow** — `autoInvokeNextStage` (true on Claude, print-only elsewhere).
|
|
109
|
+
- **Loop** — `loopRunner` block (binary, command templates, version gate, agent selection);
|
|
110
|
+
defaults to **rauf** when absent. `workspaces` supports monorepos.
|
|
111
|
+
|
|
112
|
+
## Verification gates
|
|
113
|
+
|
|
114
|
+
`forge-verify <feature>` dispatches the read-only `forge-verifier` subagent to find gaps,
|
|
115
|
+
inconsistencies, and quality issues; it writes a findings doc, and `forge-fix` applies them.
|
|
116
|
+
Because verification runs in a **fresh subagent**, it's clean-room by construction — it never
|
|
117
|
+
needs a clear your session / start a fresh session, and it's safe to automate with `autoVerify: true` (fixing stays human-gated
|
|
118
|
+
unless `autoFix: true`). **Always verify before Stage 5 (the loop)** — catching errors in
|
|
119
|
+
specs/backlog is far cheaper than mid-loop. Verifying after PRD and after backlog is also
|
|
120
|
+
recommended. A findings pass is fresh only while the artifact `version` matches what was
|
|
121
|
+
verified; revise upstream and downstream re-verifies.
|
|
122
|
+
|
|
123
|
+
## Context management
|
|
124
|
+
|
|
125
|
+
Each stage reads upstream artifacts as standalone contracts, so you can (and usually should)
|
|
126
|
+
clear your session / start a fresh session between them:
|
|
127
|
+
|
|
128
|
+
- **Clear** between PRD → tech, tech → specs, specs → backlog, backlog → loop.
|
|
129
|
+
- **Stay warm** mid-interview (PRD, tech spec) — the interview needs a continuous thread.
|
|
130
|
+
- **No clear needed** for any → verify (runs in a fresh subagent).
|
|
131
|
+
|
|
132
|
+
The navigator warns when the session passes `contextWarnThreshold` (default 70% full).
|
|
133
|
+
|
|
134
|
+
## Epics (large changes)
|
|
135
|
+
|
|
136
|
+
Use Stage 0 only when a change naturally splits into **several interdependent features** that
|
|
137
|
+
must agree on interfaces. `forge-0-epic` produces `epic-manifest.json` + `EPIC.md` with a
|
|
138
|
+
per-member charter, `exposes`/`consumes` contracts, and `dependsOn` edges. Each member then
|
|
139
|
+
runs the normal pipeline with epic context injected. At Stage 5 a **dependency gate** warns if
|
|
140
|
+
a member's dependencies are unmet. Epic support is purely additive — single-feature flows are
|
|
141
|
+
unchanged. Re-run `forge-0-epic` on an existing epic to enter edit mode.
|
|
142
|
+
|
|
143
|
+
## The loop
|
|
144
|
+
|
|
145
|
+
Stage 5 runs a configurable runner (**rauf** by default) that gives each backlog item a fresh
|
|
146
|
+
agent session — implement → run the verification command → commit on pass. This is why items
|
|
147
|
+
must be truly **self-contained**; context bleed breaks the model. Per-item signals:
|
|
148
|
+
|
|
149
|
+
- `RAUF_DONE` — item passed; loop continues.
|
|
150
|
+
- `RAUF_BLOCKED` — missing dependency / unclear requirement; set aside, loop continues others.
|
|
151
|
+
- `RAUF_NEEDS_HUMAN` — decision or secret needed; set aside, loop continues.
|
|
152
|
+
|
|
153
|
+
The loop doesn't pause on blocked items. Supply what's missing, then `rauf resume <path>` to
|
|
154
|
+
retry set-aside items. The runner refuses to start with a **dirty working tree** and enforces
|
|
155
|
+
a minimum runner version (the version gate is described in `references/ralph-loop-contract.md`).
|
|
156
|
+
|
|
157
|
+
## Best practices & gotchas
|
|
158
|
+
|
|
159
|
+
- Feature name is **required** for every stage command — never guess or infer it.
|
|
160
|
+
- Verify **before the loop**; a bad spec is cheap to fix now, expensive mid-loop.
|
|
161
|
+
- Keep backlog items self-contained — the loop has zero memory across items.
|
|
162
|
+
- Let stages commit for you; don't hand-edit `.pipeline-state.json` or backlog status.
|
|
163
|
+
- Re-running an upstream stage marks downstream stages **stale** — re-run them rather than
|
|
164
|
+
reaching for `--force`, which skips prerequisite checks and should be rare.
|
|
165
|
+
- Specs are pre-implementation artifacts, not living docs — don't cite them from generated code.
|
|
166
|
+
- Use the navigator (`/feature-forge:forge <feature>`) to orient; use `forge-verify` to inspect.
|
|
167
|
+
|
|
168
|
+
## Troubleshooting starters
|
|
169
|
+
|
|
170
|
+
- **Stage 5 won't start:** backlog exists and is verified? runner installed and ≥ min version?
|
|
171
|
+
working tree clean? See `references/ralph-loop-contract.md` for the runner contract and version gate.
|
|
172
|
+
- **Loop stopped mid-run:** check the signal — `BLOCKED`/`NEEDS_HUMAN` items are set aside, not
|
|
173
|
+
failures; the loop keeps going.
|
|
174
|
+
- **Downstream flagged stale:** an upstream stage was revised; re-run the downstream stage.
|
|
175
|
+
- **Where am I?** `/feature-forge:forge <feature>` renders the full pipeline status.
|
|
176
|
+
|
|
177
|
+
For anything deeper, ground yourself in `references/process-overview.md` and
|
|
178
|
+
`references/shared-conventions.md`, and point the *user* at the hosted docs site —
|
|
179
|
+
<https://garygentry.github.io/feature-forge/> — for the full guides and glossary.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Host execution notes
|
|
184
|
+
|
|
185
|
+
This skill was authored Claude-first; the body above refers to "the host's question mechanism", "the host's subagent mechanism", and "the host's background-execution mechanism". Use your runtime's equivalent for each — and if your runtime has no such tool:
|
|
186
|
+
|
|
187
|
+
- **User input:** ask the question directly and wait for the answer before proceeding. Do not skip a required question or assume an answer.
|
|
188
|
+
- **Subagents:** if your host cannot dispatch the named custom agent, run that step inline yourself.
|
|
189
|
+
- **Background / monitoring:** run long-lived commands in the foreground (or your host's background facility) and report progress as it arrives.
|
|
@@ -10,7 +10,7 @@ alwaysApply: false
|
|
|
10
10
|
Run the initialization script to create `forge.config.json` with default settings:
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
13
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
14
14
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
15
15
|
bash "$R/scripts/forge-init.sh"
|
|
16
16
|
```
|
|
@@ -24,9 +24,39 @@ After initialization, the config file will contain defaults for:
|
|
|
24
24
|
- `stack`: `null` (detected during `/feature-forge:forge-2-tech`)
|
|
25
25
|
- `typeCheckCommand`: `null` (set during `/feature-forge:forge-2-tech`)
|
|
26
26
|
- `testCommand`: `null` (set during `/feature-forge:forge-2-tech`)
|
|
27
|
+
- `autoInvokeNextStage`: `true` (the navigator auto-starts the next stage after you confirm; set `false` to only print the command)
|
|
28
|
+
- `contextWindowTokens`: `null` (the navigator infers the context window; set to your model's window, e.g. `1000000` for a 1M-context model, for accurate context-usage advice)
|
|
29
|
+
- `contextWarnThreshold`: `0.7` (fraction of the window past which the navigator suggests a clean session)
|
|
30
|
+
- `autoVerify`: `false` (set `true` to run `forge-verify` automatically after each stage completes)
|
|
31
|
+
- `autoVerifyStages`: `{}` (per-stage overrides for `autoVerify`)
|
|
32
|
+
- `autoFix`: `false` (set `true` to chain `forge-fix` after an auto-verify finds issues)
|
|
27
33
|
|
|
28
34
|
If `forge.config.json` already exists, the script will not overwrite it.
|
|
29
35
|
|
|
36
|
+
## Offer auto-verify
|
|
37
|
+
|
|
38
|
+
The template writes `autoVerify: false`. After the config is created (and only when the script
|
|
39
|
+
actually created it — skip this if it reported the file already exists), offer to turn
|
|
40
|
+
auto-verify on, then write the choice back into `forge.config.json`.
|
|
41
|
+
|
|
42
|
+
If the host's question mechanism is available, ask exactly one question:
|
|
43
|
+
|
|
44
|
+
> **Enable auto-verify?** Verification runs in a clean-room subagent after each stage
|
|
45
|
+
> completes — it never needs a clear your session / start a fresh session and only returns a compact digest to your session.
|
|
46
|
+
> **Recommended: on.** (Change later by editing `autoVerify` in `forge.config.json`.)
|
|
47
|
+
|
|
48
|
+
Options: **Enable (recommended)** / **Leave off**.
|
|
49
|
+
|
|
50
|
+
- On **Enable**: patch `"autoVerify": false` → `"autoVerify": true` in the generated
|
|
51
|
+
`forge.config.json` in place, preserving formatting and every other key.
|
|
52
|
+
- On **Leave off**: leave the config as written (`autoVerify: false`).
|
|
53
|
+
|
|
54
|
+
If the host lacks a structured question tool but can still prompt the user (e.g. Codex asks in
|
|
55
|
+
plain text), use that — ask the one question directly and wait for the reply; it is the same
|
|
56
|
+
choice, just rendered differently. Only when the host has **no** way to ask at all (a fully
|
|
57
|
+
non-interactive / headless run) do you skip the prompt: leave `autoVerify: false` and print the
|
|
58
|
+
one-line note `Set "autoVerify": true in forge.config.json to verify automatically after each stage.`
|
|
59
|
+
|
|
30
60
|
After initialization, start the pipeline with `/feature-forge:forge-1-prd <feature-name>`.
|
|
31
61
|
|
|
32
62
|
---
|
|
@@ -48,7 +48,7 @@ Pick based on how many checks the mode carries (see the per-mode totals in Step
|
|
|
48
48
|
|
|
49
49
|
The verifier(s) are read-only — they return findings as their response; **you** (the
|
|
50
50
|
parent) assemble and write the single document to
|
|
51
|
-
`{
|
|
51
|
+
`{resolvedFeatureDir}/.verification/VERIFY-{mode}-{YYYY-MM-DD}.md`. When you fanned out:
|
|
52
52
|
1. Concatenate all instances' findings and **renumber `V-NNN` IDs uniquely** across the
|
|
53
53
|
merged set.
|
|
54
54
|
2. **Dedup** overlaps — when two instances flag the same file+location+issue (e.g. a
|
|
@@ -73,15 +73,39 @@ without subagents), fall back to running verification inline in the current sess
|
|
|
73
73
|
|
|
74
74
|
**Inline execution guidance:** If running inline (not as subagent), process verification checklists one category at a time to manage context pressure. Load only the artifacts needed for each category, verify, summarize findings, then move to the next category.
|
|
75
75
|
|
|
76
|
+
### Require-clean (`auto`) mode — unattended auto-verify
|
|
77
|
+
|
|
78
|
+
When the navigator auto-invokes this skill (its `autoVerify` path), it passes a
|
|
79
|
+
**require-clean** signal (e.g. args include `--require-clean`, or the invocation is
|
|
80
|
+
described as auto-verify). In this mode the clean-room guarantee is load-bearing: the
|
|
81
|
+
whole reason auto-verify is safe to run without a clear your session / start a fresh session is that the `forge-verifier`
|
|
82
|
+
subagent inherits none of the dispatching session's context. Running inline would break
|
|
83
|
+
that — it would consume the dispatching session's context and invalidate the no-clear
|
|
84
|
+
justification.
|
|
85
|
+
|
|
86
|
+
So in require-clean mode, **do NOT fall back to inline execution**. If the host's subagent mechanism
|
|
87
|
+
or `forge-verifier` subagent is not dispatchable, return a **sentinel** instead of doing
|
|
88
|
+
any work:
|
|
89
|
+
|
|
90
|
+
> `CLEAN_ROOM_UNAVAILABLE: forge-verifier subagent not dispatchable — verify not run.`
|
|
91
|
+
|
|
92
|
+
Do not analyze artifacts, do not write a findings document, and do not touch pipeline
|
|
93
|
+
state. The navigator detects this sentinel and degrades to its manual verify gate (Tier
|
|
94
|
+
2/3), so verify state stays outstanding and the stage is never marked verified on false
|
|
95
|
+
assurance. **Manual / interactive invocation** (the normal `/feature-forge:forge-verify`
|
|
96
|
+
path, no require-clean signal) keeps the inline fallback above unchanged.
|
|
97
|
+
|
|
76
98
|
## Prerequisites
|
|
77
99
|
|
|
78
100
|
Read and follow `references/shared-conventions.md` for feature name validation, configuration reading, and force mode handling before proceeding.
|
|
79
101
|
|
|
102
|
+
Resolve the feature directory via the **Feature Directory Resolution** block in `references/shared-conventions.md` (so a standalone feature resolves to its flat `{specsDir}/{feature}/` path exactly as today, and an epic member resolves to its nested `{specsDir}/{epic}/{feature}/` path). Use the resulting `{resolvedFeatureDir}` everywhere this skill reads or writes a per-feature artifact or state file — the `{specsDir}/{feature}/…` forms below are shorthand for the resolved path, not a literal flat layout. This does not apply to **epic mode**, whose paths are epic-scoped (`{specsDir}/{epic}/…`) by design.
|
|
103
|
+
|
|
80
104
|
**Turn structure reminder:** Output analysis/context as text, then route ALL questions through the host's question mechanism. Never embed questions in text output — the user will not be prompted and the session will stall.
|
|
81
105
|
|
|
82
106
|
## Step 1: Read Configuration and Determine Mode
|
|
83
107
|
|
|
84
|
-
Read `{
|
|
108
|
+
Read `{resolvedFeatureDir}/.pipeline-state.json` to understand current pipeline state.
|
|
85
109
|
|
|
86
110
|
### Mode Selection
|
|
87
111
|
|
|
@@ -101,16 +125,16 @@ If ambiguous, use the host's question mechanism to ask which stage to verify.
|
|
|
101
125
|
Load into context ALL artifacts for this feature based on mode:
|
|
102
126
|
|
|
103
127
|
**For prd mode:**
|
|
104
|
-
- `{
|
|
128
|
+
- `{resolvedFeatureDir}/PRD.md`
|
|
105
129
|
|
|
106
130
|
**For tech mode:**
|
|
107
|
-
- `{
|
|
108
|
-
- `{
|
|
131
|
+
- `{resolvedFeatureDir}/PRD.md`
|
|
132
|
+
- `{resolvedFeatureDir}/tech-spec.md`
|
|
109
133
|
|
|
110
134
|
**For specs mode:**
|
|
111
|
-
- `{
|
|
112
|
-
- `{
|
|
113
|
-
- `{
|
|
135
|
+
- `{resolvedFeatureDir}/PRD.md`
|
|
136
|
+
- `{resolvedFeatureDir}/tech-spec.md`
|
|
137
|
+
- `{resolvedFeatureDir}/##-*.md` (all implementation specs)
|
|
114
138
|
|
|
115
139
|
**For backlog mode:**
|
|
116
140
|
- All of the above, PLUS
|
|
@@ -151,7 +175,7 @@ Every finding must include:
|
|
|
151
175
|
|
|
152
176
|
## Step 4: Write Findings Document
|
|
153
177
|
|
|
154
|
-
Ensure the `.verification/` subdirectory exists, then write findings to `{
|
|
178
|
+
Ensure the `.verification/` subdirectory exists, then write findings to `{resolvedFeatureDir}/.verification/VERIFY-{mode}-{YYYY-MM-DD}.md`.
|
|
155
179
|
|
|
156
180
|
**For epic mode**, the target is `{specsDir}/{epic}/.verification/VERIFY-epic-{YYYY-MM-DD}.md` (the same format, with `{mode}=epic`).
|
|
157
181
|
|
|
@@ -187,9 +211,16 @@ Do NOT embed this question in your text output.
|
|
|
187
211
|
|
|
188
212
|
Write pipeline state conforming to `references/pipeline-state-schema.json`.
|
|
189
213
|
|
|
190
|
-
Update `{
|
|
191
|
-
- Set the relevant verify entry status to `findings-reported`
|
|
214
|
+
Update `{resolvedFeatureDir}/.pipeline-state.json`:
|
|
215
|
+
- Set the relevant verify entry status to `findings-reported` (or `passed` when there
|
|
216
|
+
are zero findings)
|
|
192
217
|
- Record `findingsFile`, `findingsCount`, `verifiedAt`
|
|
218
|
+
- Record `verifiedStageVersion` = the current `version` of the production stage entry
|
|
219
|
+
this verify covers (e.g. verifying `tech` → `stages["forge-2-tech"].version`). This
|
|
220
|
+
feeds the navigator's freshness ledger: a later revision to that artifact bumps its
|
|
221
|
+
`version`, so the recorded value no longer matches and auto-verify re-fires. Omitting
|
|
222
|
+
this leaves the verify looking stale (safe: the navigator re-verifies rather than
|
|
223
|
+
skips).
|
|
193
224
|
|
|
194
225
|
Do NOT mark as `findings-applied` — that happens after the fix pass.
|
|
195
226
|
|
|
@@ -214,13 +245,13 @@ Do NOT mark as `findings-applied` — that happens after the fix pass.
|
|
|
214
245
|
- Don't verify things that are intentionally left open (check the PRD's "Open Questions" section).
|
|
215
246
|
- If you find zero issues, say so honestly. Don't manufacture findings to seem thorough. But zero findings on a complex feature is suspicious — double-check.
|
|
216
247
|
- The findings document must be self-contained. A fresh agent reading it should be able to apply every fix without needing conversational context from this session.
|
|
217
|
-
- For backlog verification, also run the loop runner's validate command (resolve `loopRunner` from `forge.config.json`, default rauf: `rauf backlog validate . --backlog {backlogDir} --specs-dir {
|
|
248
|
+
- For backlog verification, also run the loop runner's validate command (resolve `loopRunner` from `forge.config.json`, default rauf: `rauf backlog validate . --backlog {backlogDir} --specs-dir {resolvedFeatureDir} --json`). Include any findings it reports (exit 1) as verification findings; if the runner isn't installed yet (command missing), note that backlog validation was skipped rather than failing.
|
|
218
249
|
- For specs verification, also run the deterministic traceability validator to supplement agent-driven traceability checks. Include any uncovered requirements or orphaned references as findings:
|
|
219
250
|
|
|
220
251
|
```bash
|
|
221
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
252
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
222
253
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
223
|
-
python3 "$R/scripts/validate-traceability.py" {
|
|
254
|
+
python3 "$R/scripts/validate-traceability.py" {resolvedFeatureDir}/PRD.md {resolvedFeatureDir}/ --json
|
|
224
255
|
```
|
|
225
256
|
|
|
226
257
|
---
|
|
@@ -192,7 +192,7 @@ findings to E01/E02/E03/E08. Then perform the judgment checks E04–E07 by readi
|
|
|
192
192
|
manifest, EPIC.md, and completed members' specs.
|
|
193
193
|
|
|
194
194
|
```bash
|
|
195
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
195
|
+
R="$(bash -c 'for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
196
196
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
197
197
|
python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
|
|
198
198
|
```
|
|
@@ -42,6 +42,10 @@
|
|
|
42
42
|
"name": "forge-fix",
|
|
43
43
|
"description": "Apply fixes from the most recent forge-verify findings document. Use when user runs /feature-forge:forge-fix or asks to apply verification fixes for a forge feature. Do NOT trigger for general code fixes, bug fixes, or repairs outside the forge verification workflow."
|
|
44
44
|
},
|
|
45
|
+
{
|
|
46
|
+
"name": "forge-guide",
|
|
47
|
+
"description": "Explain what feature-forge is, when to use it, how to configure it, and its best practices — advisory guidance, not stage execution. Use when the user or another agent asks what feature-forge is, whether/when to adopt it, how the pipeline works conceptually, how to set up or configure forge.config.json, or for usage tips and best practices. Do NOT trigger to RUN a pipeline stage (use forge-1-prd … forge-6-docs), to show a specific feature's status (use forge), or for general software questions unrelated to feature-forge."
|
|
48
|
+
},
|
|
45
49
|
{
|
|
46
50
|
"name": "forge-init",
|
|
47
51
|
"description": "Initialize feature-forge configuration in the current project. Use when user runs /feature-forge:forge-init or asks to set up forge for the first time. Creates forge.config.json with defaults. Do NOT trigger for general project initialization or setup tasks outside the forge pipeline."
|