@entelligentsia/forgecli 1.0.21 → 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 (218) hide show
  1. package/CHANGELOG.md +346 -0
  2. package/README.md +2 -0
  3. package/dist/CHANGELOG-forge-plugin.md +281 -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/claude-bootstrap/bootstrap.d.ts +40 -0
  16. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js +593 -0
  17. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js.map +1 -0
  18. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.d.ts +46 -0
  19. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js +245 -0
  20. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js.map +1 -0
  21. package/dist/extensions/forgecli/claude-bootstrap/uninstall.d.ts +23 -0
  22. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js +215 -0
  23. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js.map +1 -0
  24. package/dist/extensions/forgecli/dashboard/component.js +10 -7
  25. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  26. package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
  27. package/dist/extensions/forgecli/forge-tools.js +73 -0
  28. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  29. package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
  30. package/dist/extensions/forgecli/lib/forge-root.js +14 -1
  31. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
  32. package/dist/extensions/forgecli/orchestrators/bug/bug-body.d.ts +1 -0
  33. package/dist/extensions/forgecli/orchestrators/bug/bug-body.js +65 -0
  34. package/dist/extensions/forgecli/orchestrators/bug/bug-body.js.map +1 -0
  35. package/dist/extensions/forgecli/orchestrators/bug/bug-id.d.ts +23 -0
  36. package/dist/extensions/forgecli/orchestrators/bug/bug-id.js +140 -0
  37. package/dist/extensions/forgecli/orchestrators/bug/bug-id.js.map +1 -0
  38. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.d.ts +54 -0
  39. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js +349 -0
  40. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js.map +1 -0
  41. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.d.ts +8 -0
  42. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js +60 -0
  43. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js.map +1 -0
  44. package/dist/extensions/forgecli/orchestrators/bug/bug-state.d.ts +14 -0
  45. package/dist/extensions/forgecli/orchestrators/bug/bug-state.js +100 -0
  46. package/dist/extensions/forgecli/orchestrators/bug/bug-state.js.map +1 -0
  47. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.d.ts +72 -0
  48. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js +204 -0
  49. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js.map +1 -0
  50. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.d.ts +38 -0
  51. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js +166 -0
  52. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js.map +1 -0
  53. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.d.ts +3 -0
  54. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js +55 -0
  55. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js.map +1 -0
  56. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.d.ts +7 -0
  57. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js +293 -0
  58. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js.map +1 -0
  59. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.d.ts +2 -0
  60. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js +501 -0
  61. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js.map +1 -0
  62. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.d.ts +41 -0
  63. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js +5 -0
  64. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js.map +1 -0
  65. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.d.ts +43 -0
  66. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js +85 -0
  67. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js.map +1 -0
  68. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.d.ts +8 -0
  69. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js +37 -0
  70. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js.map +1 -0
  71. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.d.ts +28 -0
  72. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js +45 -0
  73. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js.map +1 -0
  74. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.d.ts +26 -0
  75. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js +75 -0
  76. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js.map +1 -0
  77. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.d.ts +24 -0
  78. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js +37 -0
  79. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js.map +1 -0
  80. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +9 -92
  81. package/dist/extensions/forgecli/orchestrators/fix-bug.js +23 -1695
  82. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
  83. package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +3 -12
  84. package/dist/extensions/forgecli/orchestrators/run-sprint.js +97 -270
  85. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
  86. package/dist/extensions/forgecli/orchestrators/run-task.d.ts +10 -214
  87. package/dist/extensions/forgecli/orchestrators/run-task.js +31 -1481
  88. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -1
  89. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.d.ts +33 -0
  90. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js +135 -0
  91. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js.map +1 -0
  92. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.d.ts +18 -0
  93. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js +55 -0
  94. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js.map +1 -0
  95. package/dist/extensions/forgecli/orchestrators/task/run-task-command.d.ts +9 -0
  96. package/dist/extensions/forgecli/orchestrators/task/run-task-command.js +174 -0
  97. package/dist/extensions/forgecli/orchestrators/task/run-task-command.js.map +1 -0
  98. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.d.ts +2 -0
  99. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js +494 -0
  100. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js.map +1 -0
  101. package/dist/extensions/forgecli/orchestrators/task/run-task-types.d.ts +62 -0
  102. package/dist/extensions/forgecli/orchestrators/task/run-task-types.js +5 -0
  103. package/dist/extensions/forgecli/orchestrators/task/run-task-types.js.map +1 -0
  104. package/dist/extensions/forgecli/orchestrators/task/task-body.d.ts +4 -0
  105. package/dist/extensions/forgecli/orchestrators/task/task-body.js +48 -0
  106. package/dist/extensions/forgecli/orchestrators/task/task-body.js.map +1 -0
  107. package/dist/extensions/forgecli/orchestrators/task/task-events.d.ts +63 -0
  108. package/dist/extensions/forgecli/orchestrators/task/task-events.js +185 -0
  109. package/dist/extensions/forgecli/orchestrators/task/task-events.js.map +1 -0
  110. package/dist/extensions/forgecli/orchestrators/task/task-gates.d.ts +34 -0
  111. package/dist/extensions/forgecli/orchestrators/task/task-gates.js +78 -0
  112. package/dist/extensions/forgecli/orchestrators/task/task-gates.js.map +1 -0
  113. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.d.ts +42 -0
  114. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js +370 -0
  115. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js.map +1 -0
  116. package/dist/extensions/forgecli/orchestrators/task/task-phases.d.ts +14 -0
  117. package/dist/extensions/forgecli/orchestrators/task/task-phases.js +26 -0
  118. package/dist/extensions/forgecli/orchestrators/task/task-phases.js.map +1 -0
  119. package/dist/extensions/forgecli/orchestrators/task/task-record.d.ts +9 -0
  120. package/dist/extensions/forgecli/orchestrators/task/task-record.js +58 -0
  121. package/dist/extensions/forgecli/orchestrators/task/task-record.js.map +1 -0
  122. package/dist/extensions/forgecli/orchestrators/task/task-state.d.ts +14 -0
  123. package/dist/extensions/forgecli/orchestrators/task/task-state.js +35 -0
  124. package/dist/extensions/forgecli/orchestrators/task/task-state.js.map +1 -0
  125. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.d.ts +36 -0
  126. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js +152 -0
  127. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js.map +1 -0
  128. package/dist/extensions/forgecli/update/forge-update-command.js +10 -7
  129. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -1
  130. package/dist/forge-payload/.base-pack/commands/approve.md +2 -2
  131. package/dist/forge-payload/.base-pack/commands/check-agent.md +2 -2
  132. package/dist/forge-payload/.base-pack/commands/collate.md +2 -2
  133. package/dist/forge-payload/.base-pack/commands/commit.md +2 -2
  134. package/dist/forge-payload/.base-pack/commands/enhance.md +2 -2
  135. package/dist/forge-payload/.base-pack/commands/fix-bug.md +2 -2
  136. package/dist/forge-payload/.base-pack/commands/implement.md +2 -2
  137. package/dist/forge-payload/.base-pack/commands/init.md +278 -0
  138. package/dist/forge-payload/.base-pack/commands/new-sprint.md +2 -2
  139. package/dist/forge-payload/.base-pack/commands/plan-sprint.md +2 -2
  140. package/dist/forge-payload/.base-pack/commands/plan.md +2 -2
  141. package/dist/forge-payload/.base-pack/commands/retro.md +2 -2
  142. package/dist/forge-payload/.base-pack/commands/review-code.md +2 -2
  143. package/dist/forge-payload/.base-pack/commands/review-plan.md +2 -2
  144. package/dist/forge-payload/.base-pack/commands/run-sprint.md +2 -2
  145. package/dist/forge-payload/.base-pack/commands/run-task.md +2 -2
  146. package/dist/forge-payload/.base-pack/commands/validate.md +2 -2
  147. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
  148. package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
  149. package/dist/forge-payload/.base-pack/workflows/collator_agent.md +5 -6
  150. package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
  151. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
  152. package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +1 -1
  153. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
  154. package/dist/forge-payload/.base-pack/workflows-js/wfl-init.js +449 -0
  155. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
  156. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  157. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  158. package/dist/forge-payload/.schemas/event.schema.json +8 -3
  159. package/dist/forge-payload/.schemas/migrations.json +141 -0
  160. package/dist/forge-payload/commands/add-pipeline.md +1 -1
  161. package/dist/forge-payload/commands/add-task.md +3 -3
  162. package/dist/forge-payload/commands/ask.md +1 -1
  163. package/dist/forge-payload/commands/check-agent.md +1 -1
  164. package/dist/forge-payload/commands/config.md +1 -1
  165. package/dist/forge-payload/commands/health.md +1 -1
  166. package/dist/forge-payload/commands/init.md +62 -7
  167. package/dist/forge-payload/commands/rebuild.md +3 -3
  168. package/dist/forge-payload/commands/remove.md +1 -1
  169. package/dist/forge-payload/commands/repair.md +1 -1
  170. package/dist/forge-payload/commands/report-bug.md +1 -1
  171. package/dist/forge-payload/commands/status.md +1 -1
  172. package/dist/forge-payload/commands/update.md +3 -3
  173. package/dist/forge-payload/hooks/lib/common.cjs +228 -0
  174. package/dist/forge-payload/hooks/lib/plugin-detection.cjs +106 -0
  175. package/dist/forge-payload/hooks/lib/update-msg.cjs +23 -0
  176. package/dist/forge-payload/hooks/lib/update-url.cjs +46 -0
  177. package/dist/forge-payload/hooks/lib/write-registry.js +53 -0
  178. package/dist/forge-payload/init/discovery/discover-database.md +32 -0
  179. package/dist/forge-payload/init/discovery/discover-processes.md +31 -0
  180. package/dist/forge-payload/init/discovery/discover-routing.md +31 -0
  181. package/dist/forge-payload/init/discovery/discover-stack.md +33 -0
  182. package/dist/forge-payload/init/discovery/discover-testing.md +34 -0
  183. package/dist/forge-payload/init/generation/generate-commands.md +171 -0
  184. package/dist/forge-payload/init/generation/generate-kb-doc.md +60 -0
  185. package/dist/forge-payload/init/generation/generate-knowledge-base.md +56 -0
  186. package/dist/forge-payload/init/generation/generate-persona.md +73 -0
  187. package/dist/forge-payload/init/generation/generate-personas.md +54 -0
  188. package/dist/forge-payload/init/generation/generate-skill.md +66 -0
  189. package/dist/forge-payload/init/generation/generate-skills.md +36 -0
  190. package/dist/forge-payload/init/generation/generate-template.md +60 -0
  191. package/dist/forge-payload/init/generation/generate-templates.md +39 -0
  192. package/dist/forge-payload/init/generation/generate-tools.md +133 -0
  193. package/dist/forge-payload/init/generation/generate-workflows.md +78 -0
  194. package/dist/forge-payload/init/phases/phase-1-collect.md +10 -2
  195. package/dist/forge-payload/init/phases/phase-3-materialize.md +1 -1
  196. package/dist/forge-payload/init/phases/phase-4-register.md +8 -0
  197. package/dist/forge-payload/init/workflow-gen-plan.json +17 -0
  198. package/dist/forge-payload/integrity.json +16 -16
  199. package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
  200. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
  201. package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
  202. package/dist/forge-payload/meta/workflows/meta-collate.md +5 -6
  203. package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
  204. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
  205. package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
  206. package/dist/forge-payload/meta/workflows/meta-migrate.md +1 -1
  207. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
  208. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  209. package/dist/forge-payload/schemas/event.schema.json +8 -3
  210. package/dist/forge-payload/schemas/structure-manifest.json +5 -12
  211. package/dist/forge-payload/tools/commit-task.cjs +218 -0
  212. package/dist/forge-payload/tools/forge-preflight.cjs +268 -0
  213. package/dist/forge-payload/tools/lib/paths.cjs +12 -11
  214. package/dist/forge-payload/tools/lib/pricing.cjs +31 -11
  215. package/dist/forge-payload/tools/query-logger.cjs +34 -0
  216. package/dist/forge-payload/tools/store-cli.cjs +6 -1
  217. package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -6
  218. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-body.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/task/task-body.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yEAAyE;AACzE,0CAA0C;AAI1C,6EAA6E;AAE7E,MAAM,UAAU,oBAAoB,CAAC,MAAyB,EAAE,WAAmB;IAClF,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC;AAYD,+DAA+D;AAC/D,MAAM,WAAW,GAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;AAE9G,MAAM,UAAU,mBAAmB,CAAC,SAA8C;IACjF,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QAC9C,MAAM,CAAC,GAAG,GAAmB,CAAC;QAC9B,MAAM,KAAK,GAAa,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,CAAC,0CAA0C,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,aAAqB,EAAE,MAAc,EAAE,cAAuB;IAC7F,MAAM,KAAK,GAAG,CAAC,mDAAmD,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5F,IAAI,cAAc,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { type PhaseDescriptor } from "./task-phases.js";
2
+ import type { TaskRecord } from "./task-record.js";
3
+ export declare function actionForRole(role: string): string;
4
+ export interface OrchestratorEmitContext {
5
+ /** Entity identifier — required when entityType is "task". */
6
+ taskId?: string;
7
+ /** Entity identifier — required when entityType is "bug". */
8
+ bugId?: string;
9
+ /** Discriminator for entity-keyed event construction. */
10
+ entityType: "task" | "bug";
11
+ sprintId: string;
12
+ phase: PhaseDescriptor;
13
+ iteration: number;
14
+ startMs: number;
15
+ endMs: number;
16
+ model: string;
17
+ provider: string;
18
+ usage: {
19
+ input: number;
20
+ output: number;
21
+ cacheRead: number;
22
+ cacheWrite: number;
23
+ };
24
+ judgement: Record<string, unknown> | undefined;
25
+ storeCli: string;
26
+ cwd: string;
27
+ }
28
+ export declare function isoCompact(ms: number): string;
29
+ export declare function buildPhaseEvent(ec: OrchestratorEmitContext): Record<string, unknown>;
30
+ export declare function emitEvent(storeCli: string, cwd: string, sprintId: string, event: Record<string, unknown>): {
31
+ ok: boolean;
32
+ stderr: string;
33
+ };
34
+ /**
35
+ * Emit a phase event for an INCOMPLETE attempt (cancelled / failed) so its
36
+ * provider-billed tokens reach the store. Bug B: the cancel and halt-on-failure
37
+ * branches used to return without emitting, so collate's COST_REPORT
38
+ * under-counted real spend by exactly the aborted passes (CART-S02-T03
39
+ * baseline: 259,950 tokens across two aborted plan attempts, invisible).
40
+ *
41
+ * The event is the canonical phase event (schema-unchanged) with
42
+ * `verdict: "aborted" | "failed"` marking the outcome.
43
+ *
44
+ * Zero-token attempts are skipped — there is no spend to account, and a
45
+ * token-less event would be flagged as a husk by collate's ingestion-quality
46
+ * pass. Never throws: emission must not perturb the cancel/halt return paths.
47
+ *
48
+ * @param opts.decorate Optional event mutation hook applied before emit
49
+ * (fix-bug uses it for the BUG_TYPE_TOKENS `type` field).
50
+ * @returns true when the event was emitted and store-cli accepted it.
51
+ */
52
+ export declare function emitIncompletePhaseEvent(opts: {
53
+ emitCtx: OrchestratorEmitContext;
54
+ outcome: "aborted" | "failed";
55
+ notes?: string;
56
+ decorate?: (event: Record<string, unknown>) => void;
57
+ onDebug?: (rec: Record<string, unknown>) => void;
58
+ }): boolean;
59
+ export declare function judgementFromSummary(record: TaskRecord | null, phaseRole: string, summaryKeyByRole?: Record<string, string | null>): Record<string, unknown> | undefined;
60
+ export declare function drainFrictionFile(frictionPath: string, ec: OrchestratorEmitContext): {
61
+ emitted: number;
62
+ failed: number;
63
+ };
@@ -0,0 +1,185 @@
1
+ // task-events.ts — orchestrator event composition + emission helpers.
2
+ // Extracted from run-task.ts (no logic changes). run-task.ts re-exports these.
3
+ import * as fs from "node:fs";
4
+ import { spawnSync } from "node:child_process";
5
+ import { SUMMARY_KEY_BY_ROLE } from "./task-phases.js";
6
+ // Map phase.role → action token used in event.action / eventId.
7
+ export function actionForRole(role) {
8
+ return role.replace(/-/g, "_");
9
+ }
10
+ export function isoCompact(ms) {
11
+ return new Date(ms)
12
+ .toISOString()
13
+ .replace(/[-:]/g, "")
14
+ .replace(/\.\d{3}Z$/, "Z");
15
+ }
16
+ export function buildPhaseEvent(ec) {
17
+ const action = actionForRole(ec.phase.role);
18
+ const entityId = ec.entityType === "bug" ? ec.bugId : ec.taskId;
19
+ const eventId = `${isoCompact(ec.startMs)}_${entityId}_${ec.phase.personaNoun}_${action}`;
20
+ const durationMs = Math.max(0, ec.endMs - ec.startMs);
21
+ const event = {
22
+ eventId,
23
+ sprintId: ec.sprintId,
24
+ role: ec.phase.role,
25
+ action: `/forge:${action.replace(/_/g, "-")}`,
26
+ phase: ec.phase.role,
27
+ iteration: ec.iteration,
28
+ startTimestamp: new Date(ec.startMs).toISOString(),
29
+ endTimestamp: new Date(ec.endMs).toISOString(),
30
+ durationMinutes: Math.round((durationMs / 60000) * 100) / 100,
31
+ model: ec.model,
32
+ provider: ec.provider,
33
+ };
34
+ if (ec.entityType === "bug") {
35
+ event.bugId = ec.bugId;
36
+ }
37
+ else {
38
+ event.taskId = ec.taskId;
39
+ }
40
+ if (ec.usage.input > 0 || ec.usage.output > 0 || ec.usage.cacheRead > 0 || ec.usage.cacheWrite > 0) {
41
+ event.inputTokens = ec.usage.input;
42
+ event.outputTokens = ec.usage.output;
43
+ event.cacheReadTokens = ec.usage.cacheRead;
44
+ event.cacheWriteTokens = ec.usage.cacheWrite;
45
+ event.tokenSource = "reported";
46
+ }
47
+ if (ec.judgement && typeof ec.judgement === "object") {
48
+ const j = ec.judgement;
49
+ if (typeof j.verdict === "string")
50
+ event.verdict = j.verdict;
51
+ if (typeof j.notes === "string")
52
+ event.notes = j.notes;
53
+ }
54
+ return event;
55
+ }
56
+ export function emitEvent(storeCli, cwd, sprintId, event) {
57
+ const result = spawnSync("node", [storeCli, "emit", sprintId, JSON.stringify(event)], {
58
+ cwd,
59
+ encoding: "utf8",
60
+ });
61
+ return { ok: result.status === 0, stderr: typeof result.stderr === "string" ? result.stderr : "" };
62
+ }
63
+ /**
64
+ * Emit a phase event for an INCOMPLETE attempt (cancelled / failed) so its
65
+ * provider-billed tokens reach the store. Bug B: the cancel and halt-on-failure
66
+ * branches used to return without emitting, so collate's COST_REPORT
67
+ * under-counted real spend by exactly the aborted passes (CART-S02-T03
68
+ * baseline: 259,950 tokens across two aborted plan attempts, invisible).
69
+ *
70
+ * The event is the canonical phase event (schema-unchanged) with
71
+ * `verdict: "aborted" | "failed"` marking the outcome.
72
+ *
73
+ * Zero-token attempts are skipped — there is no spend to account, and a
74
+ * token-less event would be flagged as a husk by collate's ingestion-quality
75
+ * pass. Never throws: emission must not perturb the cancel/halt return paths.
76
+ *
77
+ * @param opts.decorate Optional event mutation hook applied before emit
78
+ * (fix-bug uses it for the BUG_TYPE_TOKENS `type` field).
79
+ * @returns true when the event was emitted and store-cli accepted it.
80
+ */
81
+ export function emitIncompletePhaseEvent(opts) {
82
+ try {
83
+ const { emitCtx, outcome } = opts;
84
+ const u = emitCtx.usage;
85
+ if (u.input + u.output + u.cacheRead + u.cacheWrite <= 0) {
86
+ opts.onDebug?.({ kind: "incomplete_emit_skipped", reason: "no-tokens", outcome });
87
+ return false;
88
+ }
89
+ const judgement = { verdict: outcome };
90
+ if (opts.notes)
91
+ judgement.notes = opts.notes;
92
+ const event = buildPhaseEvent({ ...emitCtx, judgement });
93
+ opts.decorate?.(event);
94
+ const res = emitEvent(emitCtx.storeCli, emitCtx.cwd, emitCtx.sprintId, event);
95
+ opts.onDebug?.(res.ok
96
+ ? { kind: "incomplete_emit_ok", eventId: event.eventId, outcome }
97
+ : { kind: "incomplete_emit_failed", stderr: res.stderr, outcome });
98
+ return res.ok;
99
+ }
100
+ catch (err) {
101
+ const msg = err instanceof Error ? err.message : String(err);
102
+ opts.onDebug?.({ kind: "incomplete_emit_failed", stderr: msg, outcome: opts.outcome });
103
+ return false;
104
+ }
105
+ }
106
+ export function judgementFromSummary(record, phaseRole, summaryKeyByRole) {
107
+ if (!record || !record.summaries)
108
+ return undefined;
109
+ const keyMap = summaryKeyByRole ?? SUMMARY_KEY_BY_ROLE;
110
+ const summaryKey = keyMap[phaseRole];
111
+ if (!summaryKey)
112
+ return undefined;
113
+ const blob = record.summaries[summaryKey];
114
+ return blob && typeof blob === "object" ? blob : undefined;
115
+ }
116
+ // Drain .forge/cache/FRICTION-{phase}.jsonl: stamp each judgement-only record
117
+ // with the subagent's runtime attribution and emit as event type "friction".
118
+ // Truncate only after all emits succeed (Plan-11 open-question A.3).
119
+ export function drainFrictionFile(frictionPath, ec) {
120
+ if (!fs.existsSync(frictionPath))
121
+ return { emitted: 0, failed: 0 };
122
+ const raw = fs.readFileSync(frictionPath, "utf8");
123
+ const lines = raw.split("\n").filter((l) => l.trim().length > 0);
124
+ if (lines.length === 0)
125
+ return { emitted: 0, failed: 0 };
126
+ let emitted = 0;
127
+ let failed = 0;
128
+ for (let i = 0; i < lines.length; i++) {
129
+ let judgement;
130
+ try {
131
+ judgement = JSON.parse(lines[i]);
132
+ }
133
+ catch {
134
+ failed++;
135
+ continue;
136
+ }
137
+ const action = actionForRole(ec.phase.role);
138
+ const entityId = ec.entityType === "bug" ? ec.bugId : ec.taskId;
139
+ const eventId = `${isoCompact(ec.startMs)}_${entityId}_${ec.phase.personaNoun}_friction_${i}`;
140
+ const event = {
141
+ eventId,
142
+ sprintId: ec.sprintId,
143
+ role: ec.phase.role,
144
+ action: `/forge:${action.replace(/_/g, "-")}`,
145
+ phase: ec.phase.role,
146
+ iteration: ec.iteration,
147
+ startTimestamp: new Date(ec.startMs).toISOString(),
148
+ endTimestamp: new Date(ec.endMs).toISOString(),
149
+ durationMinutes: Math.round(((ec.endMs - ec.startMs) / 60000) * 100) / 100,
150
+ model: ec.model,
151
+ provider: ec.provider,
152
+ type: "friction",
153
+ workflow: typeof judgement.workflow === "string" ? judgement.workflow : ec.phase.role,
154
+ persona: typeof judgement.persona === "string" ? judgement.persona : ec.phase.personaNoun,
155
+ issue: judgement.issue,
156
+ };
157
+ if (ec.entityType === "bug") {
158
+ event.bugId = ec.bugId;
159
+ }
160
+ else {
161
+ event.taskId = ec.taskId;
162
+ }
163
+ if (judgement.subkind !== undefined)
164
+ event.subkind = judgement.subkind;
165
+ if (judgement.evidence !== undefined)
166
+ event.evidence = judgement.evidence;
167
+ if (judgement.notes !== undefined)
168
+ event.notes = judgement.notes;
169
+ const r = emitEvent(ec.storeCli, ec.cwd, ec.sprintId, event);
170
+ if (r.ok)
171
+ emitted++;
172
+ else
173
+ failed++;
174
+ }
175
+ if (failed === 0) {
176
+ try {
177
+ fs.unlinkSync(frictionPath);
178
+ }
179
+ catch {
180
+ /* non-fatal */
181
+ }
182
+ }
183
+ return { emitted, failed };
184
+ }
185
+ //# sourceMappingURL=task-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-events.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/task/task-events.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,+EAA+E;AAE/E,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAwB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG7E,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AA2BD,MAAM,UAAU,UAAU,CAAC,EAAU;IACpC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;SACjB,WAAW,EAAE;SACb,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAA2B;IAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAO,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC;IAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,KAAK,GAA4B;QACtC,OAAO;QACP,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI;QACnB,MAAM,EAAE,UAAU,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;QAC7C,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI;QACpB,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,cAAc,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;QAClD,YAAY,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;QAC9C,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC7D,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,QAAQ,EAAE,EAAE,CAAC,QAAQ;KACrB,CAAC;IACF,IAAI,EAAE,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;IACxB,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IAC1B,CAAC;IACD,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACpG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACnC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;QACrC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;QAC3C,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,IAAI,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,EAAE,CAAC,SAAoC,CAAC;QAClD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC7D,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CACxB,QAAgB,EAChB,GAAW,EACX,QAAgB,EAChB,KAA8B;IAE9B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE;QACrF,GAAG;QACH,QAAQ,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACpG,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAMxC;IACA,IAAI,CAAC;QACJ,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAClC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YAClF,OAAO,KAAK,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAA4B,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAChE,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7C,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,OAAO,EAAE,CACb,GAAG,CAAC,EAAE;YACL,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE;YACjE,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAClE,CAAC;QACF,OAAO,GAAG,CAAC,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,MAAyB,EACzB,SAAiB,EACjB,gBAAgD;IAEhD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,MAAM,GAAG,gBAAgB,IAAI,mBAAmB,CAAC;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,IAAI,GAAI,MAAM,CAAC,SAAqC,CAAC,UAAU,CAAC,CAAC;IACvE,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,8EAA8E;AAC9E,6EAA6E;AAC7E,qEAAqE;AACrE,MAAM,UAAU,iBAAiB,CAChC,YAAoB,EACpB,EAA2B;IAE3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACnE,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAEzD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,SAAkC,CAAC;QACvC,IAAI,CAAC;YACJ,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAA4B,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,EAAE,CAAC;YACT,SAAS;QACV,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAO,CAAC;QAClE,MAAM,OAAO,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,aAAa,CAAC,EAAE,CAAC;QAC9F,MAAM,KAAK,GAA4B;YACtC,OAAO;YACP,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI;YACnB,MAAM,EAAE,UAAU,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YAC7C,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI;YACpB,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,cAAc,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YAClD,YAAY,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;YAC9C,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC1E,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI;YACrF,OAAO,EAAE,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW;YACzF,KAAK,EAAE,SAAS,CAAC,KAAK;SACtB,CAAC;QACF,IAAI,EAAE,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC7B,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;QACxB,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QAC1B,CAAC;QACD,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QACvE,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC1E,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QACjE,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;;YACf,MAAM,EAAE,CAAC;IACf,CAAC;IAED,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACR,eAAe;QAChB,CAAC;IACF,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,34 @@
1
+ export type PreflightResult = "proceed" | "halt" | "escalate";
2
+ /** Structured gate failure shape emitted by preflight-gate.cjs on stdout (exit 1). */
3
+ export interface GateFailureData {
4
+ phase: string;
5
+ reasonCode: string;
6
+ detail: string;
7
+ remediation: string;
8
+ }
9
+ /** Extended result carrying the structured failure alongside the status enum. */
10
+ export interface PreflightOutcome {
11
+ result: PreflightResult;
12
+ /** Parsed structured failure from stdout, or null on pass / escalate. */
13
+ gateFailure: GateFailureData | null;
14
+ }
15
+ export declare function runPreflightGate(preflightGate: string, role: string, taskId: string, cwd: string, entityType?: "task" | "bug"): PreflightResult;
16
+ /**
17
+ * Run postflight-gate.cjs after a phase subagent returns, before FSM advance.
18
+ * Mirrors runPreflightGateWithData — same argv-array discipline, same structured-JSON
19
+ * parsing from stdout on exit 1.
20
+ *
21
+ * Returns:
22
+ * "ok" — gate passed (or no outputs block for this phase); advance may proceed.
23
+ * "unsatisfied" — gate failed; do NOT advance FSM; halt and call runHaltAdvisor.
24
+ * "error" — gate binary missing or parse error; treat as pass-through (additive).
25
+ */
26
+ export declare function runPostflightGate(postflightGate: string, role: string, taskId: string, cwd: string): {
27
+ result: "ok" | "unsatisfied" | "error";
28
+ gateFailure: GateFailureData | null;
29
+ };
30
+ /**
31
+ * Upgraded variant that returns structured failure data alongside the status enum.
32
+ * Callers that need the advisory data should use this function directly.
33
+ */
34
+ export declare function runPreflightGateWithData(preflightGate: string, role: string, taskId: string, cwd: string, entityType?: "task" | "bug"): PreflightOutcome;
@@ -0,0 +1,78 @@
1
+ // task-gates.ts — preflight / postflight gate execution helpers.
2
+ // Extracted from run-task.ts (no logic changes). run-task.ts re-exports these.
3
+ import * as fs from "node:fs";
4
+ import { spawnSync } from "node:child_process";
5
+ export function runPreflightGate(preflightGate, role, taskId, cwd, entityType) {
6
+ const outcome = runPreflightGateWithData(preflightGate, role, taskId, cwd, entityType);
7
+ return outcome.result;
8
+ }
9
+ /**
10
+ * Run postflight-gate.cjs after a phase subagent returns, before FSM advance.
11
+ * Mirrors runPreflightGateWithData — same argv-array discipline, same structured-JSON
12
+ * parsing from stdout on exit 1.
13
+ *
14
+ * Returns:
15
+ * "ok" — gate passed (or no outputs block for this phase); advance may proceed.
16
+ * "unsatisfied" — gate failed; do NOT advance FSM; halt and call runHaltAdvisor.
17
+ * "error" — gate binary missing or parse error; treat as pass-through (additive).
18
+ */
19
+ export function runPostflightGate(postflightGate, role, taskId, cwd) {
20
+ if (!fs.existsSync(postflightGate)) {
21
+ // postflight-gate.cjs not present in this forgeRoot — pass through (additive).
22
+ return { result: "ok", gateFailure: null };
23
+ }
24
+ const spawnResult = spawnSync("node", [postflightGate, "--phase", role, "--task", taskId], {
25
+ cwd,
26
+ encoding: "utf8",
27
+ });
28
+ if (spawnResult.status === 0)
29
+ return { result: "ok", gateFailure: null };
30
+ if (spawnResult.status === 2)
31
+ return { result: "error", gateFailure: null };
32
+ // Exit 1: parse structured JSON from stdout
33
+ let gateFailure = null;
34
+ try {
35
+ const stdout = typeof spawnResult.stdout === "string" ? spawnResult.stdout.trim() : "";
36
+ if (stdout) {
37
+ const parsed = JSON.parse(stdout);
38
+ if (parsed && typeof parsed.reasonCode === "string") {
39
+ gateFailure = parsed;
40
+ }
41
+ }
42
+ }
43
+ catch {
44
+ // stdout not valid JSON — gate failure but no structured data
45
+ }
46
+ return { result: "unsatisfied", gateFailure };
47
+ }
48
+ /**
49
+ * Upgraded variant that returns structured failure data alongside the status enum.
50
+ * Callers that need the advisory data should use this function directly.
51
+ */
52
+ export function runPreflightGateWithData(preflightGate, role, taskId, cwd, entityType) {
53
+ const entityFlag = entityType === "bug" ? "--bug" : "--task";
54
+ const spawnResult = spawnSync("node", [preflightGate, "--phase", role, entityFlag, taskId], {
55
+ cwd,
56
+ encoding: "utf8",
57
+ });
58
+ if (spawnResult.status === 0)
59
+ return { result: "proceed", gateFailure: null };
60
+ if (spawnResult.status === 2)
61
+ return { result: "escalate", gateFailure: null };
62
+ // Exit 1: parse structured JSON from stdout
63
+ let gateFailure = null;
64
+ try {
65
+ const stdout = typeof spawnResult.stdout === "string" ? spawnResult.stdout.trim() : "";
66
+ if (stdout) {
67
+ const parsed = JSON.parse(stdout);
68
+ if (parsed && typeof parsed.reasonCode === "string") {
69
+ gateFailure = parsed;
70
+ }
71
+ }
72
+ }
73
+ catch {
74
+ // stdout not valid JSON — gate failure but no structured data
75
+ }
76
+ return { result: "halt", gateFailure };
77
+ }
78
+ //# sourceMappingURL=task-gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-gates.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/task/task-gates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
2
+ import type { MergedConfig } from "../../config/config-layer.js";
3
+ import { type SubagentResult } from "../../forge-subagent.js";
4
+ import { attachViewportObserver } from "../../viewport/events.js";
5
+ import { type PhaseDescriptor } from "./task-phases.js";
6
+ import { type TaskRecord } from "./task-record.js";
7
+ import type { RunTaskPipelineOptions, RunTaskPipelineResult } from "./run-task-types.js";
8
+ export interface PhaseDispatchParams {
9
+ opts: RunTaskPipelineOptions;
10
+ phase: PhaseDescriptor;
11
+ taskId: string;
12
+ cwd: string;
13
+ ctx: ExtensionCommandContext;
14
+ storeCli: string;
15
+ currentPhaseIndex: number;
16
+ iterationCounts: Record<string, number>;
17
+ dispatchCounts: Record<string, number>;
18
+ modelRoutingConfig: MergedConfig;
19
+ registry: RunTaskPipelineOptions["registry"];
20
+ cacheSessionId: string;
21
+ taskRecordAtStart: TaskRecord | null;
22
+ /** Raw sub-workflow markdown already loaded + marker-checked by the caller. */
23
+ subWorkflowMd: string;
24
+ }
25
+ export type PhaseDispatchOutcome = {
26
+ kind: "return";
27
+ result: RunTaskPipelineResult;
28
+ } | {
29
+ kind: "ok";
30
+ result: SubagentResult;
31
+ finishPhaseNode: (status: "completed" | "failed" | "escalated") => void;
32
+ observer: ReturnType<typeof attachViewportObserver>;
33
+ phaseStart: number;
34
+ writeDebug: (rec: Record<string, unknown>) => void;
35
+ };
36
+ /**
37
+ * Run a single phase's subagent dispatch and classify the immediate outcome
38
+ * (persona-load failure, subagent throw, cancellation, or non-zero exit) into
39
+ * a discriminated result. On success returns `kind: "ok"` with the live locals
40
+ * the caller's loop needs for verdict/postflight handling and advance.
41
+ */
42
+ export declare function dispatchPhase(p: PhaseDispatchParams): Promise<PhaseDispatchOutcome>;