@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
@@ -12,7 +12,7 @@ Apply fixes from the most recent forge-verify findings document, with step-level
12
12
 
13
13
  Read and follow `references/shared-conventions.md` for feature name validation, configuration reading, and force mode handling before proceeding.
14
14
 
15
- **Turn structure reminder:** Output analysis/context as text, then route ALL questions through `AskUserQuestion`. Never embed questions in text output — the user will not be prompted and the session will stall.
15
+ **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.
16
16
 
17
17
  ## Step 1: Locate Findings Document
18
18
 
@@ -29,7 +29,7 @@ Read and follow `references/shared-conventions.md` for feature name validation,
29
29
  ## Step 3: Handle User Decisions
30
30
 
31
31
  If the "User Decisions Required" section has unresolved items:
32
- 1. Present each decision to the user with the context from the findings, using `AskUserQuestion` for each decision point. Only recommend a specific option if the findings provide clear evidence for it; otherwise present options neutrally.
32
+ 1. Present each decision to the user with the context from the findings, using the host's question mechanism for each decision point. Follow the **Decision Support** protocol in `references/shared-conventions.md`: lead with a recommended option and put the trade-off in each option's description. When the findings provide clear evidence, recommend with confidence and cite it. When they don't, still offer a sensible default with the trade-offs, but flag it plainly as a judgment call rather than going neutral — a defaulted recommendation beats an unguided option dump.
33
33
  2. Wait for answers before proceeding
34
34
  3. Record decisions in the findings document under the "User Decisions Required" section (mark each as resolved)
35
35
 
@@ -62,3 +62,13 @@ Tell the user:
62
62
  "Fixes applied. Next steps:
63
63
  - Run `/feature-forge:forge-verify {feature}` again to confirm all issues are resolved
64
64
  - Or `/feature-forge:forge {feature}` to see pipeline status"
65
+
66
+ ---
67
+
68
+ ## Host execution notes
69
+
70
+ 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:
71
+
72
+ - **User input:** ask the question directly and wait for the answer before proceeding. Do not skip a required question or assume an answer.
73
+ - **Subagents:** if your host cannot dispatch the named custom agent, run that step inline yourself.
74
+ - **Background / monitoring:** run long-lived commands in the foreground (or your host's background facility) and report progress as it arrives.
@@ -9,7 +9,7 @@ description: Initialize feature-forge configuration in the current project. Use
9
9
  Run the initialization script to create `forge.config.json` with default settings:
10
10
 
11
11
  ```bash
12
- 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)"
12
+ 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
13
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
14
14
  bash "$R/scripts/forge-init.sh"
15
15
  ```
@@ -27,3 +27,13 @@ After initialization, the config file will contain defaults for:
27
27
  If `forge.config.json` already exists, the script will not overwrite it.
28
28
 
29
29
  After initialization, start the pipeline with `/feature-forge:forge-1-prd <feature-name>`.
30
+
31
+ ---
32
+
33
+ ## Host execution notes
34
+
35
+ 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:
36
+
37
+ - **User input:** ask the question directly and wait for the answer before proceeding. Do not skip a required question or assume an answer.
38
+ - **Subagents:** if your host cannot dispatch the named custom agent, run that step inline yourself.
39
+ - **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 @@ Analyze feature artifacts for completeness, consistency, and quality. Produce st
10
10
 
11
11
  ## Subagent Delegation
12
12
 
13
- This skill is delegated to the `forge-verifier` subagent via the Agent tool. The verifier subagent has:
13
+ This skill is delegated to the `forge-verifier` subagent via the host's subagent mechanism. The verifier subagent has:
14
14
  - **Read-only tools** (Read, Glob, Grep, Bash) — it cannot accidentally modify specs
15
15
  - **Persistent memory** — it accumulates knowledge about this project's recurring issues and patterns across sessions
16
16
  - **The forge-verify skill pre-loaded** — so it has all verification checklists and guidance at startup
@@ -19,12 +19,12 @@ This skill is delegated to the `forge-verifier` subagent via the Agent tool. The
19
19
 
20
20
  Pick based on how many checks the mode carries (see the per-mode totals in Step 3):
21
21
 
22
- - **Small modes (prd ~15, tech ~15): single verifier.** Use the Agent tool once with
23
- `subagent_type="forge-verifier"`, passing the feature name and mode. It runs all
22
+ - **Small modes (prd ~15, tech ~15): single verifier.** Use the host's subagent mechanism once with
23
+ `the forge-verifier custom agent`, passing the feature name and mode. It runs all
24
24
  checks and returns findings.
25
25
  - **Large modes (specs ~38, backlog ~25, impl ~20): parallel dimensioned fan-out.**
26
26
  Split the mode's checklist into **dimension groups** and dispatch **one
27
- `forge-verifier` per group, in parallel — a single message with multiple Agent
27
+ `forge-verifier` per group, in parallel — a single message with multiple subagent
28
28
  calls** (the `superpowers:dispatching-parallel-agents` pattern). Each instance owns a
29
29
  disjoint slice of CHECK-IDs, so it verifies deeper over a narrower scope and they all
30
30
  run concurrently. Suggested groups (map to the category clusters in
@@ -76,7 +76,7 @@ without subagents), fall back to running verification inline in the current sess
76
76
 
77
77
  Read and follow `references/shared-conventions.md` for feature name validation, configuration reading, and force mode handling before proceeding.
78
78
 
79
- **Turn structure reminder:** Output analysis/context as text, then route ALL questions through `AskUserQuestion`. Never embed questions in text output — the user will not be prompted and the session will stall.
79
+ **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.
80
80
 
81
81
  ## Step 1: Read Configuration and Determine Mode
82
82
 
@@ -93,7 +93,7 @@ If a stage is specified as a second argument (e.g., `/feature-forge:forge-verify
93
93
  - **backlog mode**: If `forge-4-backlog` is complete but `forge-verify-backlog` is not `passed` or `findings-applied`
94
94
  - **impl mode**: If user explicitly requests or if implementation code exists for this feature
95
95
 
96
- If ambiguous, use `AskUserQuestion` to ask which stage to verify.
96
+ If ambiguous, use the host's question mechanism to ask which stage to verify.
97
97
 
98
98
  ## Step 2: Load All Relevant Artifacts
99
99
 
@@ -132,7 +132,7 @@ Read `references/verification-checklists.md` for the detailed checklists per mod
132
132
 
133
133
  Each check in `verification-checklists.md` has a unique ID (CHECK-P01, CHECK-T01, CHECK-S01, CHECK-B01, etc.). As you execute each check, record its ID and result (pass/fail/not-applicable). After completing all checks, report the total: "Executed N of M checks. Results: X pass, Y fail, Z not-applicable." If your count is significantly below the expected total for the mode (prd: ~15 checks, tech: ~15 checks, specs: ~38 checks, backlog: ~25 checks, impl: ~20 checks, epic: ~8 checks), you likely skipped checks — go back and complete them.
134
134
 
135
- **Epic mode dispatch.** Epic mode is a small (~8-check) checklist, so per the single-vs-parallel rule above, dispatch a **single `forge-verifier`** via the Agent tool, passing the epic name and `mode=epic`. The verifier runs CHECK-E01..E08 from the `## Epic Mode Checklist` in `references/verification-checklists.md` (E01/E02/E03/E08 are delegated to `epic-manifest.py validate`/`check-name`; E04–E07 are verifier judgment) and returns its findings.
135
+ **Epic mode dispatch.** Epic mode is a small (~8-check) checklist, so per the single-vs-parallel rule above, dispatch a **single `forge-verifier`** via the host's subagent mechanism, passing the epic name and `mode=epic`. The verifier runs CHECK-E01..E08 from the `## Epic Mode Checklist` in `references/verification-checklists.md` (E01/E02/E03/E08 are delegated to `epic-manifest.py validate`/`check-name`; E04–E07 are verifier judgment) and returns its findings.
136
136
 
137
137
  ### Important: Be Specific, Not General
138
138
 
@@ -175,7 +175,12 @@ When building the Fix Execution Plan:
175
175
  **If not in plan mode:** Output the following as text:
176
176
  "Findings and fix plan written to `{findings-file}`."
177
177
 
178
- 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.
178
+ Then use the host's question mechanism 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:
179
+ - **(a) Review the findings first** — read `{findings-file}` and decide per-finding; safest, but you act on nothing until you return.
180
+ - **(b) Run `/feature-forge:forge-fix {feature}` now** — applies the fix plan immediately; fastest, best when findings are unambiguous.
181
+ - **(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.
182
+
183
+ Do NOT embed this question in your text output.
179
184
 
180
185
  ## Step 6: Update Pipeline State
181
186
 
@@ -212,7 +217,17 @@ Do NOT mark as `findings-applied` — that happens after the fix pass.
212
217
  - For specs verification, also run the deterministic traceability validator to supplement agent-driven traceability checks. Include any uncovered requirements or orphaned references as findings:
213
218
 
214
219
  ```bash
215
- 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)"
220
+ 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)"
216
221
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
217
222
  python3 "$R/scripts/validate-traceability.py" {specsDir}/{feature}/PRD.md {specsDir}/{feature}/ --json
218
223
  ```
224
+
225
+ ---
226
+
227
+ ## Host execution notes
228
+
229
+ 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:
230
+
231
+ - **User input:** ask the question directly and wait for the answer before proceeding. Do not skip a required question or assume an answer.
232
+ - **Subagents:** if your host cannot dispatch the named custom agent, run that step inline yourself.
233
+ - **Background / monitoring:** run long-lived commands in the foreground (or your host's background facility) and report progress as it arrives.
@@ -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": "cursor",
5
+ "generatedBy": "python3 scripts/build-adapters.py"
6
+ }
@@ -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