@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,123 @@
1
+ // forge:store-repair — native kickoff handler (FORGE-S23-T11).
2
+ //
3
+ // Replaces the auto-generated stub previously installed by
4
+ // registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
5
+ // (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
6
+ //
7
+ // --dry-run flag is forwarded in the kickoff body so the LLM calls
8
+ // validate-store --dry-run and skips write phases accordingly.
9
+ //
10
+ // Workflow source: <forgeRoot>/commands/store-repair.md (command file).
11
+ // File-existence check only — command files lack Pack-06 workflow markers.
12
+ //
13
+ // Iron Laws:
14
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
15
+ // IL4 — no JSON.stringify-into-subagent dispatch.
16
+ // IL6 — no shell-string interpolation; no spawn calls here.
17
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
18
+ // continuation.
19
+ import * as fs from "node:fs";
20
+ import * as path from "node:path";
21
+ import { sendKickoff } from "./kickoff.js";
22
+ export function parseStoreRepairArgs(rawArgs, cwd) {
23
+ const trimmed = (rawArgs ?? "").trim();
24
+ const result = {
25
+ dryRun: false,
26
+ seed: "",
27
+ sourceLabel: "",
28
+ };
29
+ if (!trimmed) {
30
+ result.sourceLabel = "(no args — full repair run)";
31
+ return result;
32
+ }
33
+ const tokens = trimmed.split(/\s+/);
34
+ const remaining = [];
35
+ for (const tok of tokens) {
36
+ if (tok === "--dry-run") {
37
+ result.dryRun = true;
38
+ }
39
+ else {
40
+ remaining.push(tok);
41
+ }
42
+ }
43
+ const tail = remaining.join(" ").trim();
44
+ if (tail.startsWith("@")) {
45
+ const ref = tail.slice(1).trim();
46
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
47
+ result.seed = fs.readFileSync(filePath, "utf8");
48
+ result.sourceLabel = `(seed from file: ${ref})`;
49
+ }
50
+ else if (tail) {
51
+ result.seed = tail;
52
+ result.sourceLabel = "(seed from inline text)";
53
+ }
54
+ else {
55
+ result.sourceLabel = result.dryRun ? "(--dry-run mode)" : "(no args — full repair run)";
56
+ }
57
+ return result;
58
+ }
59
+ export function composeStoreRepairKickoff(opts) {
60
+ const { commandMd, parsed } = opts;
61
+ const sections = ["# /forge:repair", ""];
62
+ sections.push("## Dispatch", "");
63
+ sections.push("Diagnose and repair the Forge JSON store. Run the repair workflow below. Specifically:");
64
+ sections.push("");
65
+ if (parsed.dryRun) {
66
+ sections.push("**`--dry-run` mode.** Preview all repairs without writing anything. " +
67
+ "In Phase 2 (LLM repair) and Phase 3 (final validation), show what would change but skip all writes. " +
68
+ "Skip Phase 4 verification (nothing changed).");
69
+ }
70
+ else {
71
+ sections.push("Full repair mode: diagnose, propose fixes, apply approved repairs, verify.");
72
+ }
73
+ sections.push("", "Use `forge_store` for all store reads and writes (never raw file writes to `.forge/store/`).");
74
+ sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
75
+ if (parsed.seed) {
76
+ sections.push("", `## Additional Context — ${parsed.sourceLabel}`, "", parsed.seed.trim());
77
+ }
78
+ return sections.join("\n");
79
+ }
80
+ // ── Registration ──────────────────────────────────────────────────────────
81
+ const COMMAND_NAME = "store-repair";
82
+ export function registerStoreRepair(pi, options) {
83
+ pi.registerCommand("forge:repair", {
84
+ description: "Diagnose and repair corrupted Forge store records. " +
85
+ "Usage: /forge:repair [--dry-run]. " +
86
+ "--dry-run shows what would be repaired without making changes.",
87
+ async handler(args, ctx) {
88
+ const { forgeRoot } = options;
89
+ const cwd = options.cwd ?? process.cwd();
90
+ if (!forgeRoot) {
91
+ ctx.ui.notify("× forge:repair — no Forge project at cwd; run /forge:init to bootstrap", "warning");
92
+ return;
93
+ }
94
+ const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
95
+ let commandMd;
96
+ try {
97
+ commandMd = fs.readFileSync(commandPath, "utf8");
98
+ }
99
+ catch (err) {
100
+ const e = err;
101
+ if (e.code === "ENOENT") {
102
+ ctx.ui.notify(`× forge:repair — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
103
+ }
104
+ else {
105
+ ctx.ui.notify(`× forge:repair — failed to read command file: ${e.message ?? "unknown error"}`, "error");
106
+ }
107
+ return;
108
+ }
109
+ let parsed;
110
+ try {
111
+ parsed = parseStoreRepairArgs(args, cwd);
112
+ }
113
+ catch (err) {
114
+ const e = err;
115
+ ctx.ui.notify(`× forge:repair — failed to parse args: ${e.message ?? "unknown"}`, "error");
116
+ return;
117
+ }
118
+ const kickoff = composeStoreRepairKickoff({ commandMd, parsed });
119
+ sendKickoff(pi, kickoff);
120
+ },
121
+ });
122
+ }
123
+ //# sourceMappingURL=store-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-repair.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/store-repair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
2
+ export declare const ENTITY_TYPES: Set<string>;
3
+ export declare const ID_PATTERNS: {
4
+ task: RegExp;
5
+ sprint: RegExp;
6
+ bug: RegExp;
7
+ feature: RegExp;
8
+ bareTask: RegExp;
9
+ idFragment: RegExp;
10
+ };
11
+ export type ResolverHit = {
12
+ dir: string;
13
+ } | {
14
+ item: any;
15
+ };
16
+ export interface ResolveOptions {
17
+ entityTypes?: Set<string>;
18
+ ctx?: ExtensionCommandContext;
19
+ statusLabel?: string;
20
+ }
21
+ export declare function isDebug(): boolean;
22
+ export declare function resolveToolDir(forgeRoot: string): string;
23
+ export declare function runStoreCli(toolDir: string, argv: string[], cwd: string): Promise<any>;
24
+ /**
25
+ * Try store-cli's native --task-suffix / --sprint-suffix flags. Returns:
26
+ * - results array on success
27
+ * - null if the flag is unsupported (older store-cli) — caller should fall back
28
+ */
29
+ export declare function suffixMatch(toolDir: string, cwd: string, kind: "task" | "sprint", suffix: string): Promise<any[] | null>;
30
+ /**
31
+ * Resolution cascade:
32
+ * 1. @path → use the path directly as artifact directory
33
+ * 2. Canonical ID → store-cli query --task/--bug/--feature/--sprint
34
+ * 3. ID suffix → --task-suffix / --sprint-suffix (one call) with loop fallback
35
+ * 4. Keyword → store-cli query --keyword (title substring)
36
+ * 5. NLP fallback → store-cli nlp "<query>"
37
+ */
38
+ export declare function resolveEntityRef(arg: string, toolDir: string, cwd: string, opts?: ResolveOptions): Promise<ResolverHit | null>;
39
+ export interface ResolveToCanonicalIdOptions {
40
+ /** Which entity types to search. Defaults to a single-element set matching `kind`. */
41
+ entityTypes?: Set<string>;
42
+ /** Command label used in error messages (e.g. "forge:run-task"). */
43
+ commandLabel?: string;
44
+ }
45
+ /**
46
+ * Resolve a raw user arg to a canonical entity ID string.
47
+ *
48
+ * 1. If the arg is already a canonical ID that resolves directly → return it.
49
+ * 2. If the arg is an unprefixed ID (e.g. "S22-T03") → suffix-match or
50
+ * prefix-normalize to the canonical form → return it.
51
+ * 3. If the arg is ambiguous → prompt the user (or hard-fail in non-interactive).
52
+ * 4. If the arg cannot be resolved → emit an actionable error and return null.
53
+ */
54
+ export declare function resolveToCanonicalId(arg: string, toolDir: string, cwd: string, kind: "task" | "sprint" | "bug" | "feature", opts: ResolveToCanonicalIdOptions & {
55
+ ctx?: ExtensionCommandContext;
56
+ }): Promise<string | null>;
@@ -0,0 +1,263 @@
1
+ // store-resolver.ts — Shared store-cli resolver for `@path` / canonical ID /
2
+ // ID-suffix / keyword / NLP cascade. Used by /forge:read, /forge:run-task,
3
+ // /forge:run-sprint, /forge:fix-bug, and (eventually) /forge:plan,
4
+ // /forge:implement ports. Co-locates the spawn helper, regex constants, and
5
+ // the multi-result picker so future ports do not drift from the canonical
6
+ // cascade.
7
+ import * as path from "node:path";
8
+ import { execFileAsync } from "./lib/exec-helpers.js";
9
+ import { isDirectory } from "./lib/shared-fs-utils.js";
10
+ export const ENTITY_TYPES = new Set(["task", "sprint", "bug", "feature"]);
11
+ export const ID_PATTERNS = {
12
+ task: /^([A-Z0-9]+-)?S\d+-T\d+$/i,
13
+ sprint: /^([A-Z0-9]+-)?S\d+$/i,
14
+ bug: /^([A-Z0-9]+-)?B\d+$/i,
15
+ feature: /^([A-Z0-9]+-)?F\d+$/i,
16
+ bareTask: /^T\d+$/i,
17
+ idFragment: /^(S|B|F|T)\d+(-T\d+)?$/i,
18
+ };
19
+ export function isDebug() {
20
+ return process.env.FORGE_DEBUG === "1";
21
+ }
22
+ export function resolveToolDir(forgeRoot) {
23
+ const nested = path.join(forgeRoot, "tools");
24
+ return isDirectory(nested) ? nested : forgeRoot;
25
+ }
26
+ export async function runStoreCli(toolDir, argv, cwd) {
27
+ const toolPath = path.join(toolDir, "store-cli.cjs");
28
+ const timeout = argv[0] === "nlp" ? 30_000 : 10_000;
29
+ const result = await execFileAsync("node", [toolPath, ...argv], {
30
+ cwd,
31
+ encoding: "utf8",
32
+ timeout,
33
+ });
34
+ try {
35
+ return JSON.parse(result.stdout);
36
+ }
37
+ catch {
38
+ throw new Error(`store-cli returned non-JSON for argv=${JSON.stringify(argv)}: ${result.stdout.slice(0, 200)}`);
39
+ }
40
+ }
41
+ function filterEntities(rs, entityTypes) {
42
+ return rs.filter((r) => entityTypes.has(r.type));
43
+ }
44
+ async function pickFromResults(items, arg, ctx, statusLabel) {
45
+ if (items.length === 1)
46
+ return { item: items[0] };
47
+ ctx.ui.setStatus(statusLabel, undefined);
48
+ const nonInteractive = process.env.FORGE_YES === "1" || process.env.FORGE_NON_INTERACTIVE === "1";
49
+ if (nonInteractive) {
50
+ ctx.ui.notify(`Multiple records match "${arg}" — refusing to pick in non-interactive mode`, "error");
51
+ return null;
52
+ }
53
+ const options = items.map((t, i) => `[${i}] ${t.id} (${t.type}): ${t.title}`);
54
+ const selection = await ctx.ui.select(`Multiple records found for "${arg}". Select one:`, options);
55
+ if (!selection)
56
+ return null;
57
+ const idx = parseInt(selection.match(/^\[(\d+)\]/)?.[1] ?? "-1", 10);
58
+ if (idx < 0 || idx >= items.length)
59
+ return null;
60
+ return { item: items[idx] };
61
+ }
62
+ /**
63
+ * Try store-cli's native --task-suffix / --sprint-suffix flags. Returns:
64
+ * - results array on success
65
+ * - null if the flag is unsupported (older store-cli) — caller should fall back
66
+ */
67
+ export async function suffixMatch(toolDir, cwd, kind, suffix) {
68
+ const flag = kind === "task" ? "--task-suffix" : "--sprint-suffix";
69
+ try {
70
+ const r = await runStoreCli(toolDir, ["query", flag, suffix], cwd);
71
+ if (r && Array.isArray(r.results) && r.path === "suffix")
72
+ return r.results;
73
+ // store-cli ran but didn't take the suffix path → treat as unsupported.
74
+ return null;
75
+ }
76
+ catch (err) {
77
+ if (isDebug())
78
+ console.error(`[forge:resolver] suffix flag failed: ${err.message}`);
79
+ return null;
80
+ }
81
+ }
82
+ /**
83
+ * Resolution cascade:
84
+ * 1. @path → use the path directly as artifact directory
85
+ * 2. Canonical ID → store-cli query --task/--bug/--feature/--sprint
86
+ * 3. ID suffix → --task-suffix / --sprint-suffix (one call) with loop fallback
87
+ * 4. Keyword → store-cli query --keyword (title substring)
88
+ * 5. NLP fallback → store-cli nlp "<query>"
89
+ */
90
+ export async function resolveEntityRef(arg, toolDir, cwd, opts = {}) {
91
+ const ctx = opts.ctx;
92
+ const statusLabel = opts.statusLabel ?? "forge:resolve";
93
+ const entityTypes = opts.entityTypes ?? ENTITY_TYPES;
94
+ const setStatus = (msg) => ctx?.ui.setStatus(statusLabel, msg);
95
+ const pick = (items) => ctx ? pickFromResults(items, arg, ctx, statusLabel) : Promise.resolve({ item: items[0] });
96
+ // ── 1. @path ──────────────────────────────────────────────────────────────
97
+ if (arg.startsWith("@")) {
98
+ const rawPath = arg.slice(1).trim();
99
+ const resolved = path.isAbsolute(rawPath) ? rawPath : path.join(cwd, rawPath);
100
+ return { dir: resolved };
101
+ }
102
+ // ── 2. Canonical structured ID ────────────────────────────────────────────
103
+ const isCanonical = /^[A-Z0-9]+-/i.test(arg) &&
104
+ (ID_PATTERNS.task.test(arg) ||
105
+ ID_PATTERNS.bug.test(arg) ||
106
+ ID_PATTERNS.feature.test(arg) ||
107
+ ID_PATTERNS.sprint.test(arg));
108
+ let structuredResult = null;
109
+ try {
110
+ if (ID_PATTERNS.task.test(arg)) {
111
+ setStatus(`Looking up task ${arg}…`);
112
+ structuredResult = await runStoreCli(toolDir, ["query", "--task", arg], cwd);
113
+ }
114
+ else if (ID_PATTERNS.bug.test(arg)) {
115
+ setStatus(`Looking up bug ${arg}…`);
116
+ structuredResult = await runStoreCli(toolDir, ["query", "--bug", arg], cwd);
117
+ }
118
+ else if (ID_PATTERNS.feature.test(arg)) {
119
+ setStatus(`Looking up feature ${arg}…`);
120
+ structuredResult = await runStoreCli(toolDir, ["query", "--feature", arg], cwd);
121
+ }
122
+ else if (ID_PATTERNS.sprint.test(arg)) {
123
+ setStatus(`Looking up sprint ${arg}…`);
124
+ structuredResult = await runStoreCli(toolDir, ["query", "--sprint", arg], cwd);
125
+ }
126
+ }
127
+ catch (err) {
128
+ if (isDebug())
129
+ console.error(`[forge:resolver] structured query failed: ${err.message}`);
130
+ }
131
+ if (structuredResult?.results?.length > 0) {
132
+ return pick(structuredResult.results);
133
+ }
134
+ if (isCanonical) {
135
+ setStatus(undefined);
136
+ ctx?.ui.notify(`No record found for canonical ID "${arg}"`, "warning");
137
+ return null;
138
+ }
139
+ // ── 3. ID suffix matching ─────────────────────────────────────────────────
140
+ const looksLikeIdFragment = ID_PATTERNS.idFragment.test(arg);
141
+ if (looksLikeIdFragment) {
142
+ setStatus(`Searching for ID suffix "${arg}"…`);
143
+ try {
144
+ const suffix = arg.toUpperCase();
145
+ // Sprint-shaped fragment (e.g. "S01"): native sprint-suffix first,
146
+ // fall back to list-and-filter.
147
+ if (ID_PATTERNS.sprint.test(arg) && !ID_PATTERNS.task.test(arg)) {
148
+ const fast = await suffixMatch(toolDir, cwd, "sprint", suffix);
149
+ if (fast && fast.length > 0)
150
+ return pick(fast);
151
+ if (fast === null) {
152
+ const r = await runStoreCli(toolDir, ["query", "--list-sprints"], cwd);
153
+ const matched = (r?.results ?? []).filter((s) => s.id?.toUpperCase().endsWith(`-${suffix}`) || s.id?.toUpperCase() === suffix);
154
+ if (matched.length > 0) {
155
+ const canonical = [];
156
+ for (const s of matched) {
157
+ try {
158
+ const rr = await runStoreCli(toolDir, ["query", "--sprint", s.id], cwd);
159
+ canonical.push(...(rr?.results ?? []));
160
+ }
161
+ catch (err) {
162
+ if (isDebug())
163
+ console.error(`[forge:resolver] sprint lookup failed for ${s.id}: ${err.message}`);
164
+ }
165
+ }
166
+ if (canonical.length > 0)
167
+ return pick(canonical);
168
+ }
169
+ }
170
+ }
171
+ // Task-shaped fragment (e.g. "T01" or "S01-T01"): native task-suffix
172
+ // first; fall back to N sprint × Tnn loop.
173
+ if (ID_PATTERNS.task.test(arg) || ID_PATTERNS.bareTask.test(arg)) {
174
+ const tPart = ID_PATTERNS.bareTask.test(arg) ? suffix : suffix.split("-")[1];
175
+ const fast = await suffixMatch(toolDir, cwd, "task", tPart);
176
+ if (fast && fast.length > 0)
177
+ return pick(fast);
178
+ if (fast === null) {
179
+ const r = await runStoreCli(toolDir, ["query", "--list-sprints"], cwd);
180
+ for (const s of r?.results ?? []) {
181
+ try {
182
+ const taskId = `${s.id}-${tPart}`;
183
+ const rr = await runStoreCli(toolDir, ["query", "--task", taskId], cwd);
184
+ if (rr?.results?.length > 0)
185
+ return pick(rr.results);
186
+ }
187
+ catch (err) {
188
+ if (isDebug())
189
+ console.error(`[forge:resolver] task lookup failed for ${s.id}-${tPart}: ${err.message}`);
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ catch (err) {
196
+ if (isDebug())
197
+ console.error(`[forge:resolver] suffix search failed: ${err.message}`);
198
+ }
199
+ }
200
+ // ── 4. Keyword search ─────────────────────────────────────────────────────
201
+ setStatus(`Keyword search: "${arg}"…`);
202
+ let keywordResult = null;
203
+ try {
204
+ keywordResult = await runStoreCli(toolDir, ["query", "--keyword", arg], cwd);
205
+ }
206
+ catch (err) {
207
+ if (isDebug())
208
+ console.error(`[forge:resolver] keyword search failed: ${err.message}`);
209
+ }
210
+ if (keywordResult?.results?.length > 0) {
211
+ return pick(filterEntities(keywordResult.results, entityTypes));
212
+ }
213
+ // ── 5. NLP fallback ───────────────────────────────────────────────────────
214
+ setStatus(`Searching Forge store: "${arg}"…`);
215
+ const nlpResult = await runStoreCli(toolDir, ["nlp", arg], cwd);
216
+ const items = filterEntities(nlpResult.results || [], entityTypes);
217
+ if (items.length === 0) {
218
+ setStatus(undefined);
219
+ ctx?.ui.notify(`No records found matching "${arg}"`, "warning");
220
+ return null;
221
+ }
222
+ return pick(items);
223
+ }
224
+ /**
225
+ * Resolve a raw user arg to a canonical entity ID string.
226
+ *
227
+ * 1. If the arg is already a canonical ID that resolves directly → return it.
228
+ * 2. If the arg is an unprefixed ID (e.g. "S22-T03") → suffix-match or
229
+ * prefix-normalize to the canonical form → return it.
230
+ * 3. If the arg is ambiguous → prompt the user (or hard-fail in non-interactive).
231
+ * 4. If the arg cannot be resolved → emit an actionable error and return null.
232
+ */
233
+ export async function resolveToCanonicalId(arg, toolDir, cwd, kind, opts) {
234
+ const { ctx, entityTypes = new Set([kind]), commandLabel = `forge:${kind}` } = opts;
235
+ const resolved = await resolveEntityRef(arg, toolDir, cwd, {
236
+ entityTypes,
237
+ ctx,
238
+ statusLabel: `${commandLabel}: resolving`,
239
+ });
240
+ if (!resolved) {
241
+ ctx?.ui.notify(`× ${commandLabel} — could not resolve "${arg}". ` +
242
+ `No matching ${kind} found. ` +
243
+ `Try a canonical ID like <PREFIX>-S<N>-T<N> or use /forge:read for search.`, "error");
244
+ return null;
245
+ }
246
+ if ("dir" in resolved) {
247
+ // @path resolution — not a task/sprint/bug ID pattern.
248
+ ctx?.ui.notify(`× ${commandLabel} — "${arg}" resolved to a directory path, not a ${kind} ID. ` +
249
+ `Provide a canonical ${kind} ID instead.`, "error");
250
+ return null;
251
+ }
252
+ const canonicalId = resolved.item?.id;
253
+ if (!canonicalId || typeof canonicalId !== "string") {
254
+ ctx?.ui.notify(`× ${commandLabel} — resolved "${arg}" but record has no canonical ID.`, "error");
255
+ return null;
256
+ }
257
+ // If the canonical ID differs from the raw arg, notify the user.
258
+ if (canonicalId !== arg) {
259
+ ctx?.ui.notify(`ℹ ${commandLabel} — resolved "${arg}" → ${canonicalId}`, "info");
260
+ }
261
+ return canonicalId;
262
+ }
263
+ //# sourceMappingURL=store-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-resolver.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/store-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface StoreValidatorResult {
2
+ ok: boolean;
3
+ /** Raw error output from store-cli. Present when ok=false. */
4
+ reason: string;
5
+ /** Enhanced message with remediation hints. Present when ok=false. */
6
+ remediation: string;
7
+ }
8
+ /**
9
+ * Validate a store entity payload by spawning `store-cli.cjs validate`.
10
+ *
11
+ * @param entity Entity type: "task" | "sprint" | "bug" | "event" | …
12
+ * @param payload The raw payload (will be JSON.stringify'd if object; passed as-is if string).
13
+ * @param forgeRoot Absolute path to the Forge plugin root — locates store-cli.cjs.
14
+ * @returns `{ ok: true, reason: "" }` on success, `{ ok: false, reason: <stderr> }` on failure.
15
+ */
16
+ export declare function validateStoreCLIPayload(entity: string, payload: unknown, forgeRoot: string): StoreValidatorResult;
@@ -0,0 +1,32 @@
1
+ // Store-CLI payload validator — FORGE-S18-T03
2
+ //
3
+ // Spawns `store-cli.cjs validate <entity> '<json>'` synchronously and surfaces
4
+ // any schema error as a structured result. This module is the sole point of
5
+ // contact between hook-dispatcher.ts and store-cli's validation logic.
6
+ //
7
+ // Why spawnSync?
8
+ // pi's tool_call handler is synchronous — the event system does not support
9
+ // async handlers. spawnSync completes before the block result is returned to pi.
10
+ //
11
+ // FORGE-S25-T17: spawnSync replaced with spawnStoreCliValidate from lib/spawn-store-cli.ts.
12
+ import * as path from "node:path";
13
+ import { spawnStoreCliValidate } from "./lib/spawn-store-cli.js";
14
+ import { enhanceBlockMessage } from "./store-error-remediation.js";
15
+ /**
16
+ * Validate a store entity payload by spawning `store-cli.cjs validate`.
17
+ *
18
+ * @param entity Entity type: "task" | "sprint" | "bug" | "event" | …
19
+ * @param payload The raw payload (will be JSON.stringify'd if object; passed as-is if string).
20
+ * @param forgeRoot Absolute path to the Forge plugin root — locates store-cli.cjs.
21
+ * @returns `{ ok: true, reason: "" }` on success, `{ ok: false, reason: <stderr> }` on failure.
22
+ */
23
+ export function validateStoreCLIPayload(entity, payload, forgeRoot) {
24
+ const storeCliPath = path.join(forgeRoot, "tools", "store-cli.cjs");
25
+ const { ok, reason } = spawnStoreCliValidate(storeCliPath, entity, payload, forgeRoot);
26
+ if (!ok) {
27
+ const remediation = enhanceBlockMessage(reason, entity, "unknown");
28
+ return { ok: false, reason, remediation };
29
+ }
30
+ return { ok: true, reason: "", remediation: "" };
31
+ }
32
+ //# sourceMappingURL=store-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-validator.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/store-validator.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,uEAAuE;AACvE,EAAE;AACF,iBAAiB;AACjB,8EAA8E;AAC9E,mFAAmF;AACnF,EAAE;AACF,4FAA4F;AAE5F,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAUnE;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,OAAgB,EAAE,SAAiB;IAC1F,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAEpE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvF,IAAI,CAAC,EAAE,EAAE,CAAC;QACT,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACnE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export declare function registerTestOrchestrate(pi: ExtensionAPI): void;