@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,494 @@
1
+ // run-task-pipeline.ts — the per-task orchestrator pipeline (runTaskPipeline
2
+ // thin wrapper + runTaskPipelineInner phase loop). Extracted VERBATIM from
3
+ // run-task.ts (FORGE-S31 file-size refactor); the only logic-neutral change is
4
+ // that the review-phase verdict block is delegated to handleReviewVerdict in
5
+ // task-verdict-loop.ts and the loop switches on its discriminated result.
6
+ //
7
+ // Iron Laws enforced here:
8
+ // IL6 — no shell-string interpolation; all external calls via spawnSync argv arrays
9
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent continuation
10
+ // IL10 — ALL LLM dispatch goes through runForgeSubagent (NO sendKickoff calls here)
11
+ //
12
+ // sendKickoff is NEVER called from this file.
13
+ import * as fs from "node:fs";
14
+ import * as path from "node:path";
15
+ import { assertAudience, CallerContextStore } from "../../audience-gate.js";
16
+ import { resolveAdvisorModel, runHaltAdvisor } from "../halt-advisor.js";
17
+ import { checkMaterialization } from "../../lib/manifest-checker.js";
18
+ import { runRefreshKbLinks } from "../../refresh-kb-links.js";
19
+ import { createOrchestratorNotifier } from "../common/orchestrator-notify.js";
20
+ import { runPipelinePreflight } from "../common/orchestrator-entry.js";
21
+ import { recoverPhaseSummary } from "../common/summary-recovery.js";
22
+ import { withOrchestratorTranscript, } from "../common/orchestrator-transcript-session.js";
23
+ import { loadWorkflow } from "../../parsers/workflow-loader.js";
24
+ import { fmtPhaseSummary } from "../../viewport/renderer.js";
25
+ import { buildPhaseEvent, drainFrictionFile, emitEvent, judgementFromSummary, } from "./task-events.js";
26
+ import { runPostflightGate, runPreflightGateWithData } from "./task-gates.js";
27
+ import { PHASES, SUMMARY_KEY_BY_ROLE } from "./task-phases.js";
28
+ import { readTaskRecord } from "./task-record.js";
29
+ import { writeState, deleteState } from "./task-state.js";
30
+ import { dispatchPhase } from "./task-phase-dispatch.js";
31
+ import { handleReviewVerdict } from "./task-verdict-loop.js";
32
+ const STATUS_KEY = "forge:run-task";
33
+ const MESSAGE_KEY = "forge:run-task:message";
34
+ // ── runTaskPipeline ──────────────────────────────────────────────────────
35
+ export async function runTaskPipeline(opts) {
36
+ // Entry preflight (layered-config schema + model-config validation) runs
37
+ // BEFORE the transcript writer is created, so a failed preflight never
38
+ // leaves a transcript file behind.
39
+ const notify = createOrchestratorNotifier(opts.ctx, {
40
+ label: "forge:run-task",
41
+ statusKey: STATUS_KEY,
42
+ messageKey: MESSAGE_KEY,
43
+ });
44
+ const pre = runPipelinePreflight({ cwd: opts.cwd, ctx: opts.ctx, notify });
45
+ if (!pre.proceed) {
46
+ return { status: "failed", lastPhaseIndex: 0, iterationCounts: {}, lastError: pre.lastError };
47
+ }
48
+ // The transcript session owns ctx.ui.notify interception and the guaranteed
49
+ // pipeline-end close on every outcome (see orchestrator-transcript-session).
50
+ return withOrchestratorTranscript({ cwd: opts.cwd, entityKind: "task", entityId: opts.taskId, ctx: opts.ctx }, (session) => runTaskPipelineInner(opts, pre.modelRoutingConfig, session));
51
+ }
52
+ async function runTaskPipelineInner(opts, modelRoutingConfig, session) {
53
+ const { taskId, cwd, ctx, forgeRoot, storeCli, preflightGate, registry, resumeFromState, onPhaseEvent } = opts;
54
+ // modelRoutingConfig is loaded and validated by runPipelinePreflight (in
55
+ // runTaskPipeline) before the transcript writer exists, then passed in.
56
+ // Determine starting phase from resumeFromState (if provided) or phase 0.
57
+ let currentPhaseIndex = resumeFromState?.phaseIndex ?? 0;
58
+ const iterationCounts = resumeFromState?.iterationCounts ?? {};
59
+ // Per-phase completion-recovery guard (forge-engineering#41): each role gets
60
+ // at most one deterministic set-summary recovery attempt before a
61
+ // missing-summary hard-fail. Prevents recovery loops.
62
+ const recoveredPhases = new Set();
63
+ // Per-role dispatch counter for OrchestratorTree node identity. Distinct
64
+ // from iterationCounts (which only tracks review-verdict revisions): every
65
+ // dispatch of a role — including a plan re-run after a review loopback —
66
+ // gets its own `<taskId>:<role>:<attempt>` node, so the dashboard renders
67
+ // one leaf per run in dispatch order instead of merging attempts into one
68
+ // node (CART-BUG-003 dashboard regression). Seeded from resume state so
69
+ // resumed runs continue numbering past prior attempts.
70
+ const dispatchCounts = { ...(resumeFromState?.iterationCounts ?? {}) };
71
+ // Track model/provider from last successful subagent result (REVIEW FIX #1).
72
+ let lastModel;
73
+ let lastProvider;
74
+ // Resolve the task's sprintId once for prompt-cache session affinity. All
75
+ // phases in this task share the cache key `forge:${sprintId}` so the
76
+ // system-prompt + project orientation prefix (which is identical across
77
+ // personas) stays warm on Anthropic and shares a stable prompt_cache_key
78
+ // on OpenAI. Falls back to a task-scoped key if the task is unattached.
79
+ const taskRecordAtStart = readTaskRecord(taskId, storeCli, cwd);
80
+ const cacheSessionId = taskRecordAtStart?.sprintId ? `forge:${taskRecordAtStart.sprintId}` : `forge:task:${taskId}`;
81
+ // Orchestrator transcript writer — created and notify-intercepted by
82
+ // withOrchestratorTranscript; the loop records structured phase-boundary
83
+ // events through it (FORGE-BUG-040 follow-up: one JSONL file per run).
84
+ const orchTranscript = session.writer;
85
+ const pipelineStartMs = Date.now();
86
+ while (currentPhaseIndex < PHASES.length) {
87
+ // ── Between-phase cancellation gate ────────────────────────────
88
+ if (opts.signal?.aborted) {
89
+ ctx.ui.notify(`⊘ forge:run-task — ${taskId} cancelled by user.`, "info");
90
+ registry.completePhase(taskId, PHASES[currentPhaseIndex]?.role ?? "unknown", "cancelled");
91
+ registry.confirmCancelled(taskId);
92
+ // ADR-S21-01: preserve state file so cancelled runs are resumable
93
+ // from the beginning of the cancelled phase (not deleted).
94
+ writeState(cwd, {
95
+ taskId,
96
+ phaseIndex: currentPhaseIndex,
97
+ iterationCounts,
98
+ halted: false,
99
+ status: "cancelled",
100
+ lastError: undefined,
101
+ savedAt: new Date().toISOString(),
102
+ });
103
+ return { status: "cancelled", lastPhaseIndex: currentPhaseIndex, iterationCounts };
104
+ }
105
+ const phase = PHASES[currentPhaseIndex];
106
+ if (!phase) {
107
+ ctx.ui.notify(`× forge:run-task — invalid phase index ${currentPhaseIndex}`, "error");
108
+ return {
109
+ status: "failed",
110
+ lastPhaseIndex: currentPhaseIndex,
111
+ iterationCounts,
112
+ lastError: `invalid phase index ${currentPhaseIndex}`,
113
+ };
114
+ }
115
+ ctx.ui.setStatus?.(STATUS_KEY, `run-task ${taskId}: phase ${currentPhaseIndex + 1}/${PHASES.length} (${phase.role})`);
116
+ ctx.ui.notify(`→ ${taskId}: ${phase.role} (phase ${currentPhaseIndex + 1}/${PHASES.length})`, "info");
117
+ orchTranscript.record({
118
+ kind: "phase-start",
119
+ ts: new Date().toISOString(),
120
+ phase: phase.role,
121
+ phaseIndex: currentPhaseIndex,
122
+ phaseCount: PHASES.length,
123
+ attempt: (iterationCounts[phase.role] ?? 0) + 1,
124
+ workflowFile: phase.workflowFile,
125
+ persona: phase.personaNoun,
126
+ });
127
+ const subWorkflowPath = path.join(cwd, ".forge", "workflows", `${phase.workflowFile}.md`);
128
+ // ── Read sub-workflow ─────────────────────────────────────────
129
+ let subWorkflowMd;
130
+ let subWorkflowAudience = "any";
131
+ try {
132
+ const loaded = loadWorkflow(subWorkflowPath);
133
+ subWorkflowMd = loaded.rawMarkdown;
134
+ subWorkflowAudience = loaded.audience;
135
+ }
136
+ catch (err) {
137
+ const e = err;
138
+ ctx.ui.notify(`× forge:run-task — failed to read sub-workflow for ${phase.role}: ${e.message ?? "unknown"}`, "error");
139
+ writeState(cwd, {
140
+ taskId,
141
+ phaseIndex: currentPhaseIndex,
142
+ iterationCounts,
143
+ halted: true,
144
+ lastError: `sub-workflow read failed: ${e.message ?? "unknown"}`,
145
+ savedAt: new Date().toISOString(),
146
+ });
147
+ return {
148
+ status: "failed",
149
+ lastPhaseIndex: currentPhaseIndex,
150
+ iterationCounts,
151
+ lastError: `sub-workflow read failed: ${e.message ?? "unknown"}`,
152
+ };
153
+ }
154
+ // ── 6a. Preflight gate ────────────────────────────────────────
155
+ if (fs.existsSync(preflightGate)) {
156
+ const preflightOutcome = runPreflightGateWithData(preflightGate, phase.role, taskId, cwd);
157
+ if (preflightOutcome.result === "halt") {
158
+ // Render structured failure reason if available.
159
+ if (preflightOutcome.gateFailure) {
160
+ ctx.ui.notify(`× forge:run-task — preflight gate failed for phase ${phase.role} ` +
161
+ `[${preflightOutcome.gateFailure.reasonCode}]: ${preflightOutcome.gateFailure.detail}`, "error");
162
+ }
163
+ else {
164
+ ctx.ui.notify(`× forge:run-task — preflight gate failed for phase ${phase.role} (exit 1); halting.`, "error");
165
+ }
166
+ writeState(cwd, {
167
+ taskId,
168
+ phaseIndex: currentPhaseIndex,
169
+ iterationCounts,
170
+ halted: true,
171
+ lastError: `preflight gate exit 1 for ${phase.role}`,
172
+ savedAt: new Date().toISOString(),
173
+ });
174
+ // Spawn halt-recovery advisor (Tier 1, best-effort — non-fatal).
175
+ if (preflightOutcome.gateFailure) {
176
+ const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
177
+ void runHaltAdvisor({
178
+ gateFailure: preflightOutcome.gateFailure,
179
+ advisorModel,
180
+ taskId,
181
+ cwd,
182
+ ctx: { ui: ctx.ui },
183
+ forgeRoot,
184
+ });
185
+ }
186
+ return {
187
+ status: "halted",
188
+ lastPhaseIndex: currentPhaseIndex,
189
+ iterationCounts,
190
+ lastError: `preflight gate exit 1 for ${phase.role}`,
191
+ };
192
+ }
193
+ if (preflightOutcome.result === "escalate") {
194
+ ctx.ui.notify(`× forge:run-task — preflight gate escalated for phase ${phase.role} (exit 2); manual intervention required.`, "error");
195
+ writeState(cwd, {
196
+ taskId,
197
+ phaseIndex: currentPhaseIndex,
198
+ iterationCounts,
199
+ halted: true,
200
+ lastError: `preflight gate exit 2 (escalate) for ${phase.role}`,
201
+ savedAt: new Date().toISOString(),
202
+ });
203
+ return {
204
+ status: "escalated",
205
+ lastPhaseIndex: currentPhaseIndex,
206
+ iterationCounts,
207
+ lastError: `preflight gate exit 2 (escalate) for ${phase.role}`,
208
+ };
209
+ }
210
+ // Preflight passed — notify (mirrored to the root node's dashboard log).
211
+ ctx.ui.notify(`〇 preflight: ${phase.role} — ok`, "info");
212
+ }
213
+ // ── 6. Materialization-marker check ───────────────────────────
214
+ const markerCheck = checkMaterialization(subWorkflowPath, subWorkflowMd);
215
+ if (!markerCheck.ok) {
216
+ for (const marker of markerCheck.missing) {
217
+ ctx.ui.notify(`× workflow regression: ${marker} not found in ${subWorkflowPath}`, "error");
218
+ }
219
+ return {
220
+ status: "failed",
221
+ lastPhaseIndex: currentPhaseIndex,
222
+ iterationCounts,
223
+ lastError: `materialization markers missing: ${markerCheck.missing.join(", ")}`,
224
+ };
225
+ }
226
+ // ── 5. Audience check ─────────────────────────────────────────
227
+ // Wrap with CallerContextStore.asSubagent so assertAudience treats
228
+ // this as a subagent context (IL10: we ARE dispatching from subagent chain).
229
+ const audienceOk = CallerContextStore.asSubagent(phase.role, () => assertAudience({ workflowName: phase.workflowFile, audience: subWorkflowAudience }, ctx));
230
+ if (!audienceOk) {
231
+ writeState(cwd, {
232
+ taskId,
233
+ phaseIndex: currentPhaseIndex,
234
+ iterationCounts,
235
+ halted: true,
236
+ lastError: `audience check failed for ${phase.workflowFile}`,
237
+ savedAt: new Date().toISOString(),
238
+ });
239
+ return {
240
+ status: "failed",
241
+ lastPhaseIndex: currentPhaseIndex,
242
+ iterationCounts,
243
+ lastError: `audience check failed for ${phase.workflowFile}`,
244
+ };
245
+ }
246
+ // ── Dispatch (persona load + runForgeSubagent + observer + abort/halt) ──
247
+ // Extracted to task-phase-dispatch.ts (FORGE-S31). Returns either a
248
+ // terminal result (persona-load failure / throw / cancel / non-zero exit)
249
+ // or the live locals the rest of the loop needs.
250
+ const dispatch = await dispatchPhase({
251
+ opts,
252
+ phase,
253
+ taskId,
254
+ cwd,
255
+ ctx,
256
+ storeCli,
257
+ currentPhaseIndex,
258
+ iterationCounts,
259
+ dispatchCounts,
260
+ modelRoutingConfig,
261
+ registry,
262
+ cacheSessionId,
263
+ taskRecordAtStart,
264
+ subWorkflowMd,
265
+ });
266
+ if (dispatch.kind === "return")
267
+ return dispatch.result;
268
+ const { result, finishPhaseNode, observer, phaseStart, writeDebug } = dispatch;
269
+ // Capture model/provider from subagent result (REVIEW FIX #1).
270
+ if (result.model)
271
+ lastModel = result.model;
272
+ if (result.provider)
273
+ lastProvider = result.provider;
274
+ // Phase-complete liveliness ping (counts + duration).
275
+ {
276
+ const elapsed = Math.floor((Date.now() - phaseStart) / 1000);
277
+ const { turn, toolCount, errCount, cumUsage } = observer.state;
278
+ ctx.ui.notify(`✓ ${phase.role}: ${turn} turn${turn === 1 ? "" : "s"} · ${toolCount} tool call${toolCount === 1 ? "" : "s"}${errCount ? ` · ${errCount} err` : ""} · ${elapsed}s`, "info");
279
+ orchTranscript.record({
280
+ kind: "phase-end",
281
+ ts: new Date().toISOString(),
282
+ phase: phase.role,
283
+ phaseIndex: currentPhaseIndex,
284
+ attempt: (iterationCounts[phase.role] ?? 0) + 1,
285
+ verdict: "n/a",
286
+ elapsedMs: Date.now() - phaseStart,
287
+ turns: turn,
288
+ toolCount,
289
+ errCount,
290
+ subagentTranscriptPath: result.subagentTranscriptPath,
291
+ });
292
+ const { cumCompression } = observer.state;
293
+ registry.appendTail(taskId, phase.role, fmtPhaseSummary({
294
+ role: phase.role,
295
+ turns: turn,
296
+ tools: toolCount,
297
+ errors: errCount,
298
+ wallSeconds: elapsed,
299
+ usage: cumUsage,
300
+ model: result.model,
301
+ provider: result.provider,
302
+ compression: cumCompression.tokensSaved > 0 ? cumCompression : undefined,
303
+ }));
304
+ }
305
+ // ── Plan 11 / Slice 2: orchestrator emits phase event ─────────
306
+ const phaseEndMs = Date.now();
307
+ const taskRecord = readTaskRecord(taskId, storeCli, cwd);
308
+ const sprintId = taskRecord?.sprintId;
309
+ if (!sprintId) {
310
+ ctx.ui.notify(`⚠ forge:run-task — could not resolve sprintId for ${taskId}; ` +
311
+ `skipping orchestrator emit for phase ${phase.role}`, "warning");
312
+ writeDebug({ kind: "emit_skipped", reason: "no-sprintId" });
313
+ }
314
+ else {
315
+ const phaseIteration = (iterationCounts[phase.role] ?? 0) + 1;
316
+ const emitCtx = {
317
+ entityType: "task",
318
+ taskId,
319
+ sprintId,
320
+ phase,
321
+ iteration: phaseIteration,
322
+ startMs: phaseStart,
323
+ endMs: phaseEndMs,
324
+ model: result.model ?? "unknown",
325
+ provider: result.provider ?? "unknown",
326
+ usage: {
327
+ input: result.usage.input,
328
+ output: result.usage.output,
329
+ cacheRead: result.usage.cacheRead,
330
+ cacheWrite: result.usage.cacheWrite,
331
+ },
332
+ judgement: judgementFromSummary(taskRecord, phase.role),
333
+ storeCli,
334
+ cwd,
335
+ };
336
+ const phaseEvent = buildPhaseEvent(emitCtx);
337
+ const emitResult = emitEvent(storeCli, cwd, sprintId, phaseEvent);
338
+ if (!emitResult.ok) {
339
+ ctx.ui.notify(`⚠ forge:run-task — phase event emit failed for ${phase.role}: ${emitResult.stderr.trim()}`, "warning");
340
+ writeDebug({ kind: "emit_failed", stderr: emitResult.stderr });
341
+ }
342
+ else {
343
+ writeDebug({ kind: "emit_ok", eventId: phaseEvent.eventId });
344
+ }
345
+ // Notify sprint-level observer (FORGE-S21-T03).
346
+ if (onPhaseEvent)
347
+ onPhaseEvent(phaseEvent);
348
+ // Drain friction file for this phase, if any.
349
+ const frictionPath = path.join(cwd, ".forge", "cache", `FRICTION-${phase.role}.jsonl`);
350
+ const drain = drainFrictionFile(frictionPath, emitCtx);
351
+ if (drain.emitted + drain.failed > 0) {
352
+ writeDebug({ kind: "friction_drain", ...drain });
353
+ if (drain.failed > 0) {
354
+ ctx.ui.notify(`⚠ forge:run-task — friction drain for ${phase.role}: ${drain.emitted} ok, ${drain.failed} failed`, "warning");
355
+ }
356
+ }
357
+ }
358
+ // ── 6b. Verdict check (review phases only) ────────────────────
359
+ if (phase.isReview) {
360
+ const outcome = handleReviewVerdict({
361
+ phase,
362
+ taskId,
363
+ storeCli,
364
+ cwd,
365
+ forgeRoot,
366
+ iterationCounts,
367
+ currentPhaseIndex,
368
+ modelRoutingConfig,
369
+ ctx,
370
+ orchTranscript,
371
+ finishPhaseNode,
372
+ recoveredPhases,
373
+ });
374
+ if (outcome.kind === "return")
375
+ return outcome.result;
376
+ if (outcome.kind === "loopback") {
377
+ currentPhaseIndex = outcome.toIndex;
378
+ continue;
379
+ }
380
+ // outcome.kind === "advance": fall through to postflight + advance
381
+ }
382
+ // Postflight gate: evaluate `outputs` block after subagent returns,
383
+ // before FSM status advance (FORGE-S26-T19). Hard enforcement in forge-cli;
384
+ // plugin LLM route treats postflight as advisory. On UNSATISFIED: do not
385
+ // advance currentPhaseIndex, halt, hand off to existing runHaltAdvisor.
386
+ {
387
+ const postflightGatePath = preflightGate.replace("preflight-gate.cjs", "postflight-gate.cjs");
388
+ let postflightOutcome = runPostflightGate(postflightGatePath, phase.role, taskId, cwd);
389
+ // Completion recovery (forge-engineering#41): a clean stop with an
390
+ // unsatisfied postflight is most often the subagent writing the
391
+ // {PHASE}-SUMMARY.json sidecar but eliding the set-summary that
392
+ // registers it. Register the sidecar ourselves (once per phase), then
393
+ // re-run the gate. Only the existing hard-fail remains if it's still
394
+ // unsatisfied (sidecar genuinely absent → set-summary exits non-zero).
395
+ if (postflightOutcome.result === "unsatisfied") {
396
+ const summaryKey = SUMMARY_KEY_BY_ROLE[phase.role];
397
+ if (summaryKey && !recoveredPhases.has(phase.role)) {
398
+ recoveredPhases.add(phase.role);
399
+ const rec = recoverPhaseSummary({ storeCli, entityId: taskId, summaryKey, cwd });
400
+ writeDebug({ kind: "summary_recovery", phase: phase.role, gate: "postflight", ok: rec.ok });
401
+ if (rec.ok) {
402
+ const recheck = runPostflightGate(postflightGatePath, phase.role, taskId, cwd);
403
+ if (recheck.result !== "unsatisfied") {
404
+ ctx.ui.notify(`⟳ forge:run-task — ${phase.role}: subagent skipped set-summary; orchestrator registered ` +
405
+ `the '${summaryKey}' sidecar and postflight now passes.`, "info");
406
+ }
407
+ postflightOutcome = recheck;
408
+ }
409
+ }
410
+ }
411
+ if (postflightOutcome.result === "unsatisfied") {
412
+ finishPhaseNode("failed");
413
+ if (postflightOutcome.gateFailure) {
414
+ ctx.ui.notify(`× forge:run-task — postflight gate failed for phase ${phase.role} ` +
415
+ `[${postflightOutcome.gateFailure.reasonCode}]: ${postflightOutcome.gateFailure.detail}`, "error");
416
+ }
417
+ else {
418
+ ctx.ui.notify(`× forge:run-task — postflight gate failed for phase ${phase.role}; halting.`, "error");
419
+ }
420
+ // Do NOT advance FSM — write state at current phaseIndex (halted)
421
+ writeState(cwd, {
422
+ taskId,
423
+ phaseIndex: currentPhaseIndex,
424
+ iterationCounts,
425
+ halted: true,
426
+ lastError: `postflight gate exit 1 for ${phase.role}`,
427
+ savedAt: new Date().toISOString(),
428
+ });
429
+ // Spawn halt-recovery advisor (Tier 1, best-effort — non-fatal).
430
+ if (postflightOutcome.gateFailure) {
431
+ const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
432
+ void runHaltAdvisor({
433
+ gateFailure: postflightOutcome.gateFailure,
434
+ advisorModel,
435
+ taskId,
436
+ cwd,
437
+ ctx: { ui: ctx.ui },
438
+ forgeRoot,
439
+ });
440
+ }
441
+ return {
442
+ status: "halted",
443
+ lastPhaseIndex: currentPhaseIndex,
444
+ iterationCounts,
445
+ lastError: `postflight gate exit 1 for ${phase.role}`,
446
+ };
447
+ }
448
+ // "ok" or "error" — proceed to advance
449
+ if (postflightOutcome.result === "ok") {
450
+ ctx.ui.notify(`〇 postflight: ${phase.role} — ok`, "info");
451
+ }
452
+ }
453
+ // ── Advance to next phase ─────────────────────────────────────
454
+ registry.completePhase(taskId, phase.role, "completed");
455
+ finishPhaseNode("completed");
456
+ // KB link refresh is orchestrator-owned in forge-cli (subagents run via Pi
457
+ // runtime and have no Skill tool). Mirrors the init phase-4 pattern.
458
+ if (phase.role === "writeback") {
459
+ try {
460
+ const kbResult = await runRefreshKbLinks(cwd);
461
+ ctx.ui.notify(kbResult.filesUpdated > 0
462
+ ? `〇 KB links refreshed (${kbResult.filesUpdated} file${kbResult.filesUpdated === 1 ? "" : "s"} updated)`
463
+ : ` KB links — already up to date`, "info");
464
+ }
465
+ catch (e) {
466
+ ctx.ui.notify(`△ KB links refresh failed (best-effort): ${e.message ?? "unknown"}`, "warning");
467
+ }
468
+ }
469
+ writeState(cwd, {
470
+ taskId,
471
+ phaseIndex: currentPhaseIndex,
472
+ iterationCounts,
473
+ halted: false,
474
+ savedAt: new Date().toISOString(),
475
+ });
476
+ currentPhaseIndex++;
477
+ }
478
+ // ── All phases complete ───────────────────────────────────────────
479
+ deleteState(cwd, taskId);
480
+ orchTranscript.record({
481
+ kind: "pipeline-end",
482
+ ts: new Date().toISOString(),
483
+ outcome: "complete",
484
+ elapsedMs: Date.now() - pipelineStartMs,
485
+ });
486
+ return {
487
+ status: "completed",
488
+ lastPhaseIndex: PHASES.length - 1,
489
+ iterationCounts,
490
+ model: lastModel,
491
+ provider: lastProvider,
492
+ };
493
+ }
494
+ //# sourceMappingURL=run-task-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-task-pipeline.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/task/run-task-pipeline.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,EAAE;AACF,2BAA2B;AAC3B,uFAAuF;AACvF,sFAAsF;AACtF,sFAAsF;AACtF,EAAE;AACF,8CAA8C;AAE9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAEN,0BAA0B,GAC1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAsB,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,SAAS,EAET,oBAAoB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,UAAU,GAAG,gBAAgB,CAAC;AACpC,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA4B;IACjE,yEAAyE;IACzE,uEAAuE;IACvE,mCAAmC;IACnC,MAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,EAAE;QACnD,KAAK,EAAE,gBAAgB;QACvB,SAAS,EAAE,UAAU;QACrB,UAAU,EAAE,WAAW;KACvB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IAC/F,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,OAAO,0BAA0B,CAChC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAC3E,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CACxE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAClC,IAA4B,EAC5B,kBAAgC,EAChC,OAAsC;IAEtC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE/G,yEAAyE;IACzE,wEAAwE;IAExE,0EAA0E;IAC1E,IAAI,iBAAiB,GAAG,eAAe,EAAE,UAAU,IAAI,CAAC,CAAC;IACzD,MAAM,eAAe,GAA2B,eAAe,EAAE,eAAe,IAAI,EAAE,CAAC;IAEvF,6EAA6E;IAC7E,kEAAkE;IAClE,sDAAsD;IACtD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,yEAAyE;IACzE,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,uDAAuD;IACvD,MAAM,cAAc,GAA2B,EAAE,GAAG,CAAC,eAAe,EAAE,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;IAE/F,6EAA6E;IAC7E,IAAI,SAA6B,CAAC;IAClC,IAAI,YAAgC,CAAC;IAErC,0EAA0E;IAC1E,qEAAqE;IACrE,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,cAAc,MAAM,EAAE,CAAC;IAEpH,qEAAqE;IACrE,yEAAyE;IACzE,uEAAuE;IACvE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IACtC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEnC,OAAO,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,kEAAkE;QAClE,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sBAAsB,MAAM,qBAAqB,EAAE,MAAM,CAAC,CAAC;YACzE,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,WAAW,CAAC,CAAC;YAC1F,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAClC,kEAAkE;YAClE,2DAA2D;YAC3D,UAAU,CAAC,GAAG,EAAE;gBACf,MAAM;gBACN,UAAU,EAAE,iBAAiB;gBAC7B,eAAe;gBACf,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACjC,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;QACpF,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0CAA0C,iBAAiB,EAAE,EAAE,OAAO,CAAC,CAAC;YACtF,OAAO;gBACN,MAAM,EAAE,QAAQ;gBAChB,cAAc,EAAE,iBAAiB;gBACjC,eAAe;gBACf,SAAS,EAAE,uBAAuB,iBAAiB,EAAE;aACrD,CAAC;QACH,CAAC;QAED,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CACjB,UAAU,EACV,YAAY,MAAM,WAAW,iBAAiB,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,GAAG,CACrF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI,WAAW,iBAAiB,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC,CAAC;QACtG,cAAc,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;YAC/C,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,OAAO,EAAE,KAAK,CAAC,WAAW;SAC1B,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC;QAE1F,iEAAiE;QACjE,IAAI,aAAqB,CAAC;QAC1B,IAAI,mBAAmB,GAAkB,KAAK,CAAC;QAC/C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;YAC7C,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC;YACnC,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC;QACvC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;YACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,sDAAsD,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAC7F,OAAO,CACP,CAAC;YACF,UAAU,CAAC,GAAG,EAAE;gBACf,MAAM;gBACN,UAAU,EAAE,iBAAiB;gBAC7B,eAAe;gBACf,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,6BAA6B,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE;gBAChE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACjC,CAAC,CAAC;YACH,OAAO;gBACN,MAAM,EAAE,QAAQ;gBAChB,cAAc,EAAE,iBAAiB;gBACjC,eAAe;gBACf,SAAS,EAAE,6BAA6B,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE;aAChE,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1F,IAAI,gBAAgB,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACxC,iDAAiD;gBACjD,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;oBAClC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,sDAAsD,KAAK,CAAC,IAAI,GAAG;wBAClE,IAAI,gBAAgB,CAAC,WAAW,CAAC,UAAU,MAAM,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,EACvF,OAAO,CACP,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,sDAAsD,KAAK,CAAC,IAAI,qBAAqB,EACrF,OAAO,CACP,CAAC;gBACH,CAAC;gBACD,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM;oBACN,UAAU,EAAE,iBAAiB;oBAC7B,eAAe;oBACf,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,6BAA6B,KAAK,CAAC,IAAI,EAAE;oBACpD,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACjC,CAAC,CAAC;gBACH,iEAAiE;gBACjE,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;oBAClC,MAAM,YAAY,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,GAAG,CAAC,KAAY,CAAC,CAAC;oBAC/E,KAAK,cAAc,CAAC;wBACnB,WAAW,EAAE,gBAAgB,CAAC,WAAW;wBACzC,YAAY;wBACZ,MAAM;wBACN,GAAG;wBACH,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAS,EAAE;wBAC1B,SAAS;qBACT,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACN,MAAM,EAAE,QAAQ;oBAChB,cAAc,EAAE,iBAAiB;oBACjC,eAAe;oBACf,SAAS,EAAE,6BAA6B,KAAK,CAAC,IAAI,EAAE;iBACpD,CAAC;YACH,CAAC;YACD,IAAI,gBAAgB,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,yDAAyD,KAAK,CAAC,IAAI,0CAA0C,EAC7G,OAAO,CACP,CAAC;gBACF,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM;oBACN,UAAU,EAAE,iBAAiB;oBAC7B,eAAe;oBACf,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,wCAAwC,KAAK,CAAC,IAAI,EAAE;oBAC/D,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACjC,CAAC,CAAC;gBACH,OAAO;oBACN,MAAM,EAAE,WAAW;oBACnB,cAAc,EAAE,iBAAiB;oBACjC,eAAe;oBACf,SAAS,EAAE,wCAAwC,KAAK,CAAC,IAAI,EAAE;iBAC/D,CAAC;YACH,CAAC;YACD,yEAAyE;YACzE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,KAAK,CAAC,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,iEAAiE;QACjE,MAAM,WAAW,GAAG,oBAAoB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QACzE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACrB,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC1C,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0BAA0B,MAAM,iBAAiB,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO;gBACN,MAAM,EAAE,QAAQ;gBAChB,cAAc,EAAE,iBAAiB;gBACjC,eAAe;gBACf,SAAS,EAAE,oCAAoC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC/E,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,mEAAmE;QACnE,6EAA6E;QAC7E,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAiB,EAAE,GAAG,EAAE,CAC9E,cAAc,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CACxF,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,UAAU,CAAC,GAAG,EAAE;gBACf,MAAM;gBACN,UAAU,EAAE,iBAAiB;gBAC7B,eAAe;gBACf,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,6BAA6B,KAAK,CAAC,YAAY,EAAE;gBAC5D,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACjC,CAAC,CAAC;YACH,OAAO;gBACN,MAAM,EAAE,QAAQ;gBAChB,cAAc,EAAE,iBAAiB;gBACjC,eAAe;gBACf,SAAS,EAAE,6BAA6B,KAAK,CAAC,YAAY,EAAE;aAC5D,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,oEAAoE;QACpE,0EAA0E;QAC1E,iDAAiD;QACjD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;YACpC,IAAI;YACJ,KAAK;YACL,MAAM;YACN,GAAG;YACH,GAAG;YACH,QAAQ;YACR,iBAAiB;YACjB,eAAe;YACf,cAAc;YACd,kBAAkB;YAClB,QAAQ;YACR,cAAc;YACd,iBAAiB;YACjB,aAAa;SACb,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;QACvD,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;QAE/E,+DAA+D;QAC/D,IAAI,MAAM,CAAC,KAAK;YAAE,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3C,IAAI,MAAM,CAAC,QAAQ;YAAE,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEpD,sDAAsD;QACtD,CAAC;YACA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC/D,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,SAAS,aAAa,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,OAAO,GAAG,EAClK,MAAM,CACN,CAAC;YACF,cAAc,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;gBAC/C,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU;gBAClC,KAAK,EAAE,IAAI;gBACX,SAAS;gBACT,QAAQ;gBACR,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;aACrD,CAAC,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC1C,QAAQ,CAAC,UAAU,CAClB,MAAM,EACN,KAAK,CAAC,IAAI,EACV,eAAe,CAAC;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,OAAO;gBACpB,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,cAAc,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;aACxE,CAAC,CACF,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,UAAU,EAAE,QAAQ,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,qDAAqD,MAAM,IAAI;gBAC9D,wCAAwC,KAAK,CAAC,IAAI,EAAE,EACrD,SAAS,CACT,CAAC;YACF,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACP,MAAM,cAAc,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9D,MAAM,OAAO,GAA4B;gBACxC,UAAU,EAAE,MAAM;gBAClB,MAAM;gBACN,QAAQ;gBACR,KAAK;gBACL,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;gBAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;gBACtC,KAAK,EAAE;oBACN,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;oBACzB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;oBAC3B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;oBACjC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;iBACnC;gBACD,SAAS,EAAE,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvD,QAAQ;gBACR,GAAG;aACH,CAAC;YACF,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACpB,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,kDAAkD,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAC3F,SAAS,CACT,CAAC;gBACF,UAAU,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACP,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,gDAAgD;YAChD,IAAI,YAAY;gBAAE,YAAY,CAAC,UAAU,CAAC,CAAC;YAE3C,8CAA8C;YAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;YACvF,MAAM,KAAK,GAAG,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,UAAU,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;gBACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,yCAAyC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,QAAQ,KAAK,CAAC,MAAM,SAAS,EAClG,SAAS,CACT,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;QAED,iEAAiE;QACjE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC;gBACnC,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,GAAG;gBACH,SAAS;gBACT,eAAe;gBACf,iBAAiB;gBACjB,kBAAkB;gBAClB,GAAG;gBACH,cAAc;gBACd,eAAe;gBACf,eAAe;aACf,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC;YACrD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACjC,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;gBACpC,SAAS;YACV,CAAC;YACD,mEAAmE;QACpE,CAAC;QAED,oEAAoE;QACpE,4EAA4E;QAC5E,yEAAyE;QACzE,wEAAwE;QACxE,CAAC;YACA,MAAM,kBAAkB,GAAG,aAAa,CAAC,OAAO,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,CAAC;YAC9F,IAAI,iBAAiB,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAEvF,mEAAmE;YACnE,gEAAgE;YAChE,gEAAgE;YAChE,sEAAsE;YACtE,qEAAqE;YACrE,uEAAuE;YACvE,IAAI,iBAAiB,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBAChD,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,UAAU,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChC,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;oBACjF,UAAU,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5F,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;wBACZ,MAAM,OAAO,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;wBAC/E,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;4BACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,sBAAsB,KAAK,CAAC,IAAI,0DAA0D;gCACzF,QAAQ,UAAU,sCAAsC,EACzD,MAAM,CACN,CAAC;wBACH,CAAC;wBACD,iBAAiB,GAAG,OAAO,CAAC;oBAC7B,CAAC;gBACF,CAAC;YACF,CAAC;YAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBAChD,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC1B,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;oBACnC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,uDAAuD,KAAK,CAAC,IAAI,GAAG;wBACnE,IAAI,iBAAiB,CAAC,WAAW,CAAC,UAAU,MAAM,iBAAiB,CAAC,WAAW,CAAC,MAAM,EAAE,EACzF,OAAO,CACP,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uDAAuD,KAAK,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,CAAC;gBACvG,CAAC;gBACD,kEAAkE;gBAClE,UAAU,CAAC,GAAG,EAAE;oBACf,MAAM;oBACN,UAAU,EAAE,iBAAiB;oBAC7B,eAAe;oBACf,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,8BAA8B,KAAK,CAAC,IAAI,EAAE;oBACrD,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACjC,CAAC,CAAC;gBACH,iEAAiE;gBACjE,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;oBACnC,MAAM,YAAY,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,GAAG,CAAC,KAAY,CAAC,CAAC;oBAC/E,KAAK,cAAc,CAAC;wBACnB,WAAW,EAAE,iBAAiB,CAAC,WAAW;wBAC1C,YAAY;wBACZ,MAAM;wBACN,GAAG;wBACH,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAS,EAAE;wBAC1B,SAAS;qBACT,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACN,MAAM,EAAE,QAAQ;oBAChB,cAAc,EAAE,iBAAiB;oBACjC,eAAe;oBACf,SAAS,EAAE,8BAA8B,KAAK,CAAC,IAAI,EAAE;iBACrD,CAAC;YACH,CAAC;YACD,uCAAuC;YACvC,IAAI,iBAAiB,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACvC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,KAAK,CAAC,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3D,CAAC;QACF,CAAC;QAED,iEAAiE;QACjE,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACxD,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7B,2EAA2E;QAC3E,qEAAqE;QACrE,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAC9C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,QAAQ,CAAC,YAAY,GAAG,CAAC;oBACxB,CAAC,CAAC,yBAAyB,QAAQ,CAAC,YAAY,QAAQ,QAAQ,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW;oBACzG,CAAC,CAAC,iCAAiC,EACpC,MAAM,CACN,CAAC;YACH,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACrB,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,4CAA6C,CAA0B,CAAC,OAAO,IAAI,SAAS,EAAE,EAC9F,SAAS,CACT,CAAC;YACH,CAAC;QACF,CAAC;QACD,UAAU,CAAC,GAAG,EAAE;YACf,MAAM;YACN,UAAU,EAAE,iBAAiB;YAC7B,eAAe;YACf,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACjC,CAAC,CAAC;QACH,iBAAiB,EAAE,CAAC;IACrB,CAAC;IAED,qEAAqE;IACrE,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,cAAc,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,cAAc;QACpB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe;KACvC,CAAC,CAAC;IACH,OAAO;QACN,MAAM,EAAE,WAAW;QACnB,cAAc,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;QACjC,eAAe;QACf,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,YAAY;KACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { ExtensionCommandContext, ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
+ import type { ForgeToolDefs } from "../../forge-tools.js";
3
+ import type { getSessionRegistry } from "../../session-registry.js";
4
+ import type { RunTaskState } from "./task-state.js";
5
+ export interface RunTaskPipelineOptions {
6
+ taskId: string;
7
+ cwd: string;
8
+ ctx: ExtensionCommandContext;
9
+ forgeRoot: string;
10
+ storeCli: string;
11
+ preflightGate: string;
12
+ registry: ReturnType<typeof getSessionRegistry>;
13
+ /** When provided, pipeline starts from this state instead of phase 0.
14
+ * Used by run-sprint.ts for mid-task resume (REVIEW FIX #2, option b). */
15
+ resumeFromState?: RunTaskState;
16
+ /** Optional observer for phase events; called after emitEvent. */
17
+ onPhaseEvent?: (event: Record<string, unknown>) => void;
18
+ /**
19
+ * Test-only seam (forge-cli#17). When set, each phase's `runForgeSubagent`
20
+ * call receives `streamFn = streamFnFactory({...})`. Production callers
21
+ * leave this undefined. See helpers/scripted-subagent.ts and
22
+ * fixtures/sprint-fixture.ts.
23
+ */
24
+ streamFnFactory?: (ctx: {
25
+ kind: "task-phase";
26
+ persona: string;
27
+ phase: string;
28
+ taskId: string;
29
+ }) => import("@earendil-works/pi-agent-core").StreamFn | undefined;
30
+ /**
31
+ * Optional AbortSignal from SessionRegistry. When provided, the pipeline
32
+ * checks signal.aborted between phases and passes the signal to
33
+ * runForgeSubagent so in-flight subagents can be aborted.
34
+ */
35
+ signal?: AbortSignal;
36
+ forgeToolDefs?: ForgeToolDefs;
37
+ /**
38
+ * Extension factories forwarded to each subagent session via runForgeSubagent.
39
+ * Used by Mechanism E (FORGE-S30-T07) to inject the Forge-aware compaction
40
+ * handler when FORGE_CTX_GOVERNOR=1. No-op when undefined (default path unchanged).
41
+ */
42
+ extensionFactories?: ExtensionFactory[];
43
+ }
44
+ export type RunTaskPipelineStatus = "completed" | "halted" | "escalated" | "failed" | "cancelled";
45
+ export interface RunTaskPipelineResult {
46
+ status: RunTaskPipelineStatus;
47
+ lastPhaseIndex: number;
48
+ iterationCounts: Record<string, number>;
49
+ lastError?: string;
50
+ /** Model captured from last successful phase's subagent result (REVIEW FIX #1). */
51
+ model?: string;
52
+ /** Provider captured from last successful phase's subagent result (REVIEW FIX #1). */
53
+ provider?: string;
54
+ /**
55
+ * Project-local orchestrator JSONL path for this run
56
+ * (.forge/transcripts/<taskId>/<ISO>__<taskId>__orchestrator.jsonl).
57
+ * Callers (registerRunTask, run-sprint) hand it to archiveRun() to mirror
58
+ * the run into the central transcript archive. Unset only when the
59
+ * pipeline returned before the transcript writer was created (preflight).
60
+ */
61
+ orchestratorTranscriptPath?: string;
62
+ }
@@ -0,0 +1,5 @@
1
+ // run-task-types.ts — pipeline option/result interfaces shared between the
2
+ // pipeline file and the command handler. Extracted from run-task.ts (no logic
3
+ // changes). run-task.ts re-exports these.
4
+ export {};
5
+ //# sourceMappingURL=run-task-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-task-types.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/task/run-task-types.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,0CAA0C"}
@@ -0,0 +1,4 @@
1
+ import type { PhaseDescriptor } from "./task-phases.js";
2
+ export declare function findPredecessorIndex(phases: PhaseDescriptor[], reviewIndex: number): number;
3
+ export declare function buildSummariesBlock(summaries: Record<string, unknown> | undefined): string;
4
+ export declare function composeTaskBody(subWorkflowMd: string, taskId: string, summariesBlock?: string): string;
@@ -0,0 +1,48 @@
1
+ // task-body.ts — task body composition + summary carry-forward helpers and the
2
+ // revision-loop predecessor finder. Extracted from run-task.ts (no logic
3
+ // changes). run-task.ts re-exports these.
4
+ // ── Find predecessor non-review phase for revision loop ───────────────────
5
+ export function findPredecessorIndex(phases, reviewIndex) {
6
+ for (let i = reviewIndex - 1; i >= 0; i--) {
7
+ if (!phases[i].isReview)
8
+ return i;
9
+ }
10
+ return 0;
11
+ }
12
+ // Phase ordering for summary injection — earlier phases first.
13
+ const PHASE_ORDER = ["plan", "review_plan", "implementation", "code_review", "validation"];
14
+ export function buildSummariesBlock(summaries) {
15
+ if (!summaries)
16
+ return "";
17
+ const lines = [];
18
+ for (const key of PHASE_ORDER) {
19
+ const raw = summaries[key];
20
+ if (!raw || typeof raw !== "object")
21
+ continue;
22
+ const s = raw;
23
+ const parts = [`### ${key}`];
24
+ if (s.objective)
25
+ parts.push(`Objective: ${s.objective}`);
26
+ if (s.verdict)
27
+ parts.push(`Verdict: ${s.verdict}`);
28
+ if (s.key_changes?.length)
29
+ parts.push(`Key changes: ${s.key_changes.join("; ")}`);
30
+ if (s.findings?.length)
31
+ parts.push(`Findings: ${s.findings.join("; ")}`);
32
+ if (s.artifact_ref)
33
+ parts.push(`Full artifact: ${s.artifact_ref}`);
34
+ lines.push(parts.join("\n"));
35
+ }
36
+ if (lines.length === 0)
37
+ return "";
38
+ return ["## Prior phase summaries (carry-forward)", "", ...lines].join("\n");
39
+ }
40
+ export function composeTaskBody(subWorkflowMd, taskId, summariesBlock) {
41
+ const parts = [`Read the workflow below and follow it. Task ID: ${taskId}.`, "", "---", ""];
42
+ if (summariesBlock) {
43
+ parts.push(summariesBlock, "", "---", "");
44
+ }
45
+ parts.push(subWorkflowMd.trim());
46
+ return parts.join("\n");
47
+ }
48
+ //# sourceMappingURL=task-body.js.map