@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,563 @@
1
+ // migration-engine.ts — Deterministic migration apply engine (FORGE-S23-T01)
2
+ //
3
+ // Reads migrations.json from the bundled payload, walks version entries between
4
+ // the given bounds using semver comparison [from, to) semantics, applies
5
+ // regeneration actions against the project's .forge/ directory, and maintains
6
+ // an idempotency ledger at .forge/applied-migrations.json.
7
+ //
8
+ // Design: pure engine — no pi runtime context, no UI calls, no event emission.
9
+ // The calling command handler (forge-update-command.ts) is responsible for
10
+ // event emission after this engine returns a MigrationResult.
11
+ //
12
+ // Layer: Layer 1 of the two-layer split (pure engine / command handler).
13
+ import * as fs from "node:fs";
14
+ import { createRequire } from "node:module";
15
+ import * as path from "node:path";
16
+ import { isFile } from "./lib/shared-fs-utils.js";
17
+ // ── semverCompare ─────────────────────────────────────────────────────────────
18
+ /**
19
+ * Compare two version strings using semver integer-component comparison.
20
+ * Returns: negative if a < b, 0 if a === b, positive if a > b.
21
+ *
22
+ * Unlike string comparison, this correctly handles 0.9.x vs 0.10.x boundaries.
23
+ * Strips leading "v" prefix (matches parseTriple() behavior in forge-update-command.ts:118).
24
+ * Falls back to localeCompare for invalid/non-semver inputs.
25
+ */
26
+ export function semverCompare(a, b) {
27
+ const parse = (v) => {
28
+ const cleaned = v.startsWith("v") ? v.slice(1) : v; // Strip "v" prefix (parity with parseTriple())
29
+ const parts = cleaned.split(".");
30
+ if (parts.length !== 3)
31
+ return null;
32
+ const [major, minor, patch] = parts.map(Number);
33
+ if ([major, minor, patch].some((n) => Number.isNaN(n)))
34
+ return null;
35
+ return [major, minor, patch];
36
+ };
37
+ const pa = parse(a);
38
+ const pb = parse(b);
39
+ if (!pa || !pb)
40
+ return a.localeCompare(b); // Fallback for invalid format
41
+ for (let i = 0; i < 3; i++) {
42
+ if (pa[i] !== pb[i])
43
+ return pa[i] - pb[i];
44
+ }
45
+ return 0;
46
+ }
47
+ // ── filterMigrationEntries ────────────────────────────────────────────────────
48
+ /**
49
+ * Filter migrations.json entries using [fromVersion, toVersion) semantics on keys.
50
+ *
51
+ * - fromVersion entry IS included: it represents the transition AWAY from that version.
52
+ * - toVersion entry is EXCLUDED: it would be a further transition past the target.
53
+ * - Results are sorted ascending by semver (oldest first).
54
+ *
55
+ * No first-run special case — this same filter applies for both first-run
56
+ * (empty ledger) and subsequent runs. The idempotency ledger handles re-run protection.
57
+ */
58
+ export function filterMigrationEntries(migrations, fromVersion, toVersion) {
59
+ return Object.entries(migrations)
60
+ .filter(([key]) => {
61
+ return semverCompare(key, fromVersion) >= 0 && semverCompare(key, toVersion) < 0;
62
+ })
63
+ .map(([key, entry]) => ({ key, entry }))
64
+ .sort((a, b) => semverCompare(a.key, b.key));
65
+ }
66
+ // ── resolveCategory ────────────────────────────────────────────────────────────
67
+ /**
68
+ * Resolve a migration category string to one or more WriteDescriptors.
69
+ * Pure function — does not write files; appends to the provided writes array.
70
+ *
71
+ * ENOENT trap rule: if source doesn't exist, skip silently (never throw on ENOENT).
72
+ * Non-ENOENT IO errors propagate.
73
+ *
74
+ * Path-traversal defense: all output paths are validated against
75
+ * path.join(projectRoot, '.forge') before being added to writes.
76
+ */
77
+ export function resolveCategory(category, bundleRoot, projectRoot, writes) {
78
+ const forgeDir = path.join(projectRoot, ".forge");
79
+ const basePack = path.join(bundleRoot, ".base-pack");
80
+ const schemas = path.join(bundleRoot, ".schemas");
81
+ function safeDest(rel) {
82
+ const resolved = path.join(forgeDir, rel);
83
+ const safePrefix = forgeDir + path.sep;
84
+ if (!resolved.startsWith(safePrefix)) {
85
+ throw new Error(`Path traversal attempt: resolved output path '${resolved}' is outside .forge/`);
86
+ }
87
+ return resolved;
88
+ }
89
+ function tryAdd(src, dest) {
90
+ // isFile() returns false on ENOENT and any other stat error — intentional,
91
+ // since the migration engine must not crash on missing optional sources.
92
+ if (isFile(src)) {
93
+ writes.push({ src, dest });
94
+ }
95
+ }
96
+ // ── Schema categories ───────────────────────────────────────────────────
97
+ if (category === "schemas") {
98
+ // Bare schemas — copy all *.schema.json from bundle/.schemas/ recursively,
99
+ // preserving subdirectory structure under the destination .forge/schemas/.
100
+ // (FORGE-S25-T12: enables _defs/ subtree shipping for $ref'd shared schemas.)
101
+ function walk(dir) {
102
+ let entries;
103
+ try {
104
+ entries = fs.readdirSync(dir, { withFileTypes: true });
105
+ }
106
+ catch (err) {
107
+ if (err.code === "ENOENT")
108
+ return;
109
+ throw err;
110
+ }
111
+ for (const entry of entries) {
112
+ const fullSrc = path.join(dir, entry.name);
113
+ if (entry.isDirectory()) {
114
+ walk(fullSrc);
115
+ }
116
+ else if (entry.isFile() && entry.name.endsWith(".schema.json")) {
117
+ const rel = path.relative(schemas, fullSrc);
118
+ writes.push({
119
+ src: fullSrc,
120
+ dest: safeDest(path.join("schemas", rel)),
121
+ });
122
+ }
123
+ }
124
+ }
125
+ walk(schemas);
126
+ return;
127
+ }
128
+ if (category.startsWith("schemas:")) {
129
+ const name = category.slice("schemas:".length);
130
+ // Path-traversal defense on the name itself
131
+ if (name.includes("..") || name.includes("/") || name.includes("\\")) {
132
+ // Validate safe destination will catch it — but throw explicitly for clarity
133
+ const dest = path.join(forgeDir, "schemas", `${name}.schema.json`);
134
+ const safePrefix = forgeDir + path.sep;
135
+ if (!dest.startsWith(safePrefix)) {
136
+ throw new Error(`Path traversal attempt: schemas category '${category}'`);
137
+ }
138
+ }
139
+ // Special case: structure-manifest (non-.schema.json file)
140
+ if (name === "structure-manifest") {
141
+ // Probe .schema.json first, fall back to .json
142
+ const srcSchema = path.join(schemas, `${name}.schema.json`);
143
+ const srcJson = path.join(schemas, `${name}.json`);
144
+ const dest = safeDest(path.join("schemas", `${name}.json`));
145
+ if (fs.existsSync(srcSchema)) {
146
+ writes.push({ src: srcSchema, dest });
147
+ }
148
+ else {
149
+ tryAdd(srcJson, dest);
150
+ }
151
+ return;
152
+ }
153
+ // Standard schema: <name>.schema.json
154
+ tryAdd(path.join(schemas, `${name}.schema.json`), safeDest(path.join("schemas", `${name}.schema.json`)));
155
+ return;
156
+ }
157
+ // ── hooks:* short-circuit ───────────────────────────────────────────────
158
+ if (category === "hooks" || category.startsWith("hooks:")) {
159
+ // No source directory in bundle; short-circuit before any fs call
160
+ return;
161
+ }
162
+ // ── tools:* short-circuit (excluding tools:lib:*) ──────────────────────
163
+ if (category === "tools" || (category.startsWith("tools:") && !category.startsWith("tools:lib"))) {
164
+ // FORGE-S29-T05: copy all .cjs and .js files from bundle tools/ to .forge/tools/.
165
+ // The tools/ directory is at bundleRoot/tools/ (same level as .schemas/, .base-pack/).
166
+ const toolsSrc = path.join(bundleRoot, "tools");
167
+ let entries;
168
+ try {
169
+ entries = fs.readdirSync(toolsSrc, { withFileTypes: true });
170
+ }
171
+ catch (err) {
172
+ if (err.code === "ENOENT")
173
+ return;
174
+ throw err;
175
+ }
176
+ for (const entry of entries) {
177
+ if (!entry.isFile())
178
+ continue;
179
+ if (!entry.name.endsWith(".cjs") && !entry.name.endsWith(".js"))
180
+ continue;
181
+ writes.push({
182
+ src: path.join(toolsSrc, entry.name),
183
+ dest: safeDest(path.join("tools", entry.name)),
184
+ });
185
+ }
186
+ return;
187
+ }
188
+ // ── tools:lib/<name> and tools:lib:<name> ──────────────────────────────
189
+ if (category.startsWith("tools:lib")) {
190
+ const rest = category.slice("tools:lib".length);
191
+ // Normalize separator: tools:lib/forge-root or tools:lib:validate → name
192
+ const name = rest.startsWith("/") ? rest.slice(1) : rest.startsWith(":") ? rest.slice(1) : rest;
193
+ const libSrc = path.join(bundleRoot, "tools", "lib");
194
+ // FORGE-S29-T05: copy lib files to .forge/tools/lib/ (previously wrote a
195
+ // marker stub to .forge/schemas/; now writes the real file to .forge/tools/lib/).
196
+ // Probe .cjs first, then .js (matching LIB_ALLOWLIST entry patterns).
197
+ // ENOENT on both: graceful skip (no throw).
198
+ const srcCjs = path.join(libSrc, `${name}.cjs`);
199
+ const srcJs = path.join(libSrc, `${name}.js`);
200
+ const resolvedSrc = fs.existsSync(srcCjs) ? srcCjs : fs.existsSync(srcJs) ? srcJs : null;
201
+ if (resolvedSrc) {
202
+ writes.push({
203
+ src: resolvedSrc,
204
+ dest: safeDest(path.join("tools", "lib", `${name}${resolvedSrc.endsWith(".cjs") ? ".cjs" : ".js"}`)),
205
+ });
206
+ }
207
+ // ENOENT on both: graceful skip
208
+ return;
209
+ }
210
+ // ── fragments:* and events:* (convention aliases) ──────────────────────
211
+ if (category.startsWith("fragments:") || category.startsWith("events:")) {
212
+ const prefix = category.startsWith("fragments:") ? "fragments:" : "events:";
213
+ const name = category.slice(prefix.length);
214
+ tryAdd(path.join(basePack, "workflows", "_fragments", `${name}.md`), safeDest(path.join("workflows", "_fragments", `${name}.md`)));
215
+ return;
216
+ }
217
+ // ── workflows:_fragments (bare-directory token) ─────────────────────────
218
+ if (category === "workflows:_fragments") {
219
+ const fragDir = path.join(basePack, "workflows", "_fragments");
220
+ try {
221
+ const entries = fs.readdirSync(fragDir);
222
+ for (const entry of entries) {
223
+ // Nesting guard: do NOT recurse into a subdirectory named _fragments/
224
+ if (entry === "_fragments")
225
+ continue;
226
+ const fullSrc = path.join(fragDir, entry);
227
+ // isFile() returns false for dirs and any stat error — skip silently.
228
+ if (isFile(fullSrc)) {
229
+ writes.push({
230
+ src: fullSrc,
231
+ dest: safeDest(path.join("workflows", "_fragments", entry)),
232
+ });
233
+ }
234
+ }
235
+ }
236
+ catch (err) {
237
+ if (err.code !== "ENOENT")
238
+ throw err;
239
+ }
240
+ return;
241
+ }
242
+ // ── workflows:_fragments_<name> (underscore compound) ──────────────────
243
+ if (category.startsWith("workflows:_fragments_")) {
244
+ const name = category.slice("workflows:_fragments_".length);
245
+ tryAdd(path.join(basePack, "workflows", "_fragments", `${name}.md`), safeDest(path.join("workflows", "_fragments", `${name}.md`)));
246
+ return;
247
+ }
248
+ // ── Base-pack categories ────────────────────────────────────────────────
249
+ const VALID_BASE_PACK_TYPES = ["personas", "workflows", "skills", "templates", "commands"];
250
+ const colonIdx = category.indexOf(":");
251
+ const typeStr = colonIdx >= 0 ? category.slice(0, colonIdx) : category;
252
+ const subTarget = colonIdx >= 0 ? category.slice(colonIdx + 1) : null;
253
+ if (!VALID_BASE_PACK_TYPES.includes(typeStr)) {
254
+ // Unknown category — log at debug level and skip
255
+ return;
256
+ }
257
+ const type = typeStr;
258
+ if (subTarget === null) {
259
+ // Bare category — walk the entire subdirectory
260
+ const srcDir = path.join(basePack, type);
261
+ try {
262
+ const files = fs.readdirSync(srcDir).filter((f) => f.endsWith(".md"));
263
+ for (const f of files) {
264
+ const dest = type === "skills"
265
+ ? safeDest(path.join(type, f)) // skills files already have -skills.md suffix
266
+ : type === "commands"
267
+ ? safeDest(path.join("commands", "forge", f))
268
+ : safeDest(path.join(type, f));
269
+ tryAdd(path.join(srcDir, f), dest);
270
+ }
271
+ }
272
+ catch (err) {
273
+ if (err.code !== "ENOENT")
274
+ throw err;
275
+ }
276
+ return;
277
+ }
278
+ // Special case: workflows:base-pack-store-cli-form — explicit no-op
279
+ if (type === "workflows" && subTarget === "base-pack-store-cli-form") {
280
+ // Sub-target doesn't exist in base-pack; debug-logged no-op
281
+ return;
282
+ }
283
+ // Sub-target category: <type>:<name>
284
+ const filename = type === "skills"
285
+ ? `${subTarget}-skills.md` // skills:<name> → <name>-skills.md
286
+ : `${subTarget}.md`;
287
+ const dest = type === "commands" ? safeDest(path.join("commands", "forge", filename)) : safeDest(path.join(type, filename));
288
+ tryAdd(path.join(basePack, type, filename), dest);
289
+ }
290
+ function executeFileOps(fileOps, projectRoot, dryRun) {
291
+ const forgeDir = path.join(projectRoot, ".forge");
292
+ const safePrefix = forgeDir + path.sep;
293
+ const categories = [];
294
+ // C-19: accumulate ENOENT failures for copy/substitute-placeholder ops
295
+ const failed = [];
296
+ for (const op of fileOps) {
297
+ const dest = path.resolve(projectRoot, op.path);
298
+ if (!dest.startsWith(safePrefix) && !dest.startsWith(forgeDir)) {
299
+ throw new Error(`Path traversal attempt in fileOps: '${op.path}'`);
300
+ }
301
+ const categoryLabel = `fileOps:${op.op}`;
302
+ categories.push(categoryLabel);
303
+ if (dryRun)
304
+ continue;
305
+ switch (op.op) {
306
+ case "mkdir":
307
+ fs.mkdirSync(dest, { recursive: true });
308
+ break;
309
+ case "copy":
310
+ if (op.src) {
311
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
312
+ try {
313
+ fs.copyFileSync(op.src, dest);
314
+ }
315
+ catch (err) {
316
+ if (err.code !== "ENOENT")
317
+ throw err;
318
+ // C-19: src absent — record failure so caller can surface it
319
+ failed.push({ category: categoryLabel, reason: `ENOENT: ${op.src}` });
320
+ }
321
+ }
322
+ break;
323
+ case "delete":
324
+ try {
325
+ fs.rmSync(dest, { force: true });
326
+ }
327
+ catch (err) {
328
+ if (err.code !== "ENOENT")
329
+ throw err;
330
+ }
331
+ break;
332
+ case "substitute-placeholder":
333
+ // Forward-compat: just copy for now (no ctx available in engine)
334
+ if (op.src) {
335
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
336
+ try {
337
+ fs.copyFileSync(op.src, dest);
338
+ }
339
+ catch (err) {
340
+ if (err.code !== "ENOENT")
341
+ throw err;
342
+ // C-19: src absent — record failure so caller can surface it
343
+ failed.push({ category: categoryLabel, reason: `ENOENT: ${op.src}` });
344
+ }
345
+ }
346
+ break;
347
+ }
348
+ }
349
+ return { categories, failed };
350
+ }
351
+ // ── Ledger helpers ────────────────────────────────────────────────────────────
352
+ function readLedger(projectRoot) {
353
+ const ledgerPath = path.join(projectRoot, ".forge", "applied-migrations.json");
354
+ try {
355
+ const raw = fs.readFileSync(ledgerPath, "utf8");
356
+ return JSON.parse(raw);
357
+ }
358
+ catch {
359
+ return { schemaVersion: 1, appliedVersions: [] };
360
+ }
361
+ }
362
+ function writeLedger(projectRoot, ledger) {
363
+ const ledgerPath = path.join(projectRoot, ".forge", "applied-migrations.json");
364
+ fs.writeFileSync(ledgerPath, JSON.stringify(ledger, null, 2), "utf8");
365
+ }
366
+ // ── runMigrations ─────────────────────────────────────────────────────────────
367
+ /**
368
+ * Execute all migration entries between [fromVersion, toVersion) from the
369
+ * bundled migrations.json against the project's .forge/ directory.
370
+ *
371
+ * Design constraints:
372
+ * - No UI context (no ctx.ui calls).
373
+ * - No event emission (caller is responsible).
374
+ * - Pure deterministic engine: reads from bundleRoot, writes to projectRoot/.forge/.
375
+ * - Idempotent: already-applied versions (from .forge/applied-migrations.json) are skipped.
376
+ *
377
+ * Forward-compat: entries with non-empty fileOps[] use fileOps; otherwise regenerate.
378
+ * NOTE: 0 of 158 current entries use fileOps — the executor is dead code on day 1.
379
+ * Once a real fileOps entry lands, an integration test against that entry MUST be added.
380
+ */
381
+ export async function runMigrations(opts) {
382
+ const { bundleRoot, projectRoot, fromVersion, toVersion, dryRun = false } = opts;
383
+ const result = {
384
+ applied: [],
385
+ skippedBreaking: [],
386
+ manualSteps: [],
387
+ dryRun,
388
+ schemasRefreshed: [],
389
+ forgeRootUpdated: false,
390
+ failedCategories: [], // C-19: populated when ops fail with ENOENT
391
+ };
392
+ // Read migrations.json from bundle
393
+ const migrationsPath = path.join(bundleRoot, ".schemas", "migrations.json");
394
+ let migrations;
395
+ try {
396
+ const raw = fs.readFileSync(migrationsPath, "utf8");
397
+ migrations = JSON.parse(raw);
398
+ }
399
+ catch (err) {
400
+ if (err.code === "ENOENT") {
401
+ // migrations.json not in bundle — no migrations to apply
402
+ return result;
403
+ }
404
+ throw err;
405
+ }
406
+ // Filter entries using [from, to) semantics
407
+ const entries = filterMigrationEntries(migrations, fromVersion, toVersion);
408
+ if (entries.length === 0) {
409
+ // No-op: empty range (from == to) or no entries in range
410
+ return result;
411
+ }
412
+ // Read idempotency ledger
413
+ const ledger = readLedger(projectRoot);
414
+ // Build substitution map ONCE using config from .forge/config.json
415
+ let buildSubstitutionMap = null;
416
+ let substituteFile = null;
417
+ try {
418
+ const substPath = path.join(bundleRoot, "tools", "substitute-placeholders.cjs");
419
+ const _require = createRequire(import.meta.url);
420
+ const substModule = _require(substPath);
421
+ buildSubstitutionMap = substModule.buildSubstitutionMap;
422
+ substituteFile = substModule.substituteFile;
423
+ }
424
+ catch {
425
+ // substitute-placeholders not available (testing or minimal bundle)
426
+ // Fall back to identity substitution
427
+ }
428
+ let substitutionMap = null;
429
+ if (buildSubstitutionMap) {
430
+ try {
431
+ const configPath = path.join(projectRoot, ".forge", "config.json");
432
+ const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
433
+ substitutionMap = buildSubstitutionMap(config);
434
+ }
435
+ catch {
436
+ // Config unreadable — proceed without substitution
437
+ }
438
+ }
439
+ // Process each entry in ascending semver order
440
+ for (const { key, entry } of entries) {
441
+ // Skip if already applied (idempotency)
442
+ if (ledger.appliedVersions.includes(key)) {
443
+ continue;
444
+ }
445
+ // Skip breaking entries
446
+ if (entry.breaking) {
447
+ result.skippedBreaking.push({
448
+ fromVersion: key,
449
+ toVersion: entry.version,
450
+ reason: `breaking: true — manual intervention required. Notes: ${entry.notes}`,
451
+ });
452
+ continue;
453
+ }
454
+ // Collect manual steps
455
+ if (entry.manual && entry.manual.length > 0) {
456
+ result.manualSteps.push({
457
+ fromVersion: key,
458
+ toVersion: entry.version,
459
+ steps: entry.manual,
460
+ });
461
+ }
462
+ let appliedCategories = [];
463
+ // fileOps takes priority over regenerate when non-empty
464
+ // NOTE: 0 of 158 current entries use fileOps (dead code on day 1).
465
+ // When a real fileOps entry lands, add an integration test against it.
466
+ if (entry.fileOps && entry.fileOps.length > 0) {
467
+ // C-19: consume FileOpsResult to capture ENOENT failures
468
+ const fileOpsResult = executeFileOps(entry.fileOps, projectRoot, dryRun);
469
+ appliedCategories = fileOpsResult.categories;
470
+ for (const f of fileOpsResult.failed) {
471
+ result.failedCategories.push({ version: key, category: f.category, reason: f.reason });
472
+ }
473
+ }
474
+ else if (entry.regenerate && entry.regenerate.length > 0) {
475
+ // Resolve categories to write descriptors
476
+ const writes = [];
477
+ for (const category of entry.regenerate) {
478
+ resolveCategory(category, bundleRoot, projectRoot, writes);
479
+ }
480
+ // Execute writes (unless dry-run)
481
+ if (!dryRun) {
482
+ for (const { src, dest } of writes) {
483
+ try {
484
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
485
+ // Apply placeholder substitution for base-pack files
486
+ if (substituteFile &&
487
+ substitutionMap &&
488
+ src.includes(path.join(".base-pack")) &&
489
+ dest.endsWith(".md")) {
490
+ const content = fs.readFileSync(src, "utf8");
491
+ const substituted = substituteFile(content, substitutionMap);
492
+ fs.writeFileSync(dest, substituted, "utf8");
493
+ }
494
+ else {
495
+ fs.copyFileSync(src, dest);
496
+ }
497
+ }
498
+ catch (err) {
499
+ if (err.code !== "ENOENT")
500
+ throw err;
501
+ // C-19: ENOENT on src — skip silently but record the failure so
502
+ // the caller (forge-update-command.ts) can surface a warning.
503
+ result.failedCategories.push({
504
+ version: key,
505
+ category: src,
506
+ reason: `ENOENT: ${src}`,
507
+ });
508
+ }
509
+ }
510
+ }
511
+ appliedCategories = entry.regenerate;
512
+ }
513
+ result.applied.push({
514
+ fromVersion: key,
515
+ toVersion: entry.version,
516
+ categories: appliedCategories,
517
+ });
518
+ // Update ledger after successful application
519
+ if (!dryRun) {
520
+ ledger.appliedVersions.push(key);
521
+ }
522
+ }
523
+ // Write updated ledger
524
+ if (!dryRun && result.applied.length > 0) {
525
+ writeLedger(projectRoot, ledger);
526
+ }
527
+ // Always-on schema refresh post-pass: copy all *.schema.json to .forge/schemas/
528
+ // Runs regardless of whether any entry had a schemas category.
529
+ // This is an always-overwrite safety net (schemas are not user-edited).
530
+ const schemasDir = path.join(bundleRoot, ".schemas");
531
+ const forgeSchemasDir = path.join(projectRoot, ".forge", "schemas");
532
+ try {
533
+ const schemaFiles = fs.readdirSync(schemasDir).filter((f) => f.endsWith(".schema.json"));
534
+ if (!dryRun) {
535
+ fs.mkdirSync(forgeSchemasDir, { recursive: true });
536
+ for (const f of schemaFiles) {
537
+ try {
538
+ fs.copyFileSync(path.join(schemasDir, f), path.join(forgeSchemasDir, f));
539
+ result.schemasRefreshed.push(f);
540
+ }
541
+ catch (err) {
542
+ if (err.code !== "ENOENT")
543
+ throw err;
544
+ }
545
+ }
546
+ }
547
+ else {
548
+ result.schemasRefreshed = schemaFiles;
549
+ }
550
+ }
551
+ catch (err) {
552
+ if (err.code !== "ENOENT")
553
+ throw err;
554
+ }
555
+ return result;
556
+ }
557
+ // ── Test helpers (exported for test access) ───────────────────────────────────
558
+ export const __test__ = {
559
+ semverCompare,
560
+ filterMigrationEntries,
561
+ resolveCategory,
562
+ };
563
+ //# sourceMappingURL=migration-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-engine.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/migration-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type Static, Type } from "typebox";
2
+ declare const ProviderSchema: Type.TObject<{
3
+ id: Type.TString;
4
+ label: Type.TString;
5
+ enabled: Type.TBoolean;
6
+ deferredTo: Type.TOptional<Type.TString>;
7
+ modelGlobs: Type.TArray<Type.TString>;
8
+ credentialEnvAny: Type.TArray<Type.TString>;
9
+ }>;
10
+ declare const RegistrySchema: Type.TObject<{
11
+ version: Type.TLiteral<1>;
12
+ providers: Type.TArray<Type.TObject<{
13
+ id: Type.TString;
14
+ label: Type.TString;
15
+ enabled: Type.TBoolean;
16
+ deferredTo: Type.TOptional<Type.TString>;
17
+ modelGlobs: Type.TArray<Type.TString>;
18
+ credentialEnvAny: Type.TArray<Type.TString>;
19
+ }>>;
20
+ }>;
21
+ export type CuratedRegistry = Static<typeof RegistrySchema>;
22
+ export type CuratedProvider = Static<typeof ProviderSchema>;
23
+ export interface LoadOptions {
24
+ registryPath?: string;
25
+ env?: NodeJS.ProcessEnv;
26
+ }
27
+ export interface SeedOutcome {
28
+ seeded: boolean;
29
+ path: string;
30
+ }
31
+ export interface SeedOptions {
32
+ projectRoot: string;
33
+ registry: CuratedRegistry;
34
+ now?: () => number;
35
+ }
36
+ declare function resolveRegistryPath(opts: LoadOptions): string;
37
+ export declare function loadRegistry(opts?: LoadOptions): CuratedRegistry;
38
+ declare function seededModelGlobs(registry: CuratedRegistry): string[];
39
+ declare function defaultGlob(registry: CuratedRegistry): string;
40
+ declare function seedFilePath(projectRoot: string): string;
41
+ export declare function seedEnabledModels(opts: SeedOptions): Promise<SeedOutcome>;
42
+ export declare function detectMissingCredentials(registry: CuratedRegistry, env?: NodeJS.ProcessEnv): string | null;
43
+ export declare const __test__: {
44
+ BUNDLED_PATH: string;
45
+ resolveRegistryPath: typeof resolveRegistryPath;
46
+ seedFilePath: typeof seedFilePath;
47
+ seededModelGlobs: typeof seededModelGlobs;
48
+ defaultGlob: typeof defaultGlob;
49
+ RegistrySchema: Type.TObject<{
50
+ version: Type.TLiteral<1>;
51
+ providers: Type.TArray<Type.TObject<{
52
+ id: Type.TString;
53
+ label: Type.TString;
54
+ enabled: Type.TBoolean;
55
+ deferredTo: Type.TOptional<Type.TString>;
56
+ modelGlobs: Type.TArray<Type.TString>;
57
+ credentialEnvAny: Type.TArray<Type.TString>;
58
+ }>>;
59
+ }>;
60
+ };
61
+ export {};