@entelligentsia/forgecli 1.0.14 → 1.0.21

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 (363) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/README.md +7 -1
  3. package/dist/CHANGELOG-forge-plugin.md +61 -0
  4. package/dist/bin/config.js +4 -4
  5. package/dist/bin/config.js.map +1 -1
  6. package/dist/bin/update-cli.d.ts +1 -1
  7. package/dist/bin/update-cli.js +1 -1
  8. package/dist/bin/update-cli.js.map +1 -1
  9. package/dist/extensions/forgecli/ask-user-tool.js +1 -1
  10. package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
  11. package/dist/extensions/forgecli/commands/add-pipeline.d.ts +19 -0
  12. package/dist/extensions/forgecli/commands/add-pipeline.js +143 -0
  13. package/dist/extensions/forgecli/commands/add-pipeline.js.map +1 -0
  14. package/dist/extensions/forgecli/commands/add-task.d.ts +20 -0
  15. package/dist/extensions/forgecli/commands/add-task.js +154 -0
  16. package/dist/extensions/forgecli/commands/add-task.js.map +1 -0
  17. package/dist/extensions/forgecli/commands/approve.d.ts +22 -0
  18. package/dist/extensions/forgecli/commands/approve.js +152 -0
  19. package/dist/extensions/forgecli/commands/approve.js.map +1 -0
  20. package/dist/extensions/forgecli/commands/collate.d.ts +22 -0
  21. package/dist/extensions/forgecli/commands/collate.js +134 -0
  22. package/dist/extensions/forgecli/commands/collate.js.map +1 -0
  23. package/dist/extensions/forgecli/commands/commit.d.ts +22 -0
  24. package/dist/extensions/forgecli/commands/commit.js +152 -0
  25. package/dist/extensions/forgecli/commands/commit.js.map +1 -0
  26. package/dist/extensions/forgecli/commands/config-command.d.ts +8 -0
  27. package/dist/extensions/forgecli/commands/config-command.js +67 -0
  28. package/dist/extensions/forgecli/commands/config-command.js.map +1 -0
  29. package/dist/extensions/forgecli/commands/enhance.d.ts +45 -0
  30. package/dist/extensions/forgecli/commands/enhance.js +219 -0
  31. package/dist/extensions/forgecli/commands/enhance.js.map +1 -0
  32. package/dist/extensions/forgecli/commands/implement.d.ts +22 -0
  33. package/dist/extensions/forgecli/commands/implement.js +170 -0
  34. package/dist/extensions/forgecli/commands/implement.js.map +1 -0
  35. package/dist/extensions/forgecli/commands/plan.d.ts +22 -0
  36. package/dist/extensions/forgecli/commands/plan.js +167 -0
  37. package/dist/extensions/forgecli/commands/plan.js.map +1 -0
  38. package/dist/extensions/forgecli/commands/quiz-agent.d.ts +17 -0
  39. package/dist/extensions/forgecli/commands/quiz-agent.js +98 -0
  40. package/dist/extensions/forgecli/commands/quiz-agent.js.map +1 -0
  41. package/dist/extensions/forgecli/commands/read-command.d.ts +2 -0
  42. package/dist/extensions/forgecli/commands/read-command.js +100 -0
  43. package/dist/extensions/forgecli/commands/read-command.js.map +1 -0
  44. package/dist/extensions/forgecli/commands/regenerate.d.ts +40 -0
  45. package/dist/extensions/forgecli/commands/regenerate.js +426 -0
  46. package/dist/extensions/forgecli/commands/regenerate.js.map +1 -0
  47. package/dist/extensions/forgecli/commands/remove-command.d.ts +17 -0
  48. package/dist/extensions/forgecli/commands/remove-command.js +124 -0
  49. package/dist/extensions/forgecli/commands/remove-command.js.map +1 -0
  50. package/dist/extensions/forgecli/commands/report-bug.d.ts +25 -0
  51. package/dist/extensions/forgecli/commands/report-bug.js +159 -0
  52. package/dist/extensions/forgecli/commands/report-bug.js.map +1 -0
  53. package/dist/extensions/forgecli/commands/retrospective.d.ts +20 -0
  54. package/dist/extensions/forgecli/commands/retrospective.js +126 -0
  55. package/dist/extensions/forgecli/commands/retrospective.js.map +1 -0
  56. package/dist/extensions/forgecli/commands/review-code.d.ts +35 -0
  57. package/dist/extensions/forgecli/commands/review-code.js +196 -0
  58. package/dist/extensions/forgecli/commands/review-code.js.map +1 -0
  59. package/dist/extensions/forgecli/commands/review-plan.d.ts +35 -0
  60. package/dist/extensions/forgecli/commands/review-plan.js +200 -0
  61. package/dist/extensions/forgecli/commands/review-plan.js.map +1 -0
  62. package/dist/extensions/forgecli/commands/sprint-intake.d.ts +10 -0
  63. package/dist/extensions/forgecli/commands/sprint-intake.js +91 -0
  64. package/dist/extensions/forgecli/commands/sprint-intake.js.map +1 -0
  65. package/dist/extensions/forgecli/commands/sprint-plan.d.ts +14 -0
  66. package/dist/extensions/forgecli/commands/sprint-plan.js +122 -0
  67. package/dist/extensions/forgecli/commands/sprint-plan.js.map +1 -0
  68. package/dist/extensions/forgecli/commands/status-command.d.ts +19 -0
  69. package/dist/extensions/forgecli/commands/status-command.js +140 -0
  70. package/dist/extensions/forgecli/commands/status-command.js.map +1 -0
  71. package/dist/extensions/forgecli/commands/store-query.d.ts +22 -0
  72. package/dist/extensions/forgecli/commands/store-query.js +107 -0
  73. package/dist/extensions/forgecli/commands/store-query.js.map +1 -0
  74. package/dist/extensions/forgecli/commands/store-repair.d.ts +17 -0
  75. package/dist/extensions/forgecli/commands/store-repair.js +123 -0
  76. package/dist/extensions/forgecli/commands/store-repair.js.map +1 -0
  77. package/dist/extensions/forgecli/commands/test-orchestrate.d.ts +2 -0
  78. package/dist/extensions/forgecli/commands/test-orchestrate.js +182 -0
  79. package/dist/extensions/forgecli/commands/test-orchestrate.js.map +1 -0
  80. package/dist/extensions/forgecli/commands/transcripts-command.d.ts +87 -0
  81. package/dist/extensions/forgecli/commands/transcripts-command.js +418 -0
  82. package/dist/extensions/forgecli/commands/transcripts-command.js.map +1 -0
  83. package/dist/extensions/forgecli/commands/validate.d.ts +22 -0
  84. package/dist/extensions/forgecli/commands/validate.js +152 -0
  85. package/dist/extensions/forgecli/commands/validate.js.map +1 -0
  86. package/dist/extensions/forgecli/config/config-layer.d.ts +53 -0
  87. package/dist/extensions/forgecli/config/config-layer.js +72 -0
  88. package/dist/extensions/forgecli/config/config-layer.js.map +1 -0
  89. package/dist/extensions/forgecli/config/config-writer.d.ts +16 -0
  90. package/dist/extensions/forgecli/config/config-writer.js +69 -0
  91. package/dist/extensions/forgecli/config/config-writer.js.map +1 -0
  92. package/dist/extensions/forgecli/config/model-registry.d.ts +61 -0
  93. package/dist/extensions/forgecli/config/model-registry.js +127 -0
  94. package/dist/extensions/forgecli/config/model-registry.js.map +1 -0
  95. package/dist/extensions/forgecli/config/model-resolver.d.ts +32 -0
  96. package/dist/extensions/forgecli/config/model-resolver.js +65 -0
  97. package/dist/extensions/forgecli/config/model-resolver.js.map +1 -0
  98. package/dist/extensions/forgecli/config/model-validator.d.ts +29 -0
  99. package/dist/extensions/forgecli/config/model-validator.js +107 -0
  100. package/dist/extensions/forgecli/config/model-validator.js.map +1 -0
  101. package/dist/extensions/forgecli/config-layer.d.ts +0 -16
  102. package/dist/extensions/forgecli/config-layer.js +0 -5
  103. package/dist/extensions/forgecli/config-layer.js.map +1 -1
  104. package/dist/extensions/forgecli/config-tui/component.js +1 -1
  105. package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
  106. package/dist/extensions/forgecli/config-tui/handler.js +1 -1
  107. package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
  108. package/dist/extensions/forgecli/config-tui/screens/override-editor.js +1 -1
  109. package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
  110. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +1 -1
  111. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
  112. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +1 -1
  113. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
  114. package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
  115. package/dist/extensions/forgecli/config-tui/state/model.d.ts +1 -1
  116. package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
  117. package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +2 -2
  118. package/dist/extensions/forgecli/config-tui/state/selectors.js +1 -1
  119. package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
  120. package/dist/extensions/forgecli/context-governor-compaction.d.ts +94 -0
  121. package/dist/extensions/forgecli/context-governor-compaction.js +327 -0
  122. package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -0
  123. package/dist/extensions/forgecli/context-governor.d.ts +169 -0
  124. package/dist/extensions/forgecli/context-governor.js +592 -0
  125. package/dist/extensions/forgecli/context-governor.js.map +1 -0
  126. package/dist/extensions/forgecli/dashboard/component.d.ts +17 -5
  127. package/dist/extensions/forgecli/dashboard/component.js +160 -115
  128. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  129. package/dist/extensions/forgecli/dashboard/register.js +7 -21
  130. package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
  131. package/dist/extensions/forgecli/dashboard/theme.d.ts +27 -0
  132. package/dist/extensions/forgecli/dashboard/theme.js +91 -0
  133. package/dist/extensions/forgecli/dashboard/theme.js.map +1 -0
  134. package/dist/extensions/forgecli/fix-bug.js +59 -5
  135. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  136. package/dist/extensions/forgecli/forge-artifact-tool.js +3 -2
  137. package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
  138. package/dist/extensions/forgecli/forge-cli-schema.json +0 -4
  139. package/dist/extensions/forgecli/forge-commands.js +1 -1
  140. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  141. package/dist/extensions/forgecli/forge-init/forge-init.d.ts +26 -0
  142. package/dist/extensions/forgecli/forge-init/forge-init.js +514 -0
  143. package/dist/extensions/forgecli/forge-init/forge-init.js.map +1 -0
  144. package/dist/extensions/forgecli/forge-init/init-context.d.ts +99 -0
  145. package/dist/extensions/forgecli/forge-init/init-context.js +178 -0
  146. package/dist/extensions/forgecli/forge-init/init-context.js.map +1 -0
  147. package/dist/extensions/forgecli/forge-init/init-progress.d.ts +39 -0
  148. package/dist/extensions/forgecli/forge-init/init-progress.js +117 -0
  149. package/dist/extensions/forgecli/forge-init/init-progress.js.map +1 -0
  150. package/dist/extensions/forgecli/forge-init/phase4-register.js +1 -1
  151. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  152. package/dist/extensions/forgecli/forge-init/run-phases.js +2 -2
  153. package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -1
  154. package/dist/extensions/forgecli/forge-subagent.d.ts +42 -1
  155. package/dist/extensions/forgecli/forge-subagent.js +59 -18
  156. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  157. package/dist/extensions/forgecli/forge-tools.d.ts +0 -25
  158. package/dist/extensions/forgecli/forge-tools.js +8 -37
  159. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  160. package/dist/extensions/forgecli/governor-config.d.ts +19 -0
  161. package/dist/extensions/forgecli/governor-config.js +58 -0
  162. package/dist/extensions/forgecli/governor-config.js.map +1 -0
  163. package/dist/extensions/forgecli/health-check.js +1 -1
  164. package/dist/extensions/forgecli/health-check.js.map +1 -1
  165. package/dist/extensions/forgecli/hook-dispatcher.d.ts +3 -1
  166. package/dist/extensions/forgecli/hook-dispatcher.js +39 -5
  167. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  168. package/dist/extensions/forgecli/hooks/post-init-hook.js +11 -6
  169. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
  170. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +11 -6
  171. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
  172. package/dist/extensions/forgecli/hooks/write-guard.js +1 -1
  173. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
  174. package/dist/extensions/forgecli/index.js +70 -36
  175. package/dist/extensions/forgecli/index.js.map +1 -1
  176. package/dist/extensions/forgecli/kickoff.d.ts +9 -0
  177. package/dist/extensions/forgecli/kickoff.js +15 -0
  178. package/dist/extensions/forgecli/kickoff.js.map +1 -1
  179. package/dist/extensions/forgecli/lib/forge-config.d.ts +1 -1
  180. package/dist/extensions/forgecli/lib/forge-config.js +1 -1
  181. package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
  182. package/dist/extensions/forgecli/lib/forge-root.d.ts +10 -0
  183. package/dist/extensions/forgecli/lib/forge-root.js +62 -0
  184. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -0
  185. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +19 -14
  186. package/dist/extensions/forgecli/lib/halt-advisor.js +36 -13
  187. package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -1
  188. package/dist/extensions/forgecli/lib/run-cjs.d.ts +26 -0
  189. package/dist/extensions/forgecli/lib/run-cjs.js +42 -0
  190. package/dist/extensions/forgecli/lib/run-cjs.js.map +1 -0
  191. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +3 -2
  192. package/dist/extensions/forgecli/orchestrator-status-bar.js +90 -60
  193. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -1
  194. package/dist/extensions/forgecli/orchestrator-tree.d.ts +4 -0
  195. package/dist/extensions/forgecli/orchestrator-tree.js +21 -3
  196. package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -1
  197. package/dist/extensions/forgecli/orchestrators/calibrate.d.ts +64 -0
  198. package/dist/extensions/forgecli/orchestrators/calibrate.js +481 -0
  199. package/dist/extensions/forgecli/orchestrators/calibrate.js.map +1 -0
  200. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +93 -0
  201. package/dist/extensions/forgecli/orchestrators/fix-bug.js +1705 -0
  202. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -0
  203. package/dist/extensions/forgecli/orchestrators/halt-advisor.d.ts +59 -0
  204. package/dist/extensions/forgecli/orchestrators/halt-advisor.js +113 -0
  205. package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -0
  206. package/dist/extensions/forgecli/orchestrators/materialize.d.ts +16 -0
  207. package/dist/extensions/forgecli/orchestrators/materialize.js +195 -0
  208. package/dist/extensions/forgecli/orchestrators/materialize.js.map +1 -0
  209. package/dist/extensions/forgecli/orchestrators/migrate.d.ts +22 -0
  210. package/dist/extensions/forgecli/orchestrators/migrate.js +260 -0
  211. package/dist/extensions/forgecli/orchestrators/migrate.js.map +1 -0
  212. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.d.ts +46 -0
  213. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js +64 -0
  214. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js.map +1 -0
  215. package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +27 -0
  216. package/dist/extensions/forgecli/orchestrators/run-sprint.js +734 -0
  217. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -0
  218. package/dist/extensions/forgecli/orchestrators/run-task.d.ts +215 -0
  219. package/dist/extensions/forgecli/orchestrators/run-task.js +1491 -0
  220. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -0
  221. package/dist/extensions/forgecli/paths/paths.d.ts +8 -0
  222. package/dist/extensions/forgecli/paths/paths.js +17 -0
  223. package/dist/extensions/forgecli/paths/paths.js.map +1 -1
  224. package/dist/extensions/forgecli/phase-vocab.d.ts +31 -0
  225. package/dist/extensions/forgecli/phase-vocab.js +82 -0
  226. package/dist/extensions/forgecli/phase-vocab.js.map +1 -0
  227. package/dist/extensions/forgecli/run-sprint.d.ts +3 -1
  228. package/dist/extensions/forgecli/run-sprint.js +1 -0
  229. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  230. package/dist/extensions/forgecli/run-task.d.ts +34 -1
  231. package/dist/extensions/forgecli/run-task.js +144 -6
  232. package/dist/extensions/forgecli/run-task.js.map +1 -1
  233. package/dist/extensions/forgecli/session-registry.d.ts +2 -2
  234. package/dist/extensions/forgecli/session-registry.js +6 -2
  235. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  236. package/dist/extensions/forgecli/skill-curation/friction-emit.d.ts +99 -0
  237. package/dist/extensions/forgecli/skill-curation/friction-emit.js +245 -0
  238. package/dist/extensions/forgecli/skill-curation/friction-emit.js.map +1 -0
  239. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.d.ts +21 -0
  240. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js +71 -0
  241. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js.map +1 -0
  242. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.d.ts +102 -0
  243. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js +339 -0
  244. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js.map +1 -0
  245. package/dist/extensions/forgecli/skill-curation/skill-retriever.d.ts +84 -0
  246. package/dist/extensions/forgecli/skill-curation/skill-retriever.js +246 -0
  247. package/dist/extensions/forgecli/skill-curation/skill-retriever.js.map +1 -0
  248. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.d.ts +91 -0
  249. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js +224 -0
  250. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js.map +1 -0
  251. package/dist/extensions/forgecli/store/store-error-remediation.d.ts +65 -0
  252. package/dist/extensions/forgecli/store/store-error-remediation.js +307 -0
  253. package/dist/extensions/forgecli/store/store-error-remediation.js.map +1 -0
  254. package/dist/extensions/forgecli/store/store-resolver.d.ts +56 -0
  255. package/dist/extensions/forgecli/store/store-resolver.js +263 -0
  256. package/dist/extensions/forgecli/store/store-resolver.js.map +1 -0
  257. package/dist/extensions/forgecli/store/store-validator.d.ts +16 -0
  258. package/dist/extensions/forgecli/store/store-validator.js +32 -0
  259. package/dist/extensions/forgecli/store/store-validator.js.map +1 -0
  260. package/dist/extensions/forgecli/store/transition-guard.d.ts +20 -0
  261. package/dist/extensions/forgecli/store/transition-guard.js +89 -0
  262. package/dist/extensions/forgecli/store/transition-guard.js.map +1 -0
  263. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +5 -0
  264. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -1
  265. package/dist/extensions/forgecli/thread-switcher.d.ts +4 -1
  266. package/dist/extensions/forgecli/thread-switcher.js +36 -21
  267. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  268. package/dist/extensions/forgecli/transcript-archive-types.d.ts +171 -0
  269. package/dist/extensions/forgecli/transcript-archive-types.js +130 -0
  270. package/dist/extensions/forgecli/transcript-archive-types.js.map +1 -0
  271. package/dist/extensions/forgecli/transcript-archive.d.ts +127 -0
  272. package/dist/extensions/forgecli/transcript-archive.js +656 -0
  273. package/dist/extensions/forgecli/transcript-archive.js.map +1 -0
  274. package/dist/extensions/forgecli/transcript-replay.d.ts +28 -0
  275. package/dist/extensions/forgecli/transcript-replay.js +153 -0
  276. package/dist/extensions/forgecli/transcript-replay.js.map +1 -0
  277. package/dist/extensions/forgecli/transcripts-tui/component.d.ts +36 -0
  278. package/dist/extensions/forgecli/transcripts-tui/component.js +112 -0
  279. package/dist/extensions/forgecli/transcripts-tui/component.js.map +1 -0
  280. package/dist/extensions/forgecli/transcripts-tui/index.d.ts +4 -0
  281. package/dist/extensions/forgecli/transcripts-tui/index.js +5 -0
  282. package/dist/extensions/forgecli/transcripts-tui/index.js.map +1 -0
  283. package/dist/extensions/forgecli/transcripts-tui/screens/browse.d.ts +21 -0
  284. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js +172 -0
  285. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js.map +1 -0
  286. package/dist/extensions/forgecli/transcripts-tui/screens/types.d.ts +22 -0
  287. package/dist/extensions/forgecli/transcripts-tui/screens/types.js +4 -0
  288. package/dist/extensions/forgecli/transcripts-tui/screens/types.js.map +1 -0
  289. package/dist/extensions/forgecli/transcripts-tui/state/index.d.ts +4 -0
  290. package/dist/extensions/forgecli/transcripts-tui/state/index.js +5 -0
  291. package/dist/extensions/forgecli/transcripts-tui/state/index.js.map +1 -0
  292. package/dist/extensions/forgecli/transcripts-tui/state/init.d.ts +8 -0
  293. package/dist/extensions/forgecli/transcripts-tui/state/init.js +18 -0
  294. package/dist/extensions/forgecli/transcripts-tui/state/init.js.map +1 -0
  295. package/dist/extensions/forgecli/transcripts-tui/state/model.d.ts +56 -0
  296. package/dist/extensions/forgecli/transcripts-tui/state/model.js +6 -0
  297. package/dist/extensions/forgecli/transcripts-tui/state/model.js.map +1 -0
  298. package/dist/extensions/forgecli/transcripts-tui/state/reducer.d.ts +2 -0
  299. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js +51 -0
  300. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js.map +1 -0
  301. package/dist/extensions/forgecli/transcripts-tui/state/selectors.d.ts +10 -0
  302. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js +62 -0
  303. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js.map +1 -0
  304. package/dist/extensions/forgecli/transcripts-tui/theme.d.ts +20 -0
  305. package/dist/extensions/forgecli/transcripts-tui/theme.js +47 -0
  306. package/dist/extensions/forgecli/transcripts-tui/theme.js.map +1 -0
  307. package/dist/extensions/forgecli/tui/banner.d.ts +10 -0
  308. package/dist/extensions/forgecli/tui/banner.js +36 -0
  309. package/dist/extensions/forgecli/tui/banner.js.map +1 -0
  310. package/dist/extensions/forgecli/tui/forge-header.d.ts +12 -0
  311. package/dist/extensions/forgecli/tui/forge-header.js +114 -0
  312. package/dist/extensions/forgecli/tui/forge-header.js.map +1 -0
  313. package/dist/extensions/forgecli/tui/input-router.d.ts +33 -0
  314. package/dist/extensions/forgecli/tui/input-router.js +136 -0
  315. package/dist/extensions/forgecli/tui/input-router.js.map +1 -0
  316. package/dist/extensions/forgecli/tui/orchestrator-status-bar.d.ts +26 -0
  317. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js +213 -0
  318. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js.map +1 -0
  319. package/dist/extensions/forgecli/tui/thread-switcher.d.ts +18 -0
  320. package/dist/extensions/forgecli/tui/thread-switcher.js +194 -0
  321. package/dist/extensions/forgecli/tui/thread-switcher.js.map +1 -0
  322. package/dist/extensions/forgecli/update/forge-update-command.d.ts +100 -0
  323. package/dist/extensions/forgecli/update/forge-update-command.js +435 -0
  324. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -0
  325. package/dist/extensions/forgecli/update/migration-engine.d.ts +117 -0
  326. package/dist/extensions/forgecli/update/migration-engine.js +563 -0
  327. package/dist/extensions/forgecli/update/migration-engine.js.map +1 -0
  328. package/dist/extensions/forgecli/update/update-check.d.ts +37 -0
  329. package/dist/extensions/forgecli/update/update-check.js +185 -0
  330. package/dist/extensions/forgecli/update/update-check.js.map +1 -0
  331. package/dist/extensions/forgecli/update/update-tools.d.ts +23 -0
  332. package/dist/extensions/forgecli/update/update-tools.js +135 -0
  333. package/dist/extensions/forgecli/update/update-tools.js.map +1 -0
  334. package/dist/extensions/forgecli/update/whats-new-widget.d.ts +26 -0
  335. package/dist/extensions/forgecli/update/whats-new-widget.js +376 -0
  336. package/dist/extensions/forgecli/update/whats-new-widget.js.map +1 -0
  337. package/dist/extensions/forgecli/update/whats-new.d.ts +120 -0
  338. package/dist/extensions/forgecli/update/whats-new.js +470 -0
  339. package/dist/extensions/forgecli/update/whats-new.js.map +1 -0
  340. package/dist/extensions/forgecli/viewport/events.d.ts +113 -0
  341. package/dist/extensions/forgecli/viewport/events.js +290 -0
  342. package/dist/extensions/forgecli/viewport/events.js.map +1 -0
  343. package/dist/extensions/forgecli/viewport/renderer.d.ts +102 -0
  344. package/dist/extensions/forgecli/viewport/renderer.js +277 -0
  345. package/dist/extensions/forgecli/viewport/renderer.js.map +1 -0
  346. package/dist/extensions/forgecli/viewport/theme.d.ts +11 -0
  347. package/dist/extensions/forgecli/viewport/theme.js +131 -0
  348. package/dist/extensions/forgecli/viewport/theme.js.map +1 -0
  349. package/dist/extensions/forgecli/wf-engine/engine.js +1 -1
  350. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
  351. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +9 -0
  352. package/dist/forge-payload/.base-pack/workflows/plan_task.md +7 -0
  353. package/dist/forge-payload/.base-pack/workflows/review_code.md +4 -3
  354. package/dist/forge-payload/.base-pack/workflows/review_plan.md +4 -3
  355. package/dist/forge-payload/.base-pack/workflows/validate_task.md +4 -3
  356. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  357. package/dist/forge-payload/.schemas/migrations.json +132 -27
  358. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +4 -3
  359. package/dist/forge-payload/meta/workflows/meta-review-plan.md +4 -3
  360. package/dist/forge-payload/meta/workflows/meta-validate.md +4 -3
  361. package/dist/forge-payload/tools/collate.cjs +32 -0
  362. package/dist/forge-payload/tools/postflight-gate.cjs +56 -10
  363. package/package.json +5 -3
@@ -0,0 +1,152 @@
1
+ // forge:commit — native kickoff handler (FORGE-S21-T10).
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
+ // Note: The materialized workflow (commit_task.md) declares
8
+ // `audience: subagent` — advisory only. Users may invoke this command
9
+ // manually from the CLI; assertAudience never refuses subagent-audience
10
+ // workflows. Orchestrator chains still dispatch via runForgeSubagent
11
+ // directly and do NOT route through this handler.
12
+ //
13
+ // Iron Laws:
14
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
15
+ // IL4 — no JSON.stringify-into-subagent dispatch.
16
+ // IL6 — no shell-string interpolation; no spawn calls here.
17
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
18
+ // continuation.
19
+ import * as fs from "node:fs";
20
+ import * as path from "node:path";
21
+ import { assertAudience } from "../audience-gate.js";
22
+ import { discoverForgeConfig } from "../lib/forge-root.js";
23
+ import { sendKickoff } from "../kickoff.js";
24
+ // FORGE-S25-T16: extracted to lib modules (H-1, H-2). Re-exported here for
25
+ // backward compatibility with existing test and consumer imports.
26
+ import { extractPersonaNames } from "../lib/frontmatter-parser.js";
27
+ import { parseGuardArgs, runPipelineGuard } from "../lib/pipeline-guard.js";
28
+ import { loadPersona, PersonaSkillLoaderError } from "../parsers/persona-skill-loader.js";
29
+ import { loadWorkflow, WorkflowLoaderError } from "../parsers/workflow-loader.js";
30
+ export { extractPersonaNames };
31
+ import { checkMaterialization } from "../lib/manifest-checker.js";
32
+ export { checkMaterialization };
33
+ export function parseCommitArgs(rawArgs, cwd) {
34
+ const trimmed = (rawArgs ?? "").trim();
35
+ if (trimmed === "") {
36
+ return { mode: "empty", taskRef: "", sourceLabel: "(no input — engineer infers task from store/context)" };
37
+ }
38
+ if (trimmed.startsWith("@")) {
39
+ const ref = trimmed.slice(1).trim();
40
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
41
+ const seed = fs.readFileSync(filePath, "utf8");
42
+ return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
43
+ }
44
+ return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
45
+ }
46
+ export function composeKickoff(opts) {
47
+ const { workflowMd, personaIdentity, parsed } = opts;
48
+ const sections = ["# /forge:commit", ""];
49
+ if (personaIdentity.trim().length > 0) {
50
+ sections.push(personaIdentity.trim(), "");
51
+ }
52
+ sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the task implementation at `engineering/sprints/<SPRINT_ID>/<TASK_ID>/PROGRESS.md` (the source of truth).", "2. Query the store for the task and its sprint/feature context via `forge_store_query` — do NOT raw-read `.forge/store/`.", "3. Follow the workflow Algorithm verbatim: stage changes, write commit message, finalize store status.", "4. Write `COMMIT-SUMMARY.json` to the task directory using the `write` tool.", "5. Update task status by calling the `forge_store` MCP tool: `{command:'update-status', args:['task','<TASK_ID>','status','committed']}`. Never raw-write `.forge/store/`. Do NOT bash-shell `forge store ...`.", "6. Honour Pack-06 Read/Write/Ask/Store discipline: writes go via the `forge_store` MCP tool; in-conversation clarifications use `forge_ask_user`.");
53
+ sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
54
+ if (parsed.mode === "empty") {
55
+ sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
56
+ }
57
+ else {
58
+ sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
59
+ }
60
+ return sections.join("\n");
61
+ }
62
+ // Registration -------------------------------------------------------------
63
+ const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "commit_task.md");
64
+ export function registerCommit(pi, options = {}) {
65
+ pi.registerCommand("forge:commit", {
66
+ description: "Run the commit-task workflow for a Forge task. " +
67
+ "Usage: /forge:commit [@<file> | <free-form text>]. " +
68
+ "Note: this workflow is subagent-only; standalone invocations are refused. " +
69
+ "Orchestrator chains dispatch directly via runForgeSubagent.",
70
+ async handler(args, ctx) {
71
+ const cwd = options.cwd ?? process.cwd();
72
+ const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
73
+ // Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
74
+ const guardParsed = parseGuardArgs(args);
75
+ if (!guardParsed.force) {
76
+ const forgeConfig = discoverForgeConfig(cwd);
77
+ if (forgeConfig) {
78
+ const guard = runPipelineGuard("commit", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
79
+ if (guard.blocked) {
80
+ ctx.ui.notify(guard.message, "error");
81
+ return;
82
+ }
83
+ }
84
+ }
85
+ const effectiveArgs = guardParsed.cleanArgs;
86
+ let workflowMd;
87
+ let workflowAudience;
88
+ try {
89
+ const loaded = loadWorkflow(workflowPath);
90
+ workflowMd = loaded.rawMarkdown;
91
+ workflowAudience = loaded.audience;
92
+ }
93
+ catch (err) {
94
+ if (err instanceof WorkflowLoaderError) {
95
+ if (err.code === "missing_file") {
96
+ ctx.ui.notify(`× forge:commit — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
97
+ }
98
+ else {
99
+ ctx.ui.notify(`× forge:commit — workflow load failed (${err.code}): ${err.message}`, "error");
100
+ }
101
+ return;
102
+ }
103
+ const e = err;
104
+ ctx.ui.notify(`× forge:commit — failed to read workflow: ${e.message ?? "unknown"}`, "error");
105
+ return;
106
+ }
107
+ let parsed;
108
+ try {
109
+ parsed = parseCommitArgs(effectiveArgs, cwd);
110
+ }
111
+ catch (err) {
112
+ const e = err;
113
+ ctx.ui.notify(`× forge:commit — failed to read seed: ${e.message ?? "unknown"}`, "error");
114
+ return;
115
+ }
116
+ const check = checkMaterialization(workflowPath, workflowMd);
117
+ if (!check.ok) {
118
+ for (const marker of check.missing) {
119
+ ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
120
+ }
121
+ return;
122
+ }
123
+ const personas = extractPersonaNames(workflowMd);
124
+ let personaIdentity = "";
125
+ if (personas.length > 0) {
126
+ try {
127
+ const persona = loadPersona(personas[0], { cwd });
128
+ personaIdentity = persona.identity;
129
+ }
130
+ catch (err) {
131
+ if (err instanceof PersonaSkillLoaderError) {
132
+ ctx.ui.notify(`× forge:commit — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
133
+ return;
134
+ }
135
+ const e = err;
136
+ ctx.ui.notify(`× forge:commit — persona load error: ${e.message ?? "unknown"}`, "error");
137
+ return;
138
+ }
139
+ }
140
+ if (!assertAudience({ workflowName: "commit_task", audience: workflowAudience }, ctx)) {
141
+ return;
142
+ }
143
+ const kickoff = composeKickoff({
144
+ workflowMd,
145
+ personaIdentity,
146
+ parsed,
147
+ });
148
+ sendKickoff(pi, kickoff);
149
+ },
150
+ });
151
+ }
152
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/commands/commit.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,uEAAuE;AACvE,EAAE;AACF,4DAA4D;AAC5D,sEAAsE;AACtE,wEAAwE;AACxE,qEAAqE;AACrE,kDAAkD;AAClD,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,oDAAoD;AACpD,8DAA8D;AAC9D,wEAAwE;AACxE,wBAAwB;AAExB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,2EAA2E;AAC3E,kEAAkE;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAElF,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAA6B,MAAM,4BAA4B,CAAC;AAE7F,OAAO,EAAE,oBAAoB,EAA6B,CAAC;AAY3D,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,GAAW;IAC3D,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC;IAC5G,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,GAAG,GAAG,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;AACnF,CAAC;AAUD,MAAM,UAAU,cAAc,CAAC,IAAwB;IACtD,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAErD,MAAM,QAAQ,GAAa,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACnD,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,QAAQ,CAAC,IAAI,CACZ,aAAa,EACb,EAAE,EACF,uCAAuC,EACvC,EAAE,EACF,mHAAmH,EACnH,2HAA2H,EAC3H,wGAAwG,EACxG,8EAA8E,EAC9E,iNAAiN,EACjN,mJAAmJ,CACnJ,CAAC;IAEF,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAE9E,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,sDAAsD,CAAC,CAAC;IAC3F,CAAC;SAAM,CAAC;QACP,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAE7E,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;AAM7E,MAAM,UAAU,cAAc,CAAC,EAAgB,EAAE,UAAiC,EAAE;IACnF,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE;QAClC,WAAW,EACV,iDAAiD;YACjD,qDAAqD;YACrD,4EAA4E;YAC5E,6DAA6D;QAC9D,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,GAA4B;YACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAEvD,4EAA4E;YAC5E,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,WAAW,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;oBAC7F,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACtC,OAAO;oBACR,CAAC;gBACF,CAAC;YACF,CAAC;YACD,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC;YAE5C,IAAI,UAAkB,CAAC;YACvB,IAAI,gBAAuE,CAAC;YAC5E,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC1C,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;gBAChC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YACpC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;oBACxC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBACjC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,0CAA0C,iBAAiB,4CAA4C,EACvG,OAAO,CACP,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACP,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0CAA0C,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC/F,CAAC;oBACD,OAAO;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC9F,OAAO;YACR,CAAC;YAED,IAAI,MAAkB,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC1F,OAAO;YACR,CAAC;YAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACf,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACpC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0BAA0B,MAAM,iBAAiB,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzF,CAAC;gBACD,OAAO;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,eAAe,GAAG,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;oBAClD,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACpC,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACvB,IAAI,GAAG,YAAY,uBAAuB,EAAE,CAAC;wBAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,6BAA6B,QAAQ,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EACrF,OAAO,CACP,CAAC;wBACF,OAAO;oBACR,CAAC;oBACD,MAAM,CAAC,GAAG,GAA2B,CAAC;oBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;oBACzF,OAAO;gBACR,CAAC;YACF,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;gBACvF,OAAO;YACR,CAAC;YAED,MAAM,OAAO,GAAG,cAAc,CAAC;gBAC9B,UAAU;gBACV,eAAe;gBACf,MAAM;aACN,CAAC,CAAC;YAEH,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1B,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export interface RegisterConfigCommandOptions {
3
+ /** When null, /forge:config is registered but only the routing-config bits
4
+ * are reachable — plugin-config display is hidden (no .forge to read).
5
+ */
6
+ forgeRoot: string | null;
7
+ }
8
+ export declare function registerConfigCommand(pi: ExtensionAPI, _opts: RegisterConfigCommandOptions): void;
@@ -0,0 +1,67 @@
1
+ // Native /forge:config handler — replaces the LLM-backed delegateMarkdownCommand
2
+ // stub that previously lived in forge-commands.ts.
3
+ //
4
+ // Plan 16 Slice 4a + 4b. The handler delegates to runConfigTui which is the
5
+ // same entry point used by the `forge config` bin subcommand — single source
6
+ // of truth for the routing config TUI / show flow. The wrapper supplies a
7
+ // `mountConfigTui` callback that uses ctx.ui.custom() to overlay the TUI.
8
+ import { createConfigTuiComponent } from "../config-tui/component.js";
9
+ import { runConfigTui } from "../config-tui/handler.js";
10
+ import { getInputRouter } from "../tui/input-router.js";
11
+ export function registerConfigCommand(pi, _opts) {
12
+ pi.registerCommand("forge:config", {
13
+ description: "Inspect or change forge-cli routing config (persona-models, pipeline overrides) and view Forge project config",
14
+ async handler(args, ctx) {
15
+ const argv = args.trim().length === 0 ? [] : args.trim().split(/\s+/);
16
+ const mountConfigTui = async (init) => {
17
+ // Mark overlay active so forge-input-router suppresses arrow-activator
18
+ // listeners (thread-switcher's ↓, whats-new's ↓) while the TUI owns
19
+ // input focus.
20
+ const router = getInputRouter();
21
+ router.pushOverlay();
22
+ try {
23
+ const exitCode = await ctx.ui.custom((tui, theme, _kb, done) => {
24
+ // Component drives done() on q or successful confirm-quit.
25
+ // Pi TUI key rule 3: call tui.requestRender() after state changes.
26
+ const component = createConfigTuiComponent({
27
+ ...init,
28
+ onExit: (code) => done(code),
29
+ onSaved: (target) => ctx.ui.notify(`forge config: saved → ${target}`, "info"),
30
+ onError: (msg) => ctx.ui.notify(`forge config: ${msg}`, "error"),
31
+ requestRender: () => tui.requestRender(),
32
+ theme,
33
+ });
34
+ return component;
35
+ }, {
36
+ overlay: true,
37
+ overlayOptions: {
38
+ width: "100%",
39
+ anchor: "center",
40
+ margin: 0,
41
+ },
42
+ });
43
+ return exitCode;
44
+ }
45
+ finally {
46
+ router.popOverlay();
47
+ }
48
+ };
49
+ const exitCode = await runConfigTui(argv, process.cwd(), {
50
+ write: () => { },
51
+ writeErr: (s) => ctx.ui.notify(s, "error"),
52
+ ctx: {
53
+ notify: (msg, level) => {
54
+ const lvl = (level === "warning" || level === "error" ? level : "info");
55
+ ctx.ui.notify(msg, lvl);
56
+ },
57
+ mountConfigTui,
58
+ modelRegistry: ctx.modelRegistry,
59
+ },
60
+ });
61
+ if (exitCode !== 0) {
62
+ ctx.ui.notify(`forge:config exited with code ${exitCode}`, "warning");
63
+ }
64
+ },
65
+ });
66
+ }
67
+ //# sourceMappingURL=config-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-command.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/commands/config-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
2
+ import { extractPersonaNames } from "../lib/frontmatter-parser.js";
3
+ export { extractPersonaNames };
4
+ import { checkMaterialization, type MaterializationCheck } from "../lib/manifest-checker.js";
5
+ export { checkMaterialization, type MaterializationCheck };
6
+ export type EnhancePhase = 1 | 2 | 3;
7
+ export interface ParsedArgs {
8
+ phase: EnhancePhase;
9
+ extra: string;
10
+ rawPhaseFlag: string;
11
+ }
12
+ export declare function parseEnhanceArgs(rawArgs: string): ParsedArgs;
13
+ export interface ComposeKickoffOpts {
14
+ workflowMd: string;
15
+ personaIdentity: string;
16
+ parsed: ParsedArgs;
17
+ cwd: string;
18
+ timestamp: string;
19
+ }
20
+ export declare function composeKickoff(opts: ComposeKickoffOpts): string;
21
+ export declare function defaultNow(): Date;
22
+ export declare function formatTimestamp(d: Date): string;
23
+ export interface RegisterEnhanceOptions {
24
+ cwd?: string;
25
+ now?: () => Date;
26
+ }
27
+ /**
28
+ * Run the enhance kickoff flow in-process (kickoff-dispatch fix).
29
+ *
30
+ * pi's `sendUserMessage` deliberately bypasses extension-command dispatch —
31
+ * agent-session.ts routes it through `prompt(text, { expandPromptTemplates:
32
+ * false })`, and the slash-command branch in `prompt()` is gated on
33
+ * `expandPromptTemplates`. So steering the literal string
34
+ * "/forge:rebuild --enrich" via sendKickoff lands as PROSE in the
35
+ * conversation; the registered handler never runs and the LLM is left to
36
+ * improvise. pi also forbids queueing extension commands outright
37
+ * (steer()/followUp() throw "cannot be queued").
38
+ *
39
+ * Callers that trigger enhancement programmatically (regenerate.ts
40
+ * `--enrich`, post-init-hook.ts, post-sprint-hook.ts) MUST call this
41
+ * function directly. The composed kickoff PROSE is still handed to the LLM
42
+ * via sendKickoff at the end — that part is a legitimate steer.
43
+ */
44
+ export declare function runEnhance(pi: ExtensionAPI, args: string, ctx: ExtensionCommandContext, options?: RegisterEnhanceOptions): Promise<void>;
45
+ export declare function registerEnhance(pi: ExtensionAPI, options?: RegisterEnhanceOptions): void;
@@ -0,0 +1,219 @@
1
+ // forge:enhance — Phase-2 native kickoff handler (FORGE-S20-T04).
2
+ //
3
+ // Replaces the post-S17 sentinel-writing stub registered in forge-commands.ts.
4
+ // The handler is a thin kickoff shim per Pack-04 + Pack-06:
5
+ // 1. Reads `.forge/workflows/enhance.md` (the materialized workflow).
6
+ // 2. Verifies four Pack-06 materialization markers — refuses to dispatch on
7
+ // regression and emits a per-marker `ctx.ui.notify` so a user sees the
8
+ // cause.
9
+ // 3. Loads the persona declared in the workflow's `deps.personas:`
10
+ // frontmatter via the FORGE-S20-T02 loader (no ad-hoc fs.readFile of
11
+ // `.forge/personas/`).
12
+ // 4. Composes ONE kickoff message: persona identity, phase-specific
13
+ // dispatch instruction, the workflow body verbatim, and any free-form
14
+ // argv tail.
15
+ // 5. Hands control to the LLM via `sendKickoff(pi, text)` —
16
+ // `deliverAs: "steer"`. Never raw `pi.sendUserMessage`.
17
+ //
18
+ // Phase 2 (default) directs the LLM to read friction events ONLY through
19
+ // `forge_store_query` (Pack-06 Read/Write/Ask/Store discipline) and to write
20
+ // proposals to `engineering/enhancement-proposals/phase2-<timestamp>.md`. If
21
+ // zero friction events exist, the LLM emits a notice and writes no file.
22
+ //
23
+ // Phases 1 and 3 are forwarded with the workflow's own dispatch text.
24
+ //
25
+ // Iron Laws:
26
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
27
+ // IL4 — no JSON.stringify-into-subagent dispatch.
28
+ // IL6 — no shell-string interpolation; no spawn calls here.
29
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
30
+ // continuation.
31
+ import * as path from "node:path";
32
+ import { assertAudience } from "../audience-gate.js";
33
+ import { sendKickoff } from "../kickoff.js";
34
+ // FORGE-S25-T16: extracted to lib modules (H-1, H-2). Re-exported here for
35
+ // backward compatibility with existing test and consumer imports.
36
+ import { extractPersonaNames } from "../lib/frontmatter-parser.js";
37
+ import { loadPersona, PersonaSkillLoaderError } from "../parsers/persona-skill-loader.js";
38
+ import { loadWorkflow, WorkflowLoaderError } from "../parsers/workflow-loader.js";
39
+ export { extractPersonaNames };
40
+ import { checkMaterialization } from "../lib/manifest-checker.js";
41
+ export { checkMaterialization };
42
+ const VALID_PHASES = new Set([1, 2, 3]);
43
+ export function parseEnhanceArgs(rawArgs) {
44
+ const trimmed = (rawArgs ?? "").trim();
45
+ if (trimmed === "") {
46
+ return { phase: 2, extra: "", rawPhaseFlag: "" };
47
+ }
48
+ const tokens = trimmed.split(/\s+/);
49
+ let phase = 2;
50
+ let rawPhaseFlag = "";
51
+ const tail = [];
52
+ for (let i = 0; i < tokens.length; i++) {
53
+ const tok = tokens[i];
54
+ if (tok === "--auto") {
55
+ phase = 1;
56
+ rawPhaseFlag = "--auto";
57
+ continue;
58
+ }
59
+ if (tok === "--phase") {
60
+ const next = tokens[i + 1];
61
+ if (next === undefined) {
62
+ throw new Error("invalid --phase value: missing argument");
63
+ }
64
+ const n = Number(next);
65
+ if (!Number.isInteger(n) || !VALID_PHASES.has(n)) {
66
+ throw new Error(`invalid --phase value: ${JSON.stringify(next)} (expected 1, 2, or 3)`);
67
+ }
68
+ phase = n;
69
+ rawPhaseFlag = `--phase ${next}`;
70
+ i += 1;
71
+ continue;
72
+ }
73
+ const eqMatch = /^--phase=(.+)$/.exec(tok);
74
+ if (eqMatch) {
75
+ const n = Number(eqMatch[1]);
76
+ if (!Number.isInteger(n) || !VALID_PHASES.has(n)) {
77
+ throw new Error(`invalid --phase value: ${JSON.stringify(eqMatch[1])} (expected 1, 2, or 3)`);
78
+ }
79
+ phase = n;
80
+ rawPhaseFlag = tok;
81
+ continue;
82
+ }
83
+ tail.push(tok);
84
+ }
85
+ return { phase, extra: tail.join(" "), rawPhaseFlag };
86
+ }
87
+ export function composeKickoff(opts) {
88
+ const { workflowMd, personaIdentity, parsed, timestamp } = opts;
89
+ const sections = [`# /forge:enhance --phase ${parsed.phase}`, ""];
90
+ if (personaIdentity.trim().length > 0) {
91
+ sections.push(personaIdentity.trim(), "");
92
+ }
93
+ if (parsed.phase === 2) {
94
+ const proposalRel = path.posix.join("engineering", "enhancement-proposals", `phase2-${timestamp}.md`);
95
+ sections.push("## Dispatch — Phase 2 (post-sprint propose-diffs)", "", "Run the workflow below. Specifically:", "", "1. Discover friction events. **Preferred**: `forge_store_query` with `{command:'nlp', args:['events where type=friction']}`. **If that returns zero or a suspiciously low count** (the underlying NLP engine uses keyword heuristics that can miss events), **fall back to the workflow body's filesystem walk** (`meta-enhance.md` Step 1's JS one-liner: read `.forge/store/events/**/*.json`, filter `e => e && e.type === 'friction'`). The fs-walk filter is the source of truth on `type`; the MCP query is a convenience layer over it. Use whichever surfaces the events.", `2. If at least one friction event is present (from either path), synthesize concrete enrichment proposals per the workflow's Phase 2 algorithm, then write them via the \`write\` tool to \`${proposalRel}\` (one section per proposed change, with a fenced diff block showing before/after).`, "3. If genuinely zero friction events are present (both the MCP query AND the fs-walk return empty), emit an explicit notice — `〇 no friction events present — Phase 2 produces no proposals` — and write NO proposal file. Empty artifacts are not acceptable.", "4. Honour the Pack-06 Read/Write/Ask/Store discipline: store writes go via the `forge_store` MCP tool with `{command:'write', args:['<entity>','<json>']}` (2-positional, id INSIDE json); never raw-write `.forge/store/`. Do NOT bash-shell `forge store ...`.", "5. **VERIFY after apply — MANDATORY (forge-cli#31)**: After applying enhancement edits via Edit/Write, BEFORE calling add-snapshot, you MUST call `forge_verify_apply` with the list of claimed file paths. The tool runs `generation-manifest check` on each and returns four buckets: `modified` (verified ✓), `unchanged` (your Edit silently no-op'd — usually an `old_string` whitespace/punctuation mismatch), `untracked` (no manifest entry — treat as potentially modified), `missing` (file gone). **If `unchanged.length > 0`**, you MUST re-apply those edits via Edit/Write and call `forge_verify_apply` again — repeat until `unchanged` is empty. **Do NOT proceed to add-snapshot until every claimed file is in `modified` or `untracked`.** This guard exists because agents historically claim 'Files Modified' in their UI reports while the actual disk content is unchanged; without it the next `/forge:regenerate` overwrites stale state and replay restores nothing.", '6. **Snapshot after verify (forge#107 / forge-cli#30)**: Once `forge_verify_apply` reports no `unchanged` files, MUST call `manage-versions add-snapshot` via bash to capture the verified edits into `.forge/archive/snap-N/`. Without this, the next `/forge:regenerate` cannot restore via replay. Format:\n ```sh\n node "$FORGE_ROOT/tools/manage-versions.cjs" add-snapshot --source post-sprint:<SPRINT_ID> --enhanced-elements "<comma-separated paths, e.g. .forge/personas/architect.md,.forge/skills/engineer-skills.md>"\n ```\n `$FORGE_ROOT` is exported into the bash environment — see the orientation block above for its resolved value. After add-snapshot, verify success by checking `.forge/structure-versions.json`\'s `currentSnapshot` advanced and `ls .forge/archive/snap-N/` is non-empty.');
96
+ }
97
+ else if (parsed.phase === 1) {
98
+ sections.push("## Dispatch — Phase 1 (post-init auto-apply placeholder fills)", "", "Run the workflow's Phase 1 algorithm verbatim. Apply only high-confidence placeholder fills; list low-confidence keys without substituting.");
99
+ }
100
+ else {
101
+ sections.push("## Dispatch — Phase 3 (drift detection)", "", "Run the workflow's Phase 3 algorithm verbatim. Compare codebase state against structural-element knowledge and write the drift report to `.forge/enhancement-proposals/phase3-<timestamp>.md`.");
102
+ }
103
+ sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
104
+ if (parsed.extra.trim().length > 0) {
105
+ sections.push("", "## Additional context", "", parsed.extra.trim());
106
+ }
107
+ return sections.join("\n");
108
+ }
109
+ // Timestamp helper ---------------------------------------------------------
110
+ export function defaultNow() {
111
+ return new Date();
112
+ }
113
+ export function formatTimestamp(d) {
114
+ const pad = (n, w = 2) => String(n).padStart(w, "0");
115
+ return (`${d.getUTCFullYear()}${pad(d.getUTCMonth() + 1)}${pad(d.getUTCDate())}` +
116
+ "T" +
117
+ `${pad(d.getUTCHours())}${pad(d.getUTCMinutes())}${pad(d.getUTCSeconds())}Z`);
118
+ }
119
+ // Registration -------------------------------------------------------------
120
+ const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "enhance.md");
121
+ /**
122
+ * Run the enhance kickoff flow in-process (kickoff-dispatch fix).
123
+ *
124
+ * pi's `sendUserMessage` deliberately bypasses extension-command dispatch —
125
+ * agent-session.ts routes it through `prompt(text, { expandPromptTemplates:
126
+ * false })`, and the slash-command branch in `prompt()` is gated on
127
+ * `expandPromptTemplates`. So steering the literal string
128
+ * "/forge:rebuild --enrich" via sendKickoff lands as PROSE in the
129
+ * conversation; the registered handler never runs and the LLM is left to
130
+ * improvise. pi also forbids queueing extension commands outright
131
+ * (steer()/followUp() throw "cannot be queued").
132
+ *
133
+ * Callers that trigger enhancement programmatically (regenerate.ts
134
+ * `--enrich`, post-init-hook.ts, post-sprint-hook.ts) MUST call this
135
+ * function directly. The composed kickoff PROSE is still handed to the LLM
136
+ * via sendKickoff at the end — that part is a legitimate steer.
137
+ */
138
+ export async function runEnhance(pi, args, ctx, options = {}) {
139
+ const cwd = options.cwd ?? process.cwd();
140
+ const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
141
+ let workflowMd;
142
+ let workflowAudience;
143
+ try {
144
+ const loaded = loadWorkflow(workflowPath);
145
+ workflowMd = loaded.rawMarkdown;
146
+ workflowAudience = loaded.audience;
147
+ }
148
+ catch (err) {
149
+ if (err instanceof WorkflowLoaderError) {
150
+ if (err.code === "missing_file") {
151
+ ctx.ui.notify(`× forge:enhance — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
152
+ }
153
+ else {
154
+ ctx.ui.notify(`× forge:enhance — workflow load failed (${err.code}): ${err.message}`, "error");
155
+ }
156
+ return;
157
+ }
158
+ const e = err;
159
+ ctx.ui.notify(`× forge:enhance — failed to read workflow: ${e.message ?? "unknown"}`, "error");
160
+ return;
161
+ }
162
+ let parsed;
163
+ try {
164
+ parsed = parseEnhanceArgs(args);
165
+ }
166
+ catch (err) {
167
+ const e = err;
168
+ ctx.ui.notify(`× forge:enhance — ${e.message ?? "argv parse failed"}`, "error");
169
+ return;
170
+ }
171
+ const check = checkMaterialization(workflowPath, workflowMd);
172
+ if (!check.ok) {
173
+ for (const marker of check.missing) {
174
+ ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
175
+ }
176
+ return;
177
+ }
178
+ const personas = extractPersonaNames(workflowMd);
179
+ let personaIdentity = "";
180
+ if (personas.length > 0) {
181
+ try {
182
+ const persona = loadPersona(personas[0], { cwd });
183
+ personaIdentity = persona.identity;
184
+ }
185
+ catch (err) {
186
+ if (err instanceof PersonaSkillLoaderError) {
187
+ ctx.ui.notify(`× forge:enhance — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
188
+ return;
189
+ }
190
+ const e = err;
191
+ ctx.ui.notify(`× forge:enhance — persona load error: ${e.message ?? "unknown"}`, "error");
192
+ return;
193
+ }
194
+ }
195
+ if (!assertAudience({ workflowName: "enhance", audience: workflowAudience }, ctx)) {
196
+ return;
197
+ }
198
+ const now = options.now ?? defaultNow;
199
+ const timestamp = formatTimestamp(now());
200
+ const kickoff = composeKickoff({
201
+ workflowMd,
202
+ personaIdentity,
203
+ parsed,
204
+ cwd,
205
+ timestamp,
206
+ });
207
+ sendKickoff(pi, kickoff);
208
+ }
209
+ export function registerEnhance(pi, options = {}) {
210
+ pi.registerCommand("forge:enhance", {
211
+ description: "Progressive project-specific enrichment of structural elements. " +
212
+ "Usage: /forge:enhance [--phase 1|2|3 | --auto] [free-form context]. " +
213
+ "Default phase: 2 (post-sprint propose-diffs).",
214
+ async handler(args, ctx) {
215
+ await runEnhance(pi, args, ctx, options);
216
+ },
217
+ });
218
+ }
219
+ //# sourceMappingURL=enhance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhance.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/commands/enhance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import { extractPersonaNames } from "../lib/frontmatter-parser.js";
3
+ export { extractPersonaNames };
4
+ import { checkMaterialization, type MaterializationCheck } from "../lib/manifest-checker.js";
5
+ export { checkMaterialization, type MaterializationCheck };
6
+ export type ArgMode = "empty" | "file" | "text";
7
+ export interface ParsedArgs {
8
+ mode: ArgMode;
9
+ taskRef: string;
10
+ sourceLabel: string;
11
+ }
12
+ export declare function parseImplementArgs(rawArgs: string, cwd: string): ParsedArgs;
13
+ export interface ComposeKickoffOpts {
14
+ workflowMd: string;
15
+ personaIdentity: string;
16
+ parsed: ParsedArgs;
17
+ }
18
+ export declare function composeKickoff(opts: ComposeKickoffOpts): string;
19
+ export interface RegisterImplementOptions {
20
+ cwd?: string;
21
+ }
22
+ export declare function registerImplement(pi: ExtensionAPI, options?: RegisterImplementOptions): void;