@entelligentsia/forgecli 1.0.14 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/README.md +7 -1
  3. package/dist/CHANGELOG-forge-plugin.md +61 -0
  4. package/dist/bin/config.js +4 -4
  5. package/dist/bin/config.js.map +1 -1
  6. package/dist/bin/update-cli.d.ts +1 -1
  7. package/dist/bin/update-cli.js +1 -1
  8. package/dist/bin/update-cli.js.map +1 -1
  9. package/dist/extensions/forgecli/ask-user-tool.js +1 -1
  10. package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
  11. package/dist/extensions/forgecli/commands/add-pipeline.d.ts +19 -0
  12. package/dist/extensions/forgecli/commands/add-pipeline.js +143 -0
  13. package/dist/extensions/forgecli/commands/add-pipeline.js.map +1 -0
  14. package/dist/extensions/forgecli/commands/add-task.d.ts +20 -0
  15. package/dist/extensions/forgecli/commands/add-task.js +154 -0
  16. package/dist/extensions/forgecli/commands/add-task.js.map +1 -0
  17. package/dist/extensions/forgecli/commands/approve.d.ts +22 -0
  18. package/dist/extensions/forgecli/commands/approve.js +152 -0
  19. package/dist/extensions/forgecli/commands/approve.js.map +1 -0
  20. package/dist/extensions/forgecli/commands/collate.d.ts +22 -0
  21. package/dist/extensions/forgecli/commands/collate.js +134 -0
  22. package/dist/extensions/forgecli/commands/collate.js.map +1 -0
  23. package/dist/extensions/forgecli/commands/commit.d.ts +22 -0
  24. package/dist/extensions/forgecli/commands/commit.js +152 -0
  25. package/dist/extensions/forgecli/commands/commit.js.map +1 -0
  26. package/dist/extensions/forgecli/commands/config-command.d.ts +8 -0
  27. package/dist/extensions/forgecli/commands/config-command.js +67 -0
  28. package/dist/extensions/forgecli/commands/config-command.js.map +1 -0
  29. package/dist/extensions/forgecli/commands/enhance.d.ts +45 -0
  30. package/dist/extensions/forgecli/commands/enhance.js +219 -0
  31. package/dist/extensions/forgecli/commands/enhance.js.map +1 -0
  32. package/dist/extensions/forgecli/commands/implement.d.ts +22 -0
  33. package/dist/extensions/forgecli/commands/implement.js +170 -0
  34. package/dist/extensions/forgecli/commands/implement.js.map +1 -0
  35. package/dist/extensions/forgecli/commands/plan.d.ts +22 -0
  36. package/dist/extensions/forgecli/commands/plan.js +167 -0
  37. package/dist/extensions/forgecli/commands/plan.js.map +1 -0
  38. package/dist/extensions/forgecli/commands/quiz-agent.d.ts +17 -0
  39. package/dist/extensions/forgecli/commands/quiz-agent.js +98 -0
  40. package/dist/extensions/forgecli/commands/quiz-agent.js.map +1 -0
  41. package/dist/extensions/forgecli/commands/read-command.d.ts +2 -0
  42. package/dist/extensions/forgecli/commands/read-command.js +100 -0
  43. package/dist/extensions/forgecli/commands/read-command.js.map +1 -0
  44. package/dist/extensions/forgecli/commands/regenerate.d.ts +40 -0
  45. package/dist/extensions/forgecli/commands/regenerate.js +426 -0
  46. package/dist/extensions/forgecli/commands/regenerate.js.map +1 -0
  47. package/dist/extensions/forgecli/commands/remove-command.d.ts +17 -0
  48. package/dist/extensions/forgecli/commands/remove-command.js +124 -0
  49. package/dist/extensions/forgecli/commands/remove-command.js.map +1 -0
  50. package/dist/extensions/forgecli/commands/report-bug.d.ts +25 -0
  51. package/dist/extensions/forgecli/commands/report-bug.js +159 -0
  52. package/dist/extensions/forgecli/commands/report-bug.js.map +1 -0
  53. package/dist/extensions/forgecli/commands/retrospective.d.ts +20 -0
  54. package/dist/extensions/forgecli/commands/retrospective.js +126 -0
  55. package/dist/extensions/forgecli/commands/retrospective.js.map +1 -0
  56. package/dist/extensions/forgecli/commands/review-code.d.ts +35 -0
  57. package/dist/extensions/forgecli/commands/review-code.js +196 -0
  58. package/dist/extensions/forgecli/commands/review-code.js.map +1 -0
  59. package/dist/extensions/forgecli/commands/review-plan.d.ts +35 -0
  60. package/dist/extensions/forgecli/commands/review-plan.js +200 -0
  61. package/dist/extensions/forgecli/commands/review-plan.js.map +1 -0
  62. package/dist/extensions/forgecli/commands/sprint-intake.d.ts +10 -0
  63. package/dist/extensions/forgecli/commands/sprint-intake.js +91 -0
  64. package/dist/extensions/forgecli/commands/sprint-intake.js.map +1 -0
  65. package/dist/extensions/forgecli/commands/sprint-plan.d.ts +14 -0
  66. package/dist/extensions/forgecli/commands/sprint-plan.js +122 -0
  67. package/dist/extensions/forgecli/commands/sprint-plan.js.map +1 -0
  68. package/dist/extensions/forgecli/commands/status-command.d.ts +19 -0
  69. package/dist/extensions/forgecli/commands/status-command.js +140 -0
  70. package/dist/extensions/forgecli/commands/status-command.js.map +1 -0
  71. package/dist/extensions/forgecli/commands/store-query.d.ts +22 -0
  72. package/dist/extensions/forgecli/commands/store-query.js +107 -0
  73. package/dist/extensions/forgecli/commands/store-query.js.map +1 -0
  74. package/dist/extensions/forgecli/commands/store-repair.d.ts +17 -0
  75. package/dist/extensions/forgecli/commands/store-repair.js +123 -0
  76. package/dist/extensions/forgecli/commands/store-repair.js.map +1 -0
  77. package/dist/extensions/forgecli/commands/test-orchestrate.d.ts +2 -0
  78. package/dist/extensions/forgecli/commands/test-orchestrate.js +182 -0
  79. package/dist/extensions/forgecli/commands/test-orchestrate.js.map +1 -0
  80. package/dist/extensions/forgecli/commands/transcripts-command.d.ts +87 -0
  81. package/dist/extensions/forgecli/commands/transcripts-command.js +418 -0
  82. package/dist/extensions/forgecli/commands/transcripts-command.js.map +1 -0
  83. package/dist/extensions/forgecli/commands/validate.d.ts +22 -0
  84. package/dist/extensions/forgecli/commands/validate.js +152 -0
  85. package/dist/extensions/forgecli/commands/validate.js.map +1 -0
  86. package/dist/extensions/forgecli/config/config-layer.d.ts +53 -0
  87. package/dist/extensions/forgecli/config/config-layer.js +72 -0
  88. package/dist/extensions/forgecli/config/config-layer.js.map +1 -0
  89. package/dist/extensions/forgecli/config/config-writer.d.ts +16 -0
  90. package/dist/extensions/forgecli/config/config-writer.js +69 -0
  91. package/dist/extensions/forgecli/config/config-writer.js.map +1 -0
  92. package/dist/extensions/forgecli/config/model-registry.d.ts +61 -0
  93. package/dist/extensions/forgecli/config/model-registry.js +127 -0
  94. package/dist/extensions/forgecli/config/model-registry.js.map +1 -0
  95. package/dist/extensions/forgecli/config/model-resolver.d.ts +32 -0
  96. package/dist/extensions/forgecli/config/model-resolver.js +65 -0
  97. package/dist/extensions/forgecli/config/model-resolver.js.map +1 -0
  98. package/dist/extensions/forgecli/config/model-validator.d.ts +29 -0
  99. package/dist/extensions/forgecli/config/model-validator.js +107 -0
  100. package/dist/extensions/forgecli/config/model-validator.js.map +1 -0
  101. package/dist/extensions/forgecli/config-layer.d.ts +0 -16
  102. package/dist/extensions/forgecli/config-layer.js +0 -5
  103. package/dist/extensions/forgecli/config-layer.js.map +1 -1
  104. package/dist/extensions/forgecli/config-tui/component.js +1 -1
  105. package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
  106. package/dist/extensions/forgecli/config-tui/handler.js +1 -1
  107. package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
  108. package/dist/extensions/forgecli/config-tui/screens/override-editor.js +1 -1
  109. package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
  110. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +1 -1
  111. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
  112. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +1 -1
  113. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
  114. package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
  115. package/dist/extensions/forgecli/config-tui/state/model.d.ts +1 -1
  116. package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
  117. package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +2 -2
  118. package/dist/extensions/forgecli/config-tui/state/selectors.js +1 -1
  119. package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
  120. package/dist/extensions/forgecli/context-governor-compaction.d.ts +94 -0
  121. package/dist/extensions/forgecli/context-governor-compaction.js +327 -0
  122. package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -0
  123. package/dist/extensions/forgecli/context-governor.d.ts +169 -0
  124. package/dist/extensions/forgecli/context-governor.js +592 -0
  125. package/dist/extensions/forgecli/context-governor.js.map +1 -0
  126. package/dist/extensions/forgecli/dashboard/component.d.ts +17 -5
  127. package/dist/extensions/forgecli/dashboard/component.js +160 -115
  128. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  129. package/dist/extensions/forgecli/dashboard/register.js +7 -21
  130. package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
  131. package/dist/extensions/forgecli/dashboard/theme.d.ts +27 -0
  132. package/dist/extensions/forgecli/dashboard/theme.js +91 -0
  133. package/dist/extensions/forgecli/dashboard/theme.js.map +1 -0
  134. package/dist/extensions/forgecli/fix-bug.js +59 -5
  135. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  136. package/dist/extensions/forgecli/forge-artifact-tool.js +3 -2
  137. package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
  138. package/dist/extensions/forgecli/forge-cli-schema.json +0 -4
  139. package/dist/extensions/forgecli/forge-commands.js +1 -1
  140. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  141. package/dist/extensions/forgecli/forge-init/forge-init.d.ts +26 -0
  142. package/dist/extensions/forgecli/forge-init/forge-init.js +514 -0
  143. package/dist/extensions/forgecli/forge-init/forge-init.js.map +1 -0
  144. package/dist/extensions/forgecli/forge-init/init-context.d.ts +99 -0
  145. package/dist/extensions/forgecli/forge-init/init-context.js +178 -0
  146. package/dist/extensions/forgecli/forge-init/init-context.js.map +1 -0
  147. package/dist/extensions/forgecli/forge-init/init-progress.d.ts +39 -0
  148. package/dist/extensions/forgecli/forge-init/init-progress.js +117 -0
  149. package/dist/extensions/forgecli/forge-init/init-progress.js.map +1 -0
  150. package/dist/extensions/forgecli/forge-init/phase4-register.js +1 -1
  151. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  152. package/dist/extensions/forgecli/forge-init/run-phases.js +2 -2
  153. package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -1
  154. package/dist/extensions/forgecli/forge-subagent.d.ts +42 -1
  155. package/dist/extensions/forgecli/forge-subagent.js +59 -18
  156. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  157. package/dist/extensions/forgecli/forge-tools.d.ts +0 -25
  158. package/dist/extensions/forgecli/forge-tools.js +8 -37
  159. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  160. package/dist/extensions/forgecli/governor-config.d.ts +19 -0
  161. package/dist/extensions/forgecli/governor-config.js +58 -0
  162. package/dist/extensions/forgecli/governor-config.js.map +1 -0
  163. package/dist/extensions/forgecli/health-check.js +1 -1
  164. package/dist/extensions/forgecli/health-check.js.map +1 -1
  165. package/dist/extensions/forgecli/hook-dispatcher.d.ts +3 -1
  166. package/dist/extensions/forgecli/hook-dispatcher.js +39 -5
  167. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  168. package/dist/extensions/forgecli/hooks/post-init-hook.js +11 -6
  169. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
  170. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +11 -6
  171. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
  172. package/dist/extensions/forgecli/hooks/write-guard.js +1 -1
  173. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
  174. package/dist/extensions/forgecli/index.js +70 -36
  175. package/dist/extensions/forgecli/index.js.map +1 -1
  176. package/dist/extensions/forgecli/kickoff.d.ts +9 -0
  177. package/dist/extensions/forgecli/kickoff.js +15 -0
  178. package/dist/extensions/forgecli/kickoff.js.map +1 -1
  179. package/dist/extensions/forgecli/lib/forge-config.d.ts +1 -1
  180. package/dist/extensions/forgecli/lib/forge-config.js +1 -1
  181. package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
  182. package/dist/extensions/forgecli/lib/forge-root.d.ts +10 -0
  183. package/dist/extensions/forgecli/lib/forge-root.js +62 -0
  184. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -0
  185. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +19 -14
  186. package/dist/extensions/forgecli/lib/halt-advisor.js +36 -13
  187. package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -1
  188. package/dist/extensions/forgecli/lib/run-cjs.d.ts +26 -0
  189. package/dist/extensions/forgecli/lib/run-cjs.js +42 -0
  190. package/dist/extensions/forgecli/lib/run-cjs.js.map +1 -0
  191. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +3 -2
  192. package/dist/extensions/forgecli/orchestrator-status-bar.js +90 -60
  193. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -1
  194. package/dist/extensions/forgecli/orchestrator-tree.d.ts +4 -0
  195. package/dist/extensions/forgecli/orchestrator-tree.js +21 -3
  196. package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -1
  197. package/dist/extensions/forgecli/orchestrators/calibrate.d.ts +64 -0
  198. package/dist/extensions/forgecli/orchestrators/calibrate.js +481 -0
  199. package/dist/extensions/forgecli/orchestrators/calibrate.js.map +1 -0
  200. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +93 -0
  201. package/dist/extensions/forgecli/orchestrators/fix-bug.js +1705 -0
  202. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -0
  203. package/dist/extensions/forgecli/orchestrators/halt-advisor.d.ts +59 -0
  204. package/dist/extensions/forgecli/orchestrators/halt-advisor.js +113 -0
  205. package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -0
  206. package/dist/extensions/forgecli/orchestrators/materialize.d.ts +16 -0
  207. package/dist/extensions/forgecli/orchestrators/materialize.js +195 -0
  208. package/dist/extensions/forgecli/orchestrators/materialize.js.map +1 -0
  209. package/dist/extensions/forgecli/orchestrators/migrate.d.ts +22 -0
  210. package/dist/extensions/forgecli/orchestrators/migrate.js +260 -0
  211. package/dist/extensions/forgecli/orchestrators/migrate.js.map +1 -0
  212. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.d.ts +46 -0
  213. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js +64 -0
  214. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js.map +1 -0
  215. package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +27 -0
  216. package/dist/extensions/forgecli/orchestrators/run-sprint.js +734 -0
  217. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -0
  218. package/dist/extensions/forgecli/orchestrators/run-task.d.ts +215 -0
  219. package/dist/extensions/forgecli/orchestrators/run-task.js +1491 -0
  220. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -0
  221. package/dist/extensions/forgecli/paths/paths.d.ts +8 -0
  222. package/dist/extensions/forgecli/paths/paths.js +17 -0
  223. package/dist/extensions/forgecli/paths/paths.js.map +1 -1
  224. package/dist/extensions/forgecli/phase-vocab.d.ts +31 -0
  225. package/dist/extensions/forgecli/phase-vocab.js +82 -0
  226. package/dist/extensions/forgecli/phase-vocab.js.map +1 -0
  227. package/dist/extensions/forgecli/run-sprint.d.ts +3 -1
  228. package/dist/extensions/forgecli/run-sprint.js +1 -0
  229. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  230. package/dist/extensions/forgecli/run-task.d.ts +34 -1
  231. package/dist/extensions/forgecli/run-task.js +144 -6
  232. package/dist/extensions/forgecli/run-task.js.map +1 -1
  233. package/dist/extensions/forgecli/session-registry.d.ts +2 -2
  234. package/dist/extensions/forgecli/session-registry.js +6 -2
  235. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  236. package/dist/extensions/forgecli/skill-curation/friction-emit.d.ts +99 -0
  237. package/dist/extensions/forgecli/skill-curation/friction-emit.js +245 -0
  238. package/dist/extensions/forgecli/skill-curation/friction-emit.js.map +1 -0
  239. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.d.ts +21 -0
  240. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js +71 -0
  241. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js.map +1 -0
  242. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.d.ts +102 -0
  243. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js +339 -0
  244. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js.map +1 -0
  245. package/dist/extensions/forgecli/skill-curation/skill-retriever.d.ts +84 -0
  246. package/dist/extensions/forgecli/skill-curation/skill-retriever.js +246 -0
  247. package/dist/extensions/forgecli/skill-curation/skill-retriever.js.map +1 -0
  248. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.d.ts +91 -0
  249. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js +224 -0
  250. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js.map +1 -0
  251. package/dist/extensions/forgecli/store/store-error-remediation.d.ts +65 -0
  252. package/dist/extensions/forgecli/store/store-error-remediation.js +307 -0
  253. package/dist/extensions/forgecli/store/store-error-remediation.js.map +1 -0
  254. package/dist/extensions/forgecli/store/store-resolver.d.ts +56 -0
  255. package/dist/extensions/forgecli/store/store-resolver.js +263 -0
  256. package/dist/extensions/forgecli/store/store-resolver.js.map +1 -0
  257. package/dist/extensions/forgecli/store/store-validator.d.ts +16 -0
  258. package/dist/extensions/forgecli/store/store-validator.js +32 -0
  259. package/dist/extensions/forgecli/store/store-validator.js.map +1 -0
  260. package/dist/extensions/forgecli/store/transition-guard.d.ts +20 -0
  261. package/dist/extensions/forgecli/store/transition-guard.js +89 -0
  262. package/dist/extensions/forgecli/store/transition-guard.js.map +1 -0
  263. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +5 -0
  264. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -1
  265. package/dist/extensions/forgecli/thread-switcher.d.ts +4 -1
  266. package/dist/extensions/forgecli/thread-switcher.js +36 -21
  267. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  268. package/dist/extensions/forgecli/transcript-archive-types.d.ts +171 -0
  269. package/dist/extensions/forgecli/transcript-archive-types.js +130 -0
  270. package/dist/extensions/forgecli/transcript-archive-types.js.map +1 -0
  271. package/dist/extensions/forgecli/transcript-archive.d.ts +127 -0
  272. package/dist/extensions/forgecli/transcript-archive.js +656 -0
  273. package/dist/extensions/forgecli/transcript-archive.js.map +1 -0
  274. package/dist/extensions/forgecli/transcript-replay.d.ts +28 -0
  275. package/dist/extensions/forgecli/transcript-replay.js +153 -0
  276. package/dist/extensions/forgecli/transcript-replay.js.map +1 -0
  277. package/dist/extensions/forgecli/transcripts-tui/component.d.ts +36 -0
  278. package/dist/extensions/forgecli/transcripts-tui/component.js +112 -0
  279. package/dist/extensions/forgecli/transcripts-tui/component.js.map +1 -0
  280. package/dist/extensions/forgecli/transcripts-tui/index.d.ts +4 -0
  281. package/dist/extensions/forgecli/transcripts-tui/index.js +5 -0
  282. package/dist/extensions/forgecli/transcripts-tui/index.js.map +1 -0
  283. package/dist/extensions/forgecli/transcripts-tui/screens/browse.d.ts +21 -0
  284. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js +172 -0
  285. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js.map +1 -0
  286. package/dist/extensions/forgecli/transcripts-tui/screens/types.d.ts +22 -0
  287. package/dist/extensions/forgecli/transcripts-tui/screens/types.js +4 -0
  288. package/dist/extensions/forgecli/transcripts-tui/screens/types.js.map +1 -0
  289. package/dist/extensions/forgecli/transcripts-tui/state/index.d.ts +4 -0
  290. package/dist/extensions/forgecli/transcripts-tui/state/index.js +5 -0
  291. package/dist/extensions/forgecli/transcripts-tui/state/index.js.map +1 -0
  292. package/dist/extensions/forgecli/transcripts-tui/state/init.d.ts +8 -0
  293. package/dist/extensions/forgecli/transcripts-tui/state/init.js +18 -0
  294. package/dist/extensions/forgecli/transcripts-tui/state/init.js.map +1 -0
  295. package/dist/extensions/forgecli/transcripts-tui/state/model.d.ts +56 -0
  296. package/dist/extensions/forgecli/transcripts-tui/state/model.js +6 -0
  297. package/dist/extensions/forgecli/transcripts-tui/state/model.js.map +1 -0
  298. package/dist/extensions/forgecli/transcripts-tui/state/reducer.d.ts +2 -0
  299. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js +51 -0
  300. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js.map +1 -0
  301. package/dist/extensions/forgecli/transcripts-tui/state/selectors.d.ts +10 -0
  302. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js +62 -0
  303. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js.map +1 -0
  304. package/dist/extensions/forgecli/transcripts-tui/theme.d.ts +20 -0
  305. package/dist/extensions/forgecli/transcripts-tui/theme.js +47 -0
  306. package/dist/extensions/forgecli/transcripts-tui/theme.js.map +1 -0
  307. package/dist/extensions/forgecli/tui/banner.d.ts +10 -0
  308. package/dist/extensions/forgecli/tui/banner.js +36 -0
  309. package/dist/extensions/forgecli/tui/banner.js.map +1 -0
  310. package/dist/extensions/forgecli/tui/forge-header.d.ts +12 -0
  311. package/dist/extensions/forgecli/tui/forge-header.js +114 -0
  312. package/dist/extensions/forgecli/tui/forge-header.js.map +1 -0
  313. package/dist/extensions/forgecli/tui/input-router.d.ts +33 -0
  314. package/dist/extensions/forgecli/tui/input-router.js +136 -0
  315. package/dist/extensions/forgecli/tui/input-router.js.map +1 -0
  316. package/dist/extensions/forgecli/tui/orchestrator-status-bar.d.ts +26 -0
  317. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js +213 -0
  318. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js.map +1 -0
  319. package/dist/extensions/forgecli/tui/thread-switcher.d.ts +18 -0
  320. package/dist/extensions/forgecli/tui/thread-switcher.js +194 -0
  321. package/dist/extensions/forgecli/tui/thread-switcher.js.map +1 -0
  322. package/dist/extensions/forgecli/update/forge-update-command.d.ts +100 -0
  323. package/dist/extensions/forgecli/update/forge-update-command.js +435 -0
  324. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -0
  325. package/dist/extensions/forgecli/update/migration-engine.d.ts +117 -0
  326. package/dist/extensions/forgecli/update/migration-engine.js +563 -0
  327. package/dist/extensions/forgecli/update/migration-engine.js.map +1 -0
  328. package/dist/extensions/forgecli/update/update-check.d.ts +37 -0
  329. package/dist/extensions/forgecli/update/update-check.js +185 -0
  330. package/dist/extensions/forgecli/update/update-check.js.map +1 -0
  331. package/dist/extensions/forgecli/update/update-tools.d.ts +23 -0
  332. package/dist/extensions/forgecli/update/update-tools.js +135 -0
  333. package/dist/extensions/forgecli/update/update-tools.js.map +1 -0
  334. package/dist/extensions/forgecli/update/whats-new-widget.d.ts +26 -0
  335. package/dist/extensions/forgecli/update/whats-new-widget.js +376 -0
  336. package/dist/extensions/forgecli/update/whats-new-widget.js.map +1 -0
  337. package/dist/extensions/forgecli/update/whats-new.d.ts +120 -0
  338. package/dist/extensions/forgecli/update/whats-new.js +470 -0
  339. package/dist/extensions/forgecli/update/whats-new.js.map +1 -0
  340. package/dist/extensions/forgecli/viewport/events.d.ts +113 -0
  341. package/dist/extensions/forgecli/viewport/events.js +290 -0
  342. package/dist/extensions/forgecli/viewport/events.js.map +1 -0
  343. package/dist/extensions/forgecli/viewport/renderer.d.ts +102 -0
  344. package/dist/extensions/forgecli/viewport/renderer.js +277 -0
  345. package/dist/extensions/forgecli/viewport/renderer.js.map +1 -0
  346. package/dist/extensions/forgecli/viewport/theme.d.ts +11 -0
  347. package/dist/extensions/forgecli/viewport/theme.js +131 -0
  348. package/dist/extensions/forgecli/viewport/theme.js.map +1 -0
  349. package/dist/extensions/forgecli/wf-engine/engine.js +1 -1
  350. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
  351. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +9 -0
  352. package/dist/forge-payload/.base-pack/workflows/plan_task.md +7 -0
  353. package/dist/forge-payload/.base-pack/workflows/review_code.md +4 -3
  354. package/dist/forge-payload/.base-pack/workflows/review_plan.md +4 -3
  355. package/dist/forge-payload/.base-pack/workflows/validate_task.md +4 -3
  356. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  357. package/dist/forge-payload/.schemas/migrations.json +132 -27
  358. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +4 -3
  359. package/dist/forge-payload/meta/workflows/meta-review-plan.md +4 -3
  360. package/dist/forge-payload/meta/workflows/meta-validate.md +4 -3
  361. package/dist/forge-payload/tools/collate.cjs +32 -0
  362. package/dist/forge-payload/tools/postflight-gate.cjs +56 -10
  363. package/package.json +5 -3
@@ -0,0 +1,94 @@
1
+ import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
+ /**
3
+ * Structured Forge facts extracted from messagesToSummarize.
4
+ * All fields are arrays of strings for serialization into the compaction summary.
5
+ */
6
+ export interface ForgeFactSummary {
7
+ /** FORGE-X-Y / FORGE-X-Y-TN patterns extracted from message text. */
8
+ storeIds: string[];
9
+ /** Lines containing [x] or [ ] checkbox patterns (Markdown task lists). */
10
+ acStateLines: string[];
11
+ /** Lines matching → <status> or update-status ... status <value>. */
12
+ transitionLines: string[];
13
+ /** File refs: engineering/, .forge/, *.ts/*.md/*.cjs/*.json paths. */
14
+ fileRefs: string[];
15
+ /** Text blocks containing [FRICTION] or type:friction. */
16
+ frictionBlocks: string[];
17
+ }
18
+ /**
19
+ * Options for buildForgeCompactionFactory.
20
+ */
21
+ export interface ForgeCompactionOptions {
22
+ /**
23
+ * Absolute path to the project CWD (for warm-tier summary file lookup).
24
+ * When omitted, warm-tier merge is skipped unless summaryReader is provided.
25
+ */
26
+ cwd?: string;
27
+ /**
28
+ * Phase key for summary filename resolution (e.g. "architect/plan").
29
+ * When omitted, warm-tier merge is skipped.
30
+ */
31
+ phaseKey?: string;
32
+ /**
33
+ * Task/entity ID for summary path resolution (e.g. "FORGE-S30-T09").
34
+ * When omitted, warm-tier merge is skipped.
35
+ */
36
+ entityId?: string;
37
+ /**
38
+ * Sprint ID for summary path resolution (e.g. "FORGE-S30").
39
+ * When omitted, warm-tier merge is skipped.
40
+ */
41
+ sprintId?: string;
42
+ /**
43
+ * Injected summary reader (test seam). Receives the resolved summary
44
+ * file path (empty string when path resolution is skipped) and returns
45
+ * the raw JSON string or null. Defaults to fs.readFileSync.
46
+ * Must not throw — return null on any failure.
47
+ */
48
+ summaryReader?: (filePath: string) => string | null;
49
+ }
50
+ /**
51
+ * Extract structured Forge facts from an array of message-like objects.
52
+ *
53
+ * Pure function — no fs I/O, no LLM calls, provider-neutral.
54
+ * Accepts any array (unknown[]) to be safe against varying pi message shapes.
55
+ * Text content is extracted from `.content[].text` (assistant messages)
56
+ * and from direct string entries.
57
+ *
58
+ * @param messagesToSummarize Array of message-like objects from preparation.
59
+ * @param extractOpts Optional project-config parameters (FORGE-BUG-043 PR 2):
60
+ * prefix (store-ID prefix, default "FORGE") and
61
+ * engineeringPath (file-ref directory, default "engineering").
62
+ * Omitting them preserves the historical behaviour exactly.
63
+ * @returns ForgeFactSummary with all extracted patterns.
64
+ */
65
+ export declare function extractForgeFacts(messagesToSummarize: unknown[], extractOpts?: {
66
+ prefix?: string;
67
+ engineeringPath?: string;
68
+ }): ForgeFactSummary;
69
+ /**
70
+ * Build an ExtensionFactory that registers a session_before_compact handler
71
+ * returning a deterministically-composed CompactionResult.
72
+ *
73
+ * The handler:
74
+ * 1. Validates that event.preparation is present and well-formed.
75
+ * 2. Extracts Forge facts from event.preparation.messagesToSummarize
76
+ * (no LLM call, provider-neutral).
77
+ * 3. Reads the warm-tier {PHASE}-SUMMARY.json if opts provide path context,
78
+ * or invokes opts.summaryReader("") as a test seam.
79
+ * 4. Assembles a compact structured summary string.
80
+ * 5. Returns { compaction: { summary, firstKeptEntryId, tokensBefore } }.
81
+ * 6. Returns undefined on any error (IL7 — lets pi compact normally).
82
+ *
83
+ * Pack 07: reads summary files but never writes .forge/store/.
84
+ * IL10: no pi-mono edits, no dispatch contract changes.
85
+ * Wired per-phase by run-task.ts via RunSubagentOptions.extensionFactories.
86
+ *
87
+ * Project config (store-ID prefix, paths.engineering) is loaded ONCE here at
88
+ * factory construction from `<opts.cwd>/.forge/config.json` — never per
89
+ * compaction event. Without cwd the historical defaults apply (FORGE-BUG-043 PR 2).
90
+ *
91
+ * @param opts ForgeCompactionOptions (default: empty — no warm-tier).
92
+ * @returns ExtensionFactory for passing to DefaultResourceLoader.extensionFactories.
93
+ */
94
+ export declare function buildForgeCompactionFactory(opts?: ForgeCompactionOptions): ExtensionFactory;
@@ -0,0 +1,327 @@
1
+ // context-governor-compaction.ts — Mechanism E: Forge-aware compaction handler.
2
+ // FORGE-S30-T09
3
+ //
4
+ // Exports:
5
+ // ForgeFactSummary — extracted Forge facts struct
6
+ // ForgeCompactionOptions — options for the compaction factory
7
+ // extractForgeFacts(msgs) — pure extractor (no fs I/O)
8
+ // buildForgeCompactionFactory(opts) — ExtensionFactory builder
9
+ //
10
+ // Design:
11
+ // - Thin module separate from context-governor.ts so it can import ExtensionAPI
12
+ // types (which require the pi pkg) without polluting the pure-logic governor.
13
+ // - extractForgeFacts: line-level pattern matching — no LLM call, provider-neutral,
14
+ // lossless on structured facts.
15
+ // - Warm-tier merge: reads {PHASE}-SUMMARY.json via injected summaryReader
16
+ // (defaults to fs.readFileSync). Best-effort — absent/malformed files silently
17
+ // skipped (IL7).
18
+ // - IL7 fallback: entire session_before_compact handler wrapped in try/catch.
19
+ // On any error, returns undefined — lets pi compact normally with generateSummary.
20
+ // - IL10/Pack 07: only reads summary files, never writes .forge/store/ or summaries.
21
+ // - Wired per-phase by run-task.ts (FORGE_CTX_GOVERNOR=1) with cwd/phaseKey/
22
+ // entityId/sprintId opts; project config (prefix, paths.engineering) loads
23
+ // once at factory construction (FORGE-BUG-043 PR 2).
24
+ import * as fs from "node:fs";
25
+ import * as path from "node:path";
26
+ import { loadGovernorProjectConfig } from "./governor-config.js";
27
+ import { summaryFilenameFor } from "./phase-vocab.js";
28
+ // ---------------------------------------------------------------------------
29
+ // Pattern builders (parameterized by project config — FORGE-BUG-043 PR 2)
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Build the store-ID pattern for a project prefix. Standard forms:
33
+ * <P>-S30-T09 (sprint+task)
34
+ * <P>-S30 (sprint)
35
+ * <P>-BUG-042 (bug, with category letters + digit suffix)
36
+ * Pattern: prefix followed by alternating ALPHANUM segments separated by
37
+ * hyphens; two variants ordered longest-first so overlapping (sprint+task
38
+ * before sprint) works.
39
+ *
40
+ * The prefix was previously the literal "FORGE", so any project with a
41
+ * different project.prefix (e.g. CART) extracted zero store IDs (FORGE-BUG-043).
42
+ * The prefix is identifier-validated by loadGovernorProjectConfig before it
43
+ * reaches this builder; escaping here is defence in depth.
44
+ */
45
+ function buildStoreIdRe(prefix) {
46
+ const p = prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
47
+ return new RegExp(`${p}-[A-Z]+\\d*-(?:T?\\d+|[A-Z]+\\d*)|${p}-[A-Z]+\\d*`, "g");
48
+ }
49
+ /** Matches Markdown checkbox lines. */
50
+ const CHECKBOX_RE = /^\s*[-*]?\s*\[[ xX]\].*$/gm;
51
+ /** Matches status transition patterns:
52
+ * - Arrow: "→ implemented"
53
+ * - store-cli: "update-status task FORGE-S30-T09 status implementing"
54
+ * Using a broad match to capture both forms reliably. */
55
+ const TRANSITION_RE = /(?:→\s*[\w][\w-]*|update-status\s+\S+\s+\S+\s+status\s+[\w][\w-]*)/g;
56
+ /**
57
+ * Build the file-reference pattern. The engineering directory segment comes
58
+ * from paths.engineering (default "engineering"); `.forge/` is the product's
59
+ * fixed instance directory (it hosts config.json itself) and stays literal.
60
+ */
61
+ function buildFileRefRe(engineeringPath) {
62
+ const e = engineeringPath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
63
+ return new RegExp(`(?:${e}\\/[^\\s"'\`,;)]+|\\.forge\\/[^\\s"'\`,;)]+|\\b[\\w./\\-]+\\.(?:ts|md|cjs|json)\\b)`, "g");
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // extractForgeFacts — pure extractor
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * Extract structured Forge facts from an array of message-like objects.
70
+ *
71
+ * Pure function — no fs I/O, no LLM calls, provider-neutral.
72
+ * Accepts any array (unknown[]) to be safe against varying pi message shapes.
73
+ * Text content is extracted from `.content[].text` (assistant messages)
74
+ * and from direct string entries.
75
+ *
76
+ * @param messagesToSummarize Array of message-like objects from preparation.
77
+ * @param extractOpts Optional project-config parameters (FORGE-BUG-043 PR 2):
78
+ * prefix (store-ID prefix, default "FORGE") and
79
+ * engineeringPath (file-ref directory, default "engineering").
80
+ * Omitting them preserves the historical behaviour exactly.
81
+ * @returns ForgeFactSummary with all extracted patterns.
82
+ */
83
+ export function extractForgeFacts(messagesToSummarize, extractOpts) {
84
+ const storeIdRe = buildStoreIdRe(extractOpts?.prefix ?? "FORGE");
85
+ const fileRefRe = buildFileRefRe(extractOpts?.engineeringPath ?? "engineering");
86
+ const storeIdSet = new Set();
87
+ const acStateLines = [];
88
+ const transitionLineSet = new Set();
89
+ const fileRefSet = new Set();
90
+ const frictionBlocks = [];
91
+ for (const msg of messagesToSummarize) {
92
+ const texts = extractTextContent(msg);
93
+ for (const text of texts) {
94
+ // Store IDs — fresh RegExp per text so lastIndex never leaks
95
+ const storeMatches = text.matchAll(new RegExp(storeIdRe.source, "g"));
96
+ for (const m of storeMatches) {
97
+ storeIdSet.add(m[0]);
98
+ }
99
+ // AC-state checkbox lines
100
+ const checkboxMatches = text.match(new RegExp(CHECKBOX_RE.source, "gm"));
101
+ if (checkboxMatches) {
102
+ for (const line of checkboxMatches) {
103
+ acStateLines.push(line.trim());
104
+ }
105
+ }
106
+ // Transition lines
107
+ const transitionMatches = text.matchAll(new RegExp(TRANSITION_RE.source, "g"));
108
+ for (const m of transitionMatches) {
109
+ transitionLineSet.add(m[0].trim());
110
+ }
111
+ // File refs
112
+ const fileRefMatches = text.matchAll(new RegExp(fileRefRe.source, "g"));
113
+ for (const m of fileRefMatches) {
114
+ const ref = m[0].trim();
115
+ if (ref.length > 2) {
116
+ fileRefSet.add(ref);
117
+ }
118
+ }
119
+ // FRICTION blocks — scan per line
120
+ for (const line of text.split("\n")) {
121
+ if (/\[FRICTION\]|type:friction/i.test(line)) {
122
+ frictionBlocks.push(line.trim());
123
+ }
124
+ }
125
+ }
126
+ }
127
+ return {
128
+ storeIds: Array.from(storeIdSet),
129
+ acStateLines,
130
+ transitionLines: Array.from(transitionLineSet),
131
+ fileRefs: Array.from(fileRefSet),
132
+ frictionBlocks,
133
+ };
134
+ }
135
+ /**
136
+ * Extract text strings from a message-like object.
137
+ * Handles assistant messages (content[].text) and plain strings.
138
+ */
139
+ function extractTextContent(msg) {
140
+ if (typeof msg === "string") {
141
+ return [msg];
142
+ }
143
+ if (typeof msg !== "object" || msg === null) {
144
+ return [];
145
+ }
146
+ const msgObj = msg;
147
+ const content = msgObj["content"];
148
+ if (!Array.isArray(content)) {
149
+ return [];
150
+ }
151
+ const texts = [];
152
+ for (const part of content) {
153
+ if (typeof part === "string") {
154
+ texts.push(part);
155
+ }
156
+ else if (typeof part === "object" && part !== null) {
157
+ const p = part;
158
+ if (p["type"] === "text" && typeof p["text"] === "string") {
159
+ texts.push(p["text"]);
160
+ }
161
+ }
162
+ }
163
+ return texts;
164
+ }
165
+ /** Default summaryReader: synchronous fs.readFileSync. Returns null on any error. */
166
+ function defaultSummaryReader(filePath) {
167
+ try {
168
+ return fs.readFileSync(filePath, "utf-8");
169
+ }
170
+ catch {
171
+ return null;
172
+ }
173
+ }
174
+ /**
175
+ * Read and parse the warm-tier {PHASE}-SUMMARY.json (synchronous).
176
+ * Returns the parsed object or null on any failure (IL7).
177
+ *
178
+ * The summary filename comes from phase-vocab (mirror of the plugin's
179
+ * artifact-kinds.cjs catalog — FORGE-BUG-043). Unknown phase keys and phases
180
+ * without a summary artifact skip the warm-tier read entirely; no placeholder
181
+ * paths are ever constructed.
182
+ *
183
+ * When summaryReader is provided but cwd/phaseKey/entityId/sprintId are not,
184
+ * calls summaryReader("") — enables test seams that don't need path resolution.
185
+ */
186
+ function readWarmTierSummary(opts, engineeringPath) {
187
+ try {
188
+ let filePath;
189
+ const reader = opts.summaryReader ?? defaultSummaryReader;
190
+ if (opts.cwd && opts.phaseKey && opts.entityId && opts.sprintId) {
191
+ const filename = summaryFilenameFor(opts.phaseKey);
192
+ if (filename === null)
193
+ return null; // unknown key / no artifact — skip warm tier
194
+ filePath = path.join(opts.cwd, engineeringPath, "sprints", opts.sprintId, opts.entityId, filename);
195
+ }
196
+ else if (opts.summaryReader) {
197
+ // Test seam: summaryReader present but no path context — call with empty string.
198
+ filePath = "";
199
+ }
200
+ else {
201
+ return null;
202
+ }
203
+ const raw = reader(filePath);
204
+ if (!raw)
205
+ return null;
206
+ const parsed = JSON.parse(raw);
207
+ if (typeof parsed !== "object" || parsed === null)
208
+ return null;
209
+ return parsed;
210
+ }
211
+ catch {
212
+ return null;
213
+ }
214
+ }
215
+ // ---------------------------------------------------------------------------
216
+ // Summary assembly
217
+ // ---------------------------------------------------------------------------
218
+ /**
219
+ * Assemble a compact structured summary string from extracted facts
220
+ * and an optional warm-tier summary.
221
+ */
222
+ function assembleSummary(facts, warmTier) {
223
+ const parts = [];
224
+ // Warm-tier objective (highest information density — prepend).
225
+ if (warmTier?.objective) {
226
+ parts.push(`## Phase Objective\n${warmTier.objective}`);
227
+ }
228
+ // Warm-tier key changes.
229
+ if (warmTier?.key_changes && warmTier.key_changes.length > 0) {
230
+ parts.push(`## Key Changes\n${warmTier.key_changes.map((c) => `- ${c}`).join("\n")}`);
231
+ }
232
+ // Extracted store IDs.
233
+ if (facts.storeIds.length > 0) {
234
+ parts.push(`## Active Store IDs\n${facts.storeIds.join(", ")}`);
235
+ }
236
+ // AC state (checkboxes — capped at 10).
237
+ if (facts.acStateLines.length > 0) {
238
+ const sample = facts.acStateLines.slice(0, 10);
239
+ parts.push(`## Acceptance Criteria State\n${sample.join("\n")}`);
240
+ }
241
+ // Transitions (capped at 5).
242
+ if (facts.transitionLines.length > 0) {
243
+ const sample = facts.transitionLines.slice(0, 5);
244
+ parts.push(`## Status Transitions\n${sample.join("\n")}`);
245
+ }
246
+ // File refs (capped at 10).
247
+ if (facts.fileRefs.length > 0) {
248
+ const sample = facts.fileRefs.slice(0, 10);
249
+ parts.push(`## File References\n${sample.join("\n")}`);
250
+ }
251
+ // FRICTION blocks.
252
+ if (facts.frictionBlocks.length > 0) {
253
+ parts.push(`## FRICTION\n${facts.frictionBlocks.join("\n")}`);
254
+ }
255
+ if (parts.length === 0) {
256
+ return "[Forge context governor — compaction summary — no structured facts extracted]";
257
+ }
258
+ return `[Forge context governor — compaction summary]\n\n${parts.join("\n\n")}`;
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // buildForgeCompactionFactory — ExtensionFactory builder
262
+ // ---------------------------------------------------------------------------
263
+ /**
264
+ * Build an ExtensionFactory that registers a session_before_compact handler
265
+ * returning a deterministically-composed CompactionResult.
266
+ *
267
+ * The handler:
268
+ * 1. Validates that event.preparation is present and well-formed.
269
+ * 2. Extracts Forge facts from event.preparation.messagesToSummarize
270
+ * (no LLM call, provider-neutral).
271
+ * 3. Reads the warm-tier {PHASE}-SUMMARY.json if opts provide path context,
272
+ * or invokes opts.summaryReader("") as a test seam.
273
+ * 4. Assembles a compact structured summary string.
274
+ * 5. Returns { compaction: { summary, firstKeptEntryId, tokensBefore } }.
275
+ * 6. Returns undefined on any error (IL7 — lets pi compact normally).
276
+ *
277
+ * Pack 07: reads summary files but never writes .forge/store/.
278
+ * IL10: no pi-mono edits, no dispatch contract changes.
279
+ * Wired per-phase by run-task.ts via RunSubagentOptions.extensionFactories.
280
+ *
281
+ * Project config (store-ID prefix, paths.engineering) is loaded ONCE here at
282
+ * factory construction from `<opts.cwd>/.forge/config.json` — never per
283
+ * compaction event. Without cwd the historical defaults apply (FORGE-BUG-043 PR 2).
284
+ *
285
+ * @param opts ForgeCompactionOptions (default: empty — no warm-tier).
286
+ * @returns ExtensionFactory for passing to DefaultResourceLoader.extensionFactories.
287
+ */
288
+ export function buildForgeCompactionFactory(opts = {}) {
289
+ const projectConfig = loadGovernorProjectConfig(opts.cwd);
290
+ return (pi) => {
291
+ pi.on("session_before_compact", (event) => {
292
+ try {
293
+ // Validate preparation is present and has the required pass-through fields.
294
+ const prep = event?.preparation;
295
+ if (!prep || typeof prep !== "object") {
296
+ return undefined; // IL7 — malformed preparation
297
+ }
298
+ const { firstKeptEntryId, tokensBefore, messagesToSummarize } = prep;
299
+ if (typeof firstKeptEntryId !== "string" || typeof tokensBefore !== "number") {
300
+ return undefined; // IL7 — malformed preparation fields
301
+ }
302
+ // Extract Forge facts from message history (patterns built from
303
+ // the project config loaded at factory construction).
304
+ const msgs = Array.isArray(messagesToSummarize) ? messagesToSummarize : [];
305
+ const facts = extractForgeFacts(msgs, {
306
+ prefix: projectConfig.prefix,
307
+ engineeringPath: projectConfig.engineeringPath,
308
+ });
309
+ // Read warm-tier summary (best-effort, IL7).
310
+ const warmTier = readWarmTierSummary(opts, projectConfig.engineeringPath);
311
+ // Assemble summary string.
312
+ const summary = assembleSummary(facts, warmTier);
313
+ const compaction = {
314
+ summary,
315
+ firstKeptEntryId,
316
+ tokensBefore,
317
+ };
318
+ return { compaction };
319
+ }
320
+ catch {
321
+ // IL7: unexpected error → return undefined, let pi compact normally.
322
+ return undefined;
323
+ }
324
+ });
325
+ };
326
+ }
327
+ //# sourceMappingURL=context-governor-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-governor-compaction.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/context-governor-compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import type { ExtensionContext, ExtensionFactory, ToolCallEvent, ToolCallEventResult, ToolResultEvent } from "@earendil-works/pi-coding-agent";
2
+ import type { ModelRegistry } from "@earendil-works/pi-coding-agent";
3
+ /**
4
+ * Return type for tool_result pi handlers — matches ToolResultEventResult from
5
+ * @earendil-works/pi-coding-agent (not exported from the package root).
6
+ * Structural equivalence is sufficient for TypeScript assignability.
7
+ */
8
+ export interface ToolResultEventResult {
9
+ content?: Array<{
10
+ type: "text";
11
+ text: string;
12
+ } | {
13
+ type: "image";
14
+ source: unknown;
15
+ }>;
16
+ details?: unknown;
17
+ isError?: boolean;
18
+ }
19
+ /**
20
+ * Policy for a single persona/phase combination.
21
+ *
22
+ * residentFields — names of task/sprint record fields that are always retained
23
+ * in context (not trimmed by Mechanism A).
24
+ * toolBudgets — per-tool soft token budget caps (keyed by tool name).
25
+ * T04 reads these when deciding how aggressively to trim tool_result content.
26
+ * steerThreshold — fraction of contextWindow at which Mechanism B fires a
27
+ * budget-steer note (0–1; e.g. 0.80 = steer when 80% of window is used).
28
+ */
29
+ export interface PhasePolicy {
30
+ residentFields: string[];
31
+ toolBudgets: Record<string, number>;
32
+ steerThreshold: number;
33
+ }
34
+ /**
35
+ * Lookup table keyed by `"${persona}/${phase}"` (e.g. `"architect/plan"`,
36
+ * `"engineer/review"`) plus a `"default"` entry for unknown combinations.
37
+ */
38
+ export type PhasePolicyTable = Record<string, PhasePolicy>;
39
+ /**
40
+ * Governor interface wired into hook-dispatcher.ts.
41
+ * T03: both methods return undefined/void (no-op). T04 supplies live curation
42
+ * logic via createGovernor.
43
+ *
44
+ * MUST NOT throw — IL7. Any internal failure must return undefined silently.
45
+ */
46
+ export interface ContextGovernor {
47
+ /**
48
+ * Called after the triage-error block in the tool_result handler.
49
+ * Return a ToolResultEventResult to replace the event content, or undefined
50
+ * to pass through unchanged.
51
+ */
52
+ applyToolResult(event: ToolResultEvent, ctx: ExtensionContext): ToolResultEventResult | undefined;
53
+ /**
54
+ * Called at the tail of the tool_call handler (after all existing guards).
55
+ * Return a ToolCallEventResult to block or modify the call, or undefined/void
56
+ * to pass through unchanged.
57
+ */
58
+ applyToolCall(event: ToolCallEvent, ctx: ExtensionContext): ToolCallEventResult | void;
59
+ }
60
+ /**
61
+ * Returns a ContextGovernor whose methods are pure pass-throughs.
62
+ * Used as the default in registerHookDispatcher so existing callers that do
63
+ * not pass a governor see zero behavioural change.
64
+ */
65
+ export declare function createNoOpGovernor(): ContextGovernor;
66
+ /**
67
+ * Create a governor backed by the given policy table and model registry.
68
+ *
69
+ * Implements Mechanism A curation rules (T04):
70
+ * Rule 1 — Dedup/reference-ize
71
+ * Rule 2 — Schema-trim (forge_store results)
72
+ * Rule 3 — Span-clamp (bash/grep/find/read results)
73
+ *
74
+ * Implements Mechanism B (T05):
75
+ * Budget meter: per-turn ctx.getContextUsage() → ctx.ui.setStatus("forge:ctx-budget", ...)
76
+ * Steer: one-shot note at policy.steerThreshold, injected via steerFn
77
+ *
78
+ * Implements Mechanism C (T06):
79
+ * Checkpoint-and-shed: forge_store results for summarized entities are evicted
80
+ * and replaced with an eviction pointer; unsummarized material is retained.
81
+ * Shed criterion: summarySentinel(phaseKey, entityId) returns true.
82
+ *
83
+ * @param table Phase-policy table (keyed by "persona/phase").
84
+ * @param _modelRegistry Model registry (fallback contextWindow resolution only).
85
+ * @param steerFn Optional callback injected at construction by registerHookDispatcher.
86
+ * Receives the steer message string; called at most once per governor
87
+ * instance (single-fire invariant). Callers that omit this see no steer.
88
+ * @param summarySentinel Optional read-only probe injected at construction (Mechanism C / T06).
89
+ * Receives (phaseKey, entityId); returns true when a {PHASE}-SUMMARY.json
90
+ * has been durably written for that entity. When true, the forge_store result
91
+ * is replaced with an eviction pointer. Callers that omit this param see no
92
+ * shedding (backwards-compatible; undefined default).
93
+ * The sentinel MUST NOT write to .forge/store/ or the summary itself (Pack 07).
94
+ * Errors inside the sentinel are silently caught and cause retain, not eviction (IL7).
95
+ *
96
+ * contextWindow resolution (provider-neutral): usage.contextWindow from
97
+ * ctx.getContextUsage(), used directly when available; otherwise the budget
98
+ * meter is cleared for the turn and no steer/compact decision is made.
99
+ * @param compactFn opt callback injected at construction (Mechanism E / T09).
100
+ * Called proactively once when fraction >= policy.steerThreshold,
101
+ * via a single-fire `compactFired` flag distinct from `steerFired`.
102
+ * Callers pass `compactFn = () => session.compact()`. Errors inside
103
+ * compactFn are caught and written to stderr (IL7). Omitting this
104
+ * param is backwards-compatible — no compact trigger fires.
105
+ * @param phaseKey opt construction-time phase key override ("persona/role").
106
+ * Production paths MUST pass this (via buildGovernorFactory) —
107
+ * pi never populates persona/phase on ExtensionContext, so the
108
+ * ctx probe always resolves "default" at runtime. Omitting it
109
+ * preserves the legacy ctx-probe behaviour (test harnesses).
110
+ */
111
+ export declare function createGovernor(table: PhasePolicyTable, _modelRegistry: ModelRegistry, steerFn?: (message: string) => void, summarySentinel?: (phaseKey: string, entityId: string) => boolean, compactFn?: () => void, phaseKey?: string): ContextGovernor;
112
+ /**
113
+ * Load the built-in phase-policy table.
114
+ *
115
+ * Ships an entry for every governed run-task PHASE_PIPELINE key
116
+ * (`${personaNoun}/${role}` — engineer/plan, supervisor/review-plan,
117
+ * engineer/implement, supervisor/review-code, qa-engineer/validate,
118
+ * architect/approve) plus "default" for any unlisted persona/phase.
119
+ * writeback/commit intentionally stay on "default" — small phases whose
120
+ * git/store output must not be clamped.
121
+ *
122
+ * `read` budgets are deliberately more generous than `bash` — clamping file
123
+ * reads too tightly degrades implement/review quality (the agent cannot see
124
+ * whole files), while bash output (store-cli reads, test logs, greps) is the
125
+ * dominant context bloat observed in the CART-S02-T03 baseline.
126
+ *
127
+ * Legacy design-time keys ("architect/plan", "engineer/review") are retained
128
+ * for existing test fixtures; the pipeline never produces them.
129
+ *
130
+ * Values are conservative design-time decisions; a future task can promote
131
+ * specific fields to project config once per-project tuning evidence exists.
132
+ */
133
+ export declare function loadDefaultPolicyTable(): PhasePolicyTable;
134
+ /** Options for buildGovernorFactory. */
135
+ export interface GovernorFactoryOptions {
136
+ /**
137
+ * Pipeline phase key, `${personaNoun}/${role}` (e.g. "supervisor/review-code").
138
+ * Known to run-task.ts at dispatch time; injected here because pi never
139
+ * populates persona/phase on ExtensionContext.
140
+ */
141
+ phaseKey: string;
142
+ /** Project cwd — root containing `.forge/store/` (sentinel reads only). */
143
+ cwd: string;
144
+ }
145
+ /**
146
+ * Build an ExtensionFactory that registers a fully-wired context governor in a
147
+ * subagent session. Constructed per-phase by run-task.ts (which knows the
148
+ * persona/role) and passed via RunSubagentOptions.extensionFactories —
149
+ * the same injection channel as buildForgeCompactionFactory (Mechanism E).
150
+ *
151
+ * This is the production wiring the original FORGE-S30-T07 integration missed:
152
+ * registerHookDispatcher(pi, …, governor) in index.ts only governs the PARENT
153
+ * session, while every phase runs in an isolated createAgentSession subagent
154
+ * that the parent's hooks never see. The CART-S02-T03 benchmark confirmed the
155
+ * result: zero curation markers across a full FORGE_CTX_GOVERNOR=1 phase.
156
+ *
157
+ * Wiring supplied here:
158
+ * phaseKey — construction-time (Mechanism D policies finally reachable)
159
+ * steerFn — pi.sendUserMessage(msg, { deliverAs: "steer" }) (Mechanism B)
160
+ * summarySentinel — storeSummarySentinel against .forge/store/ (Mechanism C)
161
+ * compactFn — ctx.compact() proactive trigger (Mechanism E)
162
+ *
163
+ * steer uses the session-scoped ExtensionAPI directly; compact rides the
164
+ * ExtensionContext captured at the start of each handler invocation — it only
165
+ * fires synchronously inside applyToolResult, so the captured ctx is always
166
+ * the live one. All callbacks are guarded: failures fall through silently
167
+ * (IL7); the factory never writes to .forge/store/ (Pack 07).
168
+ */
169
+ export declare function buildGovernorFactory(opts: GovernorFactoryOptions): ExtensionFactory;