@entelligentsia/forgecli 1.0.20 → 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 (324) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +7 -1
  3. package/dist/bin/config.js +4 -4
  4. package/dist/bin/config.js.map +1 -1
  5. package/dist/bin/update-cli.d.ts +1 -1
  6. package/dist/bin/update-cli.js +1 -1
  7. package/dist/bin/update-cli.js.map +1 -1
  8. package/dist/extensions/forgecli/ask-user-tool.js +1 -1
  9. package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
  10. package/dist/extensions/forgecli/commands/add-pipeline.d.ts +19 -0
  11. package/dist/extensions/forgecli/commands/add-pipeline.js +143 -0
  12. package/dist/extensions/forgecli/commands/add-pipeline.js.map +1 -0
  13. package/dist/extensions/forgecli/commands/add-task.d.ts +20 -0
  14. package/dist/extensions/forgecli/commands/add-task.js +154 -0
  15. package/dist/extensions/forgecli/commands/add-task.js.map +1 -0
  16. package/dist/extensions/forgecli/commands/approve.d.ts +22 -0
  17. package/dist/extensions/forgecli/commands/approve.js +152 -0
  18. package/dist/extensions/forgecli/commands/approve.js.map +1 -0
  19. package/dist/extensions/forgecli/commands/collate.d.ts +22 -0
  20. package/dist/extensions/forgecli/commands/collate.js +134 -0
  21. package/dist/extensions/forgecli/commands/collate.js.map +1 -0
  22. package/dist/extensions/forgecli/commands/commit.d.ts +22 -0
  23. package/dist/extensions/forgecli/commands/commit.js +152 -0
  24. package/dist/extensions/forgecli/commands/commit.js.map +1 -0
  25. package/dist/extensions/forgecli/commands/config-command.d.ts +8 -0
  26. package/dist/extensions/forgecli/commands/config-command.js +67 -0
  27. package/dist/extensions/forgecli/commands/config-command.js.map +1 -0
  28. package/dist/extensions/forgecli/commands/enhance.d.ts +45 -0
  29. package/dist/extensions/forgecli/commands/enhance.js +219 -0
  30. package/dist/extensions/forgecli/commands/enhance.js.map +1 -0
  31. package/dist/extensions/forgecli/commands/implement.d.ts +22 -0
  32. package/dist/extensions/forgecli/commands/implement.js +170 -0
  33. package/dist/extensions/forgecli/commands/implement.js.map +1 -0
  34. package/dist/extensions/forgecli/commands/plan.d.ts +22 -0
  35. package/dist/extensions/forgecli/commands/plan.js +167 -0
  36. package/dist/extensions/forgecli/commands/plan.js.map +1 -0
  37. package/dist/extensions/forgecli/commands/quiz-agent.d.ts +17 -0
  38. package/dist/extensions/forgecli/commands/quiz-agent.js +98 -0
  39. package/dist/extensions/forgecli/commands/quiz-agent.js.map +1 -0
  40. package/dist/extensions/forgecli/commands/read-command.d.ts +2 -0
  41. package/dist/extensions/forgecli/commands/read-command.js +100 -0
  42. package/dist/extensions/forgecli/commands/read-command.js.map +1 -0
  43. package/dist/extensions/forgecli/commands/regenerate.d.ts +40 -0
  44. package/dist/extensions/forgecli/commands/regenerate.js +426 -0
  45. package/dist/extensions/forgecli/commands/regenerate.js.map +1 -0
  46. package/dist/extensions/forgecli/commands/remove-command.d.ts +17 -0
  47. package/dist/extensions/forgecli/commands/remove-command.js +124 -0
  48. package/dist/extensions/forgecli/commands/remove-command.js.map +1 -0
  49. package/dist/extensions/forgecli/commands/report-bug.d.ts +25 -0
  50. package/dist/extensions/forgecli/commands/report-bug.js +159 -0
  51. package/dist/extensions/forgecli/commands/report-bug.js.map +1 -0
  52. package/dist/extensions/forgecli/commands/retrospective.d.ts +20 -0
  53. package/dist/extensions/forgecli/commands/retrospective.js +126 -0
  54. package/dist/extensions/forgecli/commands/retrospective.js.map +1 -0
  55. package/dist/extensions/forgecli/commands/review-code.d.ts +35 -0
  56. package/dist/extensions/forgecli/commands/review-code.js +196 -0
  57. package/dist/extensions/forgecli/commands/review-code.js.map +1 -0
  58. package/dist/extensions/forgecli/commands/review-plan.d.ts +35 -0
  59. package/dist/extensions/forgecli/commands/review-plan.js +200 -0
  60. package/dist/extensions/forgecli/commands/review-plan.js.map +1 -0
  61. package/dist/extensions/forgecli/commands/sprint-intake.d.ts +10 -0
  62. package/dist/extensions/forgecli/commands/sprint-intake.js +91 -0
  63. package/dist/extensions/forgecli/commands/sprint-intake.js.map +1 -0
  64. package/dist/extensions/forgecli/commands/sprint-plan.d.ts +14 -0
  65. package/dist/extensions/forgecli/commands/sprint-plan.js +122 -0
  66. package/dist/extensions/forgecli/commands/sprint-plan.js.map +1 -0
  67. package/dist/extensions/forgecli/commands/status-command.d.ts +19 -0
  68. package/dist/extensions/forgecli/commands/status-command.js +140 -0
  69. package/dist/extensions/forgecli/commands/status-command.js.map +1 -0
  70. package/dist/extensions/forgecli/commands/store-query.d.ts +22 -0
  71. package/dist/extensions/forgecli/commands/store-query.js +107 -0
  72. package/dist/extensions/forgecli/commands/store-query.js.map +1 -0
  73. package/dist/extensions/forgecli/commands/store-repair.d.ts +17 -0
  74. package/dist/extensions/forgecli/commands/store-repair.js +123 -0
  75. package/dist/extensions/forgecli/commands/store-repair.js.map +1 -0
  76. package/dist/extensions/forgecli/commands/test-orchestrate.d.ts +2 -0
  77. package/dist/extensions/forgecli/commands/test-orchestrate.js +182 -0
  78. package/dist/extensions/forgecli/commands/test-orchestrate.js.map +1 -0
  79. package/dist/extensions/forgecli/commands/transcripts-command.d.ts +87 -0
  80. package/dist/extensions/forgecli/commands/transcripts-command.js +418 -0
  81. package/dist/extensions/forgecli/commands/transcripts-command.js.map +1 -0
  82. package/dist/extensions/forgecli/commands/validate.d.ts +22 -0
  83. package/dist/extensions/forgecli/commands/validate.js +152 -0
  84. package/dist/extensions/forgecli/commands/validate.js.map +1 -0
  85. package/dist/extensions/forgecli/config/config-layer.d.ts +53 -0
  86. package/dist/extensions/forgecli/config/config-layer.js +72 -0
  87. package/dist/extensions/forgecli/config/config-layer.js.map +1 -0
  88. package/dist/extensions/forgecli/config/config-writer.d.ts +16 -0
  89. package/dist/extensions/forgecli/config/config-writer.js +69 -0
  90. package/dist/extensions/forgecli/config/config-writer.js.map +1 -0
  91. package/dist/extensions/forgecli/config/model-registry.d.ts +61 -0
  92. package/dist/extensions/forgecli/config/model-registry.js +127 -0
  93. package/dist/extensions/forgecli/config/model-registry.js.map +1 -0
  94. package/dist/extensions/forgecli/config/model-resolver.d.ts +32 -0
  95. package/dist/extensions/forgecli/config/model-resolver.js +65 -0
  96. package/dist/extensions/forgecli/config/model-resolver.js.map +1 -0
  97. package/dist/extensions/forgecli/config/model-validator.d.ts +29 -0
  98. package/dist/extensions/forgecli/config/model-validator.js +107 -0
  99. package/dist/extensions/forgecli/config/model-validator.js.map +1 -0
  100. package/dist/extensions/forgecli/config-tui/component.js +1 -1
  101. package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
  102. package/dist/extensions/forgecli/config-tui/handler.js +1 -1
  103. package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
  104. package/dist/extensions/forgecli/config-tui/screens/override-editor.js +1 -1
  105. package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
  106. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +1 -1
  107. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
  108. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +1 -1
  109. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
  110. package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
  111. package/dist/extensions/forgecli/config-tui/state/model.d.ts +1 -1
  112. package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
  113. package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +2 -2
  114. package/dist/extensions/forgecli/config-tui/state/selectors.js +1 -1
  115. package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
  116. package/dist/extensions/forgecli/context-governor-compaction.d.ts +13 -2
  117. package/dist/extensions/forgecli/context-governor-compaction.js +66 -41
  118. package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -1
  119. package/dist/extensions/forgecli/context-governor.d.ts +3 -7
  120. package/dist/extensions/forgecli/context-governor.js +43 -69
  121. package/dist/extensions/forgecli/context-governor.js.map +1 -1
  122. package/dist/extensions/forgecli/dashboard/component.d.ts +10 -1
  123. package/dist/extensions/forgecli/dashboard/component.js +84 -18
  124. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  125. package/dist/extensions/forgecli/dashboard/register.js +1 -1
  126. package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
  127. package/dist/extensions/forgecli/forge-artifact-tool.js +1 -1
  128. package/dist/extensions/forgecli/forge-commands.js +1 -1
  129. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  130. package/dist/extensions/forgecli/forge-init/forge-init.d.ts +26 -0
  131. package/dist/extensions/forgecli/forge-init/forge-init.js +514 -0
  132. package/dist/extensions/forgecli/forge-init/forge-init.js.map +1 -0
  133. package/dist/extensions/forgecli/forge-init/init-context.d.ts +99 -0
  134. package/dist/extensions/forgecli/forge-init/init-context.js +178 -0
  135. package/dist/extensions/forgecli/forge-init/init-context.js.map +1 -0
  136. package/dist/extensions/forgecli/forge-init/init-progress.d.ts +39 -0
  137. package/dist/extensions/forgecli/forge-init/init-progress.js +117 -0
  138. package/dist/extensions/forgecli/forge-init/init-progress.js.map +1 -0
  139. package/dist/extensions/forgecli/forge-init/phase4-register.js +1 -1
  140. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  141. package/dist/extensions/forgecli/forge-init/run-phases.js +2 -2
  142. package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -1
  143. package/dist/extensions/forgecli/forge-subagent.d.ts +22 -0
  144. package/dist/extensions/forgecli/forge-subagent.js +42 -15
  145. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  146. package/dist/extensions/forgecli/forge-tools.d.ts +0 -25
  147. package/dist/extensions/forgecli/forge-tools.js +6 -37
  148. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  149. package/dist/extensions/forgecli/governor-config.d.ts +19 -0
  150. package/dist/extensions/forgecli/governor-config.js +58 -0
  151. package/dist/extensions/forgecli/governor-config.js.map +1 -0
  152. package/dist/extensions/forgecli/health-check.js +1 -1
  153. package/dist/extensions/forgecli/health-check.js.map +1 -1
  154. package/dist/extensions/forgecli/hook-dispatcher.js +2 -2
  155. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  156. package/dist/extensions/forgecli/hooks/post-init-hook.js +11 -6
  157. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
  158. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +11 -6
  159. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
  160. package/dist/extensions/forgecli/hooks/write-guard.js +1 -1
  161. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
  162. package/dist/extensions/forgecli/index.js +37 -35
  163. package/dist/extensions/forgecli/index.js.map +1 -1
  164. package/dist/extensions/forgecli/kickoff.d.ts +9 -0
  165. package/dist/extensions/forgecli/kickoff.js +15 -0
  166. package/dist/extensions/forgecli/kickoff.js.map +1 -1
  167. package/dist/extensions/forgecli/lib/forge-config.d.ts +1 -1
  168. package/dist/extensions/forgecli/lib/forge-config.js +1 -1
  169. package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
  170. package/dist/extensions/forgecli/lib/forge-root.d.ts +10 -0
  171. package/dist/extensions/forgecli/lib/forge-root.js +62 -0
  172. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -0
  173. package/dist/extensions/forgecli/lib/run-cjs.d.ts +26 -0
  174. package/dist/extensions/forgecli/lib/run-cjs.js +42 -0
  175. package/dist/extensions/forgecli/lib/run-cjs.js.map +1 -0
  176. package/dist/extensions/forgecli/orchestrator-tree.d.ts +4 -0
  177. package/dist/extensions/forgecli/orchestrator-tree.js +21 -3
  178. package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -1
  179. package/dist/extensions/forgecli/orchestrators/calibrate.d.ts +64 -0
  180. package/dist/extensions/forgecli/orchestrators/calibrate.js +481 -0
  181. package/dist/extensions/forgecli/orchestrators/calibrate.js.map +1 -0
  182. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +93 -0
  183. package/dist/extensions/forgecli/orchestrators/fix-bug.js +1705 -0
  184. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -0
  185. package/dist/extensions/forgecli/orchestrators/halt-advisor.d.ts +59 -0
  186. package/dist/extensions/forgecli/orchestrators/halt-advisor.js +113 -0
  187. package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -0
  188. package/dist/extensions/forgecli/orchestrators/materialize.d.ts +16 -0
  189. package/dist/extensions/forgecli/orchestrators/materialize.js +195 -0
  190. package/dist/extensions/forgecli/orchestrators/materialize.js.map +1 -0
  191. package/dist/extensions/forgecli/orchestrators/migrate.d.ts +22 -0
  192. package/dist/extensions/forgecli/orchestrators/migrate.js +260 -0
  193. package/dist/extensions/forgecli/orchestrators/migrate.js.map +1 -0
  194. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.d.ts +46 -0
  195. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js +64 -0
  196. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js.map +1 -0
  197. package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +27 -0
  198. package/dist/extensions/forgecli/orchestrators/run-sprint.js +734 -0
  199. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -0
  200. package/dist/extensions/forgecli/orchestrators/run-task.d.ts +215 -0
  201. package/dist/extensions/forgecli/orchestrators/run-task.js +1491 -0
  202. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -0
  203. package/dist/extensions/forgecli/paths/paths.d.ts +8 -0
  204. package/dist/extensions/forgecli/paths/paths.js +17 -0
  205. package/dist/extensions/forgecli/paths/paths.js.map +1 -1
  206. package/dist/extensions/forgecli/phase-vocab.d.ts +31 -0
  207. package/dist/extensions/forgecli/phase-vocab.js +82 -0
  208. package/dist/extensions/forgecli/phase-vocab.js.map +1 -0
  209. package/dist/extensions/forgecli/session-registry.d.ts +2 -2
  210. package/dist/extensions/forgecli/session-registry.js +6 -2
  211. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  212. package/dist/extensions/forgecli/skill-curation/friction-emit.d.ts +99 -0
  213. package/dist/extensions/forgecli/skill-curation/friction-emit.js +245 -0
  214. package/dist/extensions/forgecli/skill-curation/friction-emit.js.map +1 -0
  215. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.d.ts +21 -0
  216. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js +71 -0
  217. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js.map +1 -0
  218. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.d.ts +102 -0
  219. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js +339 -0
  220. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js.map +1 -0
  221. package/dist/extensions/forgecli/skill-curation/skill-retriever.d.ts +84 -0
  222. package/dist/extensions/forgecli/skill-curation/skill-retriever.js +246 -0
  223. package/dist/extensions/forgecli/skill-curation/skill-retriever.js.map +1 -0
  224. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.d.ts +91 -0
  225. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js +224 -0
  226. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js.map +1 -0
  227. package/dist/extensions/forgecli/store/store-error-remediation.d.ts +65 -0
  228. package/dist/extensions/forgecli/store/store-error-remediation.js +307 -0
  229. package/dist/extensions/forgecli/store/store-error-remediation.js.map +1 -0
  230. package/dist/extensions/forgecli/store/store-resolver.d.ts +56 -0
  231. package/dist/extensions/forgecli/store/store-resolver.js +263 -0
  232. package/dist/extensions/forgecli/store/store-resolver.js.map +1 -0
  233. package/dist/extensions/forgecli/store/store-validator.d.ts +16 -0
  234. package/dist/extensions/forgecli/store/store-validator.js +32 -0
  235. package/dist/extensions/forgecli/store/store-validator.js.map +1 -0
  236. package/dist/extensions/forgecli/store/transition-guard.d.ts +20 -0
  237. package/dist/extensions/forgecli/store/transition-guard.js +89 -0
  238. package/dist/extensions/forgecli/store/transition-guard.js.map +1 -0
  239. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +5 -0
  240. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -1
  241. package/dist/extensions/forgecli/transcript-archive-types.d.ts +171 -0
  242. package/dist/extensions/forgecli/transcript-archive-types.js +130 -0
  243. package/dist/extensions/forgecli/transcript-archive-types.js.map +1 -0
  244. package/dist/extensions/forgecli/transcript-archive.d.ts +127 -0
  245. package/dist/extensions/forgecli/transcript-archive.js +656 -0
  246. package/dist/extensions/forgecli/transcript-archive.js.map +1 -0
  247. package/dist/extensions/forgecli/transcript-replay.d.ts +28 -0
  248. package/dist/extensions/forgecli/transcript-replay.js +153 -0
  249. package/dist/extensions/forgecli/transcript-replay.js.map +1 -0
  250. package/dist/extensions/forgecli/transcripts-tui/component.d.ts +36 -0
  251. package/dist/extensions/forgecli/transcripts-tui/component.js +112 -0
  252. package/dist/extensions/forgecli/transcripts-tui/component.js.map +1 -0
  253. package/dist/extensions/forgecli/transcripts-tui/index.d.ts +4 -0
  254. package/dist/extensions/forgecli/transcripts-tui/index.js +5 -0
  255. package/dist/extensions/forgecli/transcripts-tui/index.js.map +1 -0
  256. package/dist/extensions/forgecli/transcripts-tui/screens/browse.d.ts +21 -0
  257. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js +172 -0
  258. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js.map +1 -0
  259. package/dist/extensions/forgecli/transcripts-tui/screens/types.d.ts +22 -0
  260. package/dist/extensions/forgecli/transcripts-tui/screens/types.js +4 -0
  261. package/dist/extensions/forgecli/transcripts-tui/screens/types.js.map +1 -0
  262. package/dist/extensions/forgecli/transcripts-tui/state/index.d.ts +4 -0
  263. package/dist/extensions/forgecli/transcripts-tui/state/index.js +5 -0
  264. package/dist/extensions/forgecli/transcripts-tui/state/index.js.map +1 -0
  265. package/dist/extensions/forgecli/transcripts-tui/state/init.d.ts +8 -0
  266. package/dist/extensions/forgecli/transcripts-tui/state/init.js +18 -0
  267. package/dist/extensions/forgecli/transcripts-tui/state/init.js.map +1 -0
  268. package/dist/extensions/forgecli/transcripts-tui/state/model.d.ts +56 -0
  269. package/dist/extensions/forgecli/transcripts-tui/state/model.js +6 -0
  270. package/dist/extensions/forgecli/transcripts-tui/state/model.js.map +1 -0
  271. package/dist/extensions/forgecli/transcripts-tui/state/reducer.d.ts +2 -0
  272. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js +51 -0
  273. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js.map +1 -0
  274. package/dist/extensions/forgecli/transcripts-tui/state/selectors.d.ts +10 -0
  275. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js +62 -0
  276. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js.map +1 -0
  277. package/dist/extensions/forgecli/transcripts-tui/theme.d.ts +20 -0
  278. package/dist/extensions/forgecli/transcripts-tui/theme.js +47 -0
  279. package/dist/extensions/forgecli/transcripts-tui/theme.js.map +1 -0
  280. package/dist/extensions/forgecli/tui/banner.d.ts +10 -0
  281. package/dist/extensions/forgecli/tui/banner.js +36 -0
  282. package/dist/extensions/forgecli/tui/banner.js.map +1 -0
  283. package/dist/extensions/forgecli/tui/forge-header.d.ts +12 -0
  284. package/dist/extensions/forgecli/tui/forge-header.js +114 -0
  285. package/dist/extensions/forgecli/tui/forge-header.js.map +1 -0
  286. package/dist/extensions/forgecli/tui/input-router.d.ts +33 -0
  287. package/dist/extensions/forgecli/tui/input-router.js +136 -0
  288. package/dist/extensions/forgecli/tui/input-router.js.map +1 -0
  289. package/dist/extensions/forgecli/tui/orchestrator-status-bar.d.ts +26 -0
  290. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js +213 -0
  291. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js.map +1 -0
  292. package/dist/extensions/forgecli/tui/thread-switcher.d.ts +18 -0
  293. package/dist/extensions/forgecli/tui/thread-switcher.js +194 -0
  294. package/dist/extensions/forgecli/tui/thread-switcher.js.map +1 -0
  295. package/dist/extensions/forgecli/update/forge-update-command.d.ts +100 -0
  296. package/dist/extensions/forgecli/update/forge-update-command.js +435 -0
  297. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -0
  298. package/dist/extensions/forgecli/update/migration-engine.d.ts +117 -0
  299. package/dist/extensions/forgecli/update/migration-engine.js +563 -0
  300. package/dist/extensions/forgecli/update/migration-engine.js.map +1 -0
  301. package/dist/extensions/forgecli/update/update-check.d.ts +37 -0
  302. package/dist/extensions/forgecli/update/update-check.js +185 -0
  303. package/dist/extensions/forgecli/update/update-check.js.map +1 -0
  304. package/dist/extensions/forgecli/update/update-tools.d.ts +23 -0
  305. package/dist/extensions/forgecli/update/update-tools.js +135 -0
  306. package/dist/extensions/forgecli/update/update-tools.js.map +1 -0
  307. package/dist/extensions/forgecli/update/whats-new-widget.d.ts +26 -0
  308. package/dist/extensions/forgecli/update/whats-new-widget.js +376 -0
  309. package/dist/extensions/forgecli/update/whats-new-widget.js.map +1 -0
  310. package/dist/extensions/forgecli/update/whats-new.d.ts +120 -0
  311. package/dist/extensions/forgecli/update/whats-new.js +470 -0
  312. package/dist/extensions/forgecli/update/whats-new.js.map +1 -0
  313. package/dist/extensions/forgecli/viewport/events.d.ts +113 -0
  314. package/dist/extensions/forgecli/viewport/events.js +290 -0
  315. package/dist/extensions/forgecli/viewport/events.js.map +1 -0
  316. package/dist/extensions/forgecli/viewport/renderer.d.ts +102 -0
  317. package/dist/extensions/forgecli/viewport/renderer.js +277 -0
  318. package/dist/extensions/forgecli/viewport/renderer.js.map +1 -0
  319. package/dist/extensions/forgecli/viewport/theme.d.ts +11 -0
  320. package/dist/extensions/forgecli/viewport/theme.js +131 -0
  321. package/dist/extensions/forgecli/viewport/theme.js.map +1 -0
  322. package/dist/extensions/forgecli/wf-engine/engine.js +1 -1
  323. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
  324. package/package.json +4 -2
@@ -0,0 +1,376 @@
1
+ // What's-New strip + detail widget.
2
+ //
3
+ // Startup behavior (post-FORGE-BUG-001 refactor): on session_start we emit
4
+ // a one-line passive notify pointing the user at `/changelog` — we do NOT
5
+ // auto-mount the interactive strip and we do NOT hook the input router.
6
+ // The strip used to live below the editor for the entire session and steal
7
+ // every ↓ key; users hated it.
8
+ //
9
+ // The interactive strip is now ONLY mounted in response to `/changelog`.
10
+ // UX once mounted:
11
+ //
12
+ // INACTIVE (default): "what's new ─ pi 30 · forge-plugin 8 · forge-cli 2 ↓ to view"
13
+ // ACTIVE (↓): "what's new ─ ▸● pi 30 ○ forge-plugin 8 ○ forge-cli 2 ←→ · enter · esc hide · d forget"
14
+ //
15
+ // Enter on a chip → setOutputSource(WhatsNewDetailComponent).
16
+ // Esc → soft hide for this session (unmounts widget, drops input handler;
17
+ // /changelog cache is untouched, so /changelog still replays).
18
+ // d → permanent forget (collapses prev baseline so /changelog returns
19
+ // "no recent updates" until the next version bump).
20
+ //
21
+ // Activation key (↓) requires an empty editor (no text at all), not just
22
+ // "no newlines" — single-line text used to be enough and that was too
23
+ // eager.
24
+ //
25
+ // Mount is idempotent: a second /changelog while the strip is already
26
+ // mounted unregisters the prior input-router handler before re-registering,
27
+ // so handlers don't stack.
28
+ import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
29
+ import { getInputRouter } from "../tui/input-router.js";
30
+ import { getUserCacheDir } from "../paths/paths.js";
31
+ import { computeAndPersistStartupPanel, computeSummaries, computeWhatsNewView, dismissWhatsNew, readSeenState, renderComponentDetail, renderSummaryPanel, resolveChangelogPaths, } from "./whats-new.js";
32
+ const WIDGET_KEY = "forge:whats-new";
33
+ // ── Detail-view component: rendered into chat viewport on Enter ──────────
34
+ class WhatsNewDetailComponent {
35
+ lines;
36
+ invalidationCb;
37
+ constructor(lines) {
38
+ this.lines = lines;
39
+ }
40
+ render(width) {
41
+ return this.lines.map((l) => (visibleWidth(l) <= width ? l : truncateToWidth(l, width)));
42
+ }
43
+ invalidate() {
44
+ // Static content — re-render only when caller updates `lines`.
45
+ }
46
+ setInvalidationCallback(cb) {
47
+ this.invalidationCb = cb;
48
+ }
49
+ updateLines(lines) {
50
+ this.lines = lines;
51
+ this.invalidationCb?.();
52
+ }
53
+ dispose = () => { };
54
+ }
55
+ // ── Strip component: single row below the editor ─────────────────────────
56
+ class WhatsNewStripComponent {
57
+ summaries;
58
+ theme;
59
+ cursorIdx = 0;
60
+ stripActive = false;
61
+ /** Component currently focused into the chat viewport. */
62
+ focusedComponent = null;
63
+ invalidationCb;
64
+ constructor(summaries, theme) {
65
+ this.summaries = summaries;
66
+ this.theme = theme;
67
+ }
68
+ setInvalidationCallback(cb) {
69
+ this.invalidationCb = cb;
70
+ }
71
+ invalidate() {
72
+ // Re-render driven by caller via invalidationCb → tui.requestRender().
73
+ }
74
+ hasContent() {
75
+ return this.summaries.length > 0;
76
+ }
77
+ getStripActive() {
78
+ return this.stripActive;
79
+ }
80
+ cursorSummary() {
81
+ return this.summaries[this.cursorIdx];
82
+ }
83
+ setStripActive(active) {
84
+ if (this.stripActive === active)
85
+ return;
86
+ this.stripActive = active;
87
+ this.invalidationCb?.();
88
+ }
89
+ moveCursor(delta) {
90
+ if (this.summaries.length === 0)
91
+ return;
92
+ this.cursorIdx = Math.max(0, Math.min(this.summaries.length - 1, this.cursorIdx + delta));
93
+ this.invalidationCb?.();
94
+ }
95
+ setFocused(id) {
96
+ this.focusedComponent = id;
97
+ this.invalidationCb?.();
98
+ }
99
+ clearSummaries() {
100
+ this.summaries = [];
101
+ this.focusedComponent = null;
102
+ this.invalidationCb?.();
103
+ }
104
+ render(width) {
105
+ if (!this.hasContent())
106
+ return [];
107
+ const dim = (s) => this.theme.fg("dim", s);
108
+ const accent = (s) => this.theme.fg("accent", s);
109
+ const bold = (s) => this.theme.bold(s);
110
+ const prefix = this.stripActive ? accent("what's new ─ ") : dim("what's new ─ ");
111
+ const hint = this.stripActive ? dim(" ←→ · enter · esc hide · d forget") : dim(" ↓ to view (empty editor)");
112
+ const parts = this.summaries.map((s, i) => {
113
+ const focusedGlyph = this.focusedComponent === s.component ? "●" : "○";
114
+ const inner = `${focusedGlyph} ${s.label} ${s.totalChanges}`;
115
+ if (this.stripActive && i === this.cursorIdx)
116
+ return accent(bold(`▸${inner}`));
117
+ return dim(inner);
118
+ });
119
+ const chips = parts.join(" ");
120
+ let line = `${prefix}${chips}${hint}`;
121
+ if (visibleWidth(line) > width)
122
+ line = truncateToWidth(line, width);
123
+ return [line];
124
+ }
125
+ dispose = () => { };
126
+ }
127
+ // ── Key recognition (mirrors thread-switcher.ts) ─────────────────────────
128
+ function isLeftArrow(d) {
129
+ return d === "\x1b[D";
130
+ }
131
+ function isRightArrow(d) {
132
+ return d === "\x1b[C";
133
+ }
134
+ function isDownArrow(d) {
135
+ return d === "\x1b[B" || d === "\x1bOB";
136
+ }
137
+ function isUpArrow(d) {
138
+ return d === "\x1b[A" || d === "\x1bOA";
139
+ }
140
+ function isEnter(d) {
141
+ return d === "\r" || d === "\n";
142
+ }
143
+ function isEsc(d) {
144
+ return d === "\x1b";
145
+ }
146
+ // ── Mount ────────────────────────────────────────────────────────────────
147
+ /**
148
+ * Compute startup summaries and, if any, emit a one-line passive notify
149
+ * pointing the user at `/changelog`. Marks versions as seen via the
150
+ * standard cache so subsequent sessions won't re-notify unless a new bump
151
+ * occurs. Returns true when a notify was emitted.
152
+ *
153
+ * Pre-FORGE-BUG-001 this mounted the interactive strip directly; that was
154
+ * removed because the strip captured the ↓ key for the whole session and
155
+ * the auto-mount happened before the user had any chance to opt in.
156
+ */
157
+ export async function mountWhatsNewWidgetOnStartup(_pi, ctx, rt) {
158
+ const result = await computeAndPersistStartupPanel(rt);
159
+ if (!result || result.summaries.length === 0)
160
+ return false;
161
+ const parts = result.summaries.map((s) => `${s.label} ${s.totalChanges}`).join(" · ");
162
+ try {
163
+ ctx.ui.notify(`forge: what's new — ${parts}. Type /changelog to view.`, "info");
164
+ }
165
+ catch {
166
+ /* stale ctx — non-fatal */
167
+ }
168
+ return true;
169
+ }
170
+ /**
171
+ * Module-level mount state — used to make `mountStripWithSummaries`
172
+ * idempotent. Calling /changelog twice used to stack input-router
173
+ * handlers; we now tear down the previous mount first.
174
+ */
175
+ let currentUnregister = null;
176
+ /**
177
+ * Mount the strip with a pre-computed summary list. Idempotent — a second
178
+ * call unregisters the prior handler and replaces the widget surface.
179
+ * Only `/changelog` calls this; startup notify does not.
180
+ */
181
+ export function mountStripWithSummaries(_pi, ctx, rt, summaries) {
182
+ let stripRef;
183
+ let tuiRef;
184
+ let detailRef;
185
+ // FORGE-BUG-001: the captured ExtensionContext goes stale after pi's
186
+ // session replacement events. Touching ctx.ui after that throws.
187
+ const safeUi = (fn) => {
188
+ try {
189
+ return fn();
190
+ }
191
+ catch {
192
+ return undefined;
193
+ }
194
+ };
195
+ // Idempotency: drop any prior input-router handler before re-registering.
196
+ if (currentUnregister) {
197
+ try {
198
+ currentUnregister();
199
+ }
200
+ catch {
201
+ /* ignore */
202
+ }
203
+ currentUnregister = null;
204
+ }
205
+ try {
206
+ ctx.ui.setWidget(WIDGET_KEY, (tui, theme) => {
207
+ tuiRef = tui;
208
+ const strip = new WhatsNewStripComponent(summaries, theme);
209
+ strip.setInvalidationCallback(() => tui.requestRender());
210
+ stripRef = strip;
211
+ return strip;
212
+ }, { placement: "belowEditor" });
213
+ }
214
+ catch (err) {
215
+ if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
216
+ console.error("[forge-cli whats-new] setWidget failed:", err);
217
+ }
218
+ return;
219
+ }
220
+ const setFocusToMain = () => {
221
+ stripRef?.setFocused(null);
222
+ detailRef?.dispose?.();
223
+ detailRef = undefined;
224
+ safeUi(() => ctx.ui.setOutputSource(null));
225
+ };
226
+ const commitFocus = () => {
227
+ if (!stripRef)
228
+ return;
229
+ const summary = stripRef.cursorSummary();
230
+ if (!summary)
231
+ return;
232
+ stripRef.setFocused(summary.component);
233
+ const lines = renderComponentDetail(summary).split("\n");
234
+ if (detailRef) {
235
+ detailRef.updateLines(lines);
236
+ }
237
+ else {
238
+ detailRef = new WhatsNewDetailComponent(lines);
239
+ if (tuiRef)
240
+ detailRef.setInvalidationCallback(() => tuiRef?.requestRender());
241
+ }
242
+ if (detailRef)
243
+ safeUi(() => ctx.ui.setOutputSource(detailRef));
244
+ };
245
+ // Tear down the entire mount — used by Esc (hide for this session) and
246
+ // by `d` (permanent forget). Both unmount the widget surface and drop
247
+ // the input-router handler so ↓ stops being captured. The difference is
248
+ // whether dismissWhatsNew() is invoked to collapse the prev baseline.
249
+ const tearDown = () => {
250
+ setFocusToMain();
251
+ safeUi(() => ctx.ui.setWidget(WIDGET_KEY, undefined));
252
+ stripRef?.clearSummaries();
253
+ stripRef = undefined;
254
+ if (currentUnregister) {
255
+ try {
256
+ currentUnregister();
257
+ }
258
+ catch {
259
+ /* ignore */
260
+ }
261
+ currentUnregister = null;
262
+ }
263
+ };
264
+ const unregister = getInputRouter().register((data) => {
265
+ if (!stripRef || !stripRef.hasContent())
266
+ return undefined;
267
+ if (!stripRef.getStripActive()) {
268
+ if (!isDownArrow(data))
269
+ return undefined;
270
+ const editorText = safeUi(() => ctx.ui.getEditorText());
271
+ if (editorText === undefined)
272
+ return undefined; // stale ctx
273
+ // Stricter than the legacy "no newlines" check — only an
274
+ // empty editor activates the strip. Any in-progress text
275
+ // (single-line included) means ↓ belongs to the editor.
276
+ if (editorText !== "")
277
+ return undefined;
278
+ stripRef.setStripActive(true);
279
+ return { consume: true };
280
+ }
281
+ if (isLeftArrow(data)) {
282
+ stripRef.moveCursor(-1);
283
+ return { consume: true };
284
+ }
285
+ if (isRightArrow(data)) {
286
+ stripRef.moveCursor(1);
287
+ return { consume: true };
288
+ }
289
+ if (isUpArrow(data)) {
290
+ stripRef.setStripActive(false);
291
+ return { consume: true };
292
+ }
293
+ if (isEnter(data)) {
294
+ commitFocus();
295
+ return { consume: true };
296
+ }
297
+ if (isEsc(data)) {
298
+ // Soft hide for this session — strip disappears, ↓ is
299
+ // released, but the cache is untouched so /changelog can
300
+ // re-summon the same set.
301
+ tearDown();
302
+ return { consume: true };
303
+ }
304
+ if (isForgetKey(data)) {
305
+ // Permanent forget — collapse prev baseline so /changelog
306
+ // returns "no recent updates" until the next version bump.
307
+ void dismissWhatsNew(rt).catch(() => undefined);
308
+ tearDown();
309
+ return { consume: true };
310
+ }
311
+ return undefined;
312
+ }, { name: "whats-new-strip", skipWhenOverlayActive: true });
313
+ currentUnregister = unregister;
314
+ }
315
+ function isForgetKey(d) {
316
+ return d === "d" || d === "D";
317
+ }
318
+ /**
319
+ * Compute the summaries that should populate the strip when /whats-new is
320
+ * invoked: prev baseline first (post auto-dismiss), then lastShown frozen
321
+ * baseline (post explicit dismiss). Returns empty when neither yields a
322
+ * set — caller falls back to a notify message.
323
+ */
324
+ async function computeReplaySummaries(rt) {
325
+ const cacheDir = rt.cacheDir ?? getUserCacheDir();
326
+ const seen = await readSeenState(cacheDir);
327
+ const sources = resolveChangelogPaths(rt.pkgRoot);
328
+ let s = computeSummaries({ sources, current: rt.current, seen, baseline: "prev" });
329
+ if (s.length === 0)
330
+ s = computeSummaries({ sources, current: rt.current, seen, baseline: "lastShown" });
331
+ return s;
332
+ }
333
+ /**
334
+ * Register the /changelog slash command (overrides pi's built-in): re-mounts
335
+ * the interactive strip widget covering pi + forge-plugin + forge-cli changelogs.
336
+ * `/changelog dismiss` clears the replay baseline. Headless / non-TTY callers
337
+ * fall through to a text notify so the command is still usable.
338
+ */
339
+ export function registerChangelogCommand(pi, rt) {
340
+ pi.registerCommand("changelog", {
341
+ description: "Show What's New across pi, forge-plugin, and forge-cli (or /changelog dismiss to clear)",
342
+ async handler(args, ctx) {
343
+ const arg = args.trim().toLowerCase();
344
+ try {
345
+ if (arg === "dismiss" || arg === "--dismiss") {
346
+ await dismissWhatsNew(rt);
347
+ ctx.ui.notify("changelog: dismissed.", "info");
348
+ return;
349
+ }
350
+ const summaries = await computeReplaySummaries(rt);
351
+ if (summaries.length === 0) {
352
+ ctx.ui.notify("changelog: no recent updates.", "info");
353
+ return;
354
+ }
355
+ if (!ctx.hasUI) {
356
+ // Headless / RPC mode — widget surface unavailable; dump text.
357
+ const view = await computeWhatsNewView(rt, arg.length > 0 ? arg : null);
358
+ ctx.ui.notify(view, "info");
359
+ return;
360
+ }
361
+ // Echo the overall summary into the main chat container so
362
+ // users have a record of the change counts, then mount the
363
+ // strip below the editor for arrow-key drill-down.
364
+ ctx.ui.notify(`${renderSummaryPanel(summaries)}\n\n(Strip is below the editor — ↓ on an empty prompt to activate, ←→ to navigate, Enter to expand, Esc to hide, d to forget.)`, "info");
365
+ mountStripWithSummaries(pi, ctx, rt, summaries);
366
+ }
367
+ catch (err) {
368
+ if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
369
+ console.error("[forge-cli changelog] handler failed:", err);
370
+ }
371
+ ctx.ui.notify("changelog: failed to render — set FORGE_DEBUG_WHATS_NEW=1 for details.", "warning");
372
+ }
373
+ },
374
+ });
375
+ }
376
+ //# sourceMappingURL=whats-new-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whats-new-widget.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/update/whats-new-widget.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,wEAAwE;AACxE,2EAA2E;AAC3E,+BAA+B;AAC/B,EAAE;AACF,yEAAyE;AACzE,mBAAmB;AACnB,EAAE;AACF,uFAAuF;AACvF,qHAAqH;AACrH,EAAE;AACF,gEAAgE;AAChE,4EAA4E;AAC5E,uEAAuE;AACvE,0EAA0E;AAC1E,4DAA4D;AAC5D,EAAE;AACF,yEAAyE;AACzE,sEAAsE;AACtE,SAAS;AACT,EAAE;AACF,sEAAsE;AACtE,4EAA4E;AAC5E,2BAA2B;AAG3B,OAAO,EAA4B,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAEN,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,GAErB,MAAM,gBAAgB,CAAC;AAExB,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC,4EAA4E;AAE5E,MAAM,uBAAuB;IAGR;IAFZ,cAAc,CAAc;IAEpC,YAAoB,KAAe;QAAf,UAAK,GAAL,KAAK,CAAU;IAAG,CAAC;IAEvC,MAAM,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,UAAU;QACT,+DAA+D;IAChE,CAAC;IAED,uBAAuB,CAAC,EAAc;QACrC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,KAAe;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;CAC/B;AAED,4EAA4E;AAE5E,MAAM,sBAAsB;IAQlB;IACS;IARV,SAAS,GAAG,CAAC,CAAC;IACd,WAAW,GAAG,KAAK,CAAC;IAC5B,0DAA0D;IAClD,gBAAgB,GAAkB,IAAI,CAAC;IACvC,cAAc,CAAc;IAEpC,YACS,SAA0B,EACjB,KAAY;QADrB,cAAS,GAAT,SAAS,CAAiB;QACjB,UAAK,GAAL,KAAK,CAAO;IAC3B,CAAC;IAEJ,uBAAuB,CAAC,EAAc;QACrC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,UAAU;QACT,uEAAuE;IACxE,CAAC;IAED,UAAU;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,cAAc;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,MAAe;QAC7B,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM;YAAE,OAAO;QACxC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,KAAa;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,EAAiB;QAC3B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,cAAc;QACb,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAE9G,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACvE,MAAM,KAAK,GAAG,GAAG,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/E,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,IAAI,GAAG,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;QACtC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK;YAAE,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;CAC/B;AAED,4EAA4E;AAE5E,SAAS,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,KAAK,QAAQ,CAAC;AACvB,CAAC;AACD,SAAS,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,KAAK,QAAQ,CAAC;AACvB,CAAC;AACD,SAAS,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,CAAC;AACzC,CAAC;AACD,SAAS,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,CAAC;AACzC,CAAC;AACD,SAAS,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;AACjC,CAAC;AACD,SAAS,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,KAAK,MAAM,CAAC;AACrB,CAAC;AAED,4EAA4E;AAE5E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CACjD,GAAiB,EACjB,GAAqB,EACrB,EAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtF,IAAI,CAAC;QACJ,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uBAAuB,KAAK,6BAA6B,EAAE,MAAM,CAAC,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACR,2BAA2B;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,IAAI,iBAAiB,GAAwB,IAAI,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACtC,GAAiB,EACjB,GAAqB,EACrB,EAAmB,EACnB,SAA0B;IAE1B,IAAI,QAA4C,CAAC;IACjD,IAAI,MAAuB,CAAC;IAC5B,IAAI,SAA8C,CAAC;IAEnD,qEAAqE;IACrE,iEAAiE;IACjE,MAAM,MAAM,GAAG,CAAI,EAAW,EAAiB,EAAE;QAChD,IAAI,CAAC;YACJ,OAAO,EAAE,EAAE,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC,CAAC;IAEF,0EAA0E;IAC1E,IAAI,iBAAiB,EAAE,CAAC;QACvB,IAAI,CAAC;YACJ,iBAAiB,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACR,YAAY;QACb,CAAC;QACD,iBAAiB,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACJ,GAAG,CAAC,EAAE,CAAC,SAAS,CACf,UAAU,EACV,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,GAAG,GAAG,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC3D,KAAK,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;YACzD,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,KAAK,CAAC;QACd,CAAC,EACD,EAAE,SAAS,EAAE,aAAa,EAAE,CAC5B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,EAAE,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO;IACR,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,EAAE;QAC3B,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3B,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC;QACvB,SAAS,GAAG,SAAS,CAAC;QACtB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACxB,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACf,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACP,SAAS,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,SAAS,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,SAAS;YAAE,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,SAAU,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,uEAAuE;IACvE,sEAAsE;IACtE,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,cAAc,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QACtD,QAAQ,EAAE,cAAc,EAAE,CAAC;QAC3B,QAAQ,GAAG,SAAS,CAAC;QACrB,IAAI,iBAAiB,EAAE,CAAC;YACvB,IAAI,CAAC;gBACJ,iBAAiB,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACR,YAAY;YACb,CAAC;YACD,iBAAiB,GAAG,IAAI,CAAC;QAC1B,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC,QAAQ,CAC3C,CAAC,IAAI,EAAE,EAAE;QACR,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;YAAE,OAAO,SAAS,CAAC;QAE1D,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBAAE,OAAO,SAAS,CAAC;YACzC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;YACxD,IAAI,UAAU,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC,CAAC,YAAY;YAC5D,yDAAyD;YACzD,yDAAyD;YACzD,wDAAwD;YACxD,IAAI,UAAU,KAAK,EAAE;gBAAE,OAAO,SAAS,CAAC;YACxC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,sDAAsD;YACtD,yDAAyD;YACzD,0BAA0B;YAC1B,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,0DAA0D;YAC1D,2DAA2D;YAC3D,KAAK,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAChD,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,EACD,EAAE,IAAI,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,IAAI,EAAE,CACxD,CAAC;IACF,iBAAiB,GAAG,UAAU,CAAC;AAChC,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,sBAAsB,CAAC,EAAmB;IACxD,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,IAAI,eAAe,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,CAAC,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IACxG,OAAO,CAAC,CAAC;AACV,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAgB,EAAE,EAAmB;IAC7E,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE;QAC/B,WAAW,EAAE,yFAAyF;QACtG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC;gBACJ,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;oBAC9C,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;oBAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;oBAC/C,OAAO;gBACR,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBACnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC;oBACvD,OAAO;gBACR,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;oBAChB,+DAA+D;oBAC/D,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBACxE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC5B,OAAO;gBACR,CAAC;gBACD,2DAA2D;gBAC3D,2DAA2D;gBAC3D,mDAAmD;gBACnD,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,GAAG,kBAAkB,CAAC,SAAS,CAAC,gIAAgI,EAChK,MAAM,CACN,CAAC;gBACF,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,EAAE,CAAC;oBAC/C,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;gBAC7D,CAAC;gBACD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,wEAAwE,EAAE,SAAS,CAAC,CAAC;YACpG,CAAC;QACF,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,120 @@
1
+ export type ComponentId = "pi" | "forge-plugin" | "forge-cli";
2
+ export interface SeenState {
3
+ pi: string | null;
4
+ forgePlugin: string | null;
5
+ forgeCli: string | null;
6
+ prevPi: string | null;
7
+ prevForgePlugin: string | null;
8
+ prevForgeCli: string | null;
9
+ lastShownFromPi: string | null;
10
+ lastShownFromForgePlugin: string | null;
11
+ lastShownFromForgeCli: string | null;
12
+ lastShownAt: number;
13
+ }
14
+ export interface ChangelogEntry {
15
+ version: string;
16
+ date: string | null;
17
+ sections: {
18
+ name: string;
19
+ bullets: string[];
20
+ }[];
21
+ rawBody: string;
22
+ }
23
+ export interface ChangeSummary {
24
+ component: ComponentId;
25
+ label: string;
26
+ fromVersion: string | null;
27
+ toVersion: string;
28
+ totalChanges: number;
29
+ byCategory: Map<string, number>;
30
+ entries: ChangelogEntry[];
31
+ }
32
+ declare function defaultCacheDir(): string;
33
+ declare function cachePath(cacheDir: string): string;
34
+ export declare function emptySeenState(): SeenState;
35
+ export declare function readSeenState(cacheDir: string): Promise<SeenState>;
36
+ export declare function writeSeenState(cacheDir: string, state: SeenState): Promise<void>;
37
+ export declare function semverGt(a: string, b: string): boolean;
38
+ /**
39
+ * Parse a Keep-a-Changelog–style markdown body into per-version entries.
40
+ * Tolerates pi's `### New Features` overview sections (which precede the
41
+ * standard `### Added`/`### Fixed` sections) and the `[Unreleased]` block.
42
+ */
43
+ export declare function parseChangelog(markdown: string): ChangelogEntry[];
44
+ /**
45
+ * Reduce a list of changelog entries down to the ones strictly newer than
46
+ * `from`, up to and including `to`. When `from` is null, returns only the
47
+ * `to` entry (first-install case — don't dump the whole history).
48
+ */
49
+ export declare function entriesBetween(entries: ChangelogEntry[], from: string | null, to: string): ChangelogEntry[];
50
+ declare function normalizeCategory(name: string): string;
51
+ export declare function summarizeEntries(entries: ChangelogEntry[]): {
52
+ total: number;
53
+ byCategory: Map<string, number>;
54
+ };
55
+ export interface ChangelogSources {
56
+ pi: string | null;
57
+ forgePlugin: string | null;
58
+ forgeCli: string | null;
59
+ }
60
+ export declare function resolveChangelogPaths(pkgRoot: string): ChangelogSources;
61
+ export interface CurrentVersions {
62
+ pi: string;
63
+ forgePlugin: string;
64
+ forgeCli: string;
65
+ }
66
+ export type Baseline = "seen" | "prev" | "lastShown";
67
+ export interface ComputeOptions {
68
+ sources: ChangelogSources;
69
+ current: CurrentVersions;
70
+ seen: SeenState;
71
+ /** Which baseline to diff `current` against:
72
+ * - "seen" (default): auto-dismiss check at session_start.
73
+ * - "prev": /whats-new replay after auto-dismiss.
74
+ * - "lastShown": /whats-new replay after explicit dismiss — uses the
75
+ * `from` versions frozen at the most recent panel-mount so the
76
+ * last-shown set remains viewable forever.
77
+ */
78
+ baseline?: Baseline;
79
+ }
80
+ export declare function computeSummaries(opts: ComputeOptions): ChangeSummary[];
81
+ declare function formatVersionRange(from: string | null, to: string): string;
82
+ declare function formatCategoryBreakdown(byCategory: Map<string, number>): string;
83
+ export declare function renderSummaryPanel(summaries: ChangeSummary[]): string;
84
+ export declare function renderComponentDetail(summary: ChangeSummary): string;
85
+ export interface WhatsNewRuntime {
86
+ pkgRoot: string;
87
+ current: CurrentVersions;
88
+ cacheDir?: string;
89
+ }
90
+ /**
91
+ * Compute the startup summary and, when present, update the seen state
92
+ * so subsequent sessions don't replay. Returns the rendered string (or
93
+ * null when there's nothing to show).
94
+ *
95
+ * The `prev*` fields in the seen state preserve the prior baseline so
96
+ * /whats-new can re-render until the user explicitly dismisses.
97
+ */
98
+ export declare function computeAndPersistStartupPanel(rt: WhatsNewRuntime): Promise<{
99
+ rendered: string;
100
+ summaries: ChangeSummary[];
101
+ } | null>;
102
+ /**
103
+ * Re-compute summaries against the `prev*` baseline (so users can replay
104
+ * the panel after auto-dismiss). When `componentArg` matches one of the
105
+ * three component IDs, returns that component's full detail view instead.
106
+ */
107
+ export declare function computeWhatsNewView(rt: WhatsNewRuntime, componentArg: string | null): Promise<string>;
108
+ /**
109
+ * Clear the `prev*` baseline so /whats-new stops replaying past changes.
110
+ * Current `seen` values are left untouched.
111
+ */
112
+ export declare function dismissWhatsNew(rt: WhatsNewRuntime): Promise<string>;
113
+ export declare const __test__: {
114
+ defaultCacheDir: typeof defaultCacheDir;
115
+ cachePath: typeof cachePath;
116
+ normalizeCategory: typeof normalizeCategory;
117
+ formatCategoryBreakdown: typeof formatCategoryBreakdown;
118
+ formatVersionRange: typeof formatVersionRange;
119
+ };
120
+ export {};