@garygentry/feature-forge 0.1.4 → 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 (322) hide show
  1. package/README.md +19 -1
  2. package/adapters/GENERATION-REPORT.md +17 -13
  3. package/adapters/claude/.feature-forge-bundle.json +6 -0
  4. package/adapters/claude/references/forge-config-schema.json +36 -10
  5. package/adapters/claude/references/pipeline-state-schema.json +4 -0
  6. package/adapters/claude/references/portable-root.md +8 -5
  7. package/adapters/claude/references/process-overview.md +15 -5
  8. package/adapters/claude/references/shared-conventions.md +69 -4
  9. package/adapters/claude/references/stack-resolution.md +4 -1
  10. package/adapters/claude/references/stacks/go.md +1 -1
  11. package/adapters/claude/references/stacks/python.md +1 -1
  12. package/adapters/claude/references/stacks/rust.md +1 -1
  13. package/adapters/claude/references/stacks/typescript.md +1 -1
  14. package/adapters/claude/references/templates/specs-hygiene/AGENTS.md +23 -0
  15. package/adapters/claude/references/templates/specs-hygiene/CLAUDE.md +22 -0
  16. package/adapters/claude/scripts/epic-manifest.py +1379 -0
  17. package/adapters/claude/scripts/forge-bootstrap.py +991 -0
  18. package/adapters/claude/scripts/forge-init.sh +44 -0
  19. package/adapters/claude/scripts/forge-root.sh +30 -8
  20. package/adapters/claude/scripts/validate-traceability.py +150 -0
  21. package/adapters/claude/skills/forge/SKILL.md +5 -5
  22. package/adapters/claude/skills/forge-0-epic/SKILL.md +13 -15
  23. package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +2 -2
  24. package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  25. package/adapters/claude/skills/forge-1-prd/SKILL.md +6 -4
  26. package/adapters/claude/skills/forge-2-tech/SKILL.md +8 -7
  27. package/adapters/claude/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  28. package/adapters/claude/skills/forge-3-specs/SKILL.md +1 -1
  29. package/adapters/claude/skills/forge-4-backlog/SKILL.md +2 -2
  30. package/adapters/claude/skills/forge-5-loop/SKILL.md +20 -18
  31. package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +13 -0
  32. package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +40 -0
  33. package/adapters/claude/skills/forge-6-docs/SKILL.md +11 -1
  34. package/adapters/claude/skills/forge-bootstrap/SKILL.md +240 -0
  35. package/adapters/claude/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
  36. package/adapters/claude/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
  37. package/adapters/claude/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
  38. package/adapters/claude/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
  39. package/adapters/claude/skills/forge-bootstrap/references/templates/go/main.go +12 -0
  40. package/adapters/claude/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
  41. package/adapters/claude/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
  42. package/adapters/claude/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
  43. package/adapters/claude/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
  44. package/adapters/claude/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
  45. package/adapters/claude/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
  46. package/adapters/claude/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
  47. package/adapters/claude/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
  48. package/adapters/claude/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
  49. package/adapters/claude/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
  50. package/adapters/claude/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
  51. package/adapters/claude/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
  52. package/adapters/claude/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
  53. package/adapters/claude/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
  54. package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
  55. package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
  56. package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
  57. package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
  58. package/adapters/claude/skills/forge-fix/SKILL.md +1 -1
  59. package/adapters/claude/skills/forge-init/SKILL.md +1 -1
  60. package/adapters/claude/skills/forge-verify/SKILL.md +7 -2
  61. package/adapters/claude/skills/forge-verify/references/verification-checklists.md +1 -1
  62. package/adapters/codex/.feature-forge-bundle.json +6 -0
  63. package/adapters/codex/agents/{forge-researcher.md → forge-researcher.toml} +4 -4
  64. package/adapters/codex/agents/{forge-spec-writer.md → forge-spec-writer.toml} +4 -4
  65. package/adapters/codex/agents/{forge-verifier.md → forge-verifier.toml} +4 -4
  66. package/adapters/codex/references/forge-config-schema.json +36 -10
  67. package/adapters/codex/references/pipeline-state-schema.json +4 -0
  68. package/adapters/codex/references/portable-root.md +8 -5
  69. package/adapters/codex/references/process-overview.md +15 -5
  70. package/adapters/codex/references/shared-conventions.md +69 -4
  71. package/adapters/codex/references/stack-resolution.md +4 -1
  72. package/adapters/codex/references/stacks/go.md +1 -1
  73. package/adapters/codex/references/stacks/python.md +1 -1
  74. package/adapters/codex/references/stacks/rust.md +1 -1
  75. package/adapters/codex/references/stacks/typescript.md +1 -1
  76. package/adapters/codex/references/templates/specs-hygiene/AGENTS.md +23 -0
  77. package/adapters/codex/references/templates/specs-hygiene/CLAUDE.md +22 -0
  78. package/adapters/codex/scripts/epic-manifest.py +1379 -0
  79. package/adapters/codex/scripts/forge-bootstrap.py +991 -0
  80. package/adapters/codex/scripts/forge-init.sh +44 -0
  81. package/adapters/codex/scripts/forge-root.sh +30 -8
  82. package/adapters/codex/scripts/validate-traceability.py +150 -0
  83. package/adapters/codex/skills/forge/{forge.md → SKILL.md} +16 -6
  84. package/adapters/codex/skills/forge-0-epic/{forge-0-epic.md → SKILL.md} +33 -25
  85. package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +2 -2
  86. package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  87. package/adapters/codex/skills/forge-1-prd/{forge-1-prd.md → SKILL.md} +22 -10
  88. package/adapters/codex/skills/forge-2-tech/{forge-2-tech.md → SKILL.md} +26 -15
  89. package/adapters/codex/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  90. package/adapters/codex/skills/forge-3-specs/{forge-3-specs.md → SKILL.md} +16 -6
  91. package/adapters/codex/skills/forge-4-backlog/{forge-4-backlog.md → SKILL.md} +15 -5
  92. package/adapters/codex/skills/forge-5-loop/{forge-5-loop.md → SKILL.md} +40 -28
  93. package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +13 -0
  94. package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +40 -0
  95. package/adapters/codex/skills/forge-6-docs/{forge-6-docs.md → SKILL.md} +26 -6
  96. package/adapters/codex/skills/forge-bootstrap/SKILL.md +249 -0
  97. package/adapters/codex/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
  98. package/adapters/codex/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
  99. package/adapters/codex/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
  100. package/adapters/codex/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
  101. package/adapters/codex/skills/forge-bootstrap/references/templates/go/main.go +12 -0
  102. package/adapters/codex/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
  103. package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
  104. package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
  105. package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
  106. package/adapters/codex/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
  107. package/adapters/codex/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
  108. package/adapters/codex/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
  109. package/adapters/codex/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
  110. package/adapters/codex/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
  111. package/adapters/codex/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
  112. package/adapters/codex/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
  113. package/adapters/codex/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
  114. package/adapters/codex/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
  115. package/adapters/codex/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
  116. package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
  117. package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
  118. package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
  119. package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
  120. package/adapters/codex/skills/forge-fix/{forge-fix.md → SKILL.md} +12 -2
  121. package/adapters/codex/skills/forge-init/{forge-init.md → SKILL.md} +11 -1
  122. package/adapters/codex/skills/forge-verify/{forge-verify.md → SKILL.md} +24 -9
  123. package/adapters/codex/skills/forge-verify/references/verification-checklists.md +1 -1
  124. package/adapters/copilot/.feature-forge-bundle.json +6 -0
  125. package/adapters/copilot/references/forge-config-schema.json +36 -10
  126. package/adapters/copilot/references/pipeline-state-schema.json +4 -0
  127. package/adapters/copilot/references/portable-root.md +8 -5
  128. package/adapters/copilot/references/process-overview.md +15 -5
  129. package/adapters/copilot/references/shared-conventions.md +69 -4
  130. package/adapters/copilot/references/stack-resolution.md +4 -1
  131. package/adapters/copilot/references/stacks/go.md +1 -1
  132. package/adapters/copilot/references/stacks/python.md +1 -1
  133. package/adapters/copilot/references/stacks/rust.md +1 -1
  134. package/adapters/copilot/references/stacks/typescript.md +1 -1
  135. package/adapters/copilot/references/templates/specs-hygiene/AGENTS.md +23 -0
  136. package/adapters/copilot/references/templates/specs-hygiene/CLAUDE.md +22 -0
  137. package/adapters/copilot/scripts/epic-manifest.py +1379 -0
  138. package/adapters/copilot/scripts/forge-bootstrap.py +991 -0
  139. package/adapters/copilot/scripts/forge-init.sh +44 -0
  140. package/adapters/copilot/scripts/forge-root.sh +30 -8
  141. package/adapters/copilot/scripts/validate-traceability.py +150 -0
  142. package/adapters/copilot/skills/forge/forge.md +16 -6
  143. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +33 -25
  144. package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +2 -2
  145. package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  146. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +22 -10
  147. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +26 -15
  148. package/adapters/copilot/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  149. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +16 -6
  150. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +15 -5
  151. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +40 -28
  152. package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +13 -0
  153. package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +40 -0
  154. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +26 -6
  155. package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +249 -0
  156. package/adapters/copilot/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
  157. package/adapters/copilot/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
  158. package/adapters/copilot/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
  159. package/adapters/copilot/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
  160. package/adapters/copilot/skills/forge-bootstrap/references/templates/go/main.go +12 -0
  161. package/adapters/copilot/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
  162. package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
  163. package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
  164. package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
  165. package/adapters/copilot/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
  166. package/adapters/copilot/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
  167. package/adapters/copilot/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
  168. package/adapters/copilot/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
  169. package/adapters/copilot/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
  170. package/adapters/copilot/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
  171. package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
  172. package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
  173. package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
  174. package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
  175. package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
  176. package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
  177. package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
  178. package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
  179. package/adapters/copilot/skills/forge-fix/forge-fix.md +12 -2
  180. package/adapters/copilot/skills/forge-init/forge-init.md +11 -1
  181. package/adapters/copilot/skills/forge-verify/forge-verify.md +24 -9
  182. package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +1 -1
  183. package/adapters/cursor/.feature-forge-bundle.json +6 -0
  184. package/adapters/cursor/references/forge-config-schema.json +36 -10
  185. package/adapters/cursor/references/pipeline-state-schema.json +4 -0
  186. package/adapters/cursor/references/portable-root.md +8 -5
  187. package/adapters/cursor/references/process-overview.md +15 -5
  188. package/adapters/cursor/references/shared-conventions.md +69 -4
  189. package/adapters/cursor/references/stack-resolution.md +4 -1
  190. package/adapters/cursor/references/stacks/go.md +1 -1
  191. package/adapters/cursor/references/stacks/python.md +1 -1
  192. package/adapters/cursor/references/stacks/rust.md +1 -1
  193. package/adapters/cursor/references/stacks/typescript.md +1 -1
  194. package/adapters/cursor/references/templates/specs-hygiene/AGENTS.md +23 -0
  195. package/adapters/cursor/references/templates/specs-hygiene/CLAUDE.md +22 -0
  196. package/adapters/cursor/scripts/epic-manifest.py +1379 -0
  197. package/adapters/cursor/scripts/forge-bootstrap.py +991 -0
  198. package/adapters/cursor/scripts/forge-init.sh +44 -0
  199. package/adapters/cursor/scripts/forge-root.sh +30 -8
  200. package/adapters/cursor/scripts/validate-traceability.py +150 -0
  201. package/adapters/cursor/skills/forge/forge.mdc +16 -6
  202. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +33 -25
  203. package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +2 -2
  204. package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  205. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +22 -10
  206. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +26 -15
  207. package/adapters/cursor/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  208. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +16 -6
  209. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +15 -5
  210. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +40 -28
  211. package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +13 -0
  212. package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +40 -0
  213. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +26 -6
  214. package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +250 -0
  215. package/adapters/cursor/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
  216. package/adapters/cursor/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
  217. package/adapters/cursor/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
  218. package/adapters/cursor/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
  219. package/adapters/cursor/skills/forge-bootstrap/references/templates/go/main.go +12 -0
  220. package/adapters/cursor/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
  221. package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
  222. package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
  223. package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
  224. package/adapters/cursor/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
  225. package/adapters/cursor/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
  226. package/adapters/cursor/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
  227. package/adapters/cursor/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
  228. package/adapters/cursor/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
  229. package/adapters/cursor/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
  230. package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
  231. package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
  232. package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
  233. package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
  234. package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
  235. package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
  236. package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
  237. package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
  238. package/adapters/cursor/skills/forge-fix/forge-fix.mdc +12 -2
  239. package/adapters/cursor/skills/forge-init/forge-init.mdc +11 -1
  240. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +24 -9
  241. package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +1 -1
  242. package/adapters/gemini/.feature-forge-bundle.json +6 -0
  243. package/adapters/gemini/gemini-extension.json +5 -1
  244. package/adapters/gemini/references/forge-config-schema.json +36 -10
  245. package/adapters/gemini/references/pipeline-state-schema.json +4 -0
  246. package/adapters/gemini/references/portable-root.md +8 -5
  247. package/adapters/gemini/references/process-overview.md +15 -5
  248. package/adapters/gemini/references/shared-conventions.md +69 -4
  249. package/adapters/gemini/references/stack-resolution.md +4 -1
  250. package/adapters/gemini/references/stacks/go.md +1 -1
  251. package/adapters/gemini/references/stacks/python.md +1 -1
  252. package/adapters/gemini/references/stacks/rust.md +1 -1
  253. package/adapters/gemini/references/stacks/typescript.md +1 -1
  254. package/adapters/gemini/references/templates/specs-hygiene/AGENTS.md +23 -0
  255. package/adapters/gemini/references/templates/specs-hygiene/CLAUDE.md +22 -0
  256. package/adapters/gemini/scripts/epic-manifest.py +1379 -0
  257. package/adapters/gemini/scripts/forge-bootstrap.py +991 -0
  258. package/adapters/gemini/scripts/forge-init.sh +44 -0
  259. package/adapters/gemini/scripts/forge-root.sh +30 -8
  260. package/adapters/gemini/scripts/validate-traceability.py +150 -0
  261. package/adapters/gemini/skills/forge/forge.md +16 -6
  262. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +33 -25
  263. package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +2 -2
  264. package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
  265. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +22 -10
  266. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +26 -15
  267. package/adapters/gemini/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
  268. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +16 -6
  269. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +15 -5
  270. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +40 -28
  271. package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +13 -0
  272. package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +40 -0
  273. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +26 -6
  274. package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +249 -0
  275. package/adapters/gemini/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
  276. package/adapters/gemini/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
  277. package/adapters/gemini/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
  278. package/adapters/gemini/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
  279. package/adapters/gemini/skills/forge-bootstrap/references/templates/go/main.go +12 -0
  280. package/adapters/gemini/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
  281. package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
  282. package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
  283. package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
  284. package/adapters/gemini/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
  285. package/adapters/gemini/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
  286. package/adapters/gemini/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
  287. package/adapters/gemini/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
  288. package/adapters/gemini/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
  289. package/adapters/gemini/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
  290. package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
  291. package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
  292. package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
  293. package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
  294. package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
  295. package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
  296. package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
  297. package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
  298. package/adapters/gemini/skills/forge-fix/forge-fix.md +12 -2
  299. package/adapters/gemini/skills/forge-init/forge-init.md +11 -1
  300. package/adapters/gemini/skills/forge-verify/forge-verify.md +24 -9
  301. package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +1 -1
  302. package/dist/agent-targets.d.ts +20 -4
  303. package/dist/agent-targets.js +29 -4
  304. package/dist/apply.js +245 -18
  305. package/dist/cli.js +12 -6
  306. package/dist/hash.d.ts +5 -0
  307. package/dist/hash.js +7 -0
  308. package/dist/manifest.d.ts +4 -2
  309. package/dist/manifest.js +58 -2
  310. package/dist/placements.d.ts +69 -0
  311. package/dist/placements.js +116 -0
  312. package/dist/plan.d.ts +7 -0
  313. package/dist/plan.js +87 -1
  314. package/dist/rauf.d.ts +4 -4
  315. package/dist/rauf.js +3 -3
  316. package/dist/report.js +21 -0
  317. package/dist/source.d.ts +4 -3
  318. package/dist/source.js +4 -3
  319. package/dist/types.d.ts +163 -19
  320. package/dist/types.js +42 -11
  321. package/package.json +1 -1
  322. package/adapters/codex/agents/openai.yaml +0 -10
@@ -52,7 +52,7 @@ Read `{resolvedFeatureDir}/.pipeline-state.json`. If not in force mode, `stages.
52
52
 
53
53
  Check if `stages.forge-verify-backlog` exists and has status `passed` or `findings-applied`. If not, use `AskUserQuestion` to warn:
54
54
 
55
- "Backlog hasn't been verified yet. It's recommended to run `/feature-forge:forge-verify {feature}` first to catch issues before implementation. Continue anyway?"
55
+ "Backlog hasn't been verified yet. Recommended: run `/feature-forge:forge-verify {feature}` first — the loop implements items autonomously and commits as it goes, so a bad item (wrong scope, missing dependency, untestable acceptance criteria) is far cheaper to catch now than after several commits build on it. Continue anyway?" Offer **Verify first (recommended)** · **Continue without verifying**.
56
56
 
57
57
  ### 1b-epic. Epic Dependency Gate
58
58
 
@@ -61,7 +61,7 @@ Read the resolved feature's `.pipeline-state.json`. **If it has no `epic` key, s
61
61
  1. Run `render-status "{epic}" --specs-dir "{specsDir}" --json` via the helper:
62
62
 
63
63
  ```bash
64
- 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)"
64
+ 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)"
65
65
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
66
66
  python3 "$R/scripts/epic-manifest.py" \
67
67
  render-status "{epic}" --specs-dir "{specsDir}" --json
@@ -101,13 +101,8 @@ For the version-too-old case, phrase it concretely, e.g.: "Your rauf is {reporte
101
101
 
102
102
  Check that `loopRunner.preconditionFile` (default `.rauf.json`) exists in the project root. If not:
103
103
 
104
- - **If `loopRunner.name == "rauf"` and a legacy `.ralph.json` (or `.ralph/` directory) exists**, this is an un-migrated Ralph project. STOP and tell the user:
105
-
106
- "This project is still on the legacy **Ralph** layout. Run `rauf migrate .` first (the loop runner only understands `.rauf/` and `RAUF_*` signals), then re-run `/feature-forge:forge-5-loop {feature}`."
107
-
108
- - **Otherwise**, STOP and show `loopRunner.setupHint` (default: "Run `rauf install .` …"), e.g.:
109
-
110
- "The loop runner isn't set up in this project ({preconditionFile} is missing). {setupHint}"
104
+ - **If `loopRunner.name == "rauf"` and a legacy `.ralph.json` (or `.ralph/` directory) exists**, this is an un-migrated Ralph project. STOP: "This project is still on the legacy **Ralph** layout. Run `rauf migrate .` first (the loop runner only understands `.rauf/` and `RAUF_*` signals), then re-run `/feature-forge:forge-5-loop {feature}`."
105
+ - **Otherwise**, STOP and show `loopRunner.setupHint` (default: "Run `rauf install .` …"), e.g. "The loop runner isn't set up in this project ({preconditionFile} is missing). {setupHint}"
111
106
 
112
107
  ### 1e. Backlog File Check
113
108
 
@@ -117,6 +112,10 @@ Resolve the backlog file path (matching forge-4-backlog's composition rule, item
117
112
 
118
113
  Verify the file exists on disk. If not, STOP and tell the user: "No backlog.json found at {path}. Run `/feature-forge:forge-4-backlog {feature}` to generate it."
119
114
 
115
+ ### 1f. Branch Pre-flight (if using git)
116
+
117
+ The runner commits each completed item straight onto the current branch, so guard against committing onto the default branch. Skip if not a git repo or `branchPerFeature` is false. Read the current branch (`git rev-parse --abbrev-ref HEAD`) and default branch (`git symbolic-ref --quiet refs/remotes/origin/HEAD`, else `main`/`master`). If `.pipeline-state.json` records a `branch` that differs from the current one, warn via `AskUserQuestion` (offer **switch back** or **proceed here**). Otherwise, if the current branch **is** the default, strongly recommend via `AskUserQuestion` creating/switching to `{branchPrefix}{feature}` (`git switch -c`, then record it to the state `branch` field) before the loop commits — still allowing **proceed on `{defaultBranch}`**. Never hard-stop.
118
+
120
119
  ## Step 2: Construct the Loop Command
121
120
 
122
121
  ### 2a. Analyze Backlog
@@ -180,6 +179,7 @@ For the full loop-runner contract — event-stream vs. log-fallback launch, the
180
179
  - **(b) Agent question.** Add an **"agent"** question to the same `AskUserQuestion` surface: **one option per advertised row** labelled `"{displayName} ({id}) — available/not found"`, **plus an explicit `"default (claude-cli)"` choice mapping to `run_selection = None`**. Resolve the pick (run > project, empty/whitespace unset, an explicit runner-default pick collapses to the default path) into `{resolved.agent, resolved.source}`. Precedence: `item.provider > --agent > project defaultAgent > runner default` (forge never reads a backlog item's provider).
181
180
  - **(c) Availability listing.** From the **same** parsed `agents[]` (no second probe), list `id` / `displayName` / available (`yes`/`no`, `detail` on unavailable rows).
182
181
  - **(d) Verdict** — only for a **non-default** resolved agent (default path `None`/`claude-cli` → no probe, byte-identical to today). Classify by **membership** then `available` (never by exit code): **UNKNOWN** (`∉` set) → **hard-reject BEFORE any loop side-effect**, error lists the **sorted** valid ids, **NO proceed-anyway**; **UNAVAILABLE** (member, `available False`) → warn with `detail`, `AskUserQuestion` offering **proceed-anyway OR choose-another** (re-presents the same `agents[]`), never silent; **AVAILABLE** → proceed, the validated id fills `{agent}`; **probe failure** (non-zero exit / unparseable / missing or empty `agents[]` / row lacking `id`) → surface it, offer **choose-another OR abort**, **never launch the non-default agent unvalidated** and never silently fall back to the default.
182
+ - **(d-model) Claude-only model-alias guard.** Runs **only** when the resolved agent is **non-default** (not the default / `claude-cli` path). Read the backlog.json (Step 1e path); collect items whose `model` is a **Claude-specific alias** (tier `opus`/`sonnet`/`haiku` or a `claude-*` id). **If none, skip silently.** Otherwise warn before launch via `AskUserQuestion` (NOT prose): `item.model` outranks `--agent`, so the alias is forwarded verbatim to `{agent}`, which will likely reject it (e.g. codex 400 *"The 'sonnet' model is not supported…"*) — every spawn exits 1 and rauf circuit-breaks (*"3 consecutive infra failures — halting"*) with no hint of the cause. Offer: **(1) Strip `model` for this run (recommended)** — rewrite backlog.json removing the `model` key from each affected item (persistent edit; re-run forge-4-backlog to restore), then proceed; **(2) Proceed as-is** — only safe if `{agent}` understands the pinned ids. forge touches only `model`, never `provider`. Full rationale: `references/runner-contract.md`.
183
183
  - **(e) Optional-flags line.** Replace the confirmation's optional-flags line with one that lists `--agent <id>` first plus the agent precedence pointer (`item.provider > --agent > project defaultAgent > runner default`) alongside the model precedence.
184
184
  - **(f) Resolved-agent line.** Add to the confirmation block: `Agent: {resolved.agent or claude-cli} (source: {sourceLabel})` — `sourceLabel`: `RUN` → `"per-run selection"`, `PROJECT` → `"project default (loopRunner.defaultAgent)"`, `DEFAULT` → `"runner default — claude-cli"`.
185
185
 
@@ -193,11 +193,11 @@ Before launching, update `{resolvedFeatureDir}/.pipeline-state.json`:
193
193
  - Set `currentStage` to `forge-5-loop`
194
194
  - Update `updatedAt`
195
195
 
196
- ### 3b. Launch Background Process
196
+ Then commit this state write before launching (mandatory). The runner refuses to run with uncommitted changes (*"…pass --force"*), and this marker is itself one — so an otherwise-clean repo fails its first launch unless committed. Commit it via the shared-conventions **Git Commit Protocol** (epic members: stage `{specsDir}/{epic}/`): `{commitPrefix}({feature}): forge-5-loop in-progress` — a launch precondition, required regardless of `gitCommitAfterStage`. Unrelated leftover changes still trip the refusal; surface it, never auto-pass `--force`. See `references/runner-contract.md`.
197
197
 
198
- Launch the loop **backgrounded** (`run_in_background: true`) so it survives session end and does not block the session, and prefer the machine-readable event stream (`loopRunner.eventStreamCommand`, default for rauf) redirected to a stable `events.ndjson` so the session can supervise it live; fall back to the plain `runCommand` (tailing the human log) when no `eventStreamCommand` is configured. The background task's exit notification is the single authoritative terminal signal (Step 4). For the exact launch commands (incl. the `mkdir -p` state-dir guard) and the event-stream vs. log-fallback detail, read `references/runner-contract.md`.
198
+ ### 3b. Launch Background Process
199
199
 
200
- Loop runs can take significant time (minutes to hours depending on backlog size).
200
+ Launch the loop **backgrounded** (`run_in_background: true`) so it survives session end and does not block the session, and prefer the machine-readable event stream (`loopRunner.eventStreamCommand`, default for rauf) redirected to a stable `events.ndjson` so the session can supervise it live; fall back to the plain `runCommand` (tailing the human log) when no `eventStreamCommand` is configured. The background task's exit notification is the single authoritative terminal signal (Step 4). Loop runs can take significant time (minutes to hours depending on backlog size). For the exact launch commands (incl. the `mkdir -p` state-dir guard) and the event-stream vs. log-fallback detail, read `references/runner-contract.md`.
201
201
 
202
202
  ### 3c. Inform User
203
203
 
@@ -246,7 +246,7 @@ Run the **status-json command** (`loopRunner.statusJsonCommand`) and read
246
246
  `backlogSummary` for the authoritative counts — it separates the three non-done
247
247
  outcomes: genuine `blocked`, `needsHuman`, and runner-`deferred` ("false blocks").
248
248
  Fall back to the **list command** (`loopRunner.listCommand`) if `statusJsonCommand`
249
- is not configured. You will already have most of this from the live tally in 3e.
249
+ is not configured. You will already have most of this from the live tally in 3e. If the run used a review flag (e.g. rauf's `--review`), also read any `review_completed` event (event stream, or `{loopRunner.stateDir}/events.ndjson`) for its `itemsCreated`/`summary` to surface in 4b — see `references/result-reporting.md`.
250
250
 
251
251
  ### 4b. Report Results
252
252
 
@@ -267,13 +267,15 @@ Update `{resolvedFeatureDir}/.pipeline-state.json`:
267
267
  2. If all items complete: set `currentStage` to `"forge-6-docs"`
268
268
  3. Update `updatedAt`
269
269
 
270
- **No git commit is needed** — the loop runner commits atomically per completed item during the run. The implementation code is already committed.
270
+ **No git commit is needed** — the loop runner commits implementation code atomically per completed item during the run. (Step 6's commit, epic members only, is of pipeline state / manifest — a distinct artifact.)
271
+
272
+ ## Step 5b: Offer Impl-Verify (standalone path)
271
273
 
272
- > **Note:** Step 5's "no git commit needed" remark refers to *implementation code*, which the runner commits per-item. The epic handoff's commit in Step 6 below is of *pipeline state / manifest* a distinct artifact and applies only to epic members.
274
+ **Gate:** run only if (a) the feature's `.pipeline-state.json` has **no** `epic` key **and** (b) Step 5 set `stages.forge-5-loop.status` to `complete`. Otherwise **skip** partial runs end as today, and epic members get the equivalent offer in Step 6.1 (do **not** prompt twice). This standalone counterpart to Step 6.1 nudges verification interactively rather than via the easily-missed "Next steps" text. Use `AskUserQuestion` (NOT inline prose) to offer: *"{feature}'s loop is complete. Recommended: run `/feature-forge:forge-verify {feature} impl` to audit the implementation before generating docs. Run it now, or skip to forge-6-docs?"* On **run**, hand off to `/feature-forge:forge-verify {feature} impl`. On **skip**, record `stages.forge-verify-impl.status` as `"skipped"` (mirrors `forge-4-backlog`'s skip handling) and point the user at `/feature-forge:forge-6-docs {feature}` — the forge-6-docs backstop re-surfaces the skip.
273
275
 
274
276
  ## Step 6: Epic Handoff
275
277
 
276
- **Gate:** only run this step if (a) the resolved feature's `.pipeline-state.json` has an `epic` key **and** (b) Step 5 set `stages.forge-5-loop.status` to `complete` (all backlog items done). If either is false, **skip** — standalone features and partial runs end exactly as today (REQ-COMPAT-01).
278
+ **Gate:** only run this step if (a) the resolved feature's `.pipeline-state.json` has an `epic` key **and** (b) Step 5 set `stages.forge-5-loop.status` to `complete` (all backlog items done). If either is false, **skip** — standalone completed features are handled by Step 5b, and partial runs end as today (REQ-COMPAT-01).
277
279
 
278
280
  1. **Offer impl-verify first (recommended, skippable).** Per the completion rule (`00-core-definitions.md §7`), a feature whose `forge-verify-impl.status == findings-reported` does **not** unblock dependents. Use `AskUserQuestion` (NOT inline prose) to offer:
279
281
 
@@ -297,7 +299,7 @@ Update `{resolvedFeatureDir}/.pipeline-state.json`:
297
299
  - rauf resolves `RAUF.md` with fallback: checks `{backlogDir}/.rauf/RAUF.md` first, then the project's `.rauf/RAUF.md`. As long as the runner is installed in the project, the prompt template will be found.
298
300
  - State files (state.json, {loopRunner.logFile}, etc.) are created at `{backlogDir}/{loopRunner.stateDir}/` — this is within the feature's spec directory and is expected. State is isolated per backlog dir, so concurrent features don't collide.
299
301
  - If the session disconnects during a long-running loop, the runner process continues independently. The user can check results later with the status / list commands.
300
- - Never run the run command in the foreground (without `run_in_background`) — it blocks and will hit the Bash tool timeout for any non-trivial backlog. "Don't block the foreground" is NOT "stay silent": supervise via the `Monitor` tool (3d), which is harness-driven, not a sleep loop. Never `sleep`/poll in the foreground to wait for the loop.
301
- - The `Monitor` must use `persistent: true` (not a bounded `timeout_ms`), watch the **structured** surface (`events.ndjson`), and never filter on raw `RAUF_*` tokens — they appear in agent prose and false-match. A `needs_human`/`blocked`/`review` signal does **not** pause the loop — the runner sets the item aside and keeps going; surface it live but don't tell the user the loop is waiting. See `references/runner-contract.md` for the full monitoring rules.
302
+ - Never run the run command in the foreground (without `run_in_background`) — it blocks and will hit the Bash tool timeout for any non-trivial backlog. "Don't block the foreground" is NOT "stay silent": supervise via the `Monitor` tool (3d), never `sleep`/poll in the foreground. The `Monitor` must use `persistent: true` (not a bounded `timeout_ms`), watch the **structured** surface (`events.ndjson`), and never filter on raw `RAUF_*` tokens — they appear in agent prose and false-match. A `needs_human`/`blocked`/`review` signal does **not** pause the loop the runner sets the item aside and keeps going; surface it live but don't tell the user the loop is waiting. See `references/runner-contract.md` for the full monitoring rules.
302
303
  - If a previous loop run left a stale lock, the user may need to pass `--force` to clear it. rauf will report this error clearly.
303
304
  - The version gate (1c) uses the `--json` form on purpose; never parse `rauf version`'s human output.
305
+ - **Implementation artifacts must not cite specs.** The loop should **read** the specs and `backlog.json` freely — they are the source of truth for what to build, and the backlog rightly references specs for provenance. But the artifacts the loop **writes into the target repo** (source code, generated `SKILL.md`/agent files, configs, code comments) must be **self-contained**: they must NOT reference feature-forge spec files (no `See specs/{feature}/NN-*.md`, no "source spec" provenance notes in shipped output). Specs are pre-implementation inputs that may be archived or deleted once the feature ships; the implementation must stand on its own. This applies only to shipped implementation output — never to the backlog or spec documents, which should keep citing specs.
@@ -13,6 +13,19 @@ Next steps:
13
13
  - /feature-forge:forge-6-docs {feature} Generate architecture docs
14
14
  ```
15
15
 
16
+ **Runner review pass.** A review flag (e.g. rauf's `--review`) makes the runner run
17
+ a post-loop review that **auto-creates and implements fix items** rather than handing
18
+ findings to the user — distinct from `forge-verify impl` (a clean-context audit that
19
+ writes a findings doc). When Step 4a captured a `review_completed` event, add a line
20
+ **above** "Next steps" so the pass's effect is visible and not mistaken for "nothing
21
+ happened":
22
+ ```
23
+ Runner review pass: {itemsCreated} fix item(s) created and implemented.
24
+ {summary}
25
+ ```
26
+ Omit this line when no `review_completed` event was emitted (no review flag passed).
27
+ The created items are already counted in the totals above.
28
+
16
29
  **Some items need a human:**
17
30
  ```
18
31
  Loop completed for {feature}.
@@ -70,6 +70,38 @@ The default / `claude-cli` path runs **no** probe (zero extra cost). See
70
70
  `04-availability-precheck.md` for the full pre-check, classification, and allow-list,
71
71
  and `02-config-schema-and-gating.md` for the capability gate.
72
72
 
73
+ > **Probe false-negative for Claude Code installs (advisory).** `rauf agents` may
74
+ > report `claude-cli` **unavailable** (e.g. *"credentials file not found:
75
+ > ~/.config/claude-code/credentials.json"*) even when a working `claude` CLI
76
+ > authenticates elsewhere — the probe's credential heuristic doesn't cover every
77
+ > install. This is a rauf probe concern, not something forge-5-loop fixes. The
78
+ > **default-agent path skips the probe entirely**, so an ordinary default run is
79
+ > unaffected; only an **explicit** `--agent claude-cli` would be flagged UNAVAILABLE,
80
+ > and the existing **proceed-anyway** path (above) covers it. Do not attempt to
81
+ > patch rauf's probe from here.
82
+
83
+ ### Claude-only model-alias guard (Step 2d, sub-step d-model)
84
+
85
+ When the resolved agent is **non-default** (not the default / `claude-cli` path),
86
+ forge must guard against a backlog whose items pin **Claude-specific** model aliases.
87
+ forge-4-backlog (via the rauf author-backlog skill) writes Claude tier aliases
88
+ (`opus` / `sonnet`) into each item's `model`. Because rauf's precedence puts
89
+ `item.model` **above** `--agent`, the alias is forwarded verbatim to the selected
90
+ agent; a non-Claude agent (e.g. codex) then 400s — *"The 'sonnet' model is not
91
+ supported when using Codex with a ChatGPT account."* — so **every** spawn exits 1 and
92
+ rauf reports *"Circuit breaker: 3 consecutive infra failures — halting"* with no hint
93
+ of the real cause. forge-5-loop therefore detects Claude-specific `model` aliases in
94
+ the backlog (tier aliases `opus`/`sonnet`/`haiku` or `claude-*` ids) and, before
95
+ launch, **warns** and offers (via `AskUserQuestion`) to **strip `model` for this run**
96
+ (remove the key from each affected item so each spawn uses the agent's own default) or
97
+ **proceed as-is**. forge only ever touches the `model` field — never `provider`. The
98
+ default / `claude-cli` path skips this guard (the aliases are valid there).
99
+
100
+ > **Follow-up (out of scope here — rauf repo).** The durable fix would be for the
101
+ > rauf `author-backlog` skill to keep `model` **provider-neutral** by default (or to
102
+ > document that writing a tier alias binds the backlog to Claude agents). That lives
103
+ > in the separate rauf plugin/repo, not feature-forge; tracked as a follow-up.
104
+
73
105
  ## Optional flags catalog (Step 2d, rauf)
74
106
 
75
107
  These are the optional flags the user may add to the rendered run command. If the
@@ -92,6 +124,14 @@ Launch the loop **backgrounded** so it survives session end and does not block t
92
124
  session, and prefer the machine-readable event stream so the session can supervise
93
125
  it live.
94
126
 
127
+ > **Clean-tree precondition.** rauf refuses to run with uncommitted changes
128
+ > (*"Refusing to run the loop with uncommitted changes… pass --force"*). Step 3a's
129
+ > in-progress `.pipeline-state.json` write is itself an uncommitted change, so it
130
+ > **must be committed before launch** (Step 3a) — otherwise the first launch on an
131
+ > otherwise-clean repo always fails. If the tree still has unrelated uncommitted
132
+ > changes after that commit, surface it and let the user commit/stash or pass
133
+ > `--force`; never auto-pass `--force`.
134
+
95
135
  - **If `loopRunner.eventStreamCommand` is configured (default for rauf):** render it
96
136
  (it appends `--ndjson` to the run) and launch via the Bash tool with
97
137
  `run_in_background: true`, redirecting stdout to a stable events file:
@@ -35,12 +35,16 @@ Check `{resolvedFeatureDir}/backlog.json` (or `{backlogDir}/{feature}/backlog.js
35
35
 
36
36
  Also check `.pipeline-state.json` for `stages.forge-5-loop`. If it exists and has status `in-progress` (some items incomplete), include this in the warning: "The rauf loop has not fully completed — {done}/{total} items done. Documentation may need updates after remaining items are implemented."
37
37
 
38
+ ### Impl-Verify Backstop
39
+
40
+ Check `.pipeline-state.json` for `stages.forge-verify-impl`. If it is **absent** or has status `"skipped"`, use `AskUserQuestion` to warn with the cost of skipping: "Implementation hasn't been verified yet. Recommended: run `/feature-forge:forge-verify {feature} impl` first to audit the loop's output — docs generated over unverified code can document bugs or gaps as if they were intended behavior, and readers will trust them. Generate docs anyway?" Offer **Verify first (recommended)** · **Generate docs anyway**. This mirrors `forge-4-backlog`'s pre-stage verification check and backstops a skipped impl-verify regardless of how the loop ended. If `stages.forge-verify-impl` shows it already ran (`findings-applied`, `findings-reported`, or `passed`), proceed with no warning.
41
+
38
42
  ### Epic-Level Documentation (epic members only)
39
43
 
40
44
  If the resolved feature has an `epic` back-pointer in its `.pipeline-state.json`, run:
41
45
 
42
46
  ```bash
43
- 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)"
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)"
44
48
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
45
49
  python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
46
50
  ```
@@ -110,6 +114,11 @@ Present the plan and use `AskUserQuestion` to get the user's confirmation.
110
114
  - Specs are the source of truth for design intent; code is the source of truth for behavior
111
115
  - Read the actual source code to verify your documentation is correct
112
116
 
117
+ **Don't cite or link spec files in the generated docs.**
118
+ - Read the specs freely for context, but the docs you write are shipped implementation artifacts — they must be self-contained
119
+ - Never link or reference `PRD.md`, `tech-spec.md`, or the numbered implementation specs (`specs/{feature}/NN-*.md`); these are pre-implementation artifacts that may be archived or deleted
120
+ - Reference only the code, runtime contracts/configuration, and other generated docs. If you need to convey design intent, write it directly into the doc rather than pointing at a spec
121
+
113
122
  **Match existing conventions.**
114
123
  - If other features' docs use a specific heading structure, follow it
115
124
  - If they include diagrams, include diagrams
@@ -173,6 +182,7 @@ Write pipeline state conforming to `references/pipeline-state-schema.json`.
173
182
  ## Gotchas
174
183
 
175
184
  - Don't just rephrase the specs. Documentation should explain the implemented system, not the planned system. Read the actual code.
185
+ - Don't cite spec files (PRD.md, tech-spec.md, numbered specs) as sources or "further reading" in the generated docs — specs are pre-implementation artifacts that may not survive. Keep the docs self-contained; link only to code, configuration, and other docs.
176
186
  - If the implementation doesn't exist yet (backlog hasn't been run), document based on specs but note prominently that docs are pre-implementation and may need updating.
177
187
  - API reference should include actual function signatures from the code, not from the spec (they may differ).
178
188
  - Don't generate docs that will immediately be stale. Focus on concepts, architecture, and patterns rather than line-by-line code walkthroughs.
@@ -0,0 +1,240 @@
1
+ ---
2
+ # GENERATED — DO NOT EDIT. Source: skills/forge-bootstrap/SKILL.md. Regenerate: python3 scripts/build-adapters.py
3
+ name: forge-bootstrap
4
+ description: Scaffold a brand-new empty repository to a pipeline-ready, green baseline (structure, toolchain, passing lint+test, forge.config.json), then optionally chain into the pipeline. Use when the user runs /feature-forge:forge-bootstrap or asks to bootstrap/scaffold a new empty project for forge. Do NOT trigger on a non-empty repo (that is forge-init), or for general project setup outside the forge pipeline.
5
+ argument-hint: '[--mode-b] [--here|<target-dir>]'
6
+ ---
7
+
8
+ # Bootstrap a Greenfield Repo
9
+
10
+ Take a **brand-new, empty** repository to a pipeline-ready, **green** baseline — a
11
+ scaffolded stack, a valid `forge.config.json`, and a passing lint+test — then optionally
12
+ chain into the pipeline (Mode B). You own the **conversation and decisions only**; every
13
+ mechanic (the greenfield gate, `git init`, scaffolding, the config write, the toolchain
14
+ probe, the commit) is delegated to the helper `scripts/forge-bootstrap.py`. Never inline
15
+ file generation, template contents, the config field list, or the greenfield allow-list —
16
+ they live in the helper and templates, referenced here, never duplicated.
17
+
18
+ `<target-dir>` below is the project being bootstrapped (default `.`, or the argument) — it is
19
+ **distinct from `$R`**, the plugin root. Drive control flow off the helper's exit codes and
20
+ JSON: **0** = ok, **1** = actionable findings, **2** = usage/IO **or** verify
21
+ toolchain-missing.
22
+
23
+ ## Host adaptation (conversational fallback)
24
+
25
+ If the `AskUserQuestion` tool is available, ask the interview questions through it. If it is
26
+ **not** available (a non-Claude host such as Codex), emit the same questions as a single
27
+ **numbered text list** — each line one question with its options in brackets and the default
28
+ marked — then **stop and wait for a single text reply**. Parse the reply positionally
29
+ (answer N → question N); re-prompt only the unparseable items. The question content (text,
30
+ options, defaults) and the conditional gating (Q4 skipped for go/rust/generic; Q6a only for
31
+ monorepo; Q8 only after a verified-green baseline) are **identical** across both paths — only
32
+ the rendering changes. Never assume answers; always wait for the reply.
33
+
34
+ Emit any context as plain text, then route **all** questions through `AskUserQuestion` (or the
35
+ fallback) — never as inline prose questions, which stall the session.
36
+
37
+ ## Flow (Mode A — default)
38
+
39
+ ```
40
+ 1. Portable-root prelude → locate $R
41
+ 2. check → gate + recovery detection
42
+ ├─ eligible:false (exit 1) → Greenfield refusal — STOP
43
+ └─ resumeMarker != null → Resume / restart / cancel
44
+ 3. Interview → assemble the Answers payload
45
+ 4. scaffold --answers <json> → git init if absent; compose templates; write config;
46
+ track artifacts into the sentinel
47
+ 5. verify → toolchain probe + lint/test per member
48
+ ├─ toolchainPresent:false (2) → Missing toolchain: scaffold-anyway-unverified vs abort
49
+ ├─ green:false (exit 1) → Not-green: surface failures, offer fix/abort
50
+ └─ green:true (exit 0) → proceed
51
+ 6. commit [--stage-only per Q9] → stage exact tracked list; single baseline commit;
52
+ remove the sentinel before staging
53
+ 7. Completion summary / Mode B hand-off
54
+ ```
55
+
56
+ ### Step 1 — locate the helper
57
+
58
+ Every bash invocation begins with the byte-identical portable-root prelude, then calls the
59
+ helper. Pass `--specs-dir ./specs` (the default) so the gate allow-lists the specs directory.
60
+
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)"
63
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
64
+ python3 "$R/scripts/forge-bootstrap.py" check "<target-dir>" --json --specs-dir ./specs
65
+ ```
66
+
67
+ Never hardcode a plugin path or a `~/.claude/...` path — always go through `$R`.
68
+
69
+ ### Step 2 — gate (`check`)
70
+
71
+ Read `CheckResult{eligible, disqualifying[], resumeMarker}`.
72
+
73
+ - **`eligible:false` (exit 1) → Greenfield refusal.** Name **every** path in `disqualifying[]`
74
+ verbatim, then direct the user to the right tool — run `forge-init`, then `forge-1-prd`.
75
+ **Touch no files** and STOP (the gate is read-only).
76
+
77
+ ```
78
+ This repo is not empty — forge-bootstrap only scaffolds a brand-new project.
79
+ Disqualifying files found:
80
+ - package.json
81
+ - src/index.ts
82
+ To set forge up on an existing project, run: /feature-forge:forge-init
83
+ Then start the pipeline with: /feature-forge:forge-1-prd <feature>
84
+ ```
85
+
86
+ - **`resumeMarker != null` → Partial-state detected.** A `.forge-bootstrap.json` sentinel
87
+ from this tool's own prior run exists — do **not** treat it as a refusal. Surface the prior
88
+ run's `startedAt` and `artifactsWritten[]`, then ask **resume / restart / cancel**:
89
+ - **Resume** — reuse the sentinel's mirrored `answers` (no re-interview), re-run `scaffold`
90
+ (idempotent — the helper skips already-recorded files), continue from step 5.
91
+ - **Restart** — discard the partial: delete the recorded `artifactsWritten[]` tree + the `.forge-bootstrap.json` sentinel (a skill-orchestration step — the helper has no clean subcommand), then run the interview and `scaffold` fresh.
92
+ - **Cancel** — stop without changes.
93
+
94
+ You perform no cleanup yourself; you only render the choice and dispatch the subcommand.
95
+
96
+ ### Step 3 — interview
97
+
98
+ Ask exactly these, in order. Resolved answers become the `Answers` payload handed to
99
+ `scaffold --answers`.
100
+
101
+ | # | Question | Default / seed rule | Options |
102
+ |---|----------|---------------------|---------|
103
+ | Q1 | Project name? | default = target directory basename (confirm) | free-text, pre-filled |
104
+ | Q2 | One-line purpose? | no default; seeds README + config | free-text |
105
+ | Q3 | Language / stack? | required | `typescript` / `python` / `go` / `rust` / `generic` |
106
+ | Q4 | Package manager? | **only when the stack has a choice** — TS: `npm`/`pnpm`/`yarn`, Python: `uv`/`poetry`/`pip`; **skipped** for go/rust/generic | the stack's options |
107
+ | Q5 | License? | **detect & pre-select** from a pre-existing `LICENSE` (see gating); else default `MIT`. The helper keeps an existing `LICENSE` (REQ-SCAF-09) | `MIT` / `Apache-2.0` / `none` |
108
+ | Q6 | Single package or monorepo? | default `single` | `single` / `monorepo` |
109
+ | Q6a | (monorepo only) member count, then per-member name + stack | no default; one member each (mixed-language allowed) | loop |
110
+ | Q7 | Chain into the pipeline now (Mode B)? | default `no` | `no, scaffold only` / `yes, chain in` |
111
+ | Q8 | (Mode B only) First build: feature or epic? | asked **only after a verified-green baseline** | `feature` / `epic` |
112
+ | Q9 | Commit the baseline, or leave it staged? | default `commit` | `commit` / `stage only` |
113
+
114
+ Gating: Q4 is asked only when the chosen stack has a package-manager choice; Q6a only when
115
+ Q6 = `monorepo` (each member gets a `path` like `packages/<name>`; a single package is one
116
+ member with `path = "."`); Q7 may be asked up-front, but Q8 / Mode B launch are gated on a
117
+ verified-green, committed baseline (see below). You may also offer an optional
118
+ "generate a CI workflow (lint+test)?" question, setting `Answers.ci`.
119
+
120
+ License detect-and-seed (Q5, REQ-SCAF-09): when a `LICENSE` already exists in the target
121
+ (an allowed-meta file the gate let through), **read its first lines** and pre-select the
122
+ matching Q5 default — "MIT License" → `MIT`, "Apache License" → `Apache-2.0`, otherwise
123
+ keep the default and note the unrecognized license. The helper never overwrites the existing
124
+ `LICENSE`; this only seeds the interview default. Also set `Answers.author` from
125
+ `git config user.name` (fallback: the project name) and `Answers.host` to `claude` when
126
+ running on a Claude host (so the helper emits `CLAUDE.md` alongside `AGENTS.md`), else leave
127
+ it null.
128
+
129
+ **Assemble the payload.** Build one `Answers` JSON object — `projectName`, `purpose`,
130
+ `layout`, `license`, `members[]`, `modeB`, `modeBTarget`, `ci`, `commitStyle`, `author`,
131
+ `host` — and pass it verbatim to `scaffold --answers '<json>'`. Invent no fields beyond that
132
+ schema. Two fields come from your runtime, not the interview: `author` from `git config
133
+ user.name` (else the project name; it is the LICENSE copyright holder), and `host` — `"claude"`
134
+ when running under a Claude host (e.g. `AskUserQuestion` is available), else `"codex"`/`"other"`.
135
+ `host` drives the host-conditional agent file: the helper always emits `AGENTS.md` and adds
136
+ `CLAUDE.md` only when `host == "claude"`.
137
+
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)"
140
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
141
+ python3 "$R/scripts/forge-bootstrap.py" scaffold "<target-dir>" --json --answers '<Answers JSON>'
142
+ ```
143
+
144
+ ### Step 5 — verify
145
+
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)"
148
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
149
+ python3 "$R/scripts/forge-bootstrap.py" verify "<target-dir>" --json --answers '<Answers JSON>'
150
+ ```
151
+
152
+ Read `VerifyResult{green, toolchainPresent, lint[], test[]}`.
153
+
154
+ - **`toolchainPresent:false` (exit 2) → Missing toolchain.** Warn, naming which stack's
155
+ toolchain is missing. Ask **scaffold-anyway (unverified) vs abort**. If scaffold-anyway,
156
+ proceed to commit and mark the baseline **unverified** in the summary — never claim green
157
+ you could not verify. If abort, stop; the sentinel stays in-progress for a later resume. An
158
+ unverified baseline **disqualifies Mode B** (no override).
159
+ - **`green:false` with `toolchainPresent:true` (exit 1) → Not-green.** Surface the failing
160
+ `CommandOutcome` entries (command + member) verbatim; offer abort or retry-after-investigation.
161
+ Do not silently proceed to a "green" summary.
162
+ - **`green:true` (exit 0)** → proceed to commit.
163
+
164
+ ### Step 6 — commit
165
+
166
+ Invoke `commit` (or `commit --stage-only`, per Q9). Helper-owned: it stages the **exact
167
+ tracked list** (never `git add -A`/`--force`/`--no-verify`), makes a single baseline commit,
168
+ and removes the sentinel before staging so it never enters history. Read
169
+ `CommitResult{committed, commitHash, staged[]}`. On commit failure, surface the error and
170
+ leave the sentinel in-progress (resumable) — do **not** declare success.
171
+
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)"
174
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
175
+ python3 "$R/scripts/forge-bootstrap.py" commit "<target-dir>" --json --answers '<Answers JSON>' [--stage-only]
176
+ ```
177
+
178
+ ## Completion summary
179
+
180
+ Render the human-facing summary from the helper's JSON (`VerifyResult` + `CommitResult`). State:
181
+ created artifacts (from `CommitResult.staged[]`, including any kept pre-existing meta file);
182
+ resolved stack(s) (single, or each monorepo member's name + stack); the **verification
183
+ verdict** — `green` or `unverified` (never "green" for an unverified baseline); the commit
184
+ state (with `commitHash`, or staged-only); and the exact next command. In Mode B, **launch**
185
+ the next stage instead of printing the command.
186
+
187
+ ```
188
+ Bootstrap complete — pipeline-ready baseline.
189
+ Stack: python (uv)
190
+ Created: pyproject.toml, src/acme_svc/..., tests/test_smoke.py, .gitignore,
191
+ README.md, LICENSE, AGENTS.md, CLAUDE.md, forge.config.json
192
+ Kept: (none — README/LICENSE generated fresh)
193
+ Verification: green (mypy ✓ pytest ✓)
194
+ Commit: baseline committed (a1b2c3d)
195
+ Next step: /feature-forge:forge-1-prd <feature>
196
+ ```
197
+
198
+ Unverified variant:
199
+
200
+ ```
201
+ Verification: UNVERIFIED — toolchain not found on this machine; lint+test were not run.
202
+ Install the toolchain and re-run verify before relying on the baseline.
203
+ ```
204
+
205
+ ## Mode B hand-off (opt-in)
206
+
207
+ Mode B is **opt-in** (Q7; default Mode A) and **agent-driven** — it hands skill-to-skill to
208
+ the next pipeline stage, not through the helper.
209
+
210
+ **Gate:** launch the next stage **only after both** a verified-green baseline
211
+ (`VerifyResult.green == true`) **and** a successful commit (`CommitResult.committed == true`).
212
+ If the baseline is unverified or not-green, you MUST NOT launch the next stage and MUST NOT
213
+ even ask Q8 — fall back to the Mode A summary with the next command printed. There is no
214
+ "launch anyway on red" path.
215
+
216
+ When the gate passes:
217
+
218
+ 1. Ask Q8 — feature vs epic — if not already resolved.
219
+ 2. **Feature:** invoke `forge-1-prd <feature>` skill-to-skill, seeding `<feature>` from a
220
+ confirmed, kebab-cased name.
221
+ 3. **Epic:** invoke `forge-0-epic <epic>` skill-to-skill. Seed the epic name and initial
222
+ decomposition from the project name + purpose (Q1/Q2), **propose it, let the user
223
+ edit/approve**, then launch.
224
+ 4. **Launch** that stage instead of printing its command.
225
+
226
+ Mode B auto-launches **only the immediate next stage**; every subsequent pipeline stage stays
227
+ a normal, user-driven step. The hand-off is always skill-to-skill, never via the helper.
228
+
229
+ ## The four terminal outcomes
230
+
231
+ Every run ends in exactly one explicit, actionable outcome — make it explicit in your output;
232
+ no run ends silently:
233
+
234
+ - **Success** — `commit` exit 0 + green (or unverified-but-proceeded) → completion summary, or
235
+ Mode B launch.
236
+ - **Greenfield refusal** — `check` `eligible:false` → name `disqualifying[]`, point to
237
+ `forge-init` + `forge-1-prd`, touch nothing.
238
+ - **Missing toolchain** — `verify` `toolchainPresent:false` (exit 2) → scaffold-anyway-unverified
239
+ vs abort; mark **unverified**.
240
+ - **Partial-state detected** — `check` `resumeMarker != null` → resume / restart / cancel.
@@ -0,0 +1,12 @@
1
+ name: ci
2
+ on:
3
+ push:
4
+ branches: ["**"]
5
+ pull_request:
6
+
7
+ jobs:
8
+ verify:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ # <<MEMBER_STEPS>>
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ # Entrypoint for the scaffolded baseline.
3
+ echo "Hello from {{PROJECT_NAME}}"
@@ -0,0 +1,13 @@
1
+ #!/bin/sh
2
+ # Behavioral test: run the entrypoint and assert its output.
3
+ set -eu
4
+
5
+ actual="$(./run.sh)"
6
+ expected="Hello from {{PROJECT_NAME}}"
7
+
8
+ if [ "$actual" != "$expected" ]; then
9
+ printf 'FAIL: expected %s but got %s\n' "$expected" "$actual" >&2
10
+ exit 1
11
+ fi
12
+
13
+ printf 'PASS: run.sh produced the expected greeting\n'
@@ -0,0 +1,12 @@
1
+ package main
2
+
3
+ import "fmt"
4
+
5
+ // greet returns the project greeting for name.
6
+ func greet(name string) string {
7
+ return "Hello from " + name
8
+ }
9
+
10
+ func main() {
11
+ fmt.Println(greet("{{PROJECT_NAME}}"))
12
+ }
@@ -0,0 +1,11 @@
1
+ package main
2
+
3
+ import "testing"
4
+
5
+ func TestGreet(t *testing.T) {
6
+ got := greet("world")
7
+ want := "Hello from world"
8
+ if got != want {
9
+ t.Errorf("greet(\"world\") = %q, want %q", got, want)
10
+ }
11
+ }
@@ -0,0 +1,24 @@
1
+ # Agent Instructions — {{PROJECT_NAME}}
2
+
3
+ ## Project Purpose
4
+
5
+ {{PURPOSE}}
6
+
7
+ ## Getting Started
8
+
9
+ This project was scaffolded by forge-bootstrap. To continue development:
10
+
11
+ 1. Review `forge.config.json` for the project configuration.
12
+ 2. Run the forge pipeline (forge-1-prd → forge-0-epic → forge-3-specs → forge-4-backlog) to plan and implement features.
13
+ 3. Use `forge-5-loop` to drive autonomous implementation.
14
+
15
+ ## Conventions
16
+
17
+ - Follow the patterns established in the existing codebase.
18
+ - Keep `forge.config.json` up to date with any changes to stack or commands.
19
+
20
+ ## Specs are pre-implementation
21
+
22
+ - Documents under `specs/` (PRDs, tech specs, numbered implementation specs) establish the backlog. They are **not** kept in sync with the code as it evolves.
23
+ - Do not flag or "fix" divergence between a finalized spec and the implementation — code is the source of truth for behavior.
24
+ - It's fine for `specs/` artifacts and `backlog.json` to reference specs for provenance, but implementation artifacts (source code, generated skills/agents, configs, docs) must not reference spec files, which may be archived or deleted after a feature ships.
@@ -0,0 +1,25 @@
1
+ # Claude Instructions — {{PROJECT_NAME}}
2
+
3
+ ## Project Purpose
4
+
5
+ {{PURPOSE}}
6
+
7
+ ## Getting Started
8
+
9
+ This project was scaffolded by forge-bootstrap. To continue development:
10
+
11
+ 1. Review `forge.config.json` for the project configuration.
12
+ 2. Run the forge pipeline (forge-1-prd → forge-0-epic → forge-3-specs → forge-4-backlog) to plan and implement features.
13
+ 3. Use `forge-5-loop` to drive autonomous implementation.
14
+
15
+ ## Working with Claude
16
+
17
+ - Use `/feature-forge:forge` to enter the forge pipeline for new features.
18
+ - The `forge.config.json` at the project root defines the stack, commands, and pipeline settings.
19
+ - Follow the patterns established in the existing codebase.
20
+
21
+ ## Specs are pre-implementation
22
+
23
+ - Documents under `specs/` (PRDs, tech specs, numbered implementation specs) establish the backlog. They are **not** kept in sync with the code as it evolves.
24
+ - Don't flag or "fix" divergence between a finalized spec and the implementation — code is the source of truth for behavior.
25
+ - It's fine for `specs/` artifacts and `backlog.json` to reference specs for provenance, but implementation artifacts (source code, generated skills/agents, configs, docs) must not reference spec files, which may be archived or deleted after a feature ships.
@@ -0,0 +1,11 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ {{PURPOSE}}
4
+
5
+ ## License
6
+
7
+ This project is licensed under {{LICENSE}}.
8
+
9
+ ---
10
+
11
+ _Scaffolded by [forge-bootstrap](https://github.com/feature-forge/feature-forge)._