@entelligentsia/forgecli 1.0.25 → 1.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/CHANGELOG.md +258 -0
  2. package/README.md +2 -0
  3. package/dist/CHANGELOG-forge-plugin.md +163 -0
  4. package/dist/bin/argv.d.ts +2 -2
  5. package/dist/bin/argv.js +25 -0
  6. package/dist/bin/argv.js.map +1 -1
  7. package/dist/bin/forge.js +12 -0
  8. package/dist/bin/forge.js.map +1 -1
  9. package/dist/bin/init.d.ts +23 -0
  10. package/dist/bin/init.js +123 -0
  11. package/dist/bin/init.js.map +1 -0
  12. package/dist/bin/uninstall.d.ts +20 -0
  13. package/dist/bin/uninstall.js +141 -0
  14. package/dist/bin/uninstall.js.map +1 -0
  15. package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
  16. package/dist/extensions/forgecli/add-pipeline.js +143 -0
  17. package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
  18. package/dist/extensions/forgecli/add-task.d.ts +20 -0
  19. package/dist/extensions/forgecli/add-task.js +154 -0
  20. package/dist/extensions/forgecli/add-task.js.map +1 -0
  21. package/dist/extensions/forgecli/approve.d.ts +22 -0
  22. package/dist/extensions/forgecli/approve.js +152 -0
  23. package/dist/extensions/forgecli/approve.js.map +1 -0
  24. package/dist/extensions/forgecli/banner.d.ts +10 -0
  25. package/dist/extensions/forgecli/banner.js +36 -0
  26. package/dist/extensions/forgecli/banner.js.map +1 -0
  27. package/dist/extensions/forgecli/calibrate.d.ts +64 -0
  28. package/dist/extensions/forgecli/calibrate.js +481 -0
  29. package/dist/extensions/forgecli/calibrate.js.map +1 -0
  30. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.d.ts +40 -0
  31. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js +593 -0
  32. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js.map +1 -0
  33. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.d.ts +46 -0
  34. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js +245 -0
  35. package/dist/extensions/forgecli/claude-bootstrap/settings-merge.js.map +1 -0
  36. package/dist/extensions/forgecli/claude-bootstrap/uninstall.d.ts +23 -0
  37. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js +215 -0
  38. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js.map +1 -0
  39. package/dist/extensions/forgecli/collate.d.ts +22 -0
  40. package/dist/extensions/forgecli/collate.js +134 -0
  41. package/dist/extensions/forgecli/collate.js.map +1 -0
  42. package/dist/extensions/forgecli/commit.d.ts +22 -0
  43. package/dist/extensions/forgecli/commit.js +152 -0
  44. package/dist/extensions/forgecli/commit.js.map +1 -0
  45. package/dist/extensions/forgecli/config-command.d.ts +8 -0
  46. package/dist/extensions/forgecli/config-command.js +67 -0
  47. package/dist/extensions/forgecli/config-command.js.map +1 -0
  48. package/dist/extensions/forgecli/config-layer.d.ts +53 -0
  49. package/dist/extensions/forgecli/config-layer.js +72 -0
  50. package/dist/extensions/forgecli/config-layer.js.map +1 -0
  51. package/dist/extensions/forgecli/config-writer.d.ts +16 -0
  52. package/dist/extensions/forgecli/config-writer.js +69 -0
  53. package/dist/extensions/forgecli/config-writer.js.map +1 -0
  54. package/dist/extensions/forgecli/dashboard/component.js +10 -7
  55. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  56. package/dist/extensions/forgecli/enhance.d.ts +27 -0
  57. package/dist/extensions/forgecli/enhance.js +199 -0
  58. package/dist/extensions/forgecli/enhance.js.map +1 -0
  59. package/dist/extensions/forgecli/fix-bug.d.ts +85 -0
  60. package/dist/extensions/forgecli/fix-bug.js +1580 -0
  61. package/dist/extensions/forgecli/fix-bug.js.map +1 -0
  62. package/dist/extensions/forgecli/forge-header.d.ts +12 -0
  63. package/dist/extensions/forgecli/forge-header.js +114 -0
  64. package/dist/extensions/forgecli/forge-header.js.map +1 -0
  65. package/dist/extensions/forgecli/forge-init.d.ts +26 -0
  66. package/dist/extensions/forgecli/forge-init.js +514 -0
  67. package/dist/extensions/forgecli/forge-init.js.map +1 -0
  68. package/dist/extensions/forgecli/forge-root.d.ts +10 -0
  69. package/dist/extensions/forgecli/forge-root.js +62 -0
  70. package/dist/extensions/forgecli/forge-root.js.map +1 -0
  71. package/dist/extensions/forgecli/forge-update-command.d.ts +100 -0
  72. package/dist/extensions/forgecli/forge-update-command.js +435 -0
  73. package/dist/extensions/forgecli/forge-update-command.js.map +1 -0
  74. package/dist/extensions/forgecli/friction-emit.d.ts +99 -0
  75. package/dist/extensions/forgecli/friction-emit.js +245 -0
  76. package/dist/extensions/forgecli/friction-emit.js.map +1 -0
  77. package/dist/extensions/forgecli/implement.d.ts +22 -0
  78. package/dist/extensions/forgecli/implement.js +170 -0
  79. package/dist/extensions/forgecli/implement.js.map +1 -0
  80. package/dist/extensions/forgecli/init-context.d.ts +99 -0
  81. package/dist/extensions/forgecli/init-context.js +178 -0
  82. package/dist/extensions/forgecli/init-context.js.map +1 -0
  83. package/dist/extensions/forgecli/init-progress.d.ts +39 -0
  84. package/dist/extensions/forgecli/init-progress.js +117 -0
  85. package/dist/extensions/forgecli/init-progress.js.map +1 -0
  86. package/dist/extensions/forgecli/input-router.d.ts +33 -0
  87. package/dist/extensions/forgecli/input-router.js +136 -0
  88. package/dist/extensions/forgecli/input-router.js.map +1 -0
  89. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +59 -0
  90. package/dist/extensions/forgecli/lib/halt-advisor.js +113 -0
  91. package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
  92. package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +46 -0
  93. package/dist/extensions/forgecli/lib/orchestrator-preflight.js +64 -0
  94. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +1 -0
  95. package/dist/extensions/forgecli/materialize.d.ts +16 -0
  96. package/dist/extensions/forgecli/materialize.js +195 -0
  97. package/dist/extensions/forgecli/materialize.js.map +1 -0
  98. package/dist/extensions/forgecli/migrate.d.ts +22 -0
  99. package/dist/extensions/forgecli/migrate.js +260 -0
  100. package/dist/extensions/forgecli/migrate.js.map +1 -0
  101. package/dist/extensions/forgecli/migration-engine.d.ts +117 -0
  102. package/dist/extensions/forgecli/migration-engine.js +563 -0
  103. package/dist/extensions/forgecli/migration-engine.js.map +1 -0
  104. package/dist/extensions/forgecli/model-registry.d.ts +61 -0
  105. package/dist/extensions/forgecli/model-registry.js +127 -0
  106. package/dist/extensions/forgecli/model-registry.js.map +1 -0
  107. package/dist/extensions/forgecli/model-resolver.d.ts +32 -0
  108. package/dist/extensions/forgecli/model-resolver.js +65 -0
  109. package/dist/extensions/forgecli/model-resolver.js.map +1 -0
  110. package/dist/extensions/forgecli/model-validator.d.ts +29 -0
  111. package/dist/extensions/forgecli/model-validator.js +107 -0
  112. package/dist/extensions/forgecli/model-validator.js.map +1 -0
  113. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +26 -0
  114. package/dist/extensions/forgecli/orchestrator-status-bar.js +213 -0
  115. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
  116. package/dist/extensions/forgecli/orchestrators/bug/bug-body.d.ts +1 -0
  117. package/dist/extensions/forgecli/orchestrators/bug/bug-body.js +65 -0
  118. package/dist/extensions/forgecli/orchestrators/bug/bug-body.js.map +1 -0
  119. package/dist/extensions/forgecli/orchestrators/bug/bug-id.d.ts +23 -0
  120. package/dist/extensions/forgecli/orchestrators/bug/bug-id.js +140 -0
  121. package/dist/extensions/forgecli/orchestrators/bug/bug-id.js.map +1 -0
  122. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.d.ts +54 -0
  123. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js +349 -0
  124. package/dist/extensions/forgecli/orchestrators/bug/bug-phase-dispatch.js.map +1 -0
  125. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.d.ts +8 -0
  126. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js +60 -0
  127. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js.map +1 -0
  128. package/dist/extensions/forgecli/orchestrators/bug/bug-state.d.ts +14 -0
  129. package/dist/extensions/forgecli/orchestrators/bug/bug-state.js +100 -0
  130. package/dist/extensions/forgecli/orchestrators/bug/bug-state.js.map +1 -0
  131. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.d.ts +72 -0
  132. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js +204 -0
  133. package/dist/extensions/forgecli/orchestrators/bug/bug-triage-routing.js.map +1 -0
  134. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.d.ts +38 -0
  135. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js +166 -0
  136. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js.map +1 -0
  137. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.d.ts +3 -0
  138. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js +55 -0
  139. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict.js.map +1 -0
  140. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.d.ts +7 -0
  141. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js +293 -0
  142. package/dist/extensions/forgecli/orchestrators/bug/run-bug-command.js.map +1 -0
  143. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.d.ts +2 -0
  144. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js +501 -0
  145. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js.map +1 -0
  146. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.d.ts +41 -0
  147. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js +5 -0
  148. package/dist/extensions/forgecli/orchestrators/bug/run-bug-types.js.map +1 -0
  149. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.d.ts +43 -0
  150. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js +85 -0
  151. package/dist/extensions/forgecli/orchestrators/common/orchestrator-entry.js.map +1 -0
  152. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.d.ts +8 -0
  153. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js +37 -0
  154. package/dist/extensions/forgecli/orchestrators/common/orchestrator-misc.js.map +1 -0
  155. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.d.ts +28 -0
  156. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js +45 -0
  157. package/dist/extensions/forgecli/orchestrators/common/orchestrator-notify.js.map +1 -0
  158. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.d.ts +26 -0
  159. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js +75 -0
  160. package/dist/extensions/forgecli/orchestrators/common/orchestrator-transcript-session.js.map +1 -0
  161. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.d.ts +24 -0
  162. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js +37 -0
  163. package/dist/extensions/forgecli/orchestrators/common/summary-recovery.js.map +1 -0
  164. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +9 -93
  165. package/dist/extensions/forgecli/orchestrators/fix-bug.js +23 -1721
  166. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
  167. package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +3 -12
  168. package/dist/extensions/forgecli/orchestrators/run-sprint.js +48 -270
  169. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
  170. package/dist/extensions/forgecli/orchestrators/run-task.d.ts +10 -214
  171. package/dist/extensions/forgecli/orchestrators/run-task.js +31 -1481
  172. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -1
  173. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.d.ts +33 -0
  174. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js +135 -0
  175. package/dist/extensions/forgecli/orchestrators/sprint/sprint-ceremony.js.map +1 -0
  176. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.d.ts +18 -0
  177. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js +55 -0
  178. package/dist/extensions/forgecli/orchestrators/sprint/sprint-state.js.map +1 -0
  179. package/dist/extensions/forgecli/orchestrators/task/run-task-command.d.ts +9 -0
  180. package/dist/extensions/forgecli/orchestrators/task/run-task-command.js +174 -0
  181. package/dist/extensions/forgecli/orchestrators/task/run-task-command.js.map +1 -0
  182. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.d.ts +2 -0
  183. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js +494 -0
  184. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js.map +1 -0
  185. package/dist/extensions/forgecli/orchestrators/task/run-task-types.d.ts +62 -0
  186. package/dist/extensions/forgecli/orchestrators/task/run-task-types.js +5 -0
  187. package/dist/extensions/forgecli/orchestrators/task/run-task-types.js.map +1 -0
  188. package/dist/extensions/forgecli/orchestrators/task/task-body.d.ts +4 -0
  189. package/dist/extensions/forgecli/orchestrators/task/task-body.js +48 -0
  190. package/dist/extensions/forgecli/orchestrators/task/task-body.js.map +1 -0
  191. package/dist/extensions/forgecli/orchestrators/task/task-events.d.ts +63 -0
  192. package/dist/extensions/forgecli/orchestrators/task/task-events.js +185 -0
  193. package/dist/extensions/forgecli/orchestrators/task/task-events.js.map +1 -0
  194. package/dist/extensions/forgecli/orchestrators/task/task-gates.d.ts +34 -0
  195. package/dist/extensions/forgecli/orchestrators/task/task-gates.js +78 -0
  196. package/dist/extensions/forgecli/orchestrators/task/task-gates.js.map +1 -0
  197. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.d.ts +42 -0
  198. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js +370 -0
  199. package/dist/extensions/forgecli/orchestrators/task/task-phase-dispatch.js.map +1 -0
  200. package/dist/extensions/forgecli/orchestrators/task/task-phases.d.ts +14 -0
  201. package/dist/extensions/forgecli/orchestrators/task/task-phases.js +26 -0
  202. package/dist/extensions/forgecli/orchestrators/task/task-phases.js.map +1 -0
  203. package/dist/extensions/forgecli/orchestrators/task/task-record.d.ts +9 -0
  204. package/dist/extensions/forgecli/orchestrators/task/task-record.js +58 -0
  205. package/dist/extensions/forgecli/orchestrators/task/task-record.js.map +1 -0
  206. package/dist/extensions/forgecli/orchestrators/task/task-state.d.ts +14 -0
  207. package/dist/extensions/forgecli/orchestrators/task/task-state.js +35 -0
  208. package/dist/extensions/forgecli/orchestrators/task/task-state.js.map +1 -0
  209. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.d.ts +36 -0
  210. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js +152 -0
  211. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js.map +1 -0
  212. package/dist/extensions/forgecli/plan.d.ts +22 -0
  213. package/dist/extensions/forgecli/plan.js +167 -0
  214. package/dist/extensions/forgecli/plan.js.map +1 -0
  215. package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
  216. package/dist/extensions/forgecli/quiz-agent.js +98 -0
  217. package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
  218. package/dist/extensions/forgecli/read-command.d.ts +2 -0
  219. package/dist/extensions/forgecli/read-command.js +100 -0
  220. package/dist/extensions/forgecli/read-command.js.map +1 -0
  221. package/dist/extensions/forgecli/regenerate.d.ts +40 -0
  222. package/dist/extensions/forgecli/regenerate.js +438 -0
  223. package/dist/extensions/forgecli/regenerate.js.map +1 -0
  224. package/dist/extensions/forgecli/remove-command.d.ts +17 -0
  225. package/dist/extensions/forgecli/remove-command.js +124 -0
  226. package/dist/extensions/forgecli/remove-command.js.map +1 -0
  227. package/dist/extensions/forgecli/report-bug.d.ts +25 -0
  228. package/dist/extensions/forgecli/report-bug.js +159 -0
  229. package/dist/extensions/forgecli/report-bug.js.map +1 -0
  230. package/dist/extensions/forgecli/retrospective.d.ts +20 -0
  231. package/dist/extensions/forgecli/retrospective.js +126 -0
  232. package/dist/extensions/forgecli/retrospective.js.map +1 -0
  233. package/dist/extensions/forgecli/review-code.d.ts +35 -0
  234. package/dist/extensions/forgecli/review-code.js +196 -0
  235. package/dist/extensions/forgecli/review-code.js.map +1 -0
  236. package/dist/extensions/forgecli/review-plan.d.ts +35 -0
  237. package/dist/extensions/forgecli/review-plan.js +200 -0
  238. package/dist/extensions/forgecli/review-plan.js.map +1 -0
  239. package/dist/extensions/forgecli/run-sprint.d.ts +27 -0
  240. package/dist/extensions/forgecli/run-sprint.js +716 -0
  241. package/dist/extensions/forgecli/run-sprint.js.map +1 -0
  242. package/dist/extensions/forgecli/run-task.d.ts +204 -0
  243. package/dist/extensions/forgecli/run-task.js +1403 -0
  244. package/dist/extensions/forgecli/run-task.js.map +1 -0
  245. package/dist/extensions/forgecli/skill-curation-flag.d.ts +21 -0
  246. package/dist/extensions/forgecli/skill-curation-flag.js +71 -0
  247. package/dist/extensions/forgecli/skill-curation-flag.js.map +1 -0
  248. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +102 -0
  249. package/dist/extensions/forgecli/skill-curator-subagent.js +339 -0
  250. package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -0
  251. package/dist/extensions/forgecli/skill-retriever.d.ts +84 -0
  252. package/dist/extensions/forgecli/skill-retriever.js +246 -0
  253. package/dist/extensions/forgecli/skill-retriever.js.map +1 -0
  254. package/dist/extensions/forgecli/skill-usage-tracker.d.ts +91 -0
  255. package/dist/extensions/forgecli/skill-usage-tracker.js +224 -0
  256. package/dist/extensions/forgecli/skill-usage-tracker.js.map +1 -0
  257. package/dist/extensions/forgecli/sprint-intake.d.ts +10 -0
  258. package/dist/extensions/forgecli/sprint-intake.js +91 -0
  259. package/dist/extensions/forgecli/sprint-intake.js.map +1 -0
  260. package/dist/extensions/forgecli/sprint-plan.d.ts +14 -0
  261. package/dist/extensions/forgecli/sprint-plan.js +122 -0
  262. package/dist/extensions/forgecli/sprint-plan.js.map +1 -0
  263. package/dist/extensions/forgecli/status-command.d.ts +19 -0
  264. package/dist/extensions/forgecli/status-command.js +140 -0
  265. package/dist/extensions/forgecli/status-command.js.map +1 -0
  266. package/dist/extensions/forgecli/store-error-remediation.d.ts +65 -0
  267. package/dist/extensions/forgecli/store-error-remediation.js +307 -0
  268. package/dist/extensions/forgecli/store-error-remediation.js.map +1 -0
  269. package/dist/extensions/forgecli/store-query.d.ts +22 -0
  270. package/dist/extensions/forgecli/store-query.js +107 -0
  271. package/dist/extensions/forgecli/store-query.js.map +1 -0
  272. package/dist/extensions/forgecli/store-repair.d.ts +17 -0
  273. package/dist/extensions/forgecli/store-repair.js +123 -0
  274. package/dist/extensions/forgecli/store-repair.js.map +1 -0
  275. package/dist/extensions/forgecli/store-resolver.d.ts +56 -0
  276. package/dist/extensions/forgecli/store-resolver.js +263 -0
  277. package/dist/extensions/forgecli/store-resolver.js.map +1 -0
  278. package/dist/extensions/forgecli/store-validator.d.ts +16 -0
  279. package/dist/extensions/forgecli/store-validator.js +32 -0
  280. package/dist/extensions/forgecli/store-validator.js.map +1 -0
  281. package/dist/extensions/forgecli/test-orchestrate.d.ts +2 -0
  282. package/dist/extensions/forgecli/test-orchestrate.js +182 -0
  283. package/dist/extensions/forgecli/test-orchestrate.js.map +1 -0
  284. package/dist/extensions/forgecli/thread-switcher.d.ts +5 -0
  285. package/dist/extensions/forgecli/thread-switcher.js +189 -0
  286. package/dist/extensions/forgecli/thread-switcher.js.map +1 -0
  287. package/dist/extensions/forgecli/transition-guard.d.ts +20 -0
  288. package/dist/extensions/forgecli/transition-guard.js +89 -0
  289. package/dist/extensions/forgecli/transition-guard.js.map +1 -0
  290. package/dist/extensions/forgecli/update/forge-update-command.js +10 -7
  291. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -1
  292. package/dist/extensions/forgecli/update-check.d.ts +37 -0
  293. package/dist/extensions/forgecli/update-check.js +185 -0
  294. package/dist/extensions/forgecli/update-check.js.map +1 -0
  295. package/dist/extensions/forgecli/update-tools.d.ts +23 -0
  296. package/dist/extensions/forgecli/update-tools.js +135 -0
  297. package/dist/extensions/forgecli/update-tools.js.map +1 -0
  298. package/dist/extensions/forgecli/validate.d.ts +22 -0
  299. package/dist/extensions/forgecli/validate.js +152 -0
  300. package/dist/extensions/forgecli/validate.js.map +1 -0
  301. package/dist/extensions/forgecli/viewport-events.d.ts +78 -0
  302. package/dist/extensions/forgecli/viewport-events.js +243 -0
  303. package/dist/extensions/forgecli/viewport-events.js.map +1 -0
  304. package/dist/extensions/forgecli/viewport-renderer.d.ts +83 -0
  305. package/dist/extensions/forgecli/viewport-renderer.js +233 -0
  306. package/dist/extensions/forgecli/viewport-renderer.js.map +1 -0
  307. package/dist/extensions/forgecli/viewport-theme.d.ts +11 -0
  308. package/dist/extensions/forgecli/viewport-theme.js +128 -0
  309. package/dist/extensions/forgecli/viewport-theme.js.map +1 -0
  310. package/dist/extensions/forgecli/whats-new-widget.d.ts +26 -0
  311. package/dist/extensions/forgecli/whats-new-widget.js +376 -0
  312. package/dist/extensions/forgecli/whats-new-widget.js.map +1 -0
  313. package/dist/extensions/forgecli/whats-new.d.ts +120 -0
  314. package/dist/extensions/forgecli/whats-new.js +470 -0
  315. package/dist/extensions/forgecli/whats-new.js.map +1 -0
  316. package/dist/forge-payload/.base-pack/commands/approve.md +2 -2
  317. package/dist/forge-payload/.base-pack/commands/check-agent.md +2 -2
  318. package/dist/forge-payload/.base-pack/commands/collate.md +2 -2
  319. package/dist/forge-payload/.base-pack/commands/commit.md +2 -2
  320. package/dist/forge-payload/.base-pack/commands/enhance.md +2 -2
  321. package/dist/forge-payload/.base-pack/commands/fix-bug.md +2 -2
  322. package/dist/forge-payload/.base-pack/commands/implement.md +2 -2
  323. package/dist/forge-payload/.base-pack/commands/init.md +278 -0
  324. package/dist/forge-payload/.base-pack/commands/new-sprint.md +2 -2
  325. package/dist/forge-payload/.base-pack/commands/plan-sprint.md +2 -2
  326. package/dist/forge-payload/.base-pack/commands/plan.md +2 -2
  327. package/dist/forge-payload/.base-pack/commands/retro.md +2 -2
  328. package/dist/forge-payload/.base-pack/commands/review-code.md +2 -2
  329. package/dist/forge-payload/.base-pack/commands/review-plan.md +2 -2
  330. package/dist/forge-payload/.base-pack/commands/run-sprint.md +2 -2
  331. package/dist/forge-payload/.base-pack/commands/run-task.md +2 -2
  332. package/dist/forge-payload/.base-pack/commands/validate.md +2 -2
  333. package/dist/forge-payload/.base-pack/workflows/collator_agent.md +5 -6
  334. package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +1 -1
  335. package/dist/forge-payload/.base-pack/workflows-js/wfl-init.js +449 -0
  336. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  337. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  338. package/dist/forge-payload/.schemas/migrations.json +85 -0
  339. package/dist/forge-payload/commands/add-pipeline.md +1 -1
  340. package/dist/forge-payload/commands/add-task.md +3 -3
  341. package/dist/forge-payload/commands/ask.md +1 -1
  342. package/dist/forge-payload/commands/check-agent.md +1 -1
  343. package/dist/forge-payload/commands/config.md +1 -1
  344. package/dist/forge-payload/commands/health.md +1 -1
  345. package/dist/forge-payload/commands/init.md +62 -7
  346. package/dist/forge-payload/commands/rebuild.md +3 -3
  347. package/dist/forge-payload/commands/remove.md +1 -1
  348. package/dist/forge-payload/commands/repair.md +1 -1
  349. package/dist/forge-payload/commands/report-bug.md +1 -1
  350. package/dist/forge-payload/commands/status.md +1 -1
  351. package/dist/forge-payload/commands/update.md +3 -3
  352. package/dist/forge-payload/hooks/lib/common.cjs +228 -0
  353. package/dist/forge-payload/hooks/lib/plugin-detection.cjs +106 -0
  354. package/dist/forge-payload/hooks/lib/update-msg.cjs +23 -0
  355. package/dist/forge-payload/hooks/lib/update-url.cjs +46 -0
  356. package/dist/forge-payload/hooks/lib/write-registry.js +53 -0
  357. package/dist/forge-payload/init/discovery/discover-database.md +32 -0
  358. package/dist/forge-payload/init/discovery/discover-processes.md +31 -0
  359. package/dist/forge-payload/init/discovery/discover-routing.md +31 -0
  360. package/dist/forge-payload/init/discovery/discover-stack.md +33 -0
  361. package/dist/forge-payload/init/discovery/discover-testing.md +34 -0
  362. package/dist/forge-payload/init/generation/generate-commands.md +171 -0
  363. package/dist/forge-payload/init/generation/generate-kb-doc.md +60 -0
  364. package/dist/forge-payload/init/generation/generate-knowledge-base.md +56 -0
  365. package/dist/forge-payload/init/generation/generate-persona.md +73 -0
  366. package/dist/forge-payload/init/generation/generate-personas.md +54 -0
  367. package/dist/forge-payload/init/generation/generate-skill.md +66 -0
  368. package/dist/forge-payload/init/generation/generate-skills.md +36 -0
  369. package/dist/forge-payload/init/generation/generate-template.md +60 -0
  370. package/dist/forge-payload/init/generation/generate-templates.md +39 -0
  371. package/dist/forge-payload/init/generation/generate-tools.md +133 -0
  372. package/dist/forge-payload/init/generation/generate-workflows.md +78 -0
  373. package/dist/forge-payload/init/phases/phase-1-collect.md +10 -2
  374. package/dist/forge-payload/init/phases/phase-3-materialize.md +1 -1
  375. package/dist/forge-payload/init/phases/phase-4-register.md +8 -0
  376. package/dist/forge-payload/init/workflow-gen-plan.json +17 -0
  377. package/dist/forge-payload/integrity.json +16 -16
  378. package/dist/forge-payload/meta/workflows/meta-collate.md +5 -6
  379. package/dist/forge-payload/meta/workflows/meta-migrate.md +1 -1
  380. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  381. package/dist/forge-payload/schemas/structure-manifest.json +3 -12
  382. package/dist/forge-payload/tools/forge-preflight.cjs +268 -0
  383. package/dist/forge-payload/tools/lib/paths.cjs +12 -11
  384. package/dist/forge-payload/tools/lib/pricing.cjs +31 -11
  385. package/dist/forge-payload/tools/query-logger.cjs +34 -0
  386. package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -6
  387. package/node_modules/@mariozechner/clipboard/package.json +1 -2
  388. package/package.json +2 -2
  389. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +0 -3
  390. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +0 -25
@@ -0,0 +1,78 @@
1
+ import type { SessionRegistry } from "./session-registry.js";
2
+ import { type UsageDelta } from "./viewport-renderer.js";
3
+ /** Minimal shape of the AgentSessionEvent union we care about — kept loose
4
+ * so the file doesn't pull in @earendil-works/pi-agent-core types at compile
5
+ * time for callers that only consume the factory. */
6
+ type SubagentEvent = {
7
+ type: "turn_start";
8
+ } | {
9
+ type: "turn_end";
10
+ message: unknown;
11
+ } | {
12
+ type: "tool_execution_start";
13
+ toolCallId: string;
14
+ toolName: string;
15
+ args: unknown;
16
+ } | {
17
+ type: "tool_execution_end";
18
+ toolCallId: string;
19
+ toolName: string;
20
+ result: unknown;
21
+ isError: boolean;
22
+ } | {
23
+ type: "compaction_start";
24
+ reason: string;
25
+ } | {
26
+ type: "auto_retry_start";
27
+ attempt: number;
28
+ maxAttempts: number;
29
+ errorMessage?: string;
30
+ } | {
31
+ type: string;
32
+ [k: string]: unknown;
33
+ };
34
+ export interface ViewportObserverOpts {
35
+ registry: SessionRegistry;
36
+ /** session key in the registry (taskId, bugId, or sprintId:ceremony, etc.) */
37
+ sessionId: string;
38
+ /** phase scope for tail buffer and per-phase usage */
39
+ phaseRole: string;
40
+ /** displayed in the per-line prefix `[<displayRole> HH:MM:SS tN]`. Usually same
41
+ * as `phaseRole` but kept separate so callers like run-sprint ceremony can
42
+ * show a friendlier role label without changing the registry key. */
43
+ displayRole?: string;
44
+ /** optional `─── phase X/Y begin · sessionId ───` header to emit immediately */
45
+ beginHeader?: string;
46
+ /** optional JSONL audit sink (the run-task debug log). */
47
+ writeDebug?: (rec: Record<string, unknown>) => void;
48
+ /** optional verbose status setter — only called when FORGE_VERBOSE=1.
49
+ * The observer doesn't read FORGE_VERBOSE itself; caller decides whether to
50
+ * wire this. */
51
+ setStatusVerbose?: (key: string, msg: string) => void;
52
+ /** optional toast for compaction/retry; ignore to suppress. */
53
+ notify?: (msg: string, level: "info" | "warning" | "error") => void;
54
+ /** keys used for `setStatusVerbose` when caller wants verbose status. */
55
+ verboseKeys?: {
56
+ messageKey?: string;
57
+ };
58
+ /** invoked after every handled event so orchestrators can refresh their own
59
+ * status line (e.g. FORGE_VERBOSE status with `lastTool`, elapsed seconds). */
60
+ afterEach?: () => void;
61
+ }
62
+ export interface AttachedObserver {
63
+ onEvent: (event: SubagentEvent) => void;
64
+ /** Mutable counters orchestrator can read after subagent returns. */
65
+ state: {
66
+ turn: number;
67
+ toolCount: number;
68
+ errCount: number;
69
+ lastTool: string;
70
+ cumUsage: UsageDelta;
71
+ cumCompression: {
72
+ calls: number;
73
+ tokensSaved: number;
74
+ };
75
+ };
76
+ }
77
+ export declare function attachViewportObserver(opts: ViewportObserverOpts): AttachedObserver;
78
+ export {};
@@ -0,0 +1,243 @@
1
+ // viewport-events.ts
2
+ //
3
+ // Reusable subagent event observer. Wires `runForgeSubagent.onEvent` to:
4
+ // 1. Append per-event tail lines (with tree connectors, glyphs, risky tag,
5
+ // thinking one-liners, batch markers) into SessionRegistry.
6
+ // 2. Maintain cumulative phase token usage and push it to the registry on
7
+ // every turn_end — drives the sticky footer in the tail view AND the
8
+ // aggregate Σ meter in the chip strip.
9
+ // 3. Surface counts (turn / tools / errors) so the orchestrator can render
10
+ // its end-of-phase summary.
11
+ //
12
+ // Used by run-task, fix-bug, and run-sprint (ceremony) so every subagent
13
+ // "bubbles" usage up the same way. Top-level viewports read aggregate usage
14
+ // via SessionRegistry.getAggregateUsage().
15
+ import { getOrchestratorTree } from "./orchestrator-tree.js";
16
+ import { extractThinkingOneLiner, extractTurnPreview, argHint as fmtArgHint, RISKY_TAG, readUsage, resultShape, toolGlyph, } from "./viewport-renderer.js";
17
+ function extractCompression(result) {
18
+ if (!result || typeof result !== "object")
19
+ return undefined;
20
+ const r = result;
21
+ const c = r.details?.compression;
22
+ if (!c || typeof c.before !== "number" || typeof c.after !== "number")
23
+ return undefined;
24
+ return { tool: c.tool ?? "", before: c.before, after: c.after, saved: c.saved ?? 0 };
25
+ }
26
+ export function attachViewportObserver(opts) {
27
+ const { registry, sessionId, phaseRole, displayRole, beginHeader, writeDebug, setStatusVerbose, notify, verboseKeys, afterEach, } = opts;
28
+ const role = displayRole ?? phaseRole;
29
+ const tree = getOrchestratorTree();
30
+ // Helper to resolve the correct active node ID in the OrchestratorTree.
31
+ const resolveNodeId = () => {
32
+ const exactId = `${sessionId}:${phaseRole}`;
33
+ const exactNode = tree.getNode(exactId);
34
+ if (exactNode && exactNode.status === "running")
35
+ return exactId;
36
+ const parentNode = tree.getNode(sessionId);
37
+ if (parentNode) {
38
+ const prefix = `${sessionId}:${phaseRole}:`;
39
+ for (const cid of parentNode.children) {
40
+ if (cid.startsWith(prefix)) {
41
+ const child = tree.getNode(cid);
42
+ if (child && child.status === "running") {
43
+ return cid;
44
+ }
45
+ }
46
+ }
47
+ }
48
+ return exactId;
49
+ };
50
+ const state = {
51
+ turn: 0,
52
+ toolCount: 0,
53
+ errCount: 0,
54
+ lastTool: "",
55
+ cumUsage: { input: 0, output: 0, cacheRead: 0 },
56
+ cumCompression: { calls: 0, tokensSaved: 0 },
57
+ };
58
+ // Per-turn tree-connector state.
59
+ let toolsThisTurn = 0;
60
+ let firstLineOfTurn = true;
61
+ let currentTurnPrefixWidth = 0;
62
+ const argsByCallId = new Map();
63
+ const formatTime = (ms) => {
64
+ const d = new Date(ms);
65
+ const pad = (n) => String(n).padStart(2, "0");
66
+ return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
67
+ };
68
+ const tailPrefix = () => `[${role} ${formatTime(Date.now())} t${state.turn}]`;
69
+ const appendTail = (line, opts) => {
70
+ registry.appendTail(sessionId, phaseRole, line, opts);
71
+ tree.appendTail(resolveNodeId(), line, opts);
72
+ };
73
+ const extractErrorSummary = (result) => {
74
+ const raw = typeof result === "string"
75
+ ? result
76
+ : typeof result === "object" && result !== null
77
+ ? JSON.stringify(result)
78
+ : String(result);
79
+ const firstLine = raw.split(/\r?\n/).find((l) => l.trim().length > 0) ?? raw;
80
+ return firstLine.length > 160 ? `${firstLine.slice(0, 160)}…` : firstLine;
81
+ };
82
+ const emitTurnLine = (body, lineOpts) => {
83
+ const isFirst = firstLineOfTurn;
84
+ const isClosing = lineOpts?.closing === true;
85
+ let branch;
86
+ if (isFirst && isClosing)
87
+ branch = "─";
88
+ else if (isFirst)
89
+ branch = "╭";
90
+ else if (isClosing)
91
+ branch = "╰";
92
+ else
93
+ branch = "│";
94
+ let prefix;
95
+ if (isFirst) {
96
+ prefix = tailPrefix();
97
+ currentTurnPrefixWidth = prefix.length;
98
+ }
99
+ else {
100
+ prefix = " ".repeat(currentTurnPrefixWidth);
101
+ }
102
+ firstLineOfTurn = false;
103
+ appendTail(`${prefix} ${branch} ${body}`, lineOpts?.warning ? { warning: true } : undefined);
104
+ };
105
+ if (beginHeader)
106
+ appendTail(`${tailPrefix()} ${beginHeader}`);
107
+ const onEvent = (event) => {
108
+ switch (event.type) {
109
+ case "turn_start": {
110
+ state.turn++;
111
+ state.lastTool = "";
112
+ toolsThisTurn = 0;
113
+ firstLineOfTurn = true;
114
+ registry.bumpTurn(sessionId);
115
+ tree.bumpNodeTurn(resolveNodeId());
116
+ break;
117
+ }
118
+ case "turn_end": {
119
+ const e = event;
120
+ const delta = readUsage(e.message);
121
+ state.cumUsage.input += delta.input;
122
+ state.cumUsage.output += delta.output;
123
+ state.cumUsage.cacheRead += delta.cacheRead;
124
+ registry.setPhaseUsage(sessionId, phaseRole, state.cumUsage);
125
+ const nodeId = resolveNodeId();
126
+ tree.setNodeUsage(nodeId, state.cumUsage);
127
+ // Capture which (provider, model) actually served this turn so
128
+ // the per-phase tail-view footer can display it. Cheap; the
129
+ // registry no-ops when the value hasn't changed.
130
+ const msg = e.message;
131
+ if (msg && (msg.provider || msg.model)) {
132
+ registry.setPhaseModel(sessionId, phaseRole, {
133
+ provider: msg.provider,
134
+ model: msg.model,
135
+ });
136
+ tree.setNodeModel(nodeId, msg.model ?? "", msg.provider ?? "");
137
+ }
138
+ const closingBodies = [];
139
+ const thinking = extractThinkingOneLiner(e.message);
140
+ if (thinking)
141
+ closingBodies.push(`✱ ${thinking}`);
142
+ const preview = extractTurnPreview(e.message);
143
+ if (preview) {
144
+ registry.setTurnPreview(sessionId, preview);
145
+ tree.setTurnPreview(nodeId, preview);
146
+ if (setStatusVerbose && verboseKeys?.messageKey) {
147
+ setStatusVerbose(verboseKeys.messageKey, ` "${preview}"`);
148
+ }
149
+ closingBodies.push(`» "${preview}"`);
150
+ }
151
+ if (toolsThisTurn > 1) {
152
+ closingBodies.push(`⇉ batched ${toolsThisTurn} tool calls in turn ${state.turn}`);
153
+ }
154
+ for (let i = 0; i < closingBodies.length; i++) {
155
+ const isLast = i === closingBodies.length - 1;
156
+ emitTurnLine(closingBodies[i], { closing: isLast });
157
+ }
158
+ // Bubble one consolidated event up to the registry so the
159
+ // top-level viewport can surface activity from any subagent
160
+ // with subagent-identified attribution.
161
+ registry.recordTurnEvent({
162
+ sessionId,
163
+ phaseRole,
164
+ displayRole: role,
165
+ turn: state.turn,
166
+ preview: preview ?? "",
167
+ thinking: thinking ?? "",
168
+ deltaUsage: { ...delta },
169
+ cumUsage: { ...state.cumUsage },
170
+ timestamp: Date.now(),
171
+ });
172
+ break;
173
+ }
174
+ case "tool_execution_start": {
175
+ const e = event;
176
+ state.toolCount++;
177
+ toolsThisTurn++;
178
+ argsByCallId.set(e.toolCallId, e.args);
179
+ const hint = fmtArgHint(e.toolName, e.args);
180
+ const { glyph, risky } = toolGlyph(e.toolName, e.args);
181
+ state.lastTool = `${e.toolName}${hint ? ` ${hint}` : ""}`;
182
+ writeDebug?.({
183
+ kind: "tool_start",
184
+ toolName: e.toolName,
185
+ toolCallId: e.toolCallId,
186
+ args: e.args,
187
+ });
188
+ registry.recordToolStart(sessionId, e.toolCallId, e.toolName, e.args);
189
+ tree.incrementNodeToolCount(resolveNodeId());
190
+ const riskPrefix = risky ? `${RISKY_TAG} ` : "";
191
+ emitTurnLine(`${riskPrefix}${glyph} ${e.toolName}${hint ? ` ${hint}` : ""}`, risky ? { warning: true } : undefined);
192
+ break;
193
+ }
194
+ case "tool_execution_end": {
195
+ const e = event;
196
+ argsByCallId.delete(e.toolCallId);
197
+ writeDebug?.({
198
+ kind: "tool_end",
199
+ toolName: e.toolName,
200
+ toolCallId: e.toolCallId,
201
+ isError: e.isError,
202
+ result: e.result,
203
+ });
204
+ registry.recordToolEnd(sessionId, e.toolCallId, e.toolName, e.isError, e.result);
205
+ const nodeId = resolveNodeId();
206
+ if (e.isError) {
207
+ state.errCount++;
208
+ tree.incrementNodeErrCount(nodeId);
209
+ emitTurnLine(`⚠ ${e.toolName} failed: ${extractErrorSummary(e.result)}`, { warning: true });
210
+ }
211
+ else {
212
+ const shape = resultShape(e.toolName, e.result);
213
+ const comp = extractCompression(e.result);
214
+ const compHint = comp ? ` ⇌${comp.saved}%` : "";
215
+ emitTurnLine(`← ${e.toolName} ok${shape ? ` ${shape}` : ""}${compHint}`);
216
+ if (comp) {
217
+ state.cumCompression.calls++;
218
+ state.cumCompression.tokensSaved += comp.before - comp.after;
219
+ registry.setPhaseCompression(sessionId, phaseRole, state.cumCompression);
220
+ tree.setNodeCompression(nodeId, state.cumCompression);
221
+ }
222
+ }
223
+ break;
224
+ }
225
+ case "compaction_start": {
226
+ const e = event;
227
+ notify?.(`◌ ${role}: context compacting (${e.reason})…`, "info");
228
+ appendTail(`${tailPrefix()} ◌ compacting (${e.reason})`);
229
+ break;
230
+ }
231
+ case "auto_retry_start": {
232
+ const e = event;
233
+ const err = e.errorMessage ?? "";
234
+ notify?.(`↻ ${role}: model retry ${e.attempt}/${e.maxAttempts}${err ? `\n${err}` : ""}`, "warning");
235
+ appendTail(`${tailPrefix()} ↻ retry ${e.attempt}/${e.maxAttempts}${err ? `: ${extractErrorSummary(err)}` : ""}`, { warning: true });
236
+ break;
237
+ }
238
+ }
239
+ afterEach?.();
240
+ };
241
+ return { onEvent, state };
242
+ }
243
+ //# sourceMappingURL=viewport-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport-events.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/viewport-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { AgentMessage } from "@earendil-works/pi-agent-core";
2
+ export declare const RISKY_TAG = "\uD83D\uDD12";
3
+ export interface GlyphInfo {
4
+ glyph: string;
5
+ risky: boolean;
6
+ }
7
+ export declare function toolGlyph(toolName: string, args: unknown): GlyphInfo;
8
+ export declare function argHint(toolName: string, args: unknown, maxLen?: number): string;
9
+ /**
10
+ * Truncate at a whitespace boundary when possible so we don't slice mid-token
11
+ * (e.g. `FORGE_ROOT=$(node -e` cut at the open paren). Appends `…(+Nc)` so the
12
+ * user knows there's more.
13
+ */
14
+ export declare function truncateAtBoundary(s: string, max: number): string;
15
+ /**
16
+ * Extract a small "shape" hint from a tool result so users see `read ok 247L`
17
+ * instead of `read ok`. Defensive: result shapes vary across tools and providers.
18
+ */
19
+ export declare function resultShape(_toolName: string, result: unknown): string;
20
+ /**
21
+ * Pull the first sentence (or first 100 chars) from any `thinking` block on an
22
+ * assistant message. Returns `undefined` if no thinking content present.
23
+ */
24
+ export declare function extractThinkingOneLiner(message: AgentMessage | undefined): string | undefined;
25
+ export interface UsageDelta {
26
+ input: number;
27
+ output: number;
28
+ cacheRead: number;
29
+ }
30
+ /** Extract usage from an assistant message; returns zeros if missing. */
31
+ export declare function readUsage(message: AgentMessage | undefined): UsageDelta;
32
+ /**
33
+ * Extract the last assistant-authored text from a turn_end message and
34
+ * collapse to a single-line preview (max 120 chars). Returns "" if the
35
+ * message has no text content (e.g. all-tool-call turn).
36
+ */
37
+ export declare function extractTurnPreview(message: unknown): string;
38
+ export declare function fmtTokenMeter(u: UsageDelta): string;
39
+ /** Format a one-shot phase-completion line for the tail buffer. */
40
+ export declare function fmtPhaseSummary(opts: {
41
+ role: string;
42
+ turns: number;
43
+ tools: number;
44
+ errors: number;
45
+ wallSeconds: number;
46
+ usage: UsageDelta;
47
+ model?: string;
48
+ provider?: string;
49
+ compression?: {
50
+ calls: number;
51
+ tokensSaved: number;
52
+ };
53
+ }): string;
54
+ /**
55
+ * Build the sticky footer line shown at the bottom of the tail view.
56
+ * Includes cacheRead only when nonzero — most non-Anthropic providers (ollama,
57
+ * glm, etc.) return 0 for cache fields and we don't want the noise.
58
+ */
59
+ export declare function fmtTokenFooter(usage: UsageDelta | undefined, compression?: {
60
+ calls: number;
61
+ tokensSaved: number;
62
+ }): string;
63
+ /**
64
+ * Compact `(provider) model` label used to annotate token footers so users
65
+ * can see which model a phase ran with. Returns "" when neither field is
66
+ * populated.
67
+ */
68
+ export declare function fmtModelLabel(info: {
69
+ provider?: string;
70
+ model?: string;
71
+ } | undefined): string;
72
+ /**
73
+ * Combine a model label with a token footer, separated by ` · `. Either
74
+ * half may be empty — the separator is only inserted when both halves are
75
+ * present. Returns "" when both are empty.
76
+ */
77
+ export declare function fmtModelAndTokenFooter(info: {
78
+ provider?: string;
79
+ model?: string;
80
+ } | undefined, usage: UsageDelta | undefined, compression?: {
81
+ calls: number;
82
+ tokensSaved: number;
83
+ }): string;
@@ -0,0 +1,233 @@
1
+ // viewport-renderer.ts
2
+ //
3
+ // Pure-string helpers for the subagent viewport tail buffer.
4
+ // Centralises glyph selection, arg/result shape extraction, thinking one-liners,
5
+ // and running-usage formatting so run-task / run-sprint / fix-bug can share
6
+ // rendering without diverging.
7
+ import path from "node:path";
8
+ /** Per-tool glyph. Falls back to a generic arrow when unknown. */
9
+ const TOOL_GLYPHS = {
10
+ bash: "$",
11
+ read: "⌕",
12
+ write: "✎",
13
+ edit: "✎",
14
+ glob: "⌕",
15
+ grep: "⌕",
16
+ notebookedit: "✎",
17
+ };
18
+ /** Bash patterns we want users to see flagged even when auto-approved. */
19
+ const RISKY_BASH = /\b(rm\s+-rf|git\s+push\s+--force|chmod\s+777|sudo\s|curl\s+[^|]*\|\s*sh\b|npm\s+publish\b)/;
20
+ export const RISKY_TAG = "🔒";
21
+ export function toolGlyph(toolName, args) {
22
+ const a = (args && typeof args === "object" ? args : {});
23
+ const lower = toolName.toLowerCase();
24
+ let glyph = TOOL_GLYPHS[lower];
25
+ if (!glyph) {
26
+ if (/store[-_]?cli|forge[-_]?store/i.test(toolName))
27
+ glyph = "⚙";
28
+ else
29
+ glyph = "→";
30
+ }
31
+ let risky = false;
32
+ if (lower === "bash" && typeof a.command === "string" && RISKY_BASH.test(a.command)) {
33
+ risky = true;
34
+ }
35
+ return { glyph, risky };
36
+ }
37
+ export function argHint(toolName, args, maxLen = 60) {
38
+ if (!args || typeof args !== "object")
39
+ return "";
40
+ const a = args;
41
+ const fp = (a.file_path ?? a.path);
42
+ if (typeof fp === "string")
43
+ return path.basename(fp);
44
+ if (typeof a.command === "string")
45
+ return truncateAtBoundary(a.command, maxLen);
46
+ if (typeof a.pattern === "string")
47
+ return truncateAtBoundary(a.pattern, maxLen);
48
+ if (typeof a.query === "string")
49
+ return truncateAtBoundary(a.query, maxLen);
50
+ return "";
51
+ }
52
+ /**
53
+ * Truncate at a whitespace boundary when possible so we don't slice mid-token
54
+ * (e.g. `FORGE_ROOT=$(node -e` cut at the open paren). Appends `…(+Nc)` so the
55
+ * user knows there's more.
56
+ */
57
+ export function truncateAtBoundary(s, max) {
58
+ if (s.length <= max)
59
+ return s;
60
+ const head = s.slice(0, max);
61
+ const lastSpace = head.lastIndexOf(" ");
62
+ const cut = lastSpace > Math.floor(max * 0.6) ? lastSpace : max;
63
+ const extra = s.length - cut;
64
+ // Strip trailing whitespace before the ellipsis so the body is visually
65
+ // clean and downstream string checks (`endsWith` / regex) behave predictably.
66
+ return `${s.slice(0, cut).replace(/\s+$/, "")}…(+${extra}c)`;
67
+ }
68
+ /**
69
+ * Extract a small "shape" hint from a tool result so users see `read ok 247L`
70
+ * instead of `read ok`. Defensive: result shapes vary across tools and providers.
71
+ */
72
+ export function resultShape(_toolName, result) {
73
+ try {
74
+ if (typeof result === "string") {
75
+ if (result.length === 0)
76
+ return "empty";
77
+ const lines = result.split(/\r?\n/).length;
78
+ return lines > 1 ? `${lines}L` : `${result.length}c`;
79
+ }
80
+ if (result && typeof result === "object") {
81
+ const r = result;
82
+ if (typeof r.stdout === "string") {
83
+ const out = r.stdout;
84
+ if (out.length === 0)
85
+ return "empty";
86
+ const lines = out.split(/\r?\n/).length;
87
+ return `${lines}L`;
88
+ }
89
+ if (typeof r.content === "string") {
90
+ const lines = r.content.split(/\r?\n/).length;
91
+ return `${lines}L`;
92
+ }
93
+ if (Array.isArray(r.content)) {
94
+ let total = 0;
95
+ for (const item of r.content) {
96
+ const t = item?.text;
97
+ if (typeof t === "string")
98
+ total += t.split(/\r?\n/).length;
99
+ }
100
+ if (total > 0)
101
+ return `${total}L`;
102
+ }
103
+ }
104
+ }
105
+ catch {
106
+ // fall through to no hint
107
+ }
108
+ return "";
109
+ }
110
+ /**
111
+ * Pull the first sentence (or first 100 chars) from any `thinking` block on an
112
+ * assistant message. Returns `undefined` if no thinking content present.
113
+ */
114
+ export function extractThinkingOneLiner(message) {
115
+ if (!message || message.role !== "assistant")
116
+ return undefined;
117
+ const content = message.content;
118
+ if (!Array.isArray(content))
119
+ return undefined;
120
+ for (const block of content) {
121
+ const b = block;
122
+ if (b?.type !== "thinking" || typeof b.thinking !== "string")
123
+ continue;
124
+ const text = b.thinking.trim();
125
+ if (!text)
126
+ continue;
127
+ const m = text.match(/^[^\n.!?]+/);
128
+ const first = (m ? m[0] : text).trim();
129
+ return first.length > 100 ? `${first.slice(0, 100)}…` : first;
130
+ }
131
+ return undefined;
132
+ }
133
+ /** Extract usage from an assistant message; returns zeros if missing. */
134
+ export function readUsage(message) {
135
+ const u = message?.usage;
136
+ return {
137
+ input: u?.input ?? 0,
138
+ output: u?.output ?? 0,
139
+ cacheRead: u?.cacheRead ?? 0,
140
+ };
141
+ }
142
+ /**
143
+ * Extract the last assistant-authored text from a turn_end message and
144
+ * collapse to a single-line preview (max 120 chars). Returns "" if the
145
+ * message has no text content (e.g. all-tool-call turn).
146
+ */
147
+ export function extractTurnPreview(message) {
148
+ if (!message || typeof message !== "object")
149
+ return "";
150
+ const msg = message;
151
+ if (msg.role !== "assistant")
152
+ return "";
153
+ const content = msg.content;
154
+ if (!Array.isArray(content))
155
+ return "";
156
+ for (const c of content) {
157
+ if (!c || typeof c !== "object")
158
+ continue;
159
+ const part = c;
160
+ if (part.type === "text" && typeof part.text === "string" && part.text.trim()) {
161
+ const flat = part.text.replace(/\s+/g, " ").trim();
162
+ return flat.length > 120 ? `${flat.slice(0, 117)}…` : flat;
163
+ }
164
+ }
165
+ return "";
166
+ }
167
+ export function fmtTokenMeter(u) {
168
+ return `↑${humanTokens(u.input)}↓${humanTokens(u.output)}`;
169
+ }
170
+ function humanTokens(n) {
171
+ if (n < 1000)
172
+ return String(n);
173
+ if (n < 10_000)
174
+ return `${(n / 1000).toFixed(1)}k`;
175
+ if (n < 1_000_000)
176
+ return `${Math.round(n / 1000)}k`;
177
+ return `${(n / 1_000_000).toFixed(2)}M`;
178
+ }
179
+ /** Format a one-shot phase-completion line for the tail buffer. */
180
+ export function fmtPhaseSummary(opts) {
181
+ const { role, turns, tools, errors, wallSeconds, usage, model, provider, compression } = opts;
182
+ const errPart = errors > 0 ? ` err=${errors}` : "";
183
+ const modelPart = model ? ` model=${model}${provider ? `/${provider}` : ""}` : "";
184
+ const compPart = compression && compression.tokensSaved > 0 ? ` ⇌${humanTokens(compression.tokensSaved)}` : "";
185
+ return `▣ ${role}: turns=${turns} tools=${tools}${errPart} ${fmtTokenMeter(usage)}${compPart} wall=${fmtWall(wallSeconds)}${modelPart}`;
186
+ }
187
+ /**
188
+ * Build the sticky footer line shown at the bottom of the tail view.
189
+ * Includes cacheRead only when nonzero — most non-Anthropic providers (ollama,
190
+ * glm, etc.) return 0 for cache fields and we don't want the noise.
191
+ */
192
+ export function fmtTokenFooter(usage, compression) {
193
+ if (!usage)
194
+ return "";
195
+ const cache = usage.cacheRead > 0 ? ` ⇪${humanTokens(usage.cacheRead)}` : "";
196
+ const comp = compression && compression.tokensSaved > 0 ? ` ⇌${humanTokens(compression.tokensSaved)}` : "";
197
+ return `↑${humanTokens(usage.input)} ↓${humanTokens(usage.output)}${cache}${comp}`;
198
+ }
199
+ /**
200
+ * Compact `(provider) model` label used to annotate token footers so users
201
+ * can see which model a phase ran with. Returns "" when neither field is
202
+ * populated.
203
+ */
204
+ export function fmtModelLabel(info) {
205
+ if (!info)
206
+ return "";
207
+ const { provider, model } = info;
208
+ if (!provider && !model)
209
+ return "";
210
+ if (provider && model)
211
+ return `(${provider}) ${model}`;
212
+ return provider ?? model ?? "";
213
+ }
214
+ /**
215
+ * Combine a model label with a token footer, separated by ` · `. Either
216
+ * half may be empty — the separator is only inserted when both halves are
217
+ * present. Returns "" when both are empty.
218
+ */
219
+ export function fmtModelAndTokenFooter(info, usage, compression) {
220
+ const left = fmtModelLabel(info);
221
+ const right = fmtTokenFooter(usage, compression);
222
+ if (left && right)
223
+ return `${left} · ${right}`;
224
+ return left || right;
225
+ }
226
+ function fmtWall(seconds) {
227
+ if (seconds < 60)
228
+ return `${seconds}s`;
229
+ const m = Math.floor(seconds / 60);
230
+ const s = seconds % 60;
231
+ return `${m}m${String(s).padStart(2, "0")}s`;
232
+ }
233
+ //# sourceMappingURL=viewport-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport-renderer.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/viewport-renderer.ts"],"names":[],"mappings":"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"}