@garygentry/feature-forge 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +18 -0
  2. package/adapters/GENERATION-REPORT.md +12 -12
  3. package/adapters/claude/.feature-forge-bundle.json +6 -0
  4. package/adapters/claude/references/portable-root.md +8 -5
  5. package/adapters/claude/references/process-overview.md +1 -1
  6. package/adapters/claude/references/shared-conventions.md +24 -5
  7. package/adapters/claude/references/stack-resolution.md +4 -1
  8. package/adapters/claude/references/stacks/go.md +1 -1
  9. package/adapters/claude/references/stacks/python.md +1 -1
  10. package/adapters/claude/references/stacks/rust.md +1 -1
  11. package/adapters/claude/references/stacks/typescript.md +1 -1
  12. package/adapters/claude/scripts/epic-manifest.py +1379 -0
  13. package/adapters/claude/scripts/forge-bootstrap.py +991 -0
  14. package/adapters/claude/scripts/forge-init.sh +44 -0
  15. package/adapters/claude/scripts/forge-root.sh +30 -8
  16. package/adapters/claude/scripts/validate-traceability.py +150 -0
  17. package/adapters/claude/skills/forge/SKILL.md +5 -5
  18. package/adapters/claude/skills/forge-0-epic/SKILL.md +6 -10
  19. package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +2 -2
  20. package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  21. package/adapters/claude/skills/forge-1-prd/SKILL.md +2 -2
  22. package/adapters/claude/skills/forge-2-tech/SKILL.md +8 -7
  23. package/adapters/claude/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  24. package/adapters/claude/skills/forge-3-specs/SKILL.md +1 -1
  25. package/adapters/claude/skills/forge-4-backlog/SKILL.md +2 -2
  26. package/adapters/claude/skills/forge-5-loop/SKILL.md +2 -2
  27. package/adapters/claude/skills/forge-6-docs/SKILL.md +2 -2
  28. package/adapters/claude/skills/forge-bootstrap/SKILL.md +4 -4
  29. package/adapters/claude/skills/forge-fix/SKILL.md +1 -1
  30. package/adapters/claude/skills/forge-init/SKILL.md +1 -1
  31. package/adapters/claude/skills/forge-verify/SKILL.md +7 -2
  32. package/adapters/claude/skills/forge-verify/references/verification-checklists.md +1 -1
  33. package/adapters/codex/.feature-forge-bundle.json +6 -0
  34. package/adapters/codex/agents/{forge-researcher.md → forge-researcher.toml} +4 -4
  35. package/adapters/codex/agents/{forge-spec-writer.md → forge-spec-writer.toml} +4 -4
  36. package/adapters/codex/agents/{forge-verifier.md → forge-verifier.toml} +4 -4
  37. package/adapters/codex/references/portable-root.md +8 -5
  38. package/adapters/codex/references/process-overview.md +1 -1
  39. package/adapters/codex/references/shared-conventions.md +24 -5
  40. package/adapters/codex/references/stack-resolution.md +4 -1
  41. package/adapters/codex/references/stacks/go.md +1 -1
  42. package/adapters/codex/references/stacks/python.md +1 -1
  43. package/adapters/codex/references/stacks/rust.md +1 -1
  44. package/adapters/codex/references/stacks/typescript.md +1 -1
  45. package/adapters/codex/scripts/epic-manifest.py +1379 -0
  46. package/adapters/codex/scripts/forge-bootstrap.py +991 -0
  47. package/adapters/codex/scripts/forge-init.sh +44 -0
  48. package/adapters/codex/scripts/forge-root.sh +30 -8
  49. package/adapters/codex/scripts/validate-traceability.py +150 -0
  50. package/adapters/codex/skills/forge/{forge.md → SKILL.md} +16 -6
  51. package/adapters/codex/skills/forge-0-epic/{forge-0-epic.md → SKILL.md} +26 -20
  52. package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +2 -2
  53. package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  54. package/adapters/codex/skills/forge-1-prd/{forge-1-prd.md → SKILL.md} +18 -8
  55. package/adapters/codex/skills/forge-2-tech/{forge-2-tech.md → SKILL.md} +26 -15
  56. package/adapters/codex/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  57. package/adapters/codex/skills/forge-3-specs/{forge-3-specs.md → SKILL.md} +16 -6
  58. package/adapters/codex/skills/forge-4-backlog/{forge-4-backlog.md → SKILL.md} +15 -5
  59. package/adapters/codex/skills/forge-5-loop/{forge-5-loop.md → SKILL.md} +27 -17
  60. package/adapters/codex/skills/forge-6-docs/{forge-6-docs.md → SKILL.md} +17 -7
  61. package/adapters/codex/skills/forge-bootstrap/{forge-bootstrap.md → SKILL.md} +17 -7
  62. package/adapters/codex/skills/forge-fix/{forge-fix.md → SKILL.md} +12 -2
  63. package/adapters/codex/skills/forge-init/{forge-init.md → SKILL.md} +11 -1
  64. package/adapters/codex/skills/forge-verify/{forge-verify.md → SKILL.md} +24 -9
  65. package/adapters/codex/skills/forge-verify/references/verification-checklists.md +1 -1
  66. package/adapters/copilot/.feature-forge-bundle.json +6 -0
  67. package/adapters/copilot/references/portable-root.md +8 -5
  68. package/adapters/copilot/references/process-overview.md +1 -1
  69. package/adapters/copilot/references/shared-conventions.md +24 -5
  70. package/adapters/copilot/references/stack-resolution.md +4 -1
  71. package/adapters/copilot/references/stacks/go.md +1 -1
  72. package/adapters/copilot/references/stacks/python.md +1 -1
  73. package/adapters/copilot/references/stacks/rust.md +1 -1
  74. package/adapters/copilot/references/stacks/typescript.md +1 -1
  75. package/adapters/copilot/scripts/epic-manifest.py +1379 -0
  76. package/adapters/copilot/scripts/forge-bootstrap.py +991 -0
  77. package/adapters/copilot/scripts/forge-init.sh +44 -0
  78. package/adapters/copilot/scripts/forge-root.sh +30 -8
  79. package/adapters/copilot/scripts/validate-traceability.py +150 -0
  80. package/adapters/copilot/skills/forge/forge.md +16 -6
  81. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +26 -20
  82. package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +2 -2
  83. package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  84. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +18 -8
  85. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +26 -15
  86. package/adapters/copilot/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  87. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +16 -6
  88. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +15 -5
  89. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +27 -17
  90. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +17 -7
  91. package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +17 -7
  92. package/adapters/copilot/skills/forge-fix/forge-fix.md +12 -2
  93. package/adapters/copilot/skills/forge-init/forge-init.md +11 -1
  94. package/adapters/copilot/skills/forge-verify/forge-verify.md +24 -9
  95. package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +1 -1
  96. package/adapters/cursor/.feature-forge-bundle.json +6 -0
  97. package/adapters/cursor/references/portable-root.md +8 -5
  98. package/adapters/cursor/references/process-overview.md +1 -1
  99. package/adapters/cursor/references/shared-conventions.md +24 -5
  100. package/adapters/cursor/references/stack-resolution.md +4 -1
  101. package/adapters/cursor/references/stacks/go.md +1 -1
  102. package/adapters/cursor/references/stacks/python.md +1 -1
  103. package/adapters/cursor/references/stacks/rust.md +1 -1
  104. package/adapters/cursor/references/stacks/typescript.md +1 -1
  105. package/adapters/cursor/scripts/epic-manifest.py +1379 -0
  106. package/adapters/cursor/scripts/forge-bootstrap.py +991 -0
  107. package/adapters/cursor/scripts/forge-init.sh +44 -0
  108. package/adapters/cursor/scripts/forge-root.sh +30 -8
  109. package/adapters/cursor/scripts/validate-traceability.py +150 -0
  110. package/adapters/cursor/skills/forge/forge.mdc +16 -6
  111. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +26 -20
  112. package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +2 -2
  113. package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  114. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +18 -8
  115. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +26 -15
  116. package/adapters/cursor/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  117. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +16 -6
  118. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +15 -5
  119. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +27 -17
  120. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +17 -7
  121. package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +17 -7
  122. package/adapters/cursor/skills/forge-fix/forge-fix.mdc +12 -2
  123. package/adapters/cursor/skills/forge-init/forge-init.mdc +11 -1
  124. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +24 -9
  125. package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +1 -1
  126. package/adapters/gemini/.feature-forge-bundle.json +6 -0
  127. package/adapters/gemini/gemini-extension.json +1 -1
  128. package/adapters/gemini/references/portable-root.md +8 -5
  129. package/adapters/gemini/references/process-overview.md +1 -1
  130. package/adapters/gemini/references/shared-conventions.md +24 -5
  131. package/adapters/gemini/references/stack-resolution.md +4 -1
  132. package/adapters/gemini/references/stacks/go.md +1 -1
  133. package/adapters/gemini/references/stacks/python.md +1 -1
  134. package/adapters/gemini/references/stacks/rust.md +1 -1
  135. package/adapters/gemini/references/stacks/typescript.md +1 -1
  136. package/adapters/gemini/scripts/epic-manifest.py +1379 -0
  137. package/adapters/gemini/scripts/forge-bootstrap.py +991 -0
  138. package/adapters/gemini/scripts/forge-init.sh +44 -0
  139. package/adapters/gemini/scripts/forge-root.sh +30 -8
  140. package/adapters/gemini/scripts/validate-traceability.py +150 -0
  141. package/adapters/gemini/skills/forge/forge.md +16 -6
  142. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +26 -20
  143. package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +2 -2
  144. package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  145. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +18 -8
  146. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +26 -15
  147. package/adapters/gemini/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  148. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +16 -6
  149. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +15 -5
  150. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +27 -17
  151. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +17 -7
  152. package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +17 -7
  153. package/adapters/gemini/skills/forge-fix/forge-fix.md +12 -2
  154. package/adapters/gemini/skills/forge-init/forge-init.md +11 -1
  155. package/adapters/gemini/skills/forge-verify/forge-verify.md +24 -9
  156. package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +1 -1
  157. package/dist/agent-targets.d.ts +20 -4
  158. package/dist/agent-targets.js +29 -4
  159. package/dist/apply.js +245 -18
  160. package/dist/cli.js +12 -6
  161. package/dist/hash.d.ts +5 -0
  162. package/dist/hash.js +7 -0
  163. package/dist/manifest.d.ts +3 -1
  164. package/dist/manifest.js +58 -2
  165. package/dist/placements.d.ts +69 -0
  166. package/dist/placements.js +116 -0
  167. package/dist/plan.d.ts +7 -0
  168. package/dist/plan.js +87 -1
  169. package/dist/report.js +21 -0
  170. package/dist/source.d.ts +4 -3
  171. package/dist/source.js +4 -3
  172. package/dist/types.d.ts +162 -18
  173. package/dist/types.js +42 -11
  174. package/package.json +1 -1
  175. package/adapters/codex/agents/openai.yaml +0 -10
@@ -176,7 +176,12 @@ When building the Fix Execution Plan:
176
176
  **If not in plan mode:** Output the following as text:
177
177
  "Findings and fix plan written to `{findings-file}`."
178
178
 
179
- Then use `AskUserQuestion` to ask: "Would you like to: (a) Review the findings first, (b) Run `/feature-forge:forge-fix {feature}` to apply fixes now, or (c) Enter plan mode and re-run `/feature-forge:forge-verify {feature}` for plan-mode workflow?" Do NOT embed this question in your text output.
179
+ Then use `AskUserQuestion` to ask how to proceed. Follow the **Decision Support** protocol in `references/shared-conventions.md`: recommend a path based on the findings and give each option a one-line trade-off. Let the severity and volume of findings drive the recommendation — e.g. recommend (b) **Apply fixes now** when findings are clear-cut and mechanical; recommend (a) **Review first** when findings involve design judgment or you flagged low-confidence items; recommend (c) **plan-mode workflow** when the fixes are large or interdependent enough to warrant a reviewed plan. Present:
180
+ - **(a) Review the findings first** — read `{findings-file}` and decide per-finding; safest, but you act on nothing until you return.
181
+ - **(b) Run `/feature-forge:forge-fix {feature}` now** — applies the fix plan immediately; fastest, best when findings are unambiguous.
182
+ - **(c) Enter plan mode and re-run `/feature-forge:forge-verify {feature}`** — produces a reviewable plan before any edits; best for large or risky fix sets.
183
+
184
+ Do NOT embed this question in your text output.
180
185
 
181
186
  ## Step 6: Update Pipeline State
182
187
 
@@ -213,7 +218,7 @@ Do NOT mark as `findings-applied` — that happens after the fix pass.
213
218
  - For specs verification, also run the deterministic traceability validator to supplement agent-driven traceability checks. Include any uncovered requirements or orphaned references as findings:
214
219
 
215
220
  ```bash
216
- R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
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)"
217
222
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
218
223
  python3 "$R/scripts/validate-traceability.py" {specsDir}/{feature}/PRD.md {specsDir}/{feature}/ --json
219
224
  ```
@@ -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; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
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)"
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
  ```
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "feature-forge",
3
+ "version": "0.11.0",
4
+ "agent": "codex",
5
+ "generatedBy": "python3 scripts/build-adapters.py"
6
+ }
@@ -1,8 +1,7 @@
1
- ---
2
1
  # GENERATED — DO NOT EDIT. Source: agents/forge-researcher.md. Regenerate: python3 scripts/build-adapters.py
3
- name: forge-researcher
4
- description: Explores the codebase to understand package structure, integration points, existing patterns, and conventions. Use during feature planning, especially when running /feature-forge:forge-2-tech. Returns a distilled integration report without polluting the main conversation's context window.
5
- ---
2
+ name = "forge-researcher"
3
+ description = "Explores the codebase to understand package structure, integration points, existing patterns, and conventions. Use during feature planning, especially when running /feature-forge:forge-2-tech. Returns a distilled integration report without polluting the main conversation's context window."
4
+ developer_instructions = """
6
5
 
7
6
  You are a codebase research agent for the feature-forge pipeline. Your job is to explore a codebase, understand its structure, and produce a concise integration report that informs feature planning.
8
7
 
@@ -131,3 +130,4 @@ ALL commands not listed above are forbidden. Specifically:
131
130
  - Write/append redirects (`>`, `>>`)
132
131
  - Package managers with install/add (`pip install`, `npm install`, `bun install`)
133
132
  - Any command that creates, modifies, or deletes files
133
+ """
@@ -1,8 +1,7 @@
1
- ---
2
1
  # GENERATED — DO NOT EDIT. Source: agents/forge-spec-writer.md. Regenerate: python3 scripts/build-adapters.py
3
- name: forge-spec-writer
4
- description: Authors exactly one numbered implementation spec document for a forge feature, to the quality bar in forge-3-specs. Dispatched by forge-3-specs as one of several parallel writers, after the shared foundation docs (00-core-definitions, 01-architecture-layout) are already written. Writes only its single assigned file and returns a requirement-coverage manifest.
5
- ---
2
+ name = "forge-spec-writer"
3
+ description = "Authors exactly one numbered implementation spec document for a forge feature, to the quality bar in forge-3-specs. Dispatched by forge-3-specs as one of several parallel writers, after the shared foundation docs (00-core-definitions, 01-architecture-layout) are already written. Writes only its single assigned file and returns a requirement-coverage manifest."
4
+ developer_instructions = """
6
5
 
7
6
  You are a specification author for the feature-forge pipeline. You write **exactly one**
8
7
  numbered implementation spec document to a high quality bar, then return a short manifest
@@ -110,3 +109,4 @@ ALL commands not listed above are forbidden. Specifically:
110
109
  - Write/append redirects (`>`, `>>`) — use the Write tool for your one file
111
110
  - Package managers with install/add
112
111
  - Any command that creates, modifies, or deletes files other than your single Write
112
+ """
@@ -1,8 +1,7 @@
1
- ---
2
1
  # GENERATED — DO NOT EDIT. Source: agents/forge-verifier.md. Regenerate: python3 scripts/build-adapters.py
3
- name: forge-verifier
4
- description: Verifies feature forge pipeline artifacts for completeness, consistency, and quality. Delegates to this agent when running /feature-forge:forge-verify or when the user asks to check specs, backlog, or implementation for gaps. This agent has read-only tools and persistent memory — it cannot modify files, only analyze and report findings.
5
- ---
2
+ name = "forge-verifier"
3
+ description = "Verifies feature forge pipeline artifacts for completeness, consistency, and quality. Delegates to this agent when running /feature-forge:forge-verify or when the user asks to check specs, backlog, or implementation for gaps. This agent has read-only tools and persistent memory — it cannot modify files, only analyze and report findings."
4
+ developer_instructions = """
6
5
 
7
6
  You are a meticulous verification agent for the feature-forge development pipeline. Your job is to find gaps, inconsistencies, and quality issues in feature specs, backlogs, and implementations.
8
7
 
@@ -113,3 +112,4 @@ ALL commands not listed above are forbidden. Specifically:
113
112
  - Write/append redirects (`>`, `>>`)
114
113
  - Package managers (`pip install`, `npm install`, `bun install`, `cargo install`)
115
114
  - Any command that creates, modifies, or deletes files
115
+ """
@@ -12,7 +12,7 @@ against the fenced block here, byte-for-byte.
12
12
  ## Canonical bootstrap prelude
13
13
 
14
14
  ```bash
15
- R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
15
+ 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)"
16
16
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
17
17
  ```
18
18
 
@@ -24,7 +24,7 @@ makes several calls, add the prelude once and reuse `$R` for each. A fresh block
24
24
  prelude (per-block re-resolution). Worked example:
25
25
 
26
26
  ```bash
27
- R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
27
+ 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)"
28
28
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
29
29
  python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
30
30
  ```
@@ -40,10 +40,13 @@ python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specs
40
40
  final root resolution to that script. The `for` list is a discovery order for `forge-root.sh`
41
41
  itself, not a fallback chain for the plugin root. Removing the `exec` to "keep looping" is a
42
42
  regression — once `exec`'d, the loop is replaced by the resolver process and never advances.
43
- 3. **Prelude candidate set is a minimal `$HOME` bootstrap subset.** The prelude's `for d` list
43
+ 3. **Prelude candidate set is an agent-neutral bootstrap subset.** The prelude's `for d` list
44
44
  exists only to bootstrap-discover `forge-root.sh`; the authoritative multi-root probe lives in
45
- `forge-root.sh` step 2. When adding an install root, update `forge-root.sh` first; extend the
46
- prelude only if the new root is needed to bootstrap-discover `forge-root.sh` itself.
45
+ `forge-root.sh` step 2. The list enumerates install roots across agents the Claude
46
+ skill/plugin dirs **and** the agent-neutral `.agents/skills/feature-forge` dirs (`$HOME` and the
47
+ project-relative `./.agents/...`) — so a non-Claude install (e.g. Codex under `.agents/skills`)
48
+ can still discover the resolver. When adding an install root, update `forge-root.sh` first;
49
+ extend the prelude only if the new root is needed to bootstrap-discover `forge-root.sh` itself.
47
50
 
48
51
  ## The resolver
49
52
 
@@ -98,7 +98,7 @@ When creating specs, always examine the existing codebase for patterns, conventi
98
98
  - Shared types, utilities, and conventions
99
99
 
100
100
  ### Stack Context
101
- The project's stack is detected during forge-2-tech and persisted in `forge.config.json` (the `stack`, `typeCheckCommand`, and `testCommand` fields). See `references/stack-resolution.md` for the full resolution protocol. The project may also have a `stack-decisions.md` in `.claude/references/` with established technology decisions — if present, it takes highest precedence.
101
+ The project's stack is detected during forge-2-tech and persisted in `forge.config.json` (the `stack`, `typeCheckCommand`, and `testCommand` fields). See `references/stack-resolution.md` for the full resolution protocol. The project may also have a `stack-decisions.md` (preferred at `.feature-forge/`; legacy `.claude/references/`) with established technology decisions — if present, it takes highest precedence.
102
102
 
103
103
  ## Subagents
104
104
 
@@ -34,7 +34,24 @@ I found that the codebase uses React and TanStack Router.
34
34
  [then call AskUserQuestion with: "1. Where should this component live? 2. Should we use server-side rendering?"]
35
35
  ```
36
36
 
37
- **Recommendations:** Only recommend a specific option when codebase evidence, established conventions, or strong technical rationale clearly favors it. If options are equally valid, present them neutrally — let the user decide without bias.
37
+ ### Decision Support: Help the User Choose
38
+
39
+ When an `AskUserQuestion` carries substantive options (a real choice — not a trivial yes/no confirmation), do not just list them. The interview stages have already done codebase research and integration analysis; surfacing that synthesis at the decision moment is the whole point. For every such question:
40
+
41
+ - **Lead with a recommended option.** Place it first and label it `(recommended)` (matching the `AskUserQuestion` "(Recommended)" convention).
42
+ - **Put the trade-off in each option's `description`.** Say why you'd pick it and what you give up versus the alternatives — the cost, not just the benefit.
43
+ - **State a one-line rationale** in the text before the question for *why* the recommendation wins.
44
+
45
+ Two modes, and make clear which one you're in:
46
+
47
+ - **Evidence-backed** — codebase evidence, an established convention, or a clear technical rationale favors one option. Recommend it with confidence and cite the evidence ("the codebase already uses X, so…").
48
+ - **Preference** — no option clearly wins (taste, team workflow, risk appetite). Still offer a sensible **default** and the trade-offs, but say plainly this is a judgment call / the user's preference, so you don't manufacture false confidence.
49
+
50
+ **The only thing to avoid is false confidence** — recommending as if evidence-backed when it's really preference. Never respond to the absence of a clear winner by going silent: a defaulted recommendation with honest trade-offs always beats a neutral option dump.
51
+
52
+ For genuinely comparable artifacts (competing module structures, two code snippets, layout variants), use the `AskUserQuestion` `preview` field to show them side-by-side.
53
+
54
+ The **Branch Setup** block below is the reference pattern: a strong recommendation as the first option, rationale inline, the alternative still available, never a hard-stop.
38
55
 
39
56
  ## Configuration Reading
40
57
 
@@ -58,7 +75,7 @@ Extract these config values (use defaults if not present):
58
75
  Before any file I/O against a feature's artifacts, resolve its directory through the deterministic helper rather than hardcoding `{specsDir}/{feature}/`. This makes flat (`{specsDir}/{feature}/`) and nested (`{specsDir}/{epic}/{feature}/`) layouts both resolve from a bare feature name (REQ-DIR-03), with standalone features behaving exactly as today.
59
76
 
60
77
  ```bash
61
- R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
78
+ 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
79
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
63
80
  resolvedFeatureDir=$(python3 "$R/scripts/epic-manifest.py" \
64
81
  resolve "<feature>" --specs-dir "<specsDir>")
@@ -88,7 +105,7 @@ Whenever a stage creates the specs tree for the first time (the first PRD or epi
88
105
  Run this after creating the feature/epic directory, before the stage's git commit:
89
106
 
90
107
  ```bash
91
- R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
108
+ 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)"
92
109
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
93
110
  mkdir -p "<specsDir>"
94
111
  [ -f "<specsDir>/AGENTS.md" ] || cp "$R/references/templates/specs-hygiene/AGENTS.md" "<specsDir>/AGENTS.md"
@@ -115,7 +132,7 @@ After resolving the feature directory, check the feature's `.pipeline-state.json
115
132
  To obtain the manifest contracts and the live completion status of each dependency in one deterministic call, run `render-status` and read the per-feature `status` and the `consumes`/`exposes` arrays rather than re-deriving them:
116
133
 
117
134
  ```bash
118
- R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
135
+ 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)"
119
136
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
120
137
  python3 "$R/scripts/epic-manifest.py" \
121
138
  render-status "<epic>" --specs-dir "<specsDir>" --json
@@ -133,6 +150,8 @@ When loading upstream artifacts as prerequisites, check `basedOnVersions` in the
133
150
 
134
151
  > "This stage was built against {upstream} v{old}, but {upstream} is now at v{new}. The current artifacts may be outdated. Consider re-running this stage, or use --force to proceed with potentially stale inputs."
135
152
 
153
+ Frame the choice with its cost: re-running re-derives this stage from the current upstream (safest, but discards any hand-edits to this stage's artifacts); proceeding stale is faster but risks baking outdated assumptions into everything downstream. Recommend re-running unless the user knows the upstream change doesn't affect this stage.
154
+
136
155
  ## Branch Setup
137
156
 
138
157
  Invoke this block at the **very start** of a pipeline entry point — `forge-1-prd` (standalone feature) and `forge-0-epic` (epic) — **before** any directory resolution or interview, so the rest of the run lands on the intended branch. `{label}` is the feature name (forge-1-prd) or epic name (forge-0-epic); `{scope}` is `feature` or `epic` correspondingly.
@@ -185,6 +204,6 @@ When a skill detects that `currentStage` matches itself and the stage status is
185
204
 
186
205
  If the user passes `--force` as an argument, skip prerequisite validation with a warning:
187
206
 
188
- > Force mode: skipping prerequisite checks. Pipeline state tracking may be incomplete. Recommend running `/feature-forge:forge {feature}` after to verify status.
207
+ > Force mode: skipping prerequisite checks. Pipeline state tracking may be incomplete — this stage may build on prior stages that were never completed or verified, so its output can be silently wrong. Recommend running `/feature-forge:forge {feature}` after to verify status.
189
208
 
190
209
  Continue with the stage even if prior stages are not marked complete. Still read any existing artifacts (PRD.md, tech-spec.md, etc.) if they exist on disk — force mode skips the pipeline state check, not the artifact loading.
@@ -4,7 +4,10 @@ How feature-forge resolves stack-specific guidance for a project.
4
4
 
5
5
  ## Resolution Order (highest priority first)
6
6
 
7
- 1. **Project-level override**: `.claude/references/stack-decisions.md` in the project root. If this file exists, it takes absolute precedence — it contains the team's explicit technology decisions.
7
+ 1. **Project-level override** (first existing path wins). These hold the team's explicit technology decisions and take absolute precedence:
8
+ 1. `.feature-forge/stack-decisions.md` — the preferred, host-neutral location (it belongs to this tool, not to any one agent).
9
+ 2. `.agents/references/stack-decisions.md` — for projects that centralize cross-agent config under `.agents/`.
10
+ 3. `.claude/references/stack-decisions.md` — **legacy alias**, still honored for backward compatibility. If only this file exists, use it and suggest copying it to `.feature-forge/stack-decisions.md`.
8
11
 
9
12
  2. **Detected stack profile**: `references/stacks/{stack}.md` in this plugin, where `{stack}` matches the `stack` field in `forge.config.json`. Provides language-specific conventions for spec writing, verification, and examples.
10
13
 
@@ -111,7 +111,7 @@ When examining a Go project, check for:
111
111
 
112
112
  ## Example: Project-Level Override
113
113
 
114
- Create `.claude/references/stack-decisions.md` in your project root:
114
+ Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
115
115
 
116
116
  ```markdown
117
117
  # Stack Decisions
@@ -136,7 +136,7 @@ async def refresh_session_token(
136
136
 
137
137
  ## Example: Project-Level Override
138
138
 
139
- Create `.claude/references/stack-decisions.md` in your project root:
139
+ Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
140
140
 
141
141
  ```markdown
142
142
  # Stack Decisions
@@ -120,7 +120,7 @@ When examining a Rust project, check for:
120
120
 
121
121
  ## Example: Project-Level Override
122
122
 
123
- Create `.claude/references/stack-decisions.md` in your project root:
123
+ Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
124
124
 
125
125
  ```markdown
126
126
  # Stack Decisions
@@ -85,7 +85,7 @@ When examining a TypeScript project, check for:
85
85
 
86
86
  ## Example: Project-Level Override
87
87
 
88
- Create `.claude/references/stack-decisions.md` in your project root:
88
+ Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
89
89
 
90
90
  ```markdown
91
91
  # Stack Decisions