@entelligentsia/forgecli 1.0.25 → 1.0.36

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 (390) hide show
  1. package/CHANGELOG.md +258 -0
  2. package/README.md +2 -0
  3. package/dist/CHANGELOG-forge-plugin.md +163 -0
  4. package/dist/bin/argv.d.ts +2 -2
  5. package/dist/bin/argv.js +25 -0
  6. package/dist/bin/argv.js.map +1 -1
  7. package/dist/bin/forge.js +12 -0
  8. package/dist/bin/forge.js.map +1 -1
  9. package/dist/bin/init.d.ts +23 -0
  10. package/dist/bin/init.js +123 -0
  11. package/dist/bin/init.js.map +1 -0
  12. package/dist/bin/uninstall.d.ts +20 -0
  13. package/dist/bin/uninstall.js +141 -0
  14. package/dist/bin/uninstall.js.map +1 -0
  15. package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
  16. package/dist/extensions/forgecli/add-pipeline.js +143 -0
  17. package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
  18. package/dist/extensions/forgecli/add-task.d.ts +20 -0
  19. package/dist/extensions/forgecli/add-task.js +154 -0
  20. package/dist/extensions/forgecli/add-task.js.map +1 -0
  21. package/dist/extensions/forgecli/approve.d.ts +22 -0
  22. package/dist/extensions/forgecli/approve.js +152 -0
  23. package/dist/extensions/forgecli/approve.js.map +1 -0
  24. package/dist/extensions/forgecli/banner.d.ts +10 -0
  25. package/dist/extensions/forgecli/banner.js +36 -0
  26. package/dist/extensions/forgecli/banner.js.map +1 -0
  27. package/dist/extensions/forgecli/calibrate.d.ts +64 -0
  28. package/dist/extensions/forgecli/calibrate.js +481 -0
  29. package/dist/extensions/forgecli/calibrate.js.map +1 -0
  30. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.d.ts +40 -0
  31. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js +593 -0
  32. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js.map +1 -0
  33. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.d.ts +46 -0
  34. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js +245 -0
  35. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js.map +1 -0
  36. package/dist/extensions/forgecli/claude-bootstrap/uninstall.d.ts +23 -0
  37. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js +215 -0
  38. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js.map +1 -0
  39. package/dist/extensions/forgecli/collate.d.ts +22 -0
  40. package/dist/extensions/forgecli/collate.js +134 -0
  41. package/dist/extensions/forgecli/collate.js.map +1 -0
  42. package/dist/extensions/forgecli/commit.d.ts +22 -0
  43. package/dist/extensions/forgecli/commit.js +152 -0
  44. package/dist/extensions/forgecli/commit.js.map +1 -0
  45. package/dist/extensions/forgecli/config-command.d.ts +8 -0
  46. package/dist/extensions/forgecli/config-command.js +67 -0
  47. package/dist/extensions/forgecli/config-command.js.map +1 -0
  48. package/dist/extensions/forgecli/config-layer.d.ts +53 -0
  49. package/dist/extensions/forgecli/config-layer.js +72 -0
  50. package/dist/extensions/forgecli/config-layer.js.map +1 -0
  51. package/dist/extensions/forgecli/config-writer.d.ts +16 -0
  52. package/dist/extensions/forgecli/config-writer.js +69 -0
  53. package/dist/extensions/forgecli/config-writer.js.map +1 -0
  54. package/dist/extensions/forgecli/dashboard/component.js +10 -7
  55. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  56. package/dist/extensions/forgecli/enhance.d.ts +27 -0
  57. package/dist/extensions/forgecli/enhance.js +199 -0
  58. package/dist/extensions/forgecli/enhance.js.map +1 -0
  59. package/dist/extensions/forgecli/fix-bug.d.ts +85 -0
  60. package/dist/extensions/forgecli/fix-bug.js +1580 -0
  61. package/dist/extensions/forgecli/fix-bug.js.map +1 -0
  62. package/dist/extensions/forgecli/forge-header.d.ts +12 -0
  63. package/dist/extensions/forgecli/forge-header.js +114 -0
  64. package/dist/extensions/forgecli/forge-header.js.map +1 -0
  65. package/dist/extensions/forgecli/forge-init.d.ts +26 -0
  66. package/dist/extensions/forgecli/forge-init.js +514 -0
  67. package/dist/extensions/forgecli/forge-init.js.map +1 -0
  68. package/dist/extensions/forgecli/forge-root.d.ts +10 -0
  69. package/dist/extensions/forgecli/forge-root.js +62 -0
  70. package/dist/extensions/forgecli/forge-root.js.map +1 -0
  71. package/dist/extensions/forgecli/forge-update-command.d.ts +100 -0
  72. package/dist/extensions/forgecli/forge-update-command.js +435 -0
  73. package/dist/extensions/forgecli/forge-update-command.js.map +1 -0
  74. package/dist/extensions/forgecli/friction-emit.d.ts +99 -0
  75. package/dist/extensions/forgecli/friction-emit.js +245 -0
  76. package/dist/extensions/forgecli/friction-emit.js.map +1 -0
  77. package/dist/extensions/forgecli/implement.d.ts +22 -0
  78. package/dist/extensions/forgecli/implement.js +170 -0
  79. package/dist/extensions/forgecli/implement.js.map +1 -0
  80. package/dist/extensions/forgecli/init-context.d.ts +99 -0
  81. package/dist/extensions/forgecli/init-context.js +178 -0
  82. package/dist/extensions/forgecli/init-context.js.map +1 -0
  83. package/dist/extensions/forgecli/init-progress.d.ts +39 -0
  84. package/dist/extensions/forgecli/init-progress.js +117 -0
  85. package/dist/extensions/forgecli/init-progress.js.map +1 -0
  86. package/dist/extensions/forgecli/input-router.d.ts +33 -0
  87. package/dist/extensions/forgecli/input-router.js +136 -0
  88. package/dist/extensions/forgecli/input-router.js.map +1 -0
  89. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +59 -0
  90. package/dist/extensions/forgecli/lib/halt-advisor.js +113 -0
  91. package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
  92. package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +46 -0
  93. package/dist/extensions/forgecli/lib/orchestrator-preflight.js +64 -0
  94. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +1 -0
  95. package/dist/extensions/forgecli/materialize.d.ts +16 -0
  96. package/dist/extensions/forgecli/materialize.js +195 -0
  97. package/dist/extensions/forgecli/materialize.js.map +1 -0
  98. package/dist/extensions/forgecli/migrate.d.ts +22 -0
  99. package/dist/extensions/forgecli/migrate.js +260 -0
  100. package/dist/extensions/forgecli/migrate.js.map +1 -0
  101. package/dist/extensions/forgecli/migration-engine.d.ts +117 -0
  102. package/dist/extensions/forgecli/migration-engine.js +563 -0
  103. package/dist/extensions/forgecli/migration-engine.js.map +1 -0
  104. package/dist/extensions/forgecli/model-registry.d.ts +61 -0
  105. package/dist/extensions/forgecli/model-registry.js +127 -0
  106. package/dist/extensions/forgecli/model-registry.js.map +1 -0
  107. package/dist/extensions/forgecli/model-resolver.d.ts +32 -0
  108. package/dist/extensions/forgecli/model-resolver.js +65 -0
  109. package/dist/extensions/forgecli/model-resolver.js.map +1 -0
  110. package/dist/extensions/forgecli/model-validator.d.ts +29 -0
  111. package/dist/extensions/forgecli/model-validator.js +107 -0
  112. package/dist/extensions/forgecli/model-validator.js.map +1 -0
  113. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +26 -0
  114. package/dist/extensions/forgecli/orchestrator-status-bar.js +213 -0
  115. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
  116. package/dist/extensions/forgecli/orchestrators/bug/bug-body.d.ts +1 -0
  117. package/dist/extensions/forgecli/orchestrators/bug/bug-body.js +65 -0
  118. package/dist/extensions/forgecli/orchestrators/bug/bug-body.js.map +1 -0
  119. package/dist/extensions/forgecli/orchestrators/bug/bug-id.d.ts +23 -0
  120. package/dist/extensions/forgecli/orchestrators/bug/bug-id.js +140 -0
  121. package/dist/extensions/forgecli/orchestrators/bug/bug-id.js.map +1 -0
  122. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.d.ts +54 -0
  123. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js +349 -0
  124. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js.map +1 -0
  125. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.d.ts +8 -0
  126. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js +60 -0
  127. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js.map +1 -0
  128. package/dist/extensions/forgecli/orchestrators/bug/bug-state.d.ts +14 -0
  129. package/dist/extensions/forgecli/orchestrators/bug/bug-state.js +100 -0
  130. package/dist/extensions/forgecli/orchestrators/bug/bug-state.js.map +1 -0
  131. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.d.ts +72 -0
  132. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js +204 -0
  133. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js.map +1 -0
  134. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.d.ts +38 -0
  135. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js +166 -0
  136. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js.map +1 -0
  137. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.d.ts +3 -0
  138. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js +55 -0
  139. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js.map +1 -0
  140. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.d.ts +7 -0
  141. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js +293 -0
  142. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js.map +1 -0
  143. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.d.ts +2 -0
  144. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js +501 -0
  145. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js.map +1 -0
  146. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.d.ts +41 -0
  147. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js +5 -0
  148. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js.map +1 -0
  149. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.d.ts +43 -0
  150. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js +85 -0
  151. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js.map +1 -0
  152. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.d.ts +8 -0
  153. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js +37 -0
  154. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js.map +1 -0
  155. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.d.ts +28 -0
  156. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js +45 -0
  157. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js.map +1 -0
  158. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.d.ts +26 -0
  159. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js +75 -0
  160. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js.map +1 -0
  161. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.d.ts +24 -0
  162. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js +37 -0
  163. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js.map +1 -0
  164. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +9 -93
  165. package/dist/extensions/forgecli/orchestrators/fix-bug.js +23 -1721
  166. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
  167. package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +3 -12
  168. package/dist/extensions/forgecli/orchestrators/run-sprint.js +48 -270
  169. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
  170. package/dist/extensions/forgecli/orchestrators/run-task.d.ts +10 -214
  171. package/dist/extensions/forgecli/orchestrators/run-task.js +31 -1481
  172. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -1
  173. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.d.ts +33 -0
  174. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js +135 -0
  175. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js.map +1 -0
  176. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.d.ts +18 -0
  177. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js +55 -0
  178. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js.map +1 -0
  179. package/dist/extensions/forgecli/orchestrators/task/run-task-command.d.ts +9 -0
  180. package/dist/extensions/forgecli/orchestrators/task/run-task-command.js +174 -0
  181. package/dist/extensions/forgecli/orchestrators/task/run-task-command.js.map +1 -0
  182. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.d.ts +2 -0
  183. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js +494 -0
  184. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js.map +1 -0
  185. package/dist/extensions/forgecli/orchestrators/task/run-task-types.d.ts +62 -0
  186. package/dist/extensions/forgecli/orchestrators/task/run-task-types.js +5 -0
  187. package/dist/extensions/forgecli/orchestrators/task/run-task-types.js.map +1 -0
  188. package/dist/extensions/forgecli/orchestrators/task/task-body.d.ts +4 -0
  189. package/dist/extensions/forgecli/orchestrators/task/task-body.js +48 -0
  190. package/dist/extensions/forgecli/orchestrators/task/task-body.js.map +1 -0
  191. package/dist/extensions/forgecli/orchestrators/task/task-events.d.ts +63 -0
  192. package/dist/extensions/forgecli/orchestrators/task/task-events.js +185 -0
  193. package/dist/extensions/forgecli/orchestrators/task/task-events.js.map +1 -0
  194. package/dist/extensions/forgecli/orchestrators/task/task-gates.d.ts +34 -0
  195. package/dist/extensions/forgecli/orchestrators/task/task-gates.js +78 -0
  196. package/dist/extensions/forgecli/orchestrators/task/task-gates.js.map +1 -0
  197. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.d.ts +42 -0
  198. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js +370 -0
  199. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js.map +1 -0
  200. package/dist/extensions/forgecli/orchestrators/task/task-phases.d.ts +14 -0
  201. package/dist/extensions/forgecli/orchestrators/task/task-phases.js +26 -0
  202. package/dist/extensions/forgecli/orchestrators/task/task-phases.js.map +1 -0
  203. package/dist/extensions/forgecli/orchestrators/task/task-record.d.ts +9 -0
  204. package/dist/extensions/forgecli/orchestrators/task/task-record.js +58 -0
  205. package/dist/extensions/forgecli/orchestrators/task/task-record.js.map +1 -0
  206. package/dist/extensions/forgecli/orchestrators/task/task-state.d.ts +14 -0
  207. package/dist/extensions/forgecli/orchestrators/task/task-state.js +35 -0
  208. package/dist/extensions/forgecli/orchestrators/task/task-state.js.map +1 -0
  209. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.d.ts +36 -0
  210. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js +152 -0
  211. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js.map +1 -0
  212. package/dist/extensions/forgecli/plan.d.ts +22 -0
  213. package/dist/extensions/forgecli/plan.js +167 -0
  214. package/dist/extensions/forgecli/plan.js.map +1 -0
  215. package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
  216. package/dist/extensions/forgecli/quiz-agent.js +98 -0
  217. package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
  218. package/dist/extensions/forgecli/read-command.d.ts +2 -0
  219. package/dist/extensions/forgecli/read-command.js +100 -0
  220. package/dist/extensions/forgecli/read-command.js.map +1 -0
  221. package/dist/extensions/forgecli/regenerate.d.ts +40 -0
  222. package/dist/extensions/forgecli/regenerate.js +438 -0
  223. package/dist/extensions/forgecli/regenerate.js.map +1 -0
  224. package/dist/extensions/forgecli/remove-command.d.ts +17 -0
  225. package/dist/extensions/forgecli/remove-command.js +124 -0
  226. package/dist/extensions/forgecli/remove-command.js.map +1 -0
  227. package/dist/extensions/forgecli/report-bug.d.ts +25 -0
  228. package/dist/extensions/forgecli/report-bug.js +159 -0
  229. package/dist/extensions/forgecli/report-bug.js.map +1 -0
  230. package/dist/extensions/forgecli/retrospective.d.ts +20 -0
  231. package/dist/extensions/forgecli/retrospective.js +126 -0
  232. package/dist/extensions/forgecli/retrospective.js.map +1 -0
  233. package/dist/extensions/forgecli/review-code.d.ts +35 -0
  234. package/dist/extensions/forgecli/review-code.js +196 -0
  235. package/dist/extensions/forgecli/review-code.js.map +1 -0
  236. package/dist/extensions/forgecli/review-plan.d.ts +35 -0
  237. package/dist/extensions/forgecli/review-plan.js +200 -0
  238. package/dist/extensions/forgecli/review-plan.js.map +1 -0
  239. package/dist/extensions/forgecli/run-sprint.d.ts +27 -0
  240. package/dist/extensions/forgecli/run-sprint.js +716 -0
  241. package/dist/extensions/forgecli/run-sprint.js.map +1 -0
  242. package/dist/extensions/forgecli/run-task.d.ts +204 -0
  243. package/dist/extensions/forgecli/run-task.js +1403 -0
  244. package/dist/extensions/forgecli/run-task.js.map +1 -0
  245. package/dist/extensions/forgecli/skill-curation-flag.d.ts +21 -0
  246. package/dist/extensions/forgecli/skill-curation-flag.js +71 -0
  247. package/dist/extensions/forgecli/skill-curation-flag.js.map +1 -0
  248. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +102 -0
  249. package/dist/extensions/forgecli/skill-curator-subagent.js +339 -0
  250. package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -0
  251. package/dist/extensions/forgecli/skill-retriever.d.ts +84 -0
  252. package/dist/extensions/forgecli/skill-retriever.js +246 -0
  253. package/dist/extensions/forgecli/skill-retriever.js.map +1 -0
  254. package/dist/extensions/forgecli/skill-usage-tracker.d.ts +91 -0
  255. package/dist/extensions/forgecli/skill-usage-tracker.js +224 -0
  256. package/dist/extensions/forgecli/skill-usage-tracker.js.map +1 -0
  257. package/dist/extensions/forgecli/sprint-intake.d.ts +10 -0
  258. package/dist/extensions/forgecli/sprint-intake.js +91 -0
  259. package/dist/extensions/forgecli/sprint-intake.js.map +1 -0
  260. package/dist/extensions/forgecli/sprint-plan.d.ts +14 -0
  261. package/dist/extensions/forgecli/sprint-plan.js +122 -0
  262. package/dist/extensions/forgecli/sprint-plan.js.map +1 -0
  263. package/dist/extensions/forgecli/status-command.d.ts +19 -0
  264. package/dist/extensions/forgecli/status-command.js +140 -0
  265. package/dist/extensions/forgecli/status-command.js.map +1 -0
  266. package/dist/extensions/forgecli/store-error-remediation.d.ts +65 -0
  267. package/dist/extensions/forgecli/store-error-remediation.js +307 -0
  268. package/dist/extensions/forgecli/store-error-remediation.js.map +1 -0
  269. package/dist/extensions/forgecli/store-query.d.ts +22 -0
  270. package/dist/extensions/forgecli/store-query.js +107 -0
  271. package/dist/extensions/forgecli/store-query.js.map +1 -0
  272. package/dist/extensions/forgecli/store-repair.d.ts +17 -0
  273. package/dist/extensions/forgecli/store-repair.js +123 -0
  274. package/dist/extensions/forgecli/store-repair.js.map +1 -0
  275. package/dist/extensions/forgecli/store-resolver.d.ts +56 -0
  276. package/dist/extensions/forgecli/store-resolver.js +263 -0
  277. package/dist/extensions/forgecli/store-resolver.js.map +1 -0
  278. package/dist/extensions/forgecli/store-validator.d.ts +16 -0
  279. package/dist/extensions/forgecli/store-validator.js +32 -0
  280. package/dist/extensions/forgecli/store-validator.js.map +1 -0
  281. package/dist/extensions/forgecli/test-orchestrate.d.ts +2 -0
  282. package/dist/extensions/forgecli/test-orchestrate.js +182 -0
  283. package/dist/extensions/forgecli/test-orchestrate.js.map +1 -0
  284. package/dist/extensions/forgecli/thread-switcher.d.ts +5 -0
  285. package/dist/extensions/forgecli/thread-switcher.js +189 -0
  286. package/dist/extensions/forgecli/thread-switcher.js.map +1 -0
  287. package/dist/extensions/forgecli/transition-guard.d.ts +20 -0
  288. package/dist/extensions/forgecli/transition-guard.js +89 -0
  289. package/dist/extensions/forgecli/transition-guard.js.map +1 -0
  290. package/dist/extensions/forgecli/update/forge-update-command.js +10 -7
  291. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -1
  292. package/dist/extensions/forgecli/update-check.d.ts +37 -0
  293. package/dist/extensions/forgecli/update-check.js +185 -0
  294. package/dist/extensions/forgecli/update-check.js.map +1 -0
  295. package/dist/extensions/forgecli/update-tools.d.ts +23 -0
  296. package/dist/extensions/forgecli/update-tools.js +135 -0
  297. package/dist/extensions/forgecli/update-tools.js.map +1 -0
  298. package/dist/extensions/forgecli/validate.d.ts +22 -0
  299. package/dist/extensions/forgecli/validate.js +152 -0
  300. package/dist/extensions/forgecli/validate.js.map +1 -0
  301. package/dist/extensions/forgecli/viewport-events.d.ts +78 -0
  302. package/dist/extensions/forgecli/viewport-events.js +243 -0
  303. package/dist/extensions/forgecli/viewport-events.js.map +1 -0
  304. package/dist/extensions/forgecli/viewport-renderer.d.ts +83 -0
  305. package/dist/extensions/forgecli/viewport-renderer.js +233 -0
  306. package/dist/extensions/forgecli/viewport-renderer.js.map +1 -0
  307. package/dist/extensions/forgecli/viewport-theme.d.ts +11 -0
  308. package/dist/extensions/forgecli/viewport-theme.js +128 -0
  309. package/dist/extensions/forgecli/viewport-theme.js.map +1 -0
  310. package/dist/extensions/forgecli/whats-new-widget.d.ts +26 -0
  311. package/dist/extensions/forgecli/whats-new-widget.js +376 -0
  312. package/dist/extensions/forgecli/whats-new-widget.js.map +1 -0
  313. package/dist/extensions/forgecli/whats-new.d.ts +120 -0
  314. package/dist/extensions/forgecli/whats-new.js +470 -0
  315. package/dist/extensions/forgecli/whats-new.js.map +1 -0
  316. package/dist/forge-payload/.base-pack/commands/approve.md +2 -2
  317. package/dist/forge-payload/.base-pack/commands/check-agent.md +2 -2
  318. package/dist/forge-payload/.base-pack/commands/collate.md +2 -2
  319. package/dist/forge-payload/.base-pack/commands/commit.md +2 -2
  320. package/dist/forge-payload/.base-pack/commands/enhance.md +2 -2
  321. package/dist/forge-payload/.base-pack/commands/fix-bug.md +2 -2
  322. package/dist/forge-payload/.base-pack/commands/implement.md +2 -2
  323. package/dist/forge-payload/.base-pack/commands/init.md +278 -0
  324. package/dist/forge-payload/.base-pack/commands/new-sprint.md +2 -2
  325. package/dist/forge-payload/.base-pack/commands/plan-sprint.md +2 -2
  326. package/dist/forge-payload/.base-pack/commands/plan.md +2 -2
  327. package/dist/forge-payload/.base-pack/commands/retro.md +2 -2
  328. package/dist/forge-payload/.base-pack/commands/review-code.md +2 -2
  329. package/dist/forge-payload/.base-pack/commands/review-plan.md +2 -2
  330. package/dist/forge-payload/.base-pack/commands/run-sprint.md +2 -2
  331. package/dist/forge-payload/.base-pack/commands/run-task.md +2 -2
  332. package/dist/forge-payload/.base-pack/commands/validate.md +2 -2
  333. package/dist/forge-payload/.base-pack/workflows/collator_agent.md +5 -6
  334. package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +1 -1
  335. package/dist/forge-payload/.base-pack/workflows-js/wfl-init.js +449 -0
  336. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  337. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  338. package/dist/forge-payload/.schemas/migrations.json +85 -0
  339. package/dist/forge-payload/commands/add-pipeline.md +1 -1
  340. package/dist/forge-payload/commands/add-task.md +3 -3
  341. package/dist/forge-payload/commands/ask.md +1 -1
  342. package/dist/forge-payload/commands/check-agent.md +1 -1
  343. package/dist/forge-payload/commands/config.md +1 -1
  344. package/dist/forge-payload/commands/health.md +1 -1
  345. package/dist/forge-payload/commands/init.md +62 -7
  346. package/dist/forge-payload/commands/rebuild.md +3 -3
  347. package/dist/forge-payload/commands/remove.md +1 -1
  348. package/dist/forge-payload/commands/repair.md +1 -1
  349. package/dist/forge-payload/commands/report-bug.md +1 -1
  350. package/dist/forge-payload/commands/status.md +1 -1
  351. package/dist/forge-payload/commands/update.md +3 -3
  352. package/dist/forge-payload/hooks/lib/common.cjs +228 -0
  353. package/dist/forge-payload/hooks/lib/plugin-detection.cjs +106 -0
  354. package/dist/forge-payload/hooks/lib/update-msg.cjs +23 -0
  355. package/dist/forge-payload/hooks/lib/update-url.cjs +46 -0
  356. package/dist/forge-payload/hooks/lib/write-registry.js +53 -0
  357. package/dist/forge-payload/init/discovery/discover-database.md +32 -0
  358. package/dist/forge-payload/init/discovery/discover-processes.md +31 -0
  359. package/dist/forge-payload/init/discovery/discover-routing.md +31 -0
  360. package/dist/forge-payload/init/discovery/discover-stack.md +33 -0
  361. package/dist/forge-payload/init/discovery/discover-testing.md +34 -0
  362. package/dist/forge-payload/init/generation/generate-commands.md +171 -0
  363. package/dist/forge-payload/init/generation/generate-kb-doc.md +60 -0
  364. package/dist/forge-payload/init/generation/generate-knowledge-base.md +56 -0
  365. package/dist/forge-payload/init/generation/generate-persona.md +73 -0
  366. package/dist/forge-payload/init/generation/generate-personas.md +54 -0
  367. package/dist/forge-payload/init/generation/generate-skill.md +66 -0
  368. package/dist/forge-payload/init/generation/generate-skills.md +36 -0
  369. package/dist/forge-payload/init/generation/generate-template.md +60 -0
  370. package/dist/forge-payload/init/generation/generate-templates.md +39 -0
  371. package/dist/forge-payload/init/generation/generate-tools.md +133 -0
  372. package/dist/forge-payload/init/generation/generate-workflows.md +78 -0
  373. package/dist/forge-payload/init/phases/phase-1-collect.md +10 -2
  374. package/dist/forge-payload/init/phases/phase-3-materialize.md +1 -1
  375. package/dist/forge-payload/init/phases/phase-4-register.md +8 -0
  376. package/dist/forge-payload/init/workflow-gen-plan.json +17 -0
  377. package/dist/forge-payload/integrity.json +16 -16
  378. package/dist/forge-payload/meta/workflows/meta-collate.md +5 -6
  379. package/dist/forge-payload/meta/workflows/meta-migrate.md +1 -1
  380. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  381. package/dist/forge-payload/schemas/structure-manifest.json +3 -12
  382. package/dist/forge-payload/tools/forge-preflight.cjs +268 -0
  383. package/dist/forge-payload/tools/lib/paths.cjs +12 -11
  384. package/dist/forge-payload/tools/lib/pricing.cjs +31 -11
  385. package/dist/forge-payload/tools/query-logger.cjs +34 -0
  386. package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -6
  387. package/node_modules/@mariozechner/clipboard/package.json +1 -2
  388. package/package.json +2 -2
  389. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +0 -3
  390. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +0 -25
@@ -13,7 +13,7 @@ AI software development lifecycle for the codebase in the current working direct
13
13
  Set `$FORGE_ROOT` to the plugin root provided by Claude Code:
14
14
 
15
15
  ```
16
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
16
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
17
17
  ```
18
18
 
19
19
  `$FORGE_ROOT` is the directory containing `meta/`, `init/`, `hooks/`, and `commands/`.
@@ -136,13 +136,68 @@ Any other input (including 0, 5+, or non-numeric text) re-prompts with the same
136
136
  If a `$ARGUMENTS` phase number is provided (e.g. `3`), skip the pre-flight
137
137
  table and go straight to the specified phase.
138
138
 
139
- Read `$FORGE_ROOT/init/sdlc-init.md` that document is your complete orchestration.
140
- Follow it exactly. It defines 4 phases:
139
+ Before dispatching, gather the following values interactively:
141
140
 
142
- 1. **Collect** — 5 parallel discovery prompts, KB folder prompt, `config.json`
143
- 2. **Discover** — KB doc fan-out + inline `project-context.json` construction
144
- 3. **Materialize** — `substitute-placeholders.cjs` + `build-overlay.cjs` smoke test
145
- 4. **Register** tools, versioning, manifest, cache, store seed, Tomoshibi, `.gitignore` update (unconditional), CLAUDE.md KB-link offer
141
+ **KB Folder Prompt:**
142
+
143
+ ```
144
+ What should your engineering knowledge base folder be named?
145
+ Default: engineering
146
+
147
+ KB folder name [engineering]: ___
148
+ ```
149
+
150
+ If the user provides a custom name, write it:
151
+ ```sh
152
+ node "$FORGE_ROOT/tools/manage-config.cjs" set paths.engineering "{name}"
153
+ ```
154
+ Set `kbFolder` to the chosen name (default: `"engineering"`).
155
+
156
+ **CLAUDE.md Offer:**
157
+
158
+ ```sh
159
+ ls CLAUDE.md AGENTS.md CLAUDE.local.md .cursorrules 2>/dev/null
160
+ ```
161
+
162
+ If NONE of those files exist, ask:
163
+ ```
164
+ No CLAUDE.md / AGENTS.md found. Create a minimal CLAUDE.md with Forge KB links? [Y/n]: ___
165
+ ```
166
+ Set `createClaudeMd = true` (default Y) or `false`.
167
+ If any file exists, set `createClaudeMd = false` (skip silently).
168
+
169
+ **Timestamp:** `isoTimestamp = new Date().toISOString()`
170
+
171
+ Execute the workflow:
172
+
173
+ ```
174
+ workflow('wfl:init', {
175
+ forgeRoot: FORGE_ROOT,
176
+ kbFolder,
177
+ startPhase,
178
+ createClaudeMd,
179
+ isoTimestamp,
180
+ rawArguments: $ARGUMENTS
181
+ })
182
+ ```
183
+
184
+ If the Workflow tool is unavailable, halt immediately with the following message:
185
+
186
+ > The Workflow tool is required to run `/forge:init`. This Claude Code build does not
187
+ > support the Workflow tool. Upgrade Claude Code and try again.
188
+ >
189
+ > (Alternatively, run `4ge init claude .` again to re-scaffold, then upgrade Claude Code.)
190
+
191
+ Do NOT fall back to reading `sdlc-init.md` or any other document — Iron Law 5.
192
+
193
+ **Post-workflow:** on `result.ok === true`, render closing banners (use `banners.cjs forge`
194
+ and `--subtitle "灯 SDLC ready…"`), emit the welcome block, present the marketplace-skills
195
+ offer from `result.skillMatches` (install accepted skills via `manage-config.cjs set
196
+ installedSkills.{id} true`), invoke `forge:refresh-kb-links` via the Skill tool, and
197
+ print the final report (KB doc count, workflow count, command count, accepted/skipped skills).
198
+
199
+ On `result.ok === false`: surface `result.failure` as formatted JSON and offer
200
+ `/forge:report-bug`.
146
201
 
147
202
  The current working directory is the target project. All generated artifacts go into
148
203
  `.forge/`, the configured KB folder (default: `engineering/`), and `.claude/commands/`
@@ -10,7 +10,7 @@ Re-run generation phases using the current state of the project. Use `--enrich`
10
10
  ## Locate the Forge plugin
11
11
 
12
12
  ```
13
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
13
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
14
14
  ```
15
15
 
16
16
  Read `.forge/config.json`. If it does not exist, stop and tell the user to run
@@ -18,7 +18,7 @@ Read `.forge/config.json`. If it does not exist, stop and tell the user to run
18
18
 
19
19
  Resolve tools from the plugin:
20
20
  ```
21
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
21
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
22
22
  ```
23
23
 
24
24
  All tool invocations in this command use `node "$FORGE_ROOT/tools/<tool>.cjs"`.
@@ -709,7 +709,7 @@ When `$ARGUMENTS` contains `--enrich`, run the enhancement workflow instead of r
709
709
  This is the v1.0 replacement for the removed `/forge:enhance` command.
710
710
 
711
711
  ```
712
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
712
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
713
713
  ```
714
714
 
715
715
  1. Check that `$FORGE_ROOT/meta/workflows/meta-enhance.md` exists. If absent:
@@ -21,7 +21,7 @@ nothing is deleted until you confirm explicitly.
21
21
  Read the configured KB path and project prefix from config:
22
22
 
23
23
  ```sh
24
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
24
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
25
25
  KB_PATH: !`node -e "try{console.log(require('./.forge/config.json').paths.engineering)}catch{console.log('engineering')}"`
26
26
  PREFIX: !`node -e "try{console.log(require('./.forge/config.json').project.prefix.toLowerCase())}catch{console.log('')}"`
27
27
  ```
@@ -19,7 +19,7 @@ $ARGUMENTS
19
19
 
20
20
  1. Resolve the plugin root:
21
21
  ```
22
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
22
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
23
23
  ```
24
24
 
25
25
  2. Run the four-phase repair workflow below. If `--dry-run` is in `$ARGUMENTS`,
@@ -30,7 +30,7 @@ gh is not installed or not authenticated.
30
30
  Collect the following in parallel:
31
31
 
32
32
  ```
33
- forge_version: !`cat "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" 2>/dev/null | grep '"version"' | head -1 | sed 's/.*: *"\(.*\)".*/\1/'`
33
+ forge_version: !`cat "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}/.claude-plugin/plugin.json" 2>/dev/null | grep '"version"' | head -1 | sed 's/.*: *"\(.*\)".*/\1/'`
34
34
  node_version: !`node --version 2>/dev/null || echo "N/A"`
35
35
  os_info: !`uname -srm 2>/dev/null || echo "N/A"`
36
36
  forge_config: !`cat ".forge/config.json" 2>/dev/null | head -30 || echo "No .forge/config.json found"`
@@ -12,7 +12,7 @@ Quick overview of the current sprint and task state.
12
12
  ## Locate plugin root
13
13
 
14
14
  ```
15
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
15
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
16
16
  ```
17
17
 
18
18
  ## Locate project config
@@ -12,7 +12,7 @@ project's generated artifacts.
12
12
  ## Locate plugin root
13
13
 
14
14
  ```
15
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
15
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
16
16
  ```
17
17
 
18
18
  Detect install mode:
@@ -442,7 +442,7 @@ install changes the cache path (e.g. `…/cache/forge/forge/0.9.6/` →
442
442
  this command is stale.
443
443
 
444
444
  ```sh
445
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
445
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
446
446
  ```
447
447
 
448
448
  If the re-derived `FORGE_ROOT` differs from the original value, print:
@@ -916,7 +916,7 @@ consolidated prompt. **Nothing is written without the user saying yes.**
916
916
  ### 5a — Locate tools
917
917
 
918
918
  ```
919
- FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT}"`
919
+ FORGE_ROOT: !`echo "${CLAUDE_PLUGIN_ROOT:-$(pwd)/.forge}"`
920
920
  ```
921
921
 
922
922
  All tools are invoked directly from the plugin:
@@ -0,0 +1,228 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * hooks/lib/common.cjs — Shared primitives for Forge hooks
5
+ *
6
+ * Provides four canonical exports used across hook files:
7
+ * - resolveForgePaths() (H-1a) — read .forge/config.json and derive key paths
8
+ * - readStdinJson(cb, stdin) (H-1b) — async stdin → JSON parsing (callback pattern)
9
+ * - formatHookOutput(name, p) (H-1c) — build hookSpecificOutput JSON envelope
10
+ * - FORGE_COMMAND_PATTERNS (H-1d) — canonical forge-command RegExp array
11
+ *
12
+ * IMPORTANT: This file is intentionally excluded from the forge-cli payload
13
+ * (build-payload.cjs copies only hooks/*.js, not hooks/lib/). Therefore:
14
+ * - Only .cjs hooks (post-init.cjs, post-sprint.cjs) may require this file.
15
+ * - .js hooks (triage-error.js, forge-permissions.js) retain inline copies
16
+ * of the patterns they need. Those inline copies carry comments pointing
17
+ * here as the canonical source. Keep both in sync when patterns change.
18
+ *
19
+ * Closes findings: H-1a, H-1b, H-1c, H-1d (FORGE-S25-T08)
20
+ */
21
+
22
+ const fs = require('fs');
23
+ const path = require('path');
24
+ const os = require('os');
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // H-1a: resolveForgePaths
28
+ // ---------------------------------------------------------------------------
29
+
30
+ /**
31
+ * Read .forge/config.json from the current working directory and derive the
32
+ * key filesystem paths used by hooks.
33
+ *
34
+ * Merged from the two identical implementations in post-init.cjs and
35
+ * post-sprint.cjs. The post-init version included structureVersionsPath;
36
+ * this function always returns all fields — callers that don't need a field
37
+ * simply ignore it.
38
+ *
39
+ * @returns {{ forgeDir: string, eventsRoot: string, cacheDir: string,
40
+ * forgeRoot: string|null, structureVersionsPath: string } | null}
41
+ * Returns null if .forge/config.json is missing or unparseable.
42
+ */
43
+ function resolveForgePaths() {
44
+ const cfgPath = path.join(process.cwd(), '.forge', 'config.json');
45
+ if (!fs.existsSync(cfgPath)) return null;
46
+ let cfg;
47
+ try { cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8')); } catch (_) { return null; }
48
+ const forgeDir = path.dirname(cfgPath);
49
+ return {
50
+ forgeDir,
51
+ eventsRoot: path.join(forgeDir, 'store', 'events'),
52
+ structureVersionsPath: path.join(forgeDir, 'structure-versions.json'),
53
+ cacheDir: path.join(forgeDir, 'cache'),
54
+ forgeRoot: (cfg.paths && cfg.paths.forgeRoot) || null,
55
+ };
56
+ }
57
+
58
+ // ---------------------------------------------------------------------------
59
+ // H-1b: readStdinJson
60
+ // ---------------------------------------------------------------------------
61
+
62
+ /**
63
+ * Read all data from a readable stream (defaulting to process.stdin), parse
64
+ * as JSON, and invoke the callback with the result.
65
+ *
66
+ * Merges the async stdin reading pattern used by triage-error.js and
67
+ * forge-permissions.js. Note: .js hooks retain inline copies of this
68
+ * pattern to avoid a module-scope require on hooks/lib/ (forge-cli bundle
69
+ * gap — see file header). This function is provided for .cjs hook consumers
70
+ * and for future use when the .js extension is migrated in T14.
71
+ *
72
+ * @param {function(object|null): void} callback
73
+ * Called with the parsed object, or null if input is empty or malformed.
74
+ * @param {NodeJS.ReadableStream} [stdin]
75
+ * Readable stream to consume. Defaults to process.stdin.
76
+ */
77
+ function readStdinJson(callback, stdin) {
78
+ const stream = stdin || process.stdin;
79
+ if (stream.setEncoding) stream.setEncoding('utf8');
80
+ let raw = '';
81
+ stream.on('data', chunk => { raw += chunk; });
82
+ stream.on('end', () => {
83
+ if (!raw) { callback(null); return; }
84
+ try {
85
+ callback(JSON.parse(raw));
86
+ } catch (_) {
87
+ callback(null);
88
+ }
89
+ });
90
+ }
91
+
92
+ // ---------------------------------------------------------------------------
93
+ // H-1c: formatHookOutput
94
+ // ---------------------------------------------------------------------------
95
+
96
+ /**
97
+ * Build the Claude Code hook stdout envelope as a JSON string.
98
+ *
99
+ * Claude Code hook protocol: hooks write a JSON object to stdout where the
100
+ * top-level key is `hookSpecificOutput` containing `hookEventName` plus any
101
+ * additional fields from payload.
102
+ *
103
+ * @param {string} hookEventName - e.g. 'PostToolUse', 'SessionStart'
104
+ * @param {object} payload - additional fields to include in hookSpecificOutput
105
+ * @returns {string} JSON string ready for process.stdout.write
106
+ */
107
+ function formatHookOutput(hookEventName, payload) {
108
+ return JSON.stringify({
109
+ hookSpecificOutput: {
110
+ hookEventName,
111
+ ...payload,
112
+ },
113
+ });
114
+ }
115
+
116
+ // ---------------------------------------------------------------------------
117
+ // H-1d: FORGE_COMMAND_PATTERNS
118
+ // ---------------------------------------------------------------------------
119
+
120
+ /**
121
+ * Canonical array of RegExp patterns that identify forge-related commands.
122
+ *
123
+ * @catalogSync forge/schemas/enum-catalog.json#commandNames (FORGE-S25-T26)
124
+ *
125
+ * Build-time drift detection: forge/tools/__tests__/build-enum-catalog.test.cjs
126
+ * verifies that every `forge:*` entry in enum-catalog.json commandNames has at
127
+ * least one matching regex here. Run `node --test forge/tools/__tests__/*.test.cjs`
128
+ * to check. Drift will cause the drift-detection test to fail.
129
+ *
130
+ * Runtime: this array is the single source of truth for forge command recognition.
131
+ * hooks/triage-error.cjs and hooks/forge-permissions.cjs maintain inline copies
132
+ * of subsets; those files cannot require() this module due to the forge-cli bundle
133
+ * gap (build-payload.cjs bundles hooks/*.cjs but excludes hooks/lib/).
134
+ *
135
+ * When adding a new forge command: update this array, the inline copies in
136
+ * triage-error.cjs and forge-permissions.cjs, AND build-enum-catalog.cjs COMMAND_NAMES.
137
+ */
138
+ const FORGE_COMMAND_PATTERNS = [
139
+ /manage-config/,
140
+ /\.forge\//,
141
+ /CLAUDE_PLUGIN_ROOT/,
142
+ /FORGE_ROOT/,
143
+ /MANAGE_CONFIG/,
144
+ /engineering\/tools\//,
145
+ /forge:init/,
146
+ /forge:health/,
147
+ /forge:rebuild/,
148
+ /forge:update/,
149
+ /forge:add-pipeline/,
150
+ /forge:add-task/,
151
+ /forge:plan/,
152
+ /forge:implement/,
153
+ /forge:approve/,
154
+ /forge:commit/,
155
+ /forge:review/,
156
+ /forge:new-sprint/,
157
+ /forge:plan-sprint/,
158
+ /forge:run-task/,
159
+ /forge:run-sprint/,
160
+ /forge:fix-bug/,
161
+ /forge:retro/,
162
+ /forge:check-agent/,
163
+ /forge:report-bug/,
164
+ // forge:enhance removed in v1.0 (T03) — absorbed into forge:rebuild --enrich
165
+ // forge:collate removed from user-facing surface in v1.0 (T03) — internal tool only
166
+ /forge:validate/,
167
+ // forge:calibrate removed in v1.0 (T03) — absorbed into forge:health --fix (T04)
168
+ // forge:materialize removed in v1.0 (T03) — fast-mode eliminated in T01
169
+ /forge:remove/,
170
+ /forge:search/,
171
+ /forge:repair/,
172
+ /forge:store-custodian/,
173
+ /forge:config/,
174
+ /forge:ask/,
175
+ /forge:refresh-kb-links/,
176
+ /store-cli\.cjs/,
177
+ /validate-store\.cjs/,
178
+ ];
179
+
180
+ // ---------------------------------------------------------------------------
181
+ // H-5b: logSwallowedError
182
+ // ---------------------------------------------------------------------------
183
+
184
+ /**
185
+ * Append a diagnostic line to the swallowed-error log at
186
+ * `$dataDir/logs/forge-hooks.log`. If `dataDir` is falsy, falls back to
187
+ * `os.tmpdir()/forge-plugin-data/logs/forge-hooks.log`.
188
+ *
189
+ * Format per line:
190
+ * <ISO-timestamp> [<tag>] <err.message>
191
+ *
192
+ * Invariants:
193
+ * - Append-only. No log rotation. Users can `truncate -s 0` or `rm` the
194
+ * file; it will be recreated on the next swallowed error.
195
+ * - Hook code NEVER reads this log.
196
+ * - Fully fail-open: if the log write itself fails, we exit silently.
197
+ *
198
+ * Closes finding: H-5b (FORGE-S25-T15)
199
+ *
200
+ * @param {string} tag - Short hook identifier (e.g. 'post-init', 'post-sprint').
201
+ * @param {Error|*} err - The caught error. Uses err.message if available.
202
+ * @param {string|null|undefined} dataDir - CLAUDE_PLUGIN_DATA directory.
203
+ */
204
+ function logSwallowedError(tag, err, dataDir) {
205
+ try {
206
+ const baseDir = dataDir || path.join(os.tmpdir(), 'forge-plugin-data');
207
+ const logsDir = path.join(baseDir, 'logs');
208
+ fs.mkdirSync(logsDir, { recursive: true });
209
+ const logPath = path.join(logsDir, 'forge-hooks.log');
210
+ const msg = (err && err.message) ? err.message : String(err);
211
+ const line = `${new Date().toISOString()} [${tag}] ${msg}\n`;
212
+ fs.appendFileSync(logPath, line, 'utf8');
213
+ } catch (_) {
214
+ // Fully fail-open — never re-throw
215
+ }
216
+ }
217
+
218
+ // ---------------------------------------------------------------------------
219
+ // Exports
220
+ // ---------------------------------------------------------------------------
221
+
222
+ module.exports = {
223
+ resolveForgePaths,
224
+ readStdinJson,
225
+ formatHookOutput,
226
+ FORGE_COMMAND_PATTERNS,
227
+ logSwallowedError,
228
+ };
@@ -0,0 +1,106 @@
1
+ 'use strict';
2
+ // hooks/lib/plugin-detection.cjs — extracted from check-update.js (H-2a, FORGE-S25-T14)
3
+ //
4
+ // Provides Forge plugin distribution detection and installation scanning.
5
+ // Extracted to improve testability — each function can be imported and
6
+ // tested independently without requiring the full check-update module.
7
+ //
8
+ // Uses only Node.js built-ins — no npm dependencies required.
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+ const os = require('os');
13
+
14
+ // Distribution detection — derived from plugin path at runtime.
15
+ // The cache path encodes the marketplace name, making this more reliable than
16
+ // reading fields from plugin.json (which may be stale after a switch).
17
+ function detectDistribution(root) {
18
+ return root.includes('/cache/skillforge/forge/') || root.includes('/marketplaces/skillforge/forge/')
19
+ ? 'forge@skillforge' : 'forge@forge';
20
+ }
21
+
22
+ // Check if forge plugin is enabled in settings files.
23
+ // Returns true if no explicit disable found, false if disabled.
24
+ function isPluginEnabled(pluginPath, scope, homeDir, cwd) {
25
+ try {
26
+ // Check user settings: ~/.claude/settings.json
27
+ const userSettingsPath = path.join(homeDir, '.claude', 'settings.json');
28
+ if (fs.existsSync(userSettingsPath)) {
29
+ const userSettings = JSON.parse(fs.readFileSync(userSettingsPath, 'utf8'));
30
+ if (userSettings.disablePlugin === true) return false;
31
+ // Check for per-plugin disable (if supported in future)
32
+ if (userSettings.plugins && userSettings.plugins.forge === false) return false;
33
+ }
34
+
35
+ // Check project settings: ./.claude/settings.local.json
36
+ const projectSettingsPath = path.join(cwd, '.claude', 'settings.local.json');
37
+ if (fs.existsSync(projectSettingsPath)) {
38
+ const projectSettings = JSON.parse(fs.readFileSync(projectSettingsPath, 'utf8'));
39
+ if (projectSettings.disablePlugin === true) return false;
40
+ if (projectSettings.plugins && projectSettings.plugins.forge === false) return false;
41
+ }
42
+
43
+ return true; // Default: enabled
44
+ } catch (e) {
45
+ return true; // Non-fatal — assume enabled if cannot read settings
46
+ }
47
+ }
48
+
49
+ // Scans all known plugin locations to detect multiple Forge installations.
50
+ // Returns array of installation records with version, distribution, scope, enabled status.
51
+ // Optional parameters for dependency injection (testing).
52
+ function scanPluginInstallations(options) {
53
+ const installations = [];
54
+ const homeDir = (options && options.homeDir) || os.homedir();
55
+ const cwd = (options && options.cwd) || process.cwd();
56
+
57
+ // Candidate paths — user scope (global) and project scope (local)
58
+ // Also scan skillforge subdirectory variant (skillforge/forge/forge)
59
+ const basePaths = [
60
+ path.join(homeDir, '.claude', 'plugins'),
61
+ path.join(cwd, '.claude', 'plugins'),
62
+ ];
63
+ const variants = ['cache', 'marketplaces'];
64
+ const pluginNames = ['forge/forge', 'skillforge/forge/forge'];
65
+
66
+ const candidates = [];
67
+ for (const basePath of basePaths) {
68
+ for (const variant of variants) {
69
+ for (const pluginName of pluginNames) {
70
+ candidates.push(path.join(basePath, variant, pluginName));
71
+ }
72
+ }
73
+ }
74
+
75
+ for (const candidate of candidates) {
76
+ try {
77
+ const pluginJsonPath = path.join(candidate, '.claude-plugin', 'plugin.json');
78
+ if (!fs.existsSync(pluginJsonPath)) continue;
79
+
80
+ const manifest = JSON.parse(fs.readFileSync(pluginJsonPath, 'utf8'));
81
+ // Determine scope: user-scope paths start with homeDir/.claude, project-scope start with cwd/.claude
82
+ // Use cwd-relative check first to avoid false positives when cwd is subdir of homeDir
83
+ const isProjectScope = candidate.startsWith(path.join(cwd, '.claude'));
84
+ const isUserScope = candidate.startsWith(path.join(homeDir, '.claude'));
85
+ const scope = isProjectScope ? 'project' : (isUserScope ? 'user' : 'unknown');
86
+ const enabled = isPluginEnabled(candidate, scope, homeDir, cwd);
87
+
88
+ // Avoid duplicates — skip if same path already recorded
89
+ if (installations.some(i => i.path === candidate)) continue;
90
+
91
+ installations.push({
92
+ path: candidate,
93
+ version: manifest.version || 'unknown',
94
+ distribution: detectDistribution(candidate),
95
+ scope: scope,
96
+ enabled: enabled,
97
+ });
98
+ } catch (e) {
99
+ // Non-fatal — skip broken installations silently
100
+ }
101
+ }
102
+
103
+ return installations;
104
+ }
105
+
106
+ module.exports = { detectDistribution, isPluginEnabled, scanPluginInstallations };
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+ // hooks/lib/update-msg.cjs — extracted from check-update.js (H-2c, FORGE-S25-T14)
3
+ //
4
+ // Provides update message construction and emission.
5
+ // Extracted to improve testability — buildUpdateMsg and emit can be tested
6
+ // without executing the full check-update session logic.
7
+ //
8
+ // Uses only Node.js built-ins — no npm dependencies required.
9
+
10
+ function buildUpdateMsg(remoteVersion, local) {
11
+ return remoteVersion && remoteVersion !== local
12
+ ? `Forge ${remoteVersion} available (you have ${local}). Run /forge:update to review changes and update.`
13
+ : '';
14
+ }
15
+
16
+ function emit(forgeCtx, updateMsg) {
17
+ if (!forgeCtx && !updateMsg) return;
18
+ const combined = [forgeCtx, updateMsg].filter(Boolean).join(' ');
19
+ const escaped = combined.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, ' ');
20
+ process.stdout.write(`{"additionalContext":"${escaped}"}\n`);
21
+ }
22
+
23
+ module.exports = { buildUpdateMsg, emit };
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+ // hooks/lib/update-url.cjs — extracted from check-update.js (H-2b, FORGE-S25-T14)
3
+ //
4
+ // Provides update-check URL resolution and validation.
5
+ // Reads process.env.CLAUDE_PLUGIN_ROOT directly (option b from plan) so
6
+ // the module is self-contained — no pluginRoot argument needed at call sites.
7
+ //
8
+ // Uses only Node.js built-ins — no npm dependencies required.
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+
13
+ // Determine the correct update-check URL for this distribution.
14
+ // Each distribution's plugin.json carries its own updateUrl pointing at the
15
+ // branch it was installed from (main for forge@forge, release for forge@skillforge),
16
+ // so we read it directly — no hardcoded per-distribution URLs needed.
17
+ const FALLBACK_UPDATE_URL = 'https://raw.githubusercontent.com/Entelligentsia/forge/main/forge/.claude-plugin/plugin.json';
18
+
19
+ const ALLOWED_DOMAINS = ['raw.githubusercontent.com'];
20
+
21
+ function validateUpdateUrl(url) {
22
+ try {
23
+ const parsed = new URL(url);
24
+ const hostname = parsed.hostname.toLowerCase();
25
+ if (!ALLOWED_DOMAINS.some(d => hostname === d || hostname.endsWith('.' + d))) {
26
+ process.stderr.write(`forge-update: rejected update URL with disallowed domain '${hostname}', falling back\n`);
27
+ return FALLBACK_UPDATE_URL;
28
+ }
29
+ return url;
30
+ } catch {
31
+ return FALLBACK_UPDATE_URL;
32
+ }
33
+ }
34
+
35
+ // Reads updateUrl from the installed plugin.json.
36
+ // Uses process.env.CLAUDE_PLUGIN_ROOT (option b) with a fallback of '' so
37
+ // the function is self-contained. Falls back to FALLBACK_UPDATE_URL on any error.
38
+ function getUpdateUrl() {
39
+ try {
40
+ const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT || '';
41
+ const manifest = JSON.parse(fs.readFileSync(path.join(pluginRoot, '.claude-plugin', 'plugin.json'), 'utf8'));
42
+ return validateUpdateUrl(manifest.updateUrl || FALLBACK_UPDATE_URL);
43
+ } catch { return FALLBACK_UPDATE_URL; }
44
+ }
45
+
46
+ module.exports = { FALLBACK_UPDATE_URL, ALLOWED_DOMAINS, validateUpdateUrl, getUpdateUrl };
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ // Write-boundary registry: maps Forge-owned filesystem path patterns to the
4
+ // schema (and kind) that the write-boundary hook enforces on Write/Edit/
5
+ // MultiEdit. FIRST match wins, so order matters — place more specific
6
+ // patterns before their generalizations (sidecar before event).
7
+ //
8
+ // Patterns are anchored to absolute-path suffixes so they match whether the
9
+ // tool invocation used an absolute or project-relative path. Every pattern
10
+ // assumes the Forge store lives at `.forge/store/` (the installed default).
11
+ //
12
+ // If NO pattern matches a write, the hook is a no-op: Forge does not validate
13
+ // non-Forge-owned files. The registry is an allowlist of paths we claim, not
14
+ // a denylist of paths we reject.
15
+
16
+ const REGISTRY = [
17
+ // Core store entities — flat files under .forge/store/{kind}s/<id>.json
18
+ { pattern: /(?:^|\/)\.forge\/store\/features\/[^/]+\.json$/, schema: 'feature.schema.json', kind: 'feature' },
19
+ { pattern: /(?:^|\/)\.forge\/store\/sprints\/[^/]+\.json$/, schema: 'sprint.schema.json', kind: 'sprint' },
20
+ { pattern: /(?:^|\/)\.forge\/store\/tasks\/[^/]+\.json$/, schema: 'task.schema.json', kind: 'task' },
21
+ { pattern: /(?:^|\/)\.forge\/store\/bugs\/[^/]+\.json$/, schema: 'bug.schema.json', kind: 'bug' },
22
+
23
+ // Event sidecars — prefixed with `_` and suffixed with `_usage.json`.
24
+ // Must come BEFORE the general event pattern so the leading `_` file is
25
+ // classified as a sidecar, not an event with a malformed id.
26
+ { pattern: /(?:^|\/)\.forge\/store\/events\/[^/]+\/_[^/]+_usage\.json$/, schema: 'event-sidecar.schema.json', kind: 'event-sidecar' },
27
+
28
+ // Canonical events — any other .json under events/<bucket>/ that does NOT
29
+ // start with an underscore. (Ghost events are not written through Write/Edit
30
+ // tools, so we don't special-case them here.)
31
+ { pattern: /(?:^|\/)\.forge\/store\/events\/[^/]+\/[^_/][^/]*\.json$/, schema: 'event.schema.json', kind: 'event' },
32
+
33
+ // Collation watermark
34
+ { pattern: /(?:^|\/)\.forge\/store\/COLLATION_STATE\.json$/, schema: 'collation-state.schema.json', kind: 'collation-state' },
35
+
36
+ // Progress log — line-oriented, not JSON. The hook's parser splits newly
37
+ // appended lines and validates each as a pipe-delimited progress entry.
38
+ { pattern: /(?:^|\/)\.forge\/store\/events\/[^/]+\/progress\.log$/, schema: 'progress-entry.schema.json', kind: 'progress-line', format: 'line-pipe-delimited' },
39
+ ];
40
+
41
+ function matchRegistry(absPath) {
42
+ if (!absPath || typeof absPath !== 'string') return null;
43
+ for (const entry of REGISTRY) {
44
+ if (entry.pattern.test(absPath)) return entry;
45
+ }
46
+ return null;
47
+ }
48
+
49
+ // REGISTRY is intentionally not exported — it is a private implementation detail
50
+ // of this module. Callers use matchRegistry() for lookups. Exporting REGISTRY
51
+ // would expose internal pattern structures to external consumers and create
52
+ // coupling that makes future pattern changes harder. (H-3, FORGE-S25-T14)
53
+ module.exports = { matchRegistry };
@@ -0,0 +1,32 @@
1
+ # Discovery: Database
2
+
3
+ ## Purpose
4
+
5
+ Detect the project's data model: entities, relationships, field types,
6
+ and migration patterns.
7
+
8
+ ## Scan Targets
9
+
10
+ | Pattern | What It Reveals |
11
+ |---------|----------------|
12
+ | Django: `models.py` files | ORM models, fields, relationships |
13
+ | Rails: `app/models/*.rb` | ActiveRecord models |
14
+ | Prisma: `schema.prisma` | Prisma schema |
15
+ | TypeORM: `*.entity.ts` | TypeORM entities |
16
+ | Sequelize: `models/*.js` | Sequelize models |
17
+ | Go: `*_model.go` | Go struct definitions |
18
+ | SQL: `migrations/` / `schema.sql` | Raw schema |
19
+ | MongoDB: Mongoose schemas | Document models |
20
+
21
+ ## Tools
22
+
23
+ Use Grep to find model/entity definitions, Read to parse them.
24
+
25
+ ## Output
26
+
27
+ Structured report:
28
+ - Entity inventory (name, field count, key relationships)
29
+ - Database type (PostgreSQL, MySQL, MongoDB, SQLite, etc.)
30
+ - ORM/query layer in use
31
+ - Migration framework and directory
32
+ - Seed data presence