@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,152 @@
1
+ // task-verdict-loop.ts — review-phase verdict + revision/loopback handling
2
+ // for the run-task pipeline. Extracted VERBATIM from run-task.ts's phase loop
3
+ // (FORGE-S31 file-size refactor) as a pure decision function: it performs the
4
+ // same store reads, ctx.ui notifications, state writes, transcript records,
5
+ // tree-node finalization, and halt-advisor dispatch the inline block did, and
6
+ // returns a small discriminated result the caller's loop switches on.
7
+ //
8
+ // Behavior-preserving: no logic changes. The only structural change is that the
9
+ // inline `return {...}` paths now return `{ kind: "return"; result }`, the
10
+ // `continue` path returns `{ kind: "loopback"; toIndex }`, and the fall-through
11
+ // (approved) path returns `{ kind: "advance" }`.
12
+ import { resolveAdvisorModel, runHaltAdvisor } from "../halt-advisor.js";
13
+ import { recoverPhaseSummary } from "../common/summary-recovery.js";
14
+ import { findPredecessorIndex } from "./task-body.js";
15
+ import { PHASES, SUMMARY_KEY_BY_ROLE } from "./task-phases.js";
16
+ import { readVerdict } from "./task-record.js";
17
+ import { writeState } from "./task-state.js";
18
+ /**
19
+ * Evaluate the review-phase verdict and decide the loop's next move.
20
+ * Mirrors the inline block that previously lived in runTaskPipelineInner.
21
+ */
22
+ export function handleReviewVerdict(p) {
23
+ const { phase, taskId, storeCli, cwd, forgeRoot, iterationCounts, currentPhaseIndex, modelRoutingConfig, ctx } = p;
24
+ const { orchTranscript, finishPhaseNode, recoveredPhases } = p;
25
+ let verdict = readVerdict(taskId, phase.role, storeCli, cwd);
26
+ // Completion recovery (forge-engineering#41): a clean stop with no verdict in
27
+ // the store is most often the subagent writing the {PHASE}-SUMMARY.json
28
+ // sidecar but eliding the set-summary that registers it. Register the sidecar
29
+ // ourselves (once per phase), then re-read. Phases whose verdict comes from
30
+ // task.status (approve → summaryKey null) are not recoverable this way.
31
+ if (verdict === "missing") {
32
+ const summaryKey = SUMMARY_KEY_BY_ROLE[phase.role];
33
+ if (summaryKey && !recoveredPhases.has(phase.role)) {
34
+ recoveredPhases.add(phase.role);
35
+ const rec = recoverPhaseSummary({ storeCli, entityId: taskId, summaryKey, cwd });
36
+ if (rec.ok) {
37
+ const recheck = readVerdict(taskId, phase.role, storeCli, cwd);
38
+ if (recheck !== "missing") {
39
+ ctx.ui.notify(`⟳ forge:run-task — ${phase.role}: subagent skipped set-summary; orchestrator registered ` +
40
+ `the '${summaryKey}' sidecar and the verdict is now present.`, "info");
41
+ verdict = recheck;
42
+ }
43
+ }
44
+ }
45
+ }
46
+ // Surface the resolved verdict on the dashboard (mirrored to the root node).
47
+ ctx.ui.notify(` verdict: ${phase.role} → ${verdict === "approved" ? "〇 approved" : verdict === "revision" ? "⟳ revision" : `× ${verdict}`}`, verdict === "approved" || verdict === "revision" ? "info" : "error");
48
+ if (verdict === "missing") {
49
+ ctx.ui.notify(`× forge:run-task — verdict missing for phase ${phase.role} after subagent completed. ` +
50
+ "Subagent may have crashed or failed to write summaries. Halting for advisory.", "error");
51
+ finishPhaseNode("failed");
52
+ writeState(cwd, {
53
+ taskId,
54
+ phaseIndex: currentPhaseIndex,
55
+ iterationCounts,
56
+ halted: true,
57
+ lastError: `verdict missing for ${phase.role}`,
58
+ savedAt: new Date().toISOString(),
59
+ });
60
+ // A missing verdict IS a postflight-outputs failure: the canonical
61
+ // phase summary the subagent must write (e.g. summaries.code_review)
62
+ // was never recorded, so there is no verdict to route on. review-phase
63
+ // workflows declare no `outputs` block, so runPostflightGate is a
64
+ // pass-through here — this readVerdict check is the effective gate.
65
+ // Route it through the halt-recovery advisor (FORGE-S26-T18), the same
66
+ // hand-off the postflight-gate-unsatisfied branch uses, instead of a
67
+ // bare escalation — so the strongest configured model can diagnose the
68
+ // missing-summary cause. Best-effort, non-fatal (FORGE-S26-T19 parity).
69
+ const gateFailure = {
70
+ phase: phase.role,
71
+ reasonCode: "verdict-missing",
72
+ detail: `Phase '${phase.role}' completed but no verdict was found in the store. ` +
73
+ "The canonical phase summary was not written, so the orchestrator has no verdict to route on.",
74
+ remediation: "Re-run the phase and ensure the subagent's forge_store set-summary call " +
75
+ 'uses args:["<recordId>", "<phaseKey>"] with the literal phase key as args[1] ' +
76
+ "(e.g. code_review), and that the call exits zero before the subagent returns.",
77
+ };
78
+ const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
79
+ void runHaltAdvisor({
80
+ gateFailure,
81
+ advisorModel,
82
+ taskId,
83
+ cwd,
84
+ ctx: { ui: ctx.ui },
85
+ forgeRoot,
86
+ });
87
+ return {
88
+ kind: "return",
89
+ result: {
90
+ status: "halted",
91
+ lastPhaseIndex: currentPhaseIndex,
92
+ iterationCounts,
93
+ lastError: `verdict missing for ${phase.role}`,
94
+ },
95
+ };
96
+ }
97
+ if (verdict === "revision") {
98
+ // Increment iteration count for this review phase
99
+ iterationCounts[phase.role] = (iterationCounts[phase.role] ?? 0) + 1;
100
+ if (iterationCounts[phase.role] >= phase.maxIterations) {
101
+ ctx.ui.notify(`× forge:run-task — revision cap reached for phase ${phase.role} ` +
102
+ `(${iterationCounts[phase.role]}/${phase.maxIterations} iterations). Escalating.`, "error");
103
+ finishPhaseNode("escalated");
104
+ writeState(cwd, {
105
+ taskId,
106
+ phaseIndex: currentPhaseIndex,
107
+ iterationCounts,
108
+ halted: true,
109
+ lastError: `revision cap reached for ${phase.role}`,
110
+ savedAt: new Date().toISOString(),
111
+ });
112
+ return {
113
+ kind: "return",
114
+ result: {
115
+ status: "escalated",
116
+ lastPhaseIndex: currentPhaseIndex,
117
+ iterationCounts,
118
+ lastError: `revision cap reached for ${phase.role}`,
119
+ },
120
+ };
121
+ }
122
+ // Loop back to predecessor non-review phase. The review
123
+ // subagent itself finished cleanly — `revision` is its verdict,
124
+ // not a failure — so its node closes as completed before the
125
+ // predecessor re-dispatches under a fresh node ID.
126
+ finishPhaseNode("completed");
127
+ const predIndex = findPredecessorIndex(PHASES, currentPhaseIndex);
128
+ ctx.ui.notify(`⟳ forge:run-task — ${phase.role} returned revision; looping to ${PHASES[predIndex]?.role ?? predIndex} ` +
129
+ `(attempt ${iterationCounts[phase.role]}/${phase.maxIterations})`, "info");
130
+ orchTranscript.record({
131
+ kind: "phase-loopback",
132
+ ts: new Date().toISOString(),
133
+ fromPhase: phase.role,
134
+ toPhase: PHASES[predIndex]?.role ?? String(predIndex),
135
+ fromPhaseIndex: currentPhaseIndex,
136
+ toPhaseIndex: predIndex,
137
+ reason: `${phase.role} returned revision (attempt ${iterationCounts[phase.role]}/${phase.maxIterations})`,
138
+ });
139
+ // Write intermediate state (not halted — still running)
140
+ writeState(cwd, {
141
+ taskId,
142
+ phaseIndex: predIndex,
143
+ iterationCounts,
144
+ halted: false,
145
+ savedAt: new Date().toISOString(),
146
+ });
147
+ return { kind: "loopback", toIndex: predIndex };
148
+ }
149
+ // verdict === "approved": advance
150
+ return { kind: "advance" };
151
+ }
152
+ //# sourceMappingURL=task-verdict-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-verdict-loop.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/task/task-verdict-loop.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 parsePlanArgs(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 RegisterPlanOptions {
20
+ cwd?: string;
21
+ }
22
+ export declare function registerPlan(pi: ExtensionAPI, options?: RegisterPlanOptions): void;
@@ -0,0 +1,167 @@
1
+ // forge:plan — native kickoff handler (FORGE-S20-T05).
2
+ //
3
+ // Replaces the auto-generated stub previously installed by
4
+ // registerAllForgeCommands (forge-commands.ts). Like S19 sprint-intake and
5
+ // FORGE-S20-T04 enhance, this is a Kickoff Shim (Pack-04 + Pack-06):
6
+ // 1. Reads `.forge/workflows/plan_task.md` (the materialized workflow).
7
+ // 2. Verifies four Pack-06 materialization markers — refuses to dispatch on
8
+ // regression and emits a per-marker `ctx.ui.notify` so a user sees the
9
+ // cause.
10
+ // 3. Loads the persona declared in the workflow's `deps.personas:`
11
+ // frontmatter via the FORGE-S20-T02 loader (no ad-hoc fs.readFile of
12
+ // `.forge/personas/`).
13
+ // 4. Composes ONE kickoff message: persona identity, dispatch instructions
14
+ // (read TASK_PROMPT.md, follow workflow, write PLAN.md/PLAN-SUMMARY.json,
15
+ // forge_store-driven status updates), the workflow body verbatim, and
16
+ // argv as @<path> file ref or free-form text.
17
+ // 5. Hands control to the LLM via `sendKickoff(pi, text)` —
18
+ // `deliverAs: "steer"`. Never raw `pi.sendUserMessage`.
19
+ //
20
+ // Per FORGE-S20 SPRINT_REQUIREMENTS Constraints and T05 AC#4: the
21
+ // prompt-injection fallback is DELETED — no FORGE_LEGACY_KICKOFF flag, no
22
+ // markdown-stub for this command.
23
+ //
24
+ // FORGE-S26-T11: pipeline step guard added. Checks task status via store-cli
25
+ // before dispatching. --force flag bypasses the guard.
26
+ //
27
+ // Iron Laws:
28
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
29
+ // IL4 — no JSON.stringify-into-subagent dispatch.
30
+ // IL6 — no shell-string interpolation; no spawn calls here.
31
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
32
+ // continuation.
33
+ import * as fs from "node:fs";
34
+ import * as path from "node:path";
35
+ import { assertAudience } from "./audience-gate.js";
36
+ import { discoverForgeConfig } from "./forge-root.js";
37
+ import { sendKickoff } from "./kickoff.js";
38
+ // FORGE-S25-T16: extracted to lib modules. Re-exported here for backward compat
39
+ // (plan.test.ts, bundled-base-pack-markers.test.ts, run-task.ts, run-sprint.ts,
40
+ // fix-bug.ts all import checkMaterialization / extractPersonaNames from plan.js).
41
+ import { extractPersonaNames } from "./lib/frontmatter-parser.js";
42
+ import { parseGuardArgs, runPipelineGuard } from "./lib/pipeline-guard.js";
43
+ import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
44
+ import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
45
+ export { extractPersonaNames };
46
+ import { checkMaterialization } from "./lib/manifest-checker.js";
47
+ export { checkMaterialization };
48
+ export function parsePlanArgs(rawArgs, cwd) {
49
+ const trimmed = (rawArgs ?? "").trim();
50
+ if (trimmed === "") {
51
+ return { mode: "empty", taskRef: "", sourceLabel: "(no input — engineer infers task from store/context)" };
52
+ }
53
+ if (trimmed.startsWith("@")) {
54
+ const ref = trimmed.slice(1).trim();
55
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
56
+ const seed = fs.readFileSync(filePath, "utf8");
57
+ return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
58
+ }
59
+ return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
60
+ }
61
+ export function composeKickoff(opts) {
62
+ const { workflowMd, personaIdentity, parsed } = opts;
63
+ const sections = ["# /forge:plan", ""];
64
+ if (personaIdentity.trim().length > 0) {
65
+ sections.push(personaIdentity.trim(), "");
66
+ }
67
+ sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the task prompt at `engineering/sprints/<SPRINT_ID>/<TASK_ID>/TASK_PROMPT.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: load context, research, plan, knowledge writeback, finalize.", "4. Write `PLAN.md` and `PLAN-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','<new-status>']}`. 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 (canonical 2-positional write: `args:['<entity>','<json>']`, id INSIDE json); in-conversation clarifications use `forge_ask_user`.");
68
+ sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
69
+ if (parsed.mode === "empty") {
70
+ sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
71
+ }
72
+ else {
73
+ sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
74
+ }
75
+ return sections.join("\n");
76
+ }
77
+ // Registration -------------------------------------------------------------
78
+ const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "plan_task.md");
79
+ export function registerPlan(pi, options = {}) {
80
+ pi.registerCommand("forge:plan", {
81
+ description: "Run the plan-task workflow for a Forge task. " +
82
+ "Usage: /forge:plan [@<file> | <free-form text>]. " +
83
+ "Empty args → engineer infers the task from sprint/store context.",
84
+ async handler(args, ctx) {
85
+ const cwd = options.cwd ?? process.cwd();
86
+ const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
87
+ // Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
88
+ const guardParsed = parseGuardArgs(args);
89
+ if (!guardParsed.force) {
90
+ const forgeConfig = discoverForgeConfig(cwd);
91
+ if (forgeConfig) {
92
+ const guard = runPipelineGuard("plan", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
93
+ if (guard.blocked) {
94
+ ctx.ui.notify(guard.message, "error");
95
+ return;
96
+ }
97
+ }
98
+ }
99
+ // Use cleanArgs (--force stripped) for workflow dispatch
100
+ const effectiveArgs = guardParsed.cleanArgs;
101
+ let workflowMd;
102
+ let workflowAudience;
103
+ try {
104
+ const loaded = loadWorkflow(workflowPath);
105
+ workflowMd = loaded.rawMarkdown;
106
+ workflowAudience = loaded.audience;
107
+ }
108
+ catch (err) {
109
+ if (err instanceof WorkflowLoaderError) {
110
+ if (err.code === "missing_file") {
111
+ ctx.ui.notify(`× forge:plan — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
112
+ }
113
+ else {
114
+ ctx.ui.notify(`× forge:plan — workflow load failed (${err.code}): ${err.message}`, "error");
115
+ }
116
+ return;
117
+ }
118
+ const e = err;
119
+ ctx.ui.notify(`× forge:plan — failed to read workflow: ${e.message ?? "unknown"}`, "error");
120
+ return;
121
+ }
122
+ let parsed;
123
+ try {
124
+ parsed = parsePlanArgs(effectiveArgs, cwd);
125
+ }
126
+ catch (err) {
127
+ const e = err;
128
+ ctx.ui.notify(`× forge:plan — failed to read seed: ${e.message ?? "unknown"}`, "error");
129
+ return;
130
+ }
131
+ const check = checkMaterialization(workflowPath, workflowMd);
132
+ if (!check.ok) {
133
+ for (const marker of check.missing) {
134
+ ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
135
+ }
136
+ return;
137
+ }
138
+ const personas = extractPersonaNames(workflowMd);
139
+ let personaIdentity = "";
140
+ if (personas.length > 0) {
141
+ try {
142
+ const persona = loadPersona(personas[0], { cwd });
143
+ personaIdentity = persona.identity;
144
+ }
145
+ catch (err) {
146
+ if (err instanceof PersonaSkillLoaderError) {
147
+ ctx.ui.notify(`× forge:plan — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
148
+ return;
149
+ }
150
+ const e = err;
151
+ ctx.ui.notify(`× forge:plan — persona load error: ${e.message ?? "unknown"}`, "error");
152
+ return;
153
+ }
154
+ }
155
+ if (!assertAudience({ workflowName: "plan_task", audience: workflowAudience }, ctx)) {
156
+ return;
157
+ }
158
+ const kickoff = composeKickoff({
159
+ workflowMd,
160
+ personaIdentity,
161
+ parsed,
162
+ });
163
+ sendKickoff(pi, kickoff);
164
+ },
165
+ });
166
+ }
167
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export interface ParsedQuizAgentArgs {
3
+ mode: "empty" | "file" | "text";
4
+ topicSeed: string;
5
+ sourceLabel: string;
6
+ }
7
+ export declare function parseQuizAgentArgs(rawArgs: string, cwd: string): ParsedQuizAgentArgs;
8
+ export interface ComposeQuizAgentKickoffOpts {
9
+ commandMd: string;
10
+ parsed: ParsedQuizAgentArgs;
11
+ }
12
+ export declare function composeQuizAgentKickoff(opts: ComposeQuizAgentKickoffOpts): string;
13
+ export interface RegisterQuizAgentOptions {
14
+ forgeRoot: string | null;
15
+ cwd?: string;
16
+ }
17
+ export declare function registerQuizAgent(pi: ExtensionAPI, options: RegisterQuizAgentOptions): void;
@@ -0,0 +1,98 @@
1
+ // forge:quiz-agent — 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
+ // Ultra-thin shim: reads commands/quiz-agent.md and dispatches.
8
+ // Optional topic seed or @<file> narrows the quiz scope.
9
+ //
10
+ // Workflow source: <forgeRoot>/commands/quiz-agent.md (command file).
11
+ // Note: quiz_agent.md also exists in .forge/workflows/ but lacks 3 of
12
+ // 4 Pack-06 markers. Using the command file for consistency with the
13
+ // other 5 handlers in this batch. Follow-up task can upgrade to read
14
+ // from .forge/workflows/quiz_agent.md when it has all markers.
15
+ //
16
+ // File-existence check only — command files lack Pack-06 workflow markers.
17
+ //
18
+ // Iron Laws:
19
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
20
+ // IL4 — no JSON.stringify-into-subagent dispatch.
21
+ // IL6 — no shell-string interpolation; no spawn calls here.
22
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
23
+ // continuation.
24
+ import * as fs from "node:fs";
25
+ import * as path from "node:path";
26
+ import { sendKickoff } from "./kickoff.js";
27
+ export function parseQuizAgentArgs(rawArgs, cwd) {
28
+ const trimmed = (rawArgs ?? "").trim();
29
+ if (!trimmed) {
30
+ return { mode: "empty", topicSeed: "", sourceLabel: "(no topic — full KB quiz)" };
31
+ }
32
+ if (trimmed.startsWith("@")) {
33
+ const ref = trimmed.slice(1).trim();
34
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
35
+ const topicSeed = fs.readFileSync(filePath, "utf8");
36
+ return { mode: "file", topicSeed, sourceLabel: `(topic from file: ${ref})` };
37
+ }
38
+ return { mode: "text", topicSeed: trimmed, sourceLabel: "(topic from inline text)" };
39
+ }
40
+ export function composeQuizAgentKickoff(opts) {
41
+ const { commandMd, parsed } = opts;
42
+ const sections = ["# /forge:check-agent", ""];
43
+ sections.push("## Dispatch", "");
44
+ sections.push("Run the quiz-agent workflow below to verify this agent has read and understood the project knowledge base. " +
45
+ "Ask factual questions about the project's architecture, entity model, and sprint conventions — do not accept vague answers. " +
46
+ "Report pass/fail with specific evidence.");
47
+ sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
48
+ if (parsed.mode === "empty") {
49
+ sections.push("", "## Topic", "", "(no topic specified — quiz the full KB scope)");
50
+ }
51
+ else {
52
+ sections.push("", `## Topic — ${parsed.sourceLabel}`, "", parsed.topicSeed.trim());
53
+ }
54
+ return sections.join("\n");
55
+ }
56
+ // ── Registration ──────────────────────────────────────────────────────────
57
+ const COMMAND_NAME = "quiz-agent";
58
+ export function registerQuizAgent(pi, options) {
59
+ pi.registerCommand("forge:check-agent", {
60
+ description: "Verify an agent has loaded and understood the project knowledge base — run a short factual quiz. " +
61
+ "Usage: /forge:check-agent [@<file> | <topic>]. Empty args run a full KB quiz.",
62
+ async handler(args, ctx) {
63
+ const { forgeRoot } = options;
64
+ const cwd = options.cwd ?? process.cwd();
65
+ if (!forgeRoot) {
66
+ ctx.ui.notify("× forge:check-agent — no Forge project at cwd; run /forge:init to bootstrap", "warning");
67
+ return;
68
+ }
69
+ const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
70
+ let commandMd;
71
+ try {
72
+ commandMd = fs.readFileSync(commandPath, "utf8");
73
+ }
74
+ catch (err) {
75
+ const e = err;
76
+ if (e.code === "ENOENT") {
77
+ ctx.ui.notify(`× forge:check-agent — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
78
+ }
79
+ else {
80
+ ctx.ui.notify(`× forge:check-agent — failed to read command file: ${e.message ?? "unknown error"}`, "error");
81
+ }
82
+ return;
83
+ }
84
+ let parsed;
85
+ try {
86
+ parsed = parseQuizAgentArgs(args, cwd);
87
+ }
88
+ catch (err) {
89
+ const e = err;
90
+ ctx.ui.notify(`× forge:check-agent — failed to parse args: ${e.message ?? "unknown"}`, "error");
91
+ return;
92
+ }
93
+ const kickoff = composeQuizAgentKickoff({ commandMd, parsed });
94
+ sendKickoff(pi, kickoff);
95
+ },
96
+ });
97
+ }
98
+ //# sourceMappingURL=quiz-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz-agent.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/quiz-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export declare function registerReadCommand(pi: ExtensionAPI, forgeRoot: string | null): void;
@@ -0,0 +1,100 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { startReviewServer } from "./review-server.js";
4
+ import { resolveEntityRef, resolveToolDir } from "./store-resolver.js";
5
+ function isNonInteractive() {
6
+ return process.env.FORGE_YES === "1" || process.env.FORGE_NON_INTERACTIVE === "1";
7
+ }
8
+ export function registerReadCommand(pi, forgeRoot) {
9
+ pi.registerCommand("forge:read", {
10
+ description: "Review a Forge artifact in the browser and provide inline feedback",
11
+ async handler(args, ctx) {
12
+ if (!forgeRoot) {
13
+ ctx.ui.notify("forge:read — no Forge project at cwd; run /forge:init to bootstrap", "warning");
14
+ return;
15
+ }
16
+ if (isNonInteractive()) {
17
+ ctx.ui.notify("forge:read requires interactive mode (browser review). Unset FORGE_YES/FORGE_NON_INTERACTIVE.", "error");
18
+ return;
19
+ }
20
+ const arg = args.trim();
21
+ if (!arg) {
22
+ ctx.ui.notify("Usage: /forge:read <task-id|sprint-id|@path|natural language>\n" +
23
+ "Examples: /forge:read S01-T01 | /forge:read S01 | " +
24
+ "/forge:read @engineering/sprints/HELLO-S01/HELLO-S01-T01 | " +
25
+ "/forge:read the i18n task", "error");
26
+ return;
27
+ }
28
+ const toolDir = resolveToolDir(forgeRoot);
29
+ const resolved = await resolveEntityRef(arg, toolDir, ctx.cwd, {
30
+ ctx,
31
+ statusLabel: "forge:read",
32
+ }).catch((err) => {
33
+ ctx.ui.setStatus("forge:read", undefined);
34
+ ctx.ui.notify(`Store query failed: ${err.message}`, "error");
35
+ return null;
36
+ });
37
+ if (!resolved)
38
+ return;
39
+ let taskDir;
40
+ let label;
41
+ if ("dir" in resolved) {
42
+ taskDir = resolved.dir;
43
+ label = path.basename(taskDir);
44
+ }
45
+ else {
46
+ const item = resolved.item;
47
+ if (!item.fileRefs?.md) {
48
+ ctx.ui.notify(`No markdown index found for ${item.id}`, "error");
49
+ return;
50
+ }
51
+ taskDir = path.dirname(path.join(ctx.cwd, item.fileRefs.md));
52
+ label = `${item.id} — ${item.title}`;
53
+ ctx.ui.notify(`Resolved to ${item.type}: ${item.id} (${item.title})`, "info");
54
+ }
55
+ let files;
56
+ try {
57
+ files = await fs.readdir(taskDir);
58
+ }
59
+ catch {
60
+ ctx.ui.notify(`No artifacts found at ${taskDir}`, "warning");
61
+ return;
62
+ }
63
+ const mdFiles = files.filter((f) => f.endsWith(".md"));
64
+ if (mdFiles.length === 0) {
65
+ ctx.ui.notify(`No markdown artifacts found at ${taskDir}`, "info");
66
+ return;
67
+ }
68
+ const selectedFile = await ctx.ui.select(`Select artifact to review for ${label}:`, mdFiles);
69
+ if (!selectedFile)
70
+ return;
71
+ const artifactPath = path.join(taskDir, selectedFile);
72
+ ctx.ui.notify(`Starting local review server for ${selectedFile}…`, "info");
73
+ ctx.ui.setStatus("forge:read", "Waiting for browser review…");
74
+ try {
75
+ const feedback = await startReviewServer(artifactPath, `${label} — ${selectedFile}`);
76
+ ctx.ui.setStatus("forge:read", undefined);
77
+ if (feedback && feedback.length > 0) {
78
+ ctx.ui.notify(`Received ${feedback.length} feedback item(s). Sending to Forge…`, "info");
79
+ const itemType = "item" in resolved ? resolved.item.type : "artifact";
80
+ const itemId = "item" in resolved ? resolved.item.id : label;
81
+ let promptText = `I have reviewed the artifact \`${selectedFile}\` for ${itemType} ${itemId}. Here is my inline feedback:\n\n`;
82
+ for (const fb of feedback) {
83
+ promptText += `> **Text:** "${fb.selectedText}"\n`;
84
+ promptText += `> **Feedback:** ${fb.comment}\n\n`;
85
+ }
86
+ promptText += `Please process this feedback and update the artifact accordingly.`;
87
+ pi.sendUserMessage(promptText, { deliverAs: "steer" });
88
+ }
89
+ else {
90
+ ctx.ui.notify("Review completed with no feedback submitted.", "info");
91
+ }
92
+ }
93
+ catch (err) {
94
+ ctx.ui.setStatus("forge:read", undefined);
95
+ ctx.ui.notify(`forge:read error: ${err.message}`, "error");
96
+ }
97
+ },
98
+ });
99
+ }
100
+ //# sourceMappingURL=read-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-command.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/read-command.ts"],"names":[],"mappings":"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"}