@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
@@ -0,0 +1,123 @@
1
+ // forge init — deterministic Claude Code project bootstrap (FORGE-S31-T02).
2
+ //
3
+ // `4ge init claude [dir]` scaffolds a Claude Code project from the bundled
4
+ // forge-payload in seconds: zero LLM tokens, zero network, pure fs.
5
+ //
6
+ // Structural convention: follows runDoctor / runUpdate / runConfig.
7
+ // - parseInitArgs(args): pure arg parser
8
+ // - runInit(args): async entry point, returns exit code
9
+ //
10
+ // Iron-Law boundary (IL6): no shell-string interpolation. If shell-outs are
11
+ // ever added they MUST use argv-array spawn, not execSync with a string.
12
+ import * as path from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ import { bootstrapClaudeProject } from "../extensions/forgecli/claude-bootstrap/bootstrap.js";
15
+ // ── Payload root resolution (same logic as forge-init.ts) ─────────────────────
16
+ const _BIN_DIR = path.dirname(fileURLToPath(import.meta.url));
17
+ // dist/bin/init.js → dist/ → <pkg-root>/
18
+ const _DIST_DIR = path.resolve(_BIN_DIR, "..");
19
+ const _PKG_ROOT = path.resolve(_DIST_DIR, "..");
20
+ function getBundledPayloadRoot() {
21
+ return path.join(_PKG_ROOT, "dist", "forge-payload");
22
+ }
23
+ /**
24
+ * Parse subcommand args for `forge init`.
25
+ *
26
+ * Expected forms:
27
+ * forge init claude → dir = process.cwd()
28
+ * forge init claude <dir> → dir = <dir>
29
+ * forge init → error: platform required
30
+ * forge init <other> → error: unknown platform
31
+ */
32
+ export function parseInitArgs(args) {
33
+ if (args.length === 0) {
34
+ return {
35
+ error: "forge init: platform argument required.\n" +
36
+ "Usage: forge init claude [dir]\n" +
37
+ " claude Bootstrap a Claude Code (.claude/) project",
38
+ };
39
+ }
40
+ const platform = args[0];
41
+ if (platform !== "claude") {
42
+ return {
43
+ error: `forge init: unknown platform '${platform}'.\n` +
44
+ "Supported platforms: claude\n" +
45
+ "Usage: forge init claude [dir]",
46
+ };
47
+ }
48
+ // Optional dir arg — defaults to cwd
49
+ const dir = args[1] ? path.resolve(args[1]) : process.cwd();
50
+ return { platform: "claude", dir };
51
+ }
52
+ /**
53
+ * Entry point invoked from bin/forge.ts.
54
+ *
55
+ * Returns exit code: 0 on success, 1 on bootstrap error.
56
+ */
57
+ export async function runInit(args) {
58
+ const parsed = parseInitArgs(args);
59
+ if ("error" in parsed) {
60
+ process.stderr.write(`${parsed.error}\n`);
61
+ return 1;
62
+ }
63
+ const { dir } = parsed;
64
+ const payloadRoot = getBundledPayloadRoot();
65
+ process.stdout.write(`forge init claude — bootstrapping ${dir}\n`);
66
+ let result;
67
+ try {
68
+ result = bootstrapClaudeProject({ dir, payloadRoot });
69
+ }
70
+ catch (err) {
71
+ const e = err;
72
+ process.stderr.write(`forge init: bootstrap failed: ${e.message ?? String(err)}\n`);
73
+ return 1;
74
+ }
75
+ if (!result.ok) {
76
+ for (const w of result.warnings) {
77
+ process.stderr.write(` ✗ ${w}\n`);
78
+ }
79
+ process.stderr.write("forge init: bootstrap failed — see warnings above.\n");
80
+ return 1;
81
+ }
82
+ // Print success summary
83
+ if (result.created.length > 0) {
84
+ process.stdout.write(`\nCreated (${result.created.length}):\n`);
85
+ for (const p of result.created) {
86
+ process.stdout.write(` + ${p}\n`);
87
+ }
88
+ }
89
+ if (result.skipped.length > 0) {
90
+ process.stdout.write(`\nAlready present (${result.skipped.length}):\n`);
91
+ process.stdout.write(` ○ ${result.skipped.length} paths verified unchanged\n`);
92
+ }
93
+ if (result.warnings.length > 0) {
94
+ process.stdout.write(`\nWarnings:\n`);
95
+ for (const w of result.warnings) {
96
+ process.stdout.write(` △ ${w}\n`);
97
+ }
98
+ }
99
+ // Hand-off message (FORGE-S31-T03): names /forge:init, lists 7 hooks, mentions one-time approval prompt.
100
+ // Prepend preflight warning if Claude Code was not found.
101
+ const claudeUnavailableWarning = result.preflight.claudeAvailable
102
+ ? ""
103
+ : " Warning: Claude Code not found on PATH — install before opening this project.\n\n";
104
+ process.stdout.write(`\n✓ forge init complete — project bootstrapped in ${dir}\n` +
105
+ `\nNext step:\n` +
106
+ `${claudeUnavailableWarning}` +
107
+ ` Open Claude Code in ${dir} and run: /forge:init\n` +
108
+ `\nWhat to expect:\n` +
109
+ ` Claude Code will ask you to approve 7 project hooks (one-time prompt).\n` +
110
+ ` Approve them — they are scoped to this project only.\n` +
111
+ `\n Hooks registered:\n` +
112
+ ` • check-update (SessionStart)\n` +
113
+ ` • preflight-session (SessionStart)\n` +
114
+ ` • validate-write (PreToolUse — Write/Edit/MultiEdit)\n` +
115
+ ` • triage-error (PostToolUse — Bash)\n` +
116
+ ` • query-logger (PostToolUse — Bash)\n` +
117
+ ` • post-init (PostToolUse — Bash)\n` +
118
+ ` • post-sprint (PostToolUse — Bash)\n` +
119
+ `\n After approval, /forge:init runs discovery, KB generation,\n` +
120
+ ` and project configuration. Zero tokens until you open Claude Code.\n`);
121
+ return 0;
122
+ }
123
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface UninstallArgs {
2
+ platform: "claude";
3
+ dir: string;
4
+ purge: boolean;
5
+ yes: boolean;
6
+ }
7
+ export interface UninstallArgsError {
8
+ error: string;
9
+ }
10
+ /**
11
+ * Parse subcommand args for `forge uninstall`.
12
+ *
13
+ * Expected forms:
14
+ * forge uninstall claude → dir = cwd
15
+ * forge uninstall claude <dir> → dir = <dir>
16
+ * forge uninstall claude [dir] --purge → also remove config + store
17
+ * forge uninstall claude [dir] --yes|-y → skip the [y/N] confirm
18
+ */
19
+ export declare function parseUninstallArgs(args: readonly string[]): UninstallArgs | UninstallArgsError;
20
+ export declare function runUninstall(args: readonly string[]): Promise<number>;
@@ -0,0 +1,141 @@
1
+ // forge uninstall — deterministic reverse of `4ge init claude` (counterpart to init.ts).
2
+ //
3
+ // `4ge uninstall claude [dir] [--purge] [--yes]` removes the Forge scaffold a
4
+ // prior `4ge init claude` placed in a project. By default it preserves user
5
+ // data (.forge/config.json, .forge/store/**, the KB folder); --purge also
6
+ // removes the config + store. A [y/N] confirmation guards the destructive op
7
+ // unless --yes / -y or FORGE_NON_INTERACTIVE=1.
8
+ //
9
+ // Structural convention mirrors init.ts / update-cli.ts:
10
+ // - parseUninstallArgs(args): pure arg parser
11
+ // - runUninstall(args): async entry point, returns exit code
12
+ //
13
+ // Iron-Law boundary (IL6): no shell-string interpolation; pure fs in the core.
14
+ import * as path from "node:path";
15
+ import * as readline from "node:readline";
16
+ import { fileURLToPath } from "node:url";
17
+ import { uninstallClaudeProject } from "../extensions/forgecli/claude-bootstrap/uninstall.js";
18
+ // ── Payload root resolution (same logic as init.ts) ───────────────────────────
19
+ const _BIN_DIR = path.dirname(fileURLToPath(import.meta.url));
20
+ const _DIST_DIR = path.resolve(_BIN_DIR, "..");
21
+ const _PKG_ROOT = path.resolve(_DIST_DIR, "..");
22
+ function getBundledPayloadRoot() {
23
+ return path.join(_PKG_ROOT, "dist", "forge-payload");
24
+ }
25
+ /**
26
+ * Parse subcommand args for `forge uninstall`.
27
+ *
28
+ * Expected forms:
29
+ * forge uninstall claude → dir = cwd
30
+ * forge uninstall claude <dir> → dir = <dir>
31
+ * forge uninstall claude [dir] --purge → also remove config + store
32
+ * forge uninstall claude [dir] --yes|-y → skip the [y/N] confirm
33
+ */
34
+ export function parseUninstallArgs(args) {
35
+ if (args.length === 0) {
36
+ return {
37
+ error: "forge uninstall: platform argument required.\n" +
38
+ "Usage: forge uninstall claude [dir] [--purge] [--yes]\n" +
39
+ " claude Remove the Forge scaffold from a Claude Code (.claude/) project",
40
+ };
41
+ }
42
+ const platform = args[0];
43
+ if (platform !== "claude") {
44
+ return {
45
+ error: `forge uninstall: unknown platform '${platform}'.\n` +
46
+ "Supported platforms: claude\n" +
47
+ "Usage: forge uninstall claude [dir] [--purge] [--yes]",
48
+ };
49
+ }
50
+ let dir;
51
+ let purge = false;
52
+ let yes = false;
53
+ for (const t of args.slice(1)) {
54
+ if (t === "--purge") {
55
+ purge = true;
56
+ }
57
+ else if (t === "--yes" || t === "-y") {
58
+ yes = true;
59
+ }
60
+ else if (t.startsWith("-")) {
61
+ return {
62
+ error: `forge uninstall: unknown option ${t}. Valid options: --purge, --yes`,
63
+ };
64
+ }
65
+ else if (dir === undefined) {
66
+ dir = path.resolve(t);
67
+ }
68
+ else {
69
+ return { error: `forge uninstall: unexpected extra argument '${t}'.` };
70
+ }
71
+ }
72
+ return { platform: "claude", dir: dir ?? process.cwd(), purge, yes };
73
+ }
74
+ // ── Confirmation prompt (mirrors update-cli.ts) ───────────────────────────────
75
+ async function askConfirm(question) {
76
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
77
+ return new Promise((resolve) => {
78
+ rl.question(`${question} [y/N] `, (answer) => {
79
+ rl.close();
80
+ resolve(/^y(es)?$/i.test(answer.trim()));
81
+ });
82
+ });
83
+ }
84
+ // ── Entry point ───────────────────────────────────────────────────────────────
85
+ export async function runUninstall(args) {
86
+ const parsed = parseUninstallArgs(args);
87
+ if ("error" in parsed) {
88
+ process.stderr.write(`${parsed.error}\n`);
89
+ return 1;
90
+ }
91
+ const { dir, purge, yes } = parsed;
92
+ const payloadRoot = getBundledPayloadRoot();
93
+ // Confirmation gate (skipped by --yes / -y / FORGE_NON_INTERACTIVE=1).
94
+ const autoYes = yes || process.env.FORGE_NON_INTERACTIVE === "1";
95
+ if (!autoYes) {
96
+ const scope = purge
97
+ ? "the Forge scaffold AND your .forge/config.json + .forge/store/** (sprints, tasks, bugs, events)"
98
+ : "the Forge scaffold (config.json, store, and the KB folder are preserved)";
99
+ process.stdout.write(`forge uninstall claude — this will remove ${scope} from:\n ${dir}\n`);
100
+ const proceed = await askConfirm("Proceed?");
101
+ if (!proceed) {
102
+ process.stdout.write("forge uninstall: aborted — nothing was removed.\n");
103
+ return 0;
104
+ }
105
+ }
106
+ let result;
107
+ try {
108
+ result = uninstallClaudeProject({ dir, payloadRoot, purge });
109
+ }
110
+ catch (err) {
111
+ const e = err;
112
+ process.stderr.write(`forge uninstall: failed: ${e.message ?? String(err)}\n`);
113
+ return 1;
114
+ }
115
+ if (!result.bootstrapped) {
116
+ for (const w of result.warnings)
117
+ process.stderr.write(` ✗ ${w}\n`);
118
+ return 1;
119
+ }
120
+ if (result.removed.length > 0) {
121
+ process.stdout.write(`\nRemoved (${result.removed.length}):\n`);
122
+ for (const p of result.removed)
123
+ process.stdout.write(` - ${p}\n`);
124
+ }
125
+ else {
126
+ process.stdout.write("\nNothing to remove — project already clean of the Forge scaffold.\n");
127
+ }
128
+ if (result.kept.length > 0) {
129
+ process.stdout.write(`\nPreserved (user data — use --purge to remove):\n`);
130
+ for (const p of result.kept)
131
+ process.stdout.write(` ○ ${p}\n`);
132
+ }
133
+ if (result.warnings.length > 0) {
134
+ process.stdout.write(`\nWarnings:\n`);
135
+ for (const w of result.warnings)
136
+ process.stdout.write(` △ ${w}\n`);
137
+ }
138
+ process.stdout.write(`\n✓ forge uninstall complete — ${dir}\n`);
139
+ return result.ok ? 0 : 1;
140
+ }
141
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/bin/uninstall.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,gDAAgD;AAChD,EAAE;AACF,yDAAyD;AACzD,gDAAgD;AAChD,+DAA+D;AAC/D,EAAE;AACF,+EAA+E;AAE/E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAE9F,iFAAiF;AAEjF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAEhD,SAAS,qBAAqB;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC;AAeD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACN,KAAK,EACJ,gDAAgD;gBAChD,yDAAyD;gBACzD,6EAA6E;SAC9E,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO;YACN,KAAK,EACJ,sCAAsC,QAAQ,MAAM;gBACpD,+BAA+B;gBAC/B,uDAAuD;SACxD,CAAC;IACH,CAAC;IAED,IAAI,GAAuB,CAAC;IAC5B,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,GAAG,GAAG,KAAK,CAAC;IAEhB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACrB,KAAK,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,GAAG,GAAG,IAAI,CAAC;QACZ,CAAC;aAAM,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACN,KAAK,EAAE,mCAAmC,CAAC,iCAAiC;aAC5E,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9B,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,+CAA+C,CAAC,IAAI,EAAE,CAAC;QACxE,CAAC;IACF,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACtE,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACvC,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC5C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAuB;IACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;IACnC,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAE5C,uEAAuE;IACvE,MAAM,OAAO,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,KAAK;YAClB,CAAC,CAAC,iGAAiG;YACnG,CAAC,CAAC,0EAA0E,CAAC;QAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,KAAK,aAAa,GAAG,IAAI,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YAC1E,OAAO,CAAC,CAAC;QACV,CAAC;IACF,CAAC;IAED,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACJ,MAAM,GAAG,sBAAsB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/E,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC;QAChE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC3E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,GAAG,IAAI,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export type AddPipelineMode = "add" | "edit" | "view" | "remove";
3
+ export interface ParsedAddPipelineArgs {
4
+ mode: AddPipelineMode;
5
+ pipelineName: string | null;
6
+ seed: string;
7
+ sourceLabel: string;
8
+ }
9
+ export declare function parseAddPipelineArgs(rawArgs: string, cwd: string): ParsedAddPipelineArgs;
10
+ export interface ComposeAddPipelineKickoffOpts {
11
+ commandMd: string;
12
+ parsed: ParsedAddPipelineArgs;
13
+ }
14
+ export declare function composeAddPipelineKickoff(opts: ComposeAddPipelineKickoffOpts): string;
15
+ export interface RegisterAddPipelineOptions {
16
+ forgeRoot: string | null;
17
+ cwd?: string;
18
+ }
19
+ export declare function registerAddPipeline(pi: ExtensionAPI, options: RegisterAddPipelineOptions): void;
@@ -0,0 +1,143 @@
1
+ // forge:add-pipeline — native kickoff handler (FORGE-S23-T11).
2
+ //
3
+ // Replaces the auto-generated stub previously installed by
4
+ // registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
5
+ // (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
6
+ //
7
+ // Parses --add/--edit/--view/--remove/--list/--name flags and a plain
8
+ // pipeline name before dispatching. Resolved mode is prepended to the
9
+ // kickoff so the LLM starts in the correct mode without prompting.
10
+ //
11
+ // Workflow source: <forgeRoot>/commands/add-pipeline.md (command file).
12
+ // File-existence check only — command files lack Pack-06 workflow markers.
13
+ //
14
+ // Iron Laws:
15
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
16
+ // IL4 — no JSON.stringify-into-subagent dispatch.
17
+ // IL6 — no shell-string interpolation; no spawn calls here.
18
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
19
+ // continuation.
20
+ import * as fs from "node:fs";
21
+ import * as path from "node:path";
22
+ import { sendKickoff } from "./kickoff.js";
23
+ export function parseAddPipelineArgs(rawArgs, cwd) {
24
+ const trimmed = (rawArgs ?? "").trim();
25
+ const result = {
26
+ mode: "add",
27
+ pipelineName: null,
28
+ seed: "",
29
+ sourceLabel: "",
30
+ };
31
+ if (!trimmed) {
32
+ result.sourceLabel = "(no args — LLM will ask intent)";
33
+ return result;
34
+ }
35
+ const tokens = trimmed.split(/\s+/);
36
+ const remaining = [];
37
+ for (let i = 0; i < tokens.length; i++) {
38
+ const tok = tokens[i];
39
+ if (tok === "--add") {
40
+ result.mode = "add";
41
+ }
42
+ else if (tok === "--edit") {
43
+ result.mode = "edit";
44
+ }
45
+ else if (tok === "--view" || tok === "--list") {
46
+ result.mode = "view";
47
+ }
48
+ else if (tok === "--remove") {
49
+ result.mode = "remove";
50
+ }
51
+ else if (tok === "--name" && i + 1 < tokens.length) {
52
+ result.pipelineName = tokens[++i];
53
+ }
54
+ else {
55
+ remaining.push(tok);
56
+ }
57
+ }
58
+ const tail = remaining.join(" ").trim();
59
+ if (tail.startsWith("@")) {
60
+ const ref = tail.slice(1).trim();
61
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
62
+ result.seed = fs.readFileSync(filePath, "utf8");
63
+ result.sourceLabel = `(seed from file: ${ref})`;
64
+ }
65
+ else if (tail) {
66
+ // A bare word with no mode flag = pipeline name, default mode "add"
67
+ if (!result.pipelineName && !/^--/.test(tail)) {
68
+ result.pipelineName = tail;
69
+ }
70
+ else {
71
+ result.seed = tail;
72
+ }
73
+ result.sourceLabel = "(from inline text)";
74
+ }
75
+ return result;
76
+ }
77
+ // ── Kickoff composition ───────────────────────────────────────────────────
78
+ const MODE_LABELS = {
79
+ add: "Add a new pipeline",
80
+ edit: "Customize an existing pipeline",
81
+ view: "View configured pipelines",
82
+ remove: "Remove a pipeline",
83
+ };
84
+ export function composeAddPipelineKickoff(opts) {
85
+ const { commandMd, parsed } = opts;
86
+ const sections = ["# /forge:add-pipeline", ""];
87
+ sections.push("## Dispatch", "");
88
+ sections.push(`Start in **Mode: ${MODE_LABELS[parsed.mode]}**.`);
89
+ if (parsed.pipelineName) {
90
+ sections.push(`Pipeline name: \`${parsed.pipelineName}\``);
91
+ }
92
+ sections.push("");
93
+ sections.push("Run the pipeline manager command below. Use `forge_store` for all config reads and writes. " +
94
+ "Read `.forge/config.json` directly when you need the pipelines section.");
95
+ sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
96
+ if (parsed.seed) {
97
+ sections.push("", `## Additional Input — ${parsed.sourceLabel}`, "", parsed.seed.trim());
98
+ }
99
+ return sections.join("\n");
100
+ }
101
+ // ── Registration ──────────────────────────────────────────────────────────
102
+ const COMMAND_NAME = "add-pipeline";
103
+ export function registerAddPipeline(pi, options) {
104
+ pi.registerCommand("forge:add-pipeline", {
105
+ description: "Conversational pipeline manager — add, customize, view, or remove Forge pipelines. " +
106
+ "Usage: /forge:add-pipeline [--add|--edit|--view|--remove] [--name <name>] [<pipeline-name>]",
107
+ async handler(args, ctx) {
108
+ const { forgeRoot } = options;
109
+ const cwd = options.cwd ?? process.cwd();
110
+ if (!forgeRoot) {
111
+ ctx.ui.notify("× forge:add-pipeline — no Forge project at cwd; run /forge:init to bootstrap", "warning");
112
+ return;
113
+ }
114
+ const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
115
+ let commandMd;
116
+ try {
117
+ commandMd = fs.readFileSync(commandPath, "utf8");
118
+ }
119
+ catch (err) {
120
+ const e = err;
121
+ if (e.code === "ENOENT") {
122
+ ctx.ui.notify(`× forge:add-pipeline — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
123
+ }
124
+ else {
125
+ ctx.ui.notify(`× forge:add-pipeline — failed to read command file: ${e.message ?? "unknown error"}`, "error");
126
+ }
127
+ return;
128
+ }
129
+ let parsed;
130
+ try {
131
+ parsed = parseAddPipelineArgs(args, cwd);
132
+ }
133
+ catch (err) {
134
+ const e = err;
135
+ ctx.ui.notify(`× forge:add-pipeline — failed to parse args: ${e.message ?? "unknown"}`, "error");
136
+ return;
137
+ }
138
+ const kickoff = composeAddPipelineKickoff({ commandMd, parsed });
139
+ sendKickoff(pi, kickoff);
140
+ },
141
+ });
142
+ }
143
+ //# sourceMappingURL=add-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-pipeline.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/add-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export interface ParsedAddTaskArgs {
3
+ sprintId: string | null;
4
+ title: string | null;
5
+ estimate: string | null;
6
+ pipeline: string | null;
7
+ seed: string;
8
+ sourceLabel: string;
9
+ }
10
+ export declare function parseAddTaskArgs(rawArgs: string, cwd: string): ParsedAddTaskArgs;
11
+ export interface ComposeAddTaskKickoffOpts {
12
+ commandMd: string;
13
+ parsed: ParsedAddTaskArgs;
14
+ }
15
+ export declare function composeAddTaskKickoff(opts: ComposeAddTaskKickoffOpts): string;
16
+ export interface RegisterAddTaskOptions {
17
+ forgeRoot: string | null;
18
+ cwd?: string;
19
+ }
20
+ export declare function registerAddTask(pi: ExtensionAPI, options: RegisterAddTaskOptions): void;
@@ -0,0 +1,154 @@
1
+ // forge:add-task — native kickoff handler (FORGE-S23-T11).
2
+ //
3
+ // Replaces the auto-generated stub previously installed by
4
+ // registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
5
+ // (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
6
+ //
7
+ // This handler reads commands/add-task.md from the bundled forge payload,
8
+ // forwards any provided argv shortcuts (--sprint, --title, --estimate,
9
+ // --pipeline) in the kickoff body so the LLM skips those interview steps,
10
+ // and dispatches via pi.sendUserMessage with { deliverAs: "steer" }.
11
+ //
12
+ // Note: The task prompt mentions "store-cli --next-id pre-flight", but
13
+ // store-cli has no next-id subcommand. The ID is computed by the LLM
14
+ // from the sprint record (per Step 3 in the command file). The handler
15
+ // only forwards shortcuts to reduce LLM round-trips.
16
+ //
17
+ // Workflow source: <forgeRoot>/commands/add-task.md (command file).
18
+ // File-existence check only (not Pack-06 4-marker check) — command files
19
+ // are simpler than full workflow files and lack the required markers.
20
+ //
21
+ // Iron Laws:
22
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
23
+ // IL4 — no JSON.stringify-into-subagent dispatch.
24
+ // IL6 — no shell-string interpolation; no spawn calls here.
25
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
26
+ // continuation.
27
+ import * as fs from "node:fs";
28
+ import * as path from "node:path";
29
+ import { sendKickoff } from "./kickoff.js";
30
+ export function parseAddTaskArgs(rawArgs, cwd) {
31
+ const trimmed = (rawArgs ?? "").trim();
32
+ const result = {
33
+ sprintId: null,
34
+ title: null,
35
+ estimate: null,
36
+ pipeline: null,
37
+ seed: "",
38
+ sourceLabel: "",
39
+ };
40
+ if (!trimmed) {
41
+ result.sourceLabel = "(no args — LLM will conduct full interview)";
42
+ return result;
43
+ }
44
+ // Parse known flags
45
+ const tokens = trimmed.split(/\s+/);
46
+ const remaining = [];
47
+ for (let i = 0; i < tokens.length; i++) {
48
+ const tok = tokens[i];
49
+ if (tok === "--sprint" && i + 1 < tokens.length) {
50
+ result.sprintId = tokens[++i];
51
+ }
52
+ else if (tok === "--title" && i + 1 < tokens.length) {
53
+ result.title = tokens[++i];
54
+ }
55
+ else if (tok === "--estimate" && i + 1 < tokens.length) {
56
+ result.estimate = tokens[++i];
57
+ }
58
+ else if (tok === "--pipeline" && i + 1 < tokens.length) {
59
+ result.pipeline = tokens[++i];
60
+ }
61
+ else {
62
+ remaining.push(tok);
63
+ }
64
+ }
65
+ // Remaining tokens: @<file> or free-form text
66
+ const tail = remaining.join(" ").trim();
67
+ if (tail.startsWith("@")) {
68
+ const ref = tail.slice(1).trim();
69
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
70
+ result.seed = fs.readFileSync(filePath, "utf8");
71
+ result.sourceLabel = `(seed from file: ${ref})`;
72
+ }
73
+ else if (tail) {
74
+ result.seed = tail;
75
+ result.sourceLabel = "(seed from inline text)";
76
+ }
77
+ else {
78
+ result.sourceLabel = "(shortcuts provided)";
79
+ }
80
+ return result;
81
+ }
82
+ export function composeAddTaskKickoff(opts) {
83
+ const { commandMd, parsed } = opts;
84
+ const shortcuts = [];
85
+ if (parsed.sprintId)
86
+ shortcuts.push(`--sprint ${parsed.sprintId}`);
87
+ if (parsed.title)
88
+ shortcuts.push(`--title "${parsed.title}"`);
89
+ if (parsed.estimate)
90
+ shortcuts.push(`--estimate ${parsed.estimate}`);
91
+ if (parsed.pipeline)
92
+ shortcuts.push(`--pipeline ${parsed.pipeline}`);
93
+ const sections = ["# /forge:add-task", ""];
94
+ sections.push("## Dispatch", "");
95
+ sections.push("Run the add-task command below to add a new task to an existing sprint. Specifically:");
96
+ sections.push("");
97
+ sections.push("1. Follow the command file steps in order.");
98
+ if (shortcuts.length > 0) {
99
+ sections.push(`2. The following shortcuts were provided — skip the corresponding interview steps: \`${shortcuts.join(" ")}\``);
100
+ }
101
+ sections.push(`${shortcuts.length > 0 ? "3" : "2"}. Use \`forge_store\` for all store reads and writes (never raw bash \`forge store\`).`);
102
+ sections.push(`${shortcuts.length > 0 ? "4" : "3"}. Compute the next task ID from the sprint record's \`taskIds\` array per Step 3 in the command file.`);
103
+ sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
104
+ if (parsed.seed) {
105
+ sections.push("", `## Additional Input — ${parsed.sourceLabel}`, "", parsed.seed.trim());
106
+ }
107
+ else if (shortcuts.length === 0) {
108
+ sections.push("", "## Input", "", "(no args — begin mini-intake interview)");
109
+ }
110
+ return sections.join("\n");
111
+ }
112
+ // ── Registration ──────────────────────────────────────────────────────────
113
+ const COMMAND_NAME = "add-task";
114
+ export function registerAddTask(pi, options) {
115
+ pi.registerCommand("forge:add-task", {
116
+ description: "Add a new task to an existing sprint mid-flight — mini intake, sequential ID assignment, store write. " +
117
+ "Usage: /forge:add-task [--sprint <ID>] [--title <text>] [--estimate <S|M|L|XL>] [--pipeline <name>] [@<file> | <text>]",
118
+ async handler(args, ctx) {
119
+ const { forgeRoot } = options;
120
+ const cwd = options.cwd ?? process.cwd();
121
+ if (!forgeRoot) {
122
+ ctx.ui.notify("× forge:add-task — no Forge project at cwd; run /forge:init to bootstrap", "warning");
123
+ return;
124
+ }
125
+ const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
126
+ let commandMd;
127
+ try {
128
+ commandMd = fs.readFileSync(commandPath, "utf8");
129
+ }
130
+ catch (err) {
131
+ const e = err;
132
+ if (e.code === "ENOENT") {
133
+ ctx.ui.notify(`× forge:add-task — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
134
+ }
135
+ else {
136
+ ctx.ui.notify(`× forge:add-task — failed to read command file: ${e.message ?? "unknown error"}`, "error");
137
+ }
138
+ return;
139
+ }
140
+ let parsed;
141
+ try {
142
+ parsed = parseAddTaskArgs(args, cwd);
143
+ }
144
+ catch (err) {
145
+ const e = err;
146
+ ctx.ui.notify(`× forge:add-task — failed to parse args: ${e.message ?? "unknown"}`, "error");
147
+ return;
148
+ }
149
+ const kickoff = composeAddTaskKickoff({ commandMd, parsed });
150
+ sendKickoff(pi, kickoff);
151
+ },
152
+ });
153
+ }
154
+ //# sourceMappingURL=add-task.js.map