@entelligentsia/forgecli 0.21.0 โ†’ 1.0.3

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 (364) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +31 -33
  3. package/dist/CHANGELOG-forge-plugin.md +142 -0
  4. package/dist/CHANGELOG-pi.md +24 -1
  5. package/dist/bin/forgecli.d.ts +2 -0
  6. package/dist/bin/forgecli.js +6 -0
  7. package/dist/bin/forgecli.js.map +1 -0
  8. package/dist/extensions/forgecli/add-pipeline.js +1 -1
  9. package/dist/extensions/forgecli/add-pipeline.js.map +1 -1
  10. package/dist/extensions/forgecli/add-task.js +1 -1
  11. package/dist/extensions/forgecli/add-task.js.map +1 -1
  12. package/dist/extensions/forgecli/approve.js +17 -2
  13. package/dist/extensions/forgecli/approve.js.map +1 -1
  14. package/dist/extensions/forgecli/audience-gate.js +1 -1
  15. package/dist/extensions/forgecli/audience-gate.js.map +1 -1
  16. package/dist/extensions/forgecli/calibrate.js +11 -8
  17. package/dist/extensions/forgecli/calibrate.js.map +1 -1
  18. package/dist/extensions/forgecli/collate.js +1 -1
  19. package/dist/extensions/forgecli/collate.js.map +1 -1
  20. package/dist/extensions/forgecli/commit.js +17 -2
  21. package/dist/extensions/forgecli/commit.js.map +1 -1
  22. package/dist/extensions/forgecli/enhance.js +1 -1
  23. package/dist/extensions/forgecli/enhance.js.map +1 -1
  24. package/dist/extensions/forgecli/fix-bug.d.ts +1 -2
  25. package/dist/extensions/forgecli/fix-bug.js +678 -609
  26. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  27. package/dist/extensions/forgecli/forge-artifact-tool.d.ts +6 -8
  28. package/dist/extensions/forgecli/forge-artifact-tool.js +94 -197
  29. package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
  30. package/dist/extensions/forgecli/forge-commands.js +57 -18
  31. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  32. package/dist/extensions/forgecli/forge-init/phase4-register.js +6 -7
  33. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  34. package/dist/extensions/forgecli/forge-init/run-phases.d.ts +4 -0
  35. package/dist/extensions/forgecli/forge-init/run-phases.js +304 -0
  36. package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -0
  37. package/dist/extensions/forgecli/forge-init/verifiers.d.ts +14 -5
  38. package/dist/extensions/forgecli/forge-init/verifiers.js +79 -62
  39. package/dist/extensions/forgecli/forge-init/verifiers.js.map +1 -1
  40. package/dist/extensions/forgecli/forge-init.js +131 -76
  41. package/dist/extensions/forgecli/forge-init.js.map +1 -1
  42. package/dist/extensions/forgecli/forge-subagent.d.ts +26 -0
  43. package/dist/extensions/forgecli/forge-subagent.js +42 -18
  44. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  45. package/dist/extensions/forgecli/forge-tools.d.ts +34 -4
  46. package/dist/extensions/forgecli/forge-tools.js +191 -79
  47. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  48. package/dist/extensions/forgecli/health-check.js +3 -3
  49. package/dist/extensions/forgecli/health-check.js.map +1 -1
  50. package/dist/extensions/forgecli/hook-dispatcher.d.ts +1 -1
  51. package/dist/extensions/forgecli/hooks/check-update.d.ts +8 -0
  52. package/dist/extensions/forgecli/hooks/check-update.js +29 -1
  53. package/dist/extensions/forgecli/hooks/check-update.js.map +1 -1
  54. package/dist/extensions/forgecli/hooks/post-init-hook.js +6 -6
  55. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
  56. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +6 -6
  57. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
  58. package/dist/extensions/forgecli/hooks/triage-error.js +1 -0
  59. package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -1
  60. package/dist/extensions/forgecli/implement.js +20 -2
  61. package/dist/extensions/forgecli/implement.js.map +1 -1
  62. package/dist/extensions/forgecli/index.js +39 -32
  63. package/dist/extensions/forgecli/index.js.map +1 -1
  64. package/dist/extensions/forgecli/lib/pipeline-guard.d.ts +41 -0
  65. package/dist/extensions/forgecli/lib/pipeline-guard.js +100 -0
  66. package/dist/extensions/forgecli/lib/pipeline-guard.js.map +1 -0
  67. package/dist/extensions/forgecli/loaders/persona-skill-loader.js +2 -2
  68. package/dist/extensions/forgecli/loaders/persona-skill-loader.js.map +1 -1
  69. package/dist/extensions/forgecli/migrate.d.ts +3 -0
  70. package/dist/extensions/forgecli/migrate.js +4 -2
  71. package/dist/extensions/forgecli/migrate.js.map +1 -1
  72. package/dist/extensions/forgecli/plan.js +21 -2
  73. package/dist/extensions/forgecli/plan.js.map +1 -1
  74. package/dist/extensions/forgecli/quiz-agent.js +7 -7
  75. package/dist/extensions/forgecli/quiz-agent.js.map +1 -1
  76. package/dist/extensions/forgecli/regenerate.js +49 -18
  77. package/dist/extensions/forgecli/regenerate.js.map +1 -1
  78. package/dist/extensions/forgecli/remove-command.js +1 -1
  79. package/dist/extensions/forgecli/remove-command.js.map +1 -1
  80. package/dist/extensions/forgecli/report-bug.js +1 -1
  81. package/dist/extensions/forgecli/report-bug.js.map +1 -1
  82. package/dist/extensions/forgecli/retrospective.js +9 -9
  83. package/dist/extensions/forgecli/retrospective.js.map +1 -1
  84. package/dist/extensions/forgecli/review-code.d.ts +13 -0
  85. package/dist/extensions/forgecli/review-code.js +62 -3
  86. package/dist/extensions/forgecli/review-code.js.map +1 -1
  87. package/dist/extensions/forgecli/review-plan.d.ts +13 -0
  88. package/dist/extensions/forgecli/review-plan.js +65 -3
  89. package/dist/extensions/forgecli/review-plan.js.map +1 -1
  90. package/dist/extensions/forgecli/run-task.js +461 -391
  91. package/dist/extensions/forgecli/run-task.js.map +1 -1
  92. package/dist/extensions/forgecli/session-registry.d.ts +12 -0
  93. package/dist/extensions/forgecli/session-registry.js +23 -0
  94. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  95. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +2 -1
  96. package/dist/extensions/forgecli/skill-curator-subagent.js +2 -1
  97. package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -1
  98. package/dist/extensions/forgecli/sprint-intake.js +6 -6
  99. package/dist/extensions/forgecli/sprint-intake.js.map +1 -1
  100. package/dist/extensions/forgecli/sprint-plan.js +9 -9
  101. package/dist/extensions/forgecli/sprint-plan.js.map +1 -1
  102. package/dist/extensions/forgecli/status-command.js +1 -1
  103. package/dist/extensions/forgecli/status-command.js.map +1 -1
  104. package/dist/extensions/forgecli/store-query.js +11 -11
  105. package/dist/extensions/forgecli/store-query.js.map +1 -1
  106. package/dist/extensions/forgecli/store-repair.js +7 -7
  107. package/dist/extensions/forgecli/store-repair.js.map +1 -1
  108. package/dist/extensions/forgecli/subagent/caller-context.d.ts +35 -11
  109. package/dist/extensions/forgecli/subagent/caller-context.js +49 -21
  110. package/dist/extensions/forgecli/subagent/caller-context.js.map +1 -1
  111. package/dist/extensions/forgecli/subagent/orchestrator-transcript.d.ts +66 -0
  112. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +66 -0
  113. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -0
  114. package/dist/extensions/forgecli/subagent/phase-guard.d.ts +34 -0
  115. package/dist/extensions/forgecli/subagent/phase-guard.js +139 -0
  116. package/dist/extensions/forgecli/subagent/phase-guard.js.map +1 -0
  117. package/dist/extensions/forgecli/subagent/phase-summary-map.d.ts +1 -0
  118. package/dist/extensions/forgecli/subagent/phase-summary-map.js +22 -0
  119. package/dist/extensions/forgecli/subagent/phase-summary-map.js.map +1 -0
  120. package/dist/extensions/forgecli/thread-switcher.js +2 -2
  121. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  122. package/dist/extensions/forgecli/validate.js +17 -2
  123. package/dist/extensions/forgecli/validate.js.map +1 -1
  124. package/dist/extensions/forgecli/viewport-events.d.ts +4 -0
  125. package/dist/extensions/forgecli/viewport-events.js +18 -1
  126. package/dist/extensions/forgecli/viewport-events.js.map +1 -1
  127. package/dist/extensions/forgecli/viewport-renderer.d.ts +12 -2
  128. package/dist/extensions/forgecli/viewport-renderer.js +8 -6
  129. package/dist/extensions/forgecli/viewport-renderer.js.map +1 -1
  130. package/dist/forge-payload/.base-pack/commands/check-agent.md +22 -0
  131. package/dist/forge-payload/.base-pack/commands/new-sprint.md +22 -0
  132. package/dist/forge-payload/.base-pack/commands/plan-sprint.md +22 -0
  133. package/dist/forge-payload/.base-pack/commands/quiz-agent.md +2 -18
  134. package/dist/forge-payload/.base-pack/commands/retro.md +22 -0
  135. package/dist/forge-payload/.base-pack/commands/retrospective.md +2 -18
  136. package/dist/forge-payload/.base-pack/commands/sprint-intake.md +2 -18
  137. package/dist/forge-payload/.base-pack/commands/sprint-plan.md +2 -18
  138. package/dist/forge-payload/.base-pack/workflows/_fragments/friction-emit.md +2 -2
  139. package/dist/forge-payload/.base-pack/workflows/_fragments/generation-instructions.md +4 -4
  140. package/dist/forge-payload/.base-pack/workflows/_fragments/iron-laws.md +1 -1
  141. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +13 -1
  142. package/dist/forge-payload/.base-pack/workflows/commit_task.md +12 -1
  143. package/dist/forge-payload/.base-pack/workflows/enhance.md +6 -6
  144. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +11 -29
  145. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +14 -2
  146. package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +2 -2
  147. package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +20 -4
  148. package/dist/forge-payload/.base-pack/workflows/plan_task.md +14 -2
  149. package/dist/forge-payload/.base-pack/workflows/review_code.md +37 -7
  150. package/dist/forge-payload/.base-pack/workflows/review_plan.md +36 -6
  151. package/dist/forge-payload/.base-pack/workflows/run_sprint.md +2 -2
  152. package/dist/forge-payload/.base-pack/workflows/triage.md +190 -0
  153. package/dist/forge-payload/.base-pack/workflows/validate_task.md +37 -7
  154. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  155. package/dist/forge-payload/.schemas/config.schema.json +0 -5
  156. package/dist/forge-payload/.schemas/enum-catalog.json +9 -13
  157. package/dist/forge-payload/.schemas/migrations.json +63 -0
  158. package/dist/forge-payload/agents/tomoshibi.md +150 -6
  159. package/dist/forge-payload/commands/add-pipeline.md +1 -1
  160. package/dist/forge-payload/commands/add-task.md +1 -1
  161. package/dist/forge-payload/commands/calibrate.md +4 -350
  162. package/dist/forge-payload/commands/check-agent.md +38 -0
  163. package/dist/forge-payload/commands/config.md +3 -113
  164. package/dist/forge-payload/commands/enhance.md +5 -32
  165. package/dist/forge-payload/commands/health.md +155 -13
  166. package/dist/forge-payload/commands/init.md +25 -31
  167. package/dist/forge-payload/commands/migrate.md +6 -154
  168. package/dist/forge-payload/commands/quiz-agent.md +2 -34
  169. package/dist/forge-payload/commands/rebuild.md +664 -0
  170. package/dist/forge-payload/commands/regenerate.md +2 -774
  171. package/dist/forge-payload/commands/remove.md +10 -13
  172. package/dist/forge-payload/commands/repair.md +187 -0
  173. package/dist/forge-payload/commands/search.md +73 -0
  174. package/dist/forge-payload/commands/status.md +105 -0
  175. package/dist/forge-payload/commands/store-query.md +2 -69
  176. package/dist/forge-payload/commands/store-repair.md +2 -183
  177. package/dist/forge-payload/commands/update-tools.md +4 -50
  178. package/dist/forge-payload/commands/update.md +64 -58
  179. package/dist/forge-payload/hooks/check-update.cjs +1 -1
  180. package/dist/forge-payload/hooks/post-init.cjs +2 -2
  181. package/dist/forge-payload/hooks/post-sprint.cjs +2 -2
  182. package/dist/forge-payload/hooks/triage-error.cjs +11 -10
  183. package/dist/forge-payload/init/phases/phase-1-collect.md +138 -0
  184. package/dist/forge-payload/init/phases/phase-2-discover.md +127 -0
  185. package/dist/forge-payload/init/phases/phase-3-materialize.md +113 -0
  186. package/dist/forge-payload/init/phases/phase-4-register.md +159 -0
  187. package/dist/forge-payload/integrity.json +21 -24
  188. package/dist/forge-payload/meta/fragments/tool-discipline.md +41 -0
  189. package/dist/forge-payload/meta/templates/meta-retro.md +28 -0
  190. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +2 -2
  191. package/dist/forge-payload/meta/workflows/_fragments/generation-instructions.md +4 -4
  192. package/dist/forge-payload/meta/workflows/_fragments/iron-laws.md +1 -1
  193. package/dist/forge-payload/meta/workflows/meta-approve.md +13 -1
  194. package/dist/forge-payload/meta/workflows/meta-bug-triage.md +210 -0
  195. package/dist/forge-payload/meta/workflows/meta-check-agent.md +138 -0
  196. package/dist/forge-payload/meta/workflows/meta-commit.md +12 -1
  197. package/dist/forge-payload/meta/workflows/meta-enhance.md +5 -5
  198. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +11 -29
  199. package/dist/forge-payload/meta/workflows/meta-implement.md +13 -1
  200. package/dist/forge-payload/meta/workflows/meta-migrate.md +3 -3
  201. package/dist/forge-payload/meta/workflows/meta-new-sprint.md +84 -0
  202. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +20 -4
  203. package/dist/forge-payload/meta/workflows/meta-plan-sprint.md +152 -0
  204. package/dist/forge-payload/meta/workflows/meta-plan-task.md +13 -1
  205. package/dist/forge-payload/meta/workflows/meta-retro.md +73 -0
  206. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +37 -7
  207. package/dist/forge-payload/meta/workflows/meta-review-plan.md +36 -6
  208. package/dist/forge-payload/meta/workflows/meta-validate.md +37 -7
  209. package/dist/forge-payload/schemas/config.schema.json +0 -5
  210. package/dist/forge-payload/schemas/enum-catalog.json +9 -13
  211. package/dist/forge-payload/schemas/structure-manifest.json +25 -8
  212. package/dist/forge-payload/tools/artifact.cjs +324 -0
  213. package/dist/forge-payload/tools/banners.cjs +3 -4
  214. package/dist/forge-payload/tools/build-context-pack.cjs +1 -1
  215. package/dist/forge-payload/tools/check-structure.cjs +8 -3
  216. package/dist/forge-payload/tools/store-cli.cjs +67 -7
  217. package/dist/forge-payload/tools/substitute-placeholders.cjs +1 -1
  218. package/dist/forge-payload/tools/verify-apply.cjs +75 -0
  219. package/dist/forge-payload/tools/verify-phase.cjs +259 -0
  220. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  221. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +0 -17
  222. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  223. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +21 -38
  224. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  225. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  226. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +5 -4
  227. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  228. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +2 -1
  229. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  230. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +5 -2
  231. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  232. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  233. package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +24 -1
  234. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.d.ts.map +1 -1
  235. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.js +2 -3
  236. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.js.map +1 -1
  237. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.d.ts +1 -0
  238. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.d.ts.map +1 -1
  239. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.js +52 -22
  240. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.js.map +1 -1
  241. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  242. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js +16 -4
  243. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  244. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  245. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js +45 -50
  246. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  247. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  248. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js +43 -81
  249. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  250. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  251. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.js +27 -12
  252. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.js.map +1 -1
  253. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  254. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js +2 -3
  255. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  256. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  257. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js +3 -3
  258. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  259. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  260. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +5 -5
  261. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  262. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.d.ts +2 -0
  263. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.d.ts.map +1 -1
  264. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.js +37 -0
  265. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.js.map +1 -1
  266. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  267. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +9 -8
  268. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  269. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  270. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +20 -35
  271. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  272. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +3 -0
  273. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  274. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js +64 -7
  275. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  276. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  277. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +15 -3
  278. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  279. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.d.ts +3 -1
  280. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.d.ts.map +1 -1
  281. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.js +14 -8
  282. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.js.map +1 -1
  283. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.d.ts +30 -0
  284. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.d.ts.map +1 -0
  285. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.js +124 -0
  286. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.js.map +1 -0
  287. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.d.ts +2 -0
  288. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.d.ts.map +1 -0
  289. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.js +31 -0
  290. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.js.map +1 -0
  291. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.d.ts +7 -27
  292. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.d.ts.map +1 -1
  293. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.js +75 -115
  294. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.js.map +1 -1
  295. package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +6 -0
  296. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
  297. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  298. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
  299. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
  300. package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +12 -14
  301. package/node_modules/@earendil-works/pi-coding-agent/package.json +5 -5
  302. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts +3 -0
  303. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +1 -0
  304. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js +53 -0
  305. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -0
  306. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  307. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +4 -1
  308. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +2 -0
  310. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  311. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +13 -1
  312. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  313. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  314. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  315. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  316. package/node_modules/@entelligentsia/forge-compress/dist/compressor.d.ts +6 -0
  317. package/node_modules/@entelligentsia/forge-compress/dist/compressor.js +137 -0
  318. package/node_modules/@entelligentsia/forge-compress/dist/entropy.d.ts +3 -0
  319. package/node_modules/@entelligentsia/forge-compress/dist/entropy.js +99 -0
  320. package/node_modules/@entelligentsia/forge-compress/dist/forge/entity.d.ts +8 -0
  321. package/node_modules/@entelligentsia/forge-compress/dist/forge/entity.js +149 -0
  322. package/node_modules/@entelligentsia/forge-compress/dist/forge/index.d.ts +7 -0
  323. package/node_modules/@entelligentsia/forge-compress/dist/forge/index.js +4 -0
  324. package/node_modules/@entelligentsia/forge-compress/dist/forge/markdown.d.ts +5 -0
  325. package/node_modules/@entelligentsia/forge-compress/dist/forge/markdown.js +92 -0
  326. package/node_modules/@entelligentsia/forge-compress/dist/forge/query.d.ts +7 -0
  327. package/node_modules/@entelligentsia/forge-compress/dist/forge/query.js +60 -0
  328. package/node_modules/@entelligentsia/forge-compress/dist/forge/validate.d.ts +1 -0
  329. package/node_modules/@entelligentsia/forge-compress/dist/forge/validate.js +82 -0
  330. package/node_modules/@entelligentsia/forge-compress/dist/index.d.ts +6 -0
  331. package/node_modules/@entelligentsia/forge-compress/dist/index.js +5 -0
  332. package/node_modules/@entelligentsia/forge-compress/dist/progressive.d.ts +1 -0
  333. package/node_modules/@entelligentsia/forge-compress/dist/progressive.js +108 -0
  334. package/node_modules/@entelligentsia/forge-compress/dist/strip.d.ts +4 -0
  335. package/node_modules/@entelligentsia/forge-compress/dist/strip.js +55 -0
  336. package/node_modules/@entelligentsia/forge-compress/dist/tokens.d.ts +2 -0
  337. package/node_modules/@entelligentsia/forge-compress/dist/tokens.js +17 -0
  338. package/node_modules/@entelligentsia/forge-compress/package.json +45 -0
  339. package/node_modules/@entelligentsia/forge-compress/src/__tests__/compress.test.ts +409 -0
  340. package/node_modules/@entelligentsia/forge-compress/src/compressor.ts +147 -0
  341. package/node_modules/@entelligentsia/forge-compress/src/entropy.ts +105 -0
  342. package/node_modules/@entelligentsia/forge-compress/src/forge/entity.ts +184 -0
  343. package/node_modules/@entelligentsia/forge-compress/src/forge/index.ts +10 -0
  344. package/node_modules/@entelligentsia/forge-compress/src/forge/markdown.ts +122 -0
  345. package/node_modules/@entelligentsia/forge-compress/src/forge/query.ts +105 -0
  346. package/node_modules/@entelligentsia/forge-compress/src/forge/validate.ts +86 -0
  347. package/node_modules/@entelligentsia/forge-compress/src/index.ts +22 -0
  348. package/node_modules/@entelligentsia/forge-compress/src/progressive.ts +123 -0
  349. package/node_modules/@entelligentsia/forge-compress/src/strip.ts +58 -0
  350. package/node_modules/@entelligentsia/forge-compress/src/tokens.ts +19 -0
  351. package/package.json +10 -15
  352. package/dist/extensions/forgecli/forge-init/phase-descriptors.d.ts +0 -72
  353. package/dist/extensions/forgecli/forge-init/phase-descriptors.js +0 -359
  354. package/dist/extensions/forgecli/forge-init/phase-descriptors.js.map +0 -1
  355. package/dist/extensions/forgecli/forge-init/prompts.d.ts +0 -10
  356. package/dist/extensions/forgecli/forge-init/prompts.js +0 -91
  357. package/dist/extensions/forgecli/forge-init/prompts.js.map +0 -1
  358. package/dist/extensions/forgecli/lib/store-error-remediation.d.ts +0 -65
  359. package/dist/extensions/forgecli/lib/store-error-remediation.js +0 -298
  360. package/dist/extensions/forgecli/lib/store-error-remediation.js.map +0 -1
  361. package/dist/forge-payload/hooks/check-update.js +0 -378
  362. package/dist/forge-payload/hooks/forge-permissions.js +0 -164
  363. package/dist/forge-payload/hooks/triage-error.js +0 -77
  364. package/dist/forge-payload/hooks/validate-write.js +0 -250
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-phases.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/forge-init/run-phases.ts"],"names":[],"mappings":"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"}
@@ -6,15 +6,24 @@ export interface VerifyResult {
6
6
  /**
7
7
  * Verify Phase 1 deliverable: `.forge/config.json` exists and contains all required fields.
8
8
  *
9
- * Called immediately after the Phase-1 agent's `waitForIdle()` completes. Reads config.json
10
- * directly โ€” intentionally does NOT use a cached value because Phase 1 writes this file.
9
+ * Async wrapper over `verify-phase.cjs --phase 1`.
11
10
  */
12
- export declare function verifyPhase1(cwd: string): VerifyResult;
11
+ export declare function verifyPhase1(cwd: string): Promise<VerifyResult>;
12
+ /**
13
+ * Verify Phase 1 foundation fields only: `project.name` and `project.prefix`.
14
+ *
15
+ * Async wrapper over `verify-phase.cjs --phase 1 --foundation-only`.
16
+ */
17
+ export declare function verifyPhase1Foundation(cwd: string): Promise<VerifyResult>;
13
18
  /**
14
19
  * Verify Phase 2 deliverable: 7 architecture KB docs exist under `kbPath/architecture/`.
20
+ *
21
+ * Async wrapper over `verify-phase.cjs --phase 2 --kb-path <kbPath>`.
15
22
  */
16
- export declare function verifyPhase2(cwd: string, kbPath: string): VerifyResult;
23
+ export declare function verifyPhase2(cwd: string, kbPath: string): Promise<VerifyResult>;
17
24
  /**
18
25
  * Verify Phase 3 deliverable: all four `.forge/` subdirectories contain at least one file.
26
+ *
27
+ * Async wrapper over `verify-phase.cjs --phase 3`.
19
28
  */
20
- export declare function verifyPhase3(cwd: string): VerifyResult;
29
+ export declare function verifyPhase3(cwd: string): Promise<VerifyResult>;
@@ -1,81 +1,98 @@
1
- // forge-init/verifiers.ts โ€” per-phase deliverable verification helpers (FORGE-S25-T23, B-4, N-B-A)
1
+ // forge-init/verifiers.ts โ€” per-phase deliverable verification helpers (FORGE-S26-T17)
2
2
  //
3
- // Each verifier reads the filesystem directly rather than accepting a cached config object
4
- // because they run immediately after a phase's `waitForIdle()` โ€” the moment the deliverable
5
- // should have been written. Using a cached pre-phase value would return stale data.
3
+ // Thin async wrappers over the shared `verify-phase.cjs` plugin tool.
4
+ // Each function calls `verify-phase.cjs` via execFileAsync, parses the JSON
5
+ // output, and returns a VerifyResult. Exit code 0 โ†’ ok=true; exit code 1 โ†’
6
+ // ok=false with parsed JSON; any other error โ†’ ok=false with reason.
7
+ //
8
+ // The VerifyResult interface is defined here (authoritative home after
9
+ // phase-descriptors.ts deletion) and re-exported for all consumers.
10
+ //
11
+ // Iron Law 6: execFileAsync with argv arrays โ€” no shell-string interpolation.
6
12
  import * as fs from "node:fs";
7
13
  import * as path from "node:path";
8
- /**
9
- * Verify Phase 1 deliverable: `.forge/config.json` exists and contains all required fields.
10
- *
11
- * Called immediately after the Phase-1 agent's `waitForIdle()` completes. Reads config.json
12
- * directly โ€” intentionally does NOT use a cached value because Phase 1 writes this file.
13
- */
14
- export function verifyPhase1(cwd) {
15
- const configPath = path.join(cwd, ".forge", "config.json");
16
- if (!fs.existsSync(configPath)) {
17
- return { ok: false, missing: [".forge/config.json"], reason: "config file not written" };
14
+ import { fileURLToPath } from "node:url";
15
+ import { execFileAsync } from "../lib/exec-helpers.js";
16
+ /** Absolute path to verify-phase.cjs in the bundled forge-payload. */
17
+ function resolveVerifyPhaseTool(cwd) {
18
+ // Try forgeRoot from config.json first (populated after Phase 4)
19
+ let forgeRoot = "";
20
+ try {
21
+ const cfg = JSON.parse(fs.readFileSync(path.join(cwd, ".forge", "config.json"), "utf8"));
22
+ forgeRoot = cfg.paths?.forgeRoot ?? "";
18
23
  }
19
- let cfg;
24
+ catch {
25
+ // fall through โ€” forgeRoot stays ""
26
+ }
27
+ if (forgeRoot) {
28
+ return path.join(forgeRoot, "tools", "verify-phase.cjs");
29
+ }
30
+ // Fallback: resolve from this file's location
31
+ // dist/extensions/forgecli/forge-init/verifiers.js
32
+ // โ†’ dist/extensions/forgecli/ โ†’ dist/extensions/ โ†’ dist/ โ†’ <pkg-root>/
33
+ // โ†’ dist/forge-payload/tools/
34
+ const thisDir = path.dirname(fileURLToPath(import.meta.url));
35
+ const pkgRoot = path.resolve(thisDir, "..", "..", "..", "..");
36
+ return path.join(pkgRoot, "dist", "forge-payload", "tools", "verify-phase.cjs");
37
+ }
38
+ /** Internal: run verify-phase.cjs with given args and parse result. */
39
+ async function runVerifyPhase(cwd, args) {
40
+ const toolPath = resolveVerifyPhaseTool(cwd);
20
41
  try {
21
- cfg = JSON.parse(fs.readFileSync(configPath, "utf8"));
42
+ await execFileAsync("node", [toolPath, ...args], { cwd, encoding: "utf8" });
43
+ // exit 0 โ€” pass
44
+ return { ok: true, missing: [] };
22
45
  }
23
46
  catch (err) {
24
47
  const e = err;
25
- return { ok: false, missing: [".forge/config.json"], reason: `JSON parse failed: ${e.message ?? "?"}` };
48
+ // exit code 1 โ€” fail, JSON on stdout
49
+ if (e.code === 1 && e.stdout) {
50
+ try {
51
+ const parsed = JSON.parse(e.stdout);
52
+ return { ok: false, missing: parsed.missing ?? [], reason: parsed.reason };
53
+ }
54
+ catch {
55
+ return { ok: false, missing: [], reason: `verify-phase.cjs returned non-parseable output: ${e.stdout}` };
56
+ }
57
+ }
58
+ // exit code 2 or other error
59
+ return {
60
+ ok: false,
61
+ missing: [],
62
+ reason: `verify-phase.cjs failed: ${e.stderr ?? e.message ?? "unknown error"}`,
63
+ };
26
64
  }
27
- const missing = [];
28
- if (!cfg.version)
29
- missing.push("version");
30
- const proj = cfg.project;
31
- if (!proj?.name)
32
- missing.push("project.name");
33
- if (!proj?.prefix)
34
- missing.push("project.prefix");
35
- if (!cfg.stack)
36
- missing.push("stack");
37
- if (!cfg.commands)
38
- missing.push("commands");
39
- const paths = cfg.paths;
40
- if (!paths?.engineering)
41
- missing.push("paths.engineering");
42
- if (!paths?.store)
43
- missing.push("paths.store");
44
- if (!paths?.workflows)
45
- missing.push("paths.workflows");
46
- return { ok: missing.length === 0, missing };
65
+ }
66
+ /**
67
+ * Verify Phase 1 deliverable: `.forge/config.json` exists and contains all required fields.
68
+ *
69
+ * Async wrapper over `verify-phase.cjs --phase 1`.
70
+ */
71
+ export async function verifyPhase1(cwd) {
72
+ return runVerifyPhase(cwd, ["--phase", "1"]);
73
+ }
74
+ /**
75
+ * Verify Phase 1 foundation fields only: `project.name` and `project.prefix`.
76
+ *
77
+ * Async wrapper over `verify-phase.cjs --phase 1 --foundation-only`.
78
+ */
79
+ export async function verifyPhase1Foundation(cwd) {
80
+ return runVerifyPhase(cwd, ["--phase", "1", "--foundation-only"]);
47
81
  }
48
82
  /**
49
83
  * Verify Phase 2 deliverable: 7 architecture KB docs exist under `kbPath/architecture/`.
84
+ *
85
+ * Async wrapper over `verify-phase.cjs --phase 2 --kb-path <kbPath>`.
50
86
  */
51
- export function verifyPhase2(cwd, kbPath) {
52
- const archDocs = ["stack", "processes", "database", "routing", "deployment", "entity-model", "stack-checklist"];
53
- const missing = [];
54
- for (const d of archDocs) {
55
- if (!fs.existsSync(path.join(cwd, kbPath, "architecture", `${d}.md`))) {
56
- missing.push(`${kbPath}/architecture/${d}.md`);
57
- }
58
- }
59
- return { ok: missing.length === 0, missing };
87
+ export async function verifyPhase2(cwd, kbPath) {
88
+ return runVerifyPhase(cwd, ["--phase", "2", "--kb-path", kbPath]);
60
89
  }
61
90
  /**
62
91
  * Verify Phase 3 deliverable: all four `.forge/` subdirectories contain at least one file.
92
+ *
93
+ * Async wrapper over `verify-phase.cjs --phase 3`.
63
94
  */
64
- export function verifyPhase3(cwd) {
65
- const dirs = ["workflows", "personas", "skills", "templates"];
66
- const missing = [];
67
- for (const d of dirs) {
68
- const dir = path.join(cwd, ".forge", d);
69
- let count = 0;
70
- try {
71
- count = fs.readdirSync(dir).filter((f) => f.endsWith(".md") || f.endsWith(".json")).length;
72
- }
73
- catch {
74
- count = 0;
75
- }
76
- if (count === 0)
77
- missing.push(`.forge/${d}/ (empty)`);
78
- }
79
- return { ok: missing.length === 0, missing };
95
+ export async function verifyPhase3(cwd) {
96
+ return runVerifyPhase(cwd, ["--phase", "3"]);
80
97
  }
81
98
  //# sourceMappingURL=verifiers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifiers.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/forge-init/verifiers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verifiers.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/forge-init/verifiers.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,EAAE;AACF,sEAAsE;AACtE,4EAA4E;AAC5E,2EAA2E;AAC3E,qEAAqE;AACrE,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,EAAE;AACF,8EAA8E;AAE9E,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAQvD,sEAAsE;AACtE,SAAS,sBAAsB,CAAC,GAAW;IAC1C,iEAAiE;IACjE,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACrB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAC1B,CAAC;QACxC,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACR,oCAAoC;IACrC,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC1D,CAAC;IACD,8CAA8C;IAC9C,mDAAmD;IACnD,uEAAuE;IACvE,8BAA8B;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACjF,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAAc;IACxD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC;QACJ,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,gBAAgB;QAChB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,GAA4E,CAAC;QACvF,qCAAqC;QACrC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAwD,CAAC;gBAC3F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,mDAAmD,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1G,CAAC;QACF,CAAC;QACD,6BAA6B;QAC7B,OAAO;YACN,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,4BAA4B,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,eAAe,EAAE;SAC9E,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC7C,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAW;IACvD,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,MAAc;IAC7D,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC7C,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -1,22 +1,21 @@
1
1
  // forge-init.ts โ€” /forge:init command handler โ€” FORGE-S17-T02
2
2
  //
3
3
  // Full 4-phase init flow:
4
- // Phase 1 โ€” Collect: 5 parallel discovery scans โ†’ .forge/config.json
5
- // Phase 2 โ€” Discover: 7 parallel KB doc generation + project-context.json
4
+ // Phase 1 โ€” Collect: multi-step discovery + config.json synthesis โ†’ .forge/config.json
5
+ // Phase 2 โ€” Discover: phase gate + KB doc generation + index files โ†’ engineering/
6
6
  // Phase 3 โ€” Materialize: substitute-placeholders โ†’ .forge/{personas,skills,workflows,templates}
7
7
  // Phase 4 โ€” Register: 11 deterministic steps โ†’ versioning, packs, store, Tomoshibi
8
8
  //
9
9
  // Per INIT_PARITY_SPEC.md and PLAN.md (rev 2) phases Aโ€“G.
10
10
  //
11
- // โ”€โ”€ Descriptor model (FORGE-S25-T24, B-5) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
11
+ // โ”€โ”€ Phase model (FORGE-S26-T17) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
12
12
  //
13
- // Phases 1โ€“3 are driven by LlmPhaseDescriptor records (forge-init/phase-descriptors.ts).
14
- // The generic runLlmPhase() runner executes the shared skeleton:
15
- // banner โ†’ [LLM dispatch + waitForIdle (Phases 1โ€“2)] | [tool calls (Phase 3)]
16
- // โ†’ verify โ†’ [retry steer (Phases 1โ€“2)] โ†’ [user confirm] โ†’ postVerify โ†’ progress
13
+ // Phases 1โ€“3 are standalone async functions in forge-init/run-phases.ts.
14
+ // Each reads its phase prompt from the bundled init/phases/phase-N-*.md file,
15
+ // dispatches via sendToAgent + waitForIdle (phases 1-2) or runs tools directly
16
+ // (phase 3), then verifies deliverables via verify-phase.cjs.
17
17
  //
18
- // Phase 4 (11 deterministic steps) is too heterogeneous for the generic runner and is
19
- // extracted into forge-init/phase4-register.ts โ†’ runPhase4().
18
+ // Phase 4 is in forge-init/phase4-register.ts โ†’ runPhase4().
20
19
  //
21
20
  // This file is the orchestrator: flag parsing, resume detection, configCache population
22
21
  // (between Phase 1 and Phase 2), phase loop, post-init report.
@@ -33,21 +32,28 @@
33
32
  // #5: Tomoshibi โ€” runRefreshKbLinks() native TS port; no shell-out
34
33
  // #9: Health check โ€” runHealthCheck() direct call; NOT via sendUserMessage
35
34
  //
36
- // โ”€โ”€ Async/sync contract (N-B-C) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
35
+ // โ”€โ”€ Async/sync contract (N-B-C, revised 2026-05-26) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
37
36
  //
38
- // `sendToAgent(text)` is SYNCHRONOUS โ€” it wraps `pi.sendUserMessage(text, { deliverAs: "steer" })`
39
- // which enqueues the steer message and returns immediately. The agent does NOT start running
40
- // until the current handler yields (awaits).
37
+ // `await sendToAgent(text)` sends a prompt to the agent and resolves when the agent
38
+ // has finished processing it. It wraps `pi.sendUserMessage(text, { deliverAs: "steer" })`.
41
39
  //
42
- // `await ctx.waitForIdle()` is the SOLE synchronisation primitive. It suspends the handler
43
- // until the agent has finished processing all pending steer messages and has reached an
44
- // idle state. All reads of phase deliverables (e.g. `.forge/config.json` for Phase 1,
45
- // KB docs for Phase 2, `.forge/workflows/` for Phase 3) MUST occur AFTER a `waitForIdle`.
40
+ // When the agent is IDLE (the common case at init start): sendUserMessage calls
41
+ // session.prompt(), which starts a full agent turn via agent.prompt(). Awaiting it
42
+ // blocks until that turn completes, including all tool calls and follow-ups.
43
+ //
44
+ // When the agent is STREAMING (mid-turn): sendUserMessage enqueues a steer message
45
+ // and resolves quickly โ€” the steer is picked up by the running turn's steering poll.
46
+ // In this case `await ctx.waitForIdle()` IS needed afterwards to wait for the turn
47
+ // (including the steer) to finish.
48
+ //
49
+ // Both awaits are always issued: `await sendToAgent` covers the idle-agent path;
50
+ // `await waitForIdle` covers the streaming-agent path and is a harmless no-op when
51
+ // the agent already completed its turn via sendToAgent.
46
52
  //
47
53
  // Pattern for every phase:
48
- // sendToAgent(promptText); // enqueue โ€” synchronous
49
- // await ctx.waitForIdle(); // suspend until agent completes โ€” asynchronous
50
- // const result = verifyPhaseN(); // read deliverable โ€” synchronous
54
+ // await sendToAgent(promptText); // dispatch + wait for completion when idle
55
+ // await waitForIdle(); // wait for current turn when streaming; no-op when idle
56
+ // const result = verifyPhaseN(); // read deliverable โ€” agent is done
51
57
  //
52
58
  // โ”€โ”€ Config cache boundary (B-4, N-B-A) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
53
59
  //
@@ -62,14 +68,17 @@
62
68
  import * as fs from "node:fs";
63
69
  import * as path from "node:path";
64
70
  import { fileURLToPath } from "node:url";
65
- import { PHASE_1, PHASE_2, PHASE_3, runLlmPhase } from "./forge-init/phase-descriptors.js";
66
71
  import { runPhase4 } from "./forge-init/phase4-register.js";
72
+ import { runPhase1, runPhase2, runPhase3 } from "./forge-init/run-phases.js";
67
73
  import { verifyPhase1, verifyPhase3 } from "./forge-init/verifiers.js";
68
74
  import { runHealthCheck } from "./health-check.js";
69
75
  import { emitSyntheticEvent } from "./hook-dispatcher.js";
70
76
  import { discoverProjectName } from "./init-context.js";
71
77
  import { deleteInitProgress, readInitProgress } from "./init-progress.js";
72
78
  import { execFileAsync } from "./lib/exec-helpers.js";
79
+ import { clearForgeConfigCache } from "./lib/forge-config.js";
80
+ // FORGE-S26-T11: registerMigrate imported to power `forge:init --migrate`
81
+ import { registerMigrate } from "./migrate.js";
73
82
  // โ”€โ”€ Bundle path resolution โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
74
83
  const _EXTENSION_DIR = path.dirname(fileURLToPath(import.meta.url));
75
84
  // dist/extensions/forgecli/ โ†’ dist/ โ†’ <pkg-root>/
@@ -149,12 +158,13 @@ function parseInitFlags(args) {
149
158
  const parts = args.trim().split(/\s+/).filter(Boolean);
150
159
  const hasFast = parts.includes("--fast");
151
160
  const hasFull = parts.includes("--full");
161
+ const hasMigrate = parts.includes("--migrate");
152
162
  // Find trailing numeric phase arg
153
163
  let startPhase = null;
154
164
  let invalidPhase = false;
155
165
  for (let i = 0; i < parts.length; i++) {
156
166
  const p = parts[i];
157
- if (p === "--fast" || p === "--full")
167
+ if (p === "--fast" || p === "--full" || p === "--migrate")
158
168
  continue;
159
169
  const n = parseInt(p, 10);
160
170
  if (!Number.isNaN(n)) {
@@ -169,6 +179,7 @@ function parseInitFlags(args) {
169
179
  return {
170
180
  fast: hasFast,
171
181
  full: hasFull,
182
+ migrate: hasMigrate,
172
183
  startPhase,
173
184
  conflict: hasFast && hasFull,
174
185
  invalidPhase,
@@ -179,11 +190,19 @@ export function registerForgeInit(pi) {
179
190
  // Capture pi.sendUserMessage in closure โ€” ExtensionCommandContext does not
180
191
  // have sendUserMessage; it is on ExtensionAPI per pi types.ts:1187.
181
192
  //
182
- // FIX BUG-017 / BUG-023: all sendUserMessage calls during a command handler
183
- // execution (which is itself an active agent turn) MUST carry deliverAs: "steer"
184
- // to avoid the "Agent is already processing" runtime error. The command handler
185
- // runs inside a turn boundary; raw sendUserMessage() without deliverAs throws.
186
- const sendToAgent = (text) => pi.sendUserMessage(text, { deliverAs: "steer" });
193
+ // sendToAgent MUST be awaited. When the agent is idle (the typical case for
194
+ // /forge:init), sendUserMessage starts a full agent turn and resolves when it
195
+ // completes. When the agent is streaming, sendUserMessage enqueues a steer and
196
+ // resolves quickly โ€” waitForIdle is then needed to wait for the turn to finish.
197
+ //
198
+ // Previous bug (BUG-017/BUG-023 workaround was incomplete): sendToAgent was
199
+ // fire-and-forget (no await), and waitForIdle was the sole sync primitive.
200
+ // But waitForIdle() returns Promise.resolve() when agent.activeRun is null
201
+ // (no active turn), which is the state at init start โ€” the steer hadn't been
202
+ // picked up yet, so everything after waitForIdle fired instantly.
203
+ const sendToAgent = async (text) => {
204
+ await pi.sendUserMessage(text, { deliverAs: "steer" });
205
+ };
187
206
  pi.registerCommand("forge:init", {
188
207
  description: "Bootstrap a new Forge SDLC project at the current working directory",
189
208
  async handler(args, ctx) {
@@ -196,6 +215,28 @@ export function registerForgeInit(pi) {
196
215
  let kbPathFinal = "engineering";
197
216
  // โ”€โ”€ 1. Flag parsing โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
198
217
  const flags = parseInitFlags(args);
218
+ // FORGE-S26-T11: --migrate flag dispatches to store migration instead of init.
219
+ if (flags.migrate) {
220
+ // Strip --migrate, pass remaining args to migrate handler.
221
+ const migrateParts = (args ?? "").trim().split(/\s+/).filter((p) => p !== "--migrate");
222
+ const migrateArgs = migrateParts.join(" ");
223
+ let migrateHandler;
224
+ const syntheticPi = {
225
+ ...pi,
226
+ registerCommand: (name, def) => {
227
+ if (name === "forge:migrate")
228
+ migrateHandler = def.handler;
229
+ },
230
+ };
231
+ registerMigrate(syntheticPi);
232
+ if (migrateHandler) {
233
+ await migrateHandler(migrateArgs, ctx);
234
+ }
235
+ else {
236
+ ctx.ui.notify("ร— forge:init --migrate โ€” migrate handler unavailable", "error");
237
+ }
238
+ return;
239
+ }
199
240
  if (flags.conflict) {
200
241
  ctx.ui.notify("ร— Conflicting flags: --fast and --full cannot be combined.", "error");
201
242
  return;
@@ -262,13 +303,12 @@ export function registerForgeInit(pi) {
262
303
  if (flags.startPhase === null || flags.invalidPhase) {
263
304
  const preflightSummary = `Forge Init โ€” ${projectName}\n\n` +
264
305
  `4 phases will run in this session (~45 seconds non-interactive):\n\n` +
265
- ` 1 Collect โ€” 5 parallel discovery scans โ†’ config.json\n` +
306
+ ` 1 Collect โ€” codebase discovery โ†’ config.json\n` +
266
307
  ` KB folder prompt (interactive)\n` +
267
- ` 2 Discover โ€” KB doc generation (LLM fan-out) + project-context.json\n` +
308
+ ` 2 Discover โ€” KB doc generation + project-context.json\n` +
268
309
  ` 3 Materialize โ€” substitute-placeholders.cjs โ†’ fully functional workflows\n` +
269
310
  ` 4 Register โ€” versioning, manifest, cache, store entries, Tomoshibi\n\n` +
270
- `Phase 1 is interactive (KB folder name prompt). Phases 2โ€“4 are non-interactive\n` +
271
- `and complete in under 45 seconds.`;
311
+ `Phase 1 is interactive (KB folder name prompt). Phases 2โ€“4 are non-interactive.`;
272
312
  // G2: skip pre-flight confirm in non-interactive mode (proceed directly to Phase 1)
273
313
  if (!isNonInteractive()) {
274
314
  const proceed = await ctx.ui.confirm("Start /forge:init?", preflightSummary);
@@ -292,32 +332,50 @@ export function registerForgeInit(pi) {
292
332
  catch {
293
333
  // File not yet present โ€” Phase 1 will create it
294
334
  }
295
- // โ”€โ”€ Phases 1โ€“3: descriptor-driven loop โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
296
- // Each phase is described by an LlmPhaseDescriptor (forge-init/phase-descriptors.ts).
297
- // The generic runLlmPhase() runner handles: banner, LLM dispatch / deterministic
298
- // tool execution, verify, retry steer, user confirm, postVerify, writeInitProgress.
299
- const PHASES = [PHASE_1, PHASE_2, PHASE_3];
300
- for (const desc of PHASES) {
301
- if (startPhase > desc.phaseNum) {
302
- // Resume path: skip phases already completed
303
- continue;
304
- }
305
- const phaseResult = await runLlmPhase(desc, ctx, cwd, bundleRoot, toolsRoot, projectName, configCache, sendToAgent, () => ctx.waitForIdle(), isNonInteractive);
306
- if (phaseResult === "abort") {
335
+ // โ”€โ”€ Phases 1โ€“3: linear phase calls โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
336
+ // Each phase is a standalone async function in forge-init/run-phases.ts.
337
+ // (FORGE-S26-T17: replaced descriptor-driven loop with explicit calls.)
338
+ // Phase 1 โ€” Collect
339
+ if (startPhase <= 1) {
340
+ const phase1Result = await runPhase1(cwd, bundleRoot, toolsRoot, configCache, ctx, sendToAgent, () => ctx.waitForIdle(), isNonInteractive);
341
+ if (phase1Result === "abort")
307
342
  return;
308
- }
309
- // Refresh configCache after Phase 1 writes .forge/config.json so
310
- // Phase 2, Phase 4, and the post-init report see the values the
311
- // Phase-1 agent just produced.
312
- if (desc.phaseNum === 1) {
313
- try {
314
- configCache = JSON.parse(fs.readFileSync(path.join(cwd, ".forge", "config.json"), "utf8"));
343
+ // Inter-phase gate: let user review before Phase 2
344
+ if (!isNonInteractive()) {
345
+ const proceed = await ctx.ui.confirm("Phase 1 complete โ€” proceed?", "Phase 1 deliverables verified. Continue to Phase 2: Discover (KB generation)?");
346
+ if (!proceed) {
347
+ ctx.ui.notify("ใ€‡ /forge:init paused after Phase 1. Re-run /forge:init to resume.", "info");
348
+ return;
315
349
  }
316
- catch {
317
- // Fall back to existing cache โ€” all downstream reads have their own defaults
350
+ }
351
+ // Refresh configCache after Phase 1 writes .forge/config.json
352
+ try {
353
+ configCache = JSON.parse(fs.readFileSync(path.join(cwd, ".forge", "config.json"), "utf8"));
354
+ }
355
+ catch {
356
+ // Fall back to existing cache โ€” all downstream reads have their own defaults
357
+ }
358
+ }
359
+ // Phase 2 โ€” Discover
360
+ if (startPhase <= 2) {
361
+ const phase2Result = await runPhase2(cwd, bundleRoot, toolsRoot, projectName, configCache, ctx, sendToAgent, () => ctx.waitForIdle(), isNonInteractive);
362
+ if (phase2Result === "abort")
363
+ return;
364
+ // Inter-phase gate: let user review before Phase 3
365
+ if (!isNonInteractive()) {
366
+ const proceed = await ctx.ui.confirm("Phase 2 complete โ€” proceed?", "Phase 2 deliverables verified. Continue to Phase 3: Materialize (workflow generation)?");
367
+ if (!proceed) {
368
+ ctx.ui.notify("ใ€‡ /forge:init paused after Phase 2. Re-run /forge:init to resume.", "info");
369
+ return;
318
370
  }
319
371
  }
320
372
  }
373
+ // Phase 3 โ€” Materialize
374
+ if (startPhase <= 3) {
375
+ const phase3Result = await runPhase3(cwd, bundleRoot, toolsRoot, ctx);
376
+ if (phase3Result === "abort")
377
+ return;
378
+ }
321
379
  // โ”€โ”€ Phase 4 โ€” Register (runPhase4) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
322
380
  if (startPhase <= 4) {
323
381
  const phase4Result = await runPhase4({
@@ -336,6 +394,8 @@ export function registerForgeInit(pi) {
336
394
  // phase4Result.kbPathFinal is used in the post-init report below
337
395
  kbPathFinal = phase4Result.kbPathFinal;
338
396
  }
397
+ // โ”€โ”€ Invalidate forge-config cache so same-session commands find the new project
398
+ clearForgeConfigCache();
339
399
  // โ”€โ”€ Post-Phase-4: health check โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
340
400
  ctx.ui.setStatus?.("forge:init", "Post-init: health check");
341
401
  const healthResult = await runHealthCheck(cwd, bundleRoot);
@@ -348,23 +408,6 @@ export function registerForgeInit(pi) {
348
408
  ctx.ui.notify(` ยท ${gap.check}: ${gap.message}`, "info");
349
409
  }
350
410
  }
351
- // โ”€โ”€ post-init: emit synthetic event for registered hooks (FORGE-S21-T04) โ”€โ”€
352
- // Replaces the old sentinel-writing stub. The init-complete event is
353
- // consumed by hooks/post-init-hook.ts which handles idempotency,
354
- // materialization-marker checks, audience gates, and dispatch.
355
- // Errors inside hooks are caught by emitSyntheticEvent โ€” fail-open.
356
- {
357
- // Use configCache โ€” valid for both full-run and resumed-init paths.
358
- // configCache is populated once (after Phase 1 completes or from pre-existing
359
- // config.json for resumed inits). Non-fatal if cache is empty (empty prefix
360
- // causes hook to write sentinel under post-init-fired-.json).
361
- let projectPrefixForHook = "";
362
- const projForHook = configCache.project;
363
- if (projForHook && typeof projForHook.prefix === "string") {
364
- projectPrefixForHook = projForHook.prefix;
365
- }
366
- await emitSyntheticEvent({ type: "init-complete", projectPrefix: projectPrefixForHook, cwd }, ctx);
367
- }
368
411
  // โ”€โ”€ Report โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
369
412
  // FIX BUG-020: use configCache here (populated from config.json after Phase 1
370
413
  // or from pre-existing config.json for resumed inits starting at Phase 2+).
@@ -404,8 +447,8 @@ export function registerForgeInit(pi) {
404
447
  ctx.ui.notify(`ร— /forge:init: ${criticalGaps.length} critical gap(s) require attention โ€” see Report.`, "error");
405
448
  }
406
449
  // Final cross-phase verification โ€” banner reflects real disk state.
407
- const finalP1 = verifyPhase1(cwd);
408
- const finalP3 = verifyPhase3(cwd);
450
+ const finalP1 = await verifyPhase1(cwd);
451
+ const finalP3 = await verifyPhase3(cwd);
409
452
  const fullyComplete = finalP1.ok && finalP3.ok;
410
453
  const bannerLabel = fullyComplete
411
454
  ? `โ•‘ /forge:init complete โ•‘`
@@ -416,7 +459,7 @@ export function registerForgeInit(pi) {
416
459
  }
417
460
  if (!finalP3.ok) {
418
461
  incompleteDetail.push(`ร— Phase 3: ${finalP3.missing.join(", ")} (materialization missing)`);
419
- incompleteDetail.push(` โ†’ Recover: \`/forge:regenerate\` (re-runs substitute-placeholders against current config), or delete .forge/init-progress.json and re-run /forge:init.`);
462
+ incompleteDetail.push(` โ†’ Recover: \`/forge:rebuild\` (re-runs substitute-placeholders against current config), or delete .forge/init-progress.json and re-run /forge:init.`);
420
463
  }
421
464
  const report = [
422
465
  ``,
@@ -437,9 +480,9 @@ export function registerForgeInit(pi) {
437
480
  healthSection,
438
481
  ``,
439
482
  `Next steps:`,
440
- ` 1. Run /forge:sprint-intake to start your first sprint`,
441
- ` 2. Run /forge:health anytime to check project health`,
442
- ` 3. Run /forge:refresh-kb-links to update agent instruction file links`,
483
+ ` 1. Run /forge:new-sprint to start your first sprint`,
484
+ ` 2. Run /forge:status to see sprint and task summary`,
485
+ ` 3. Run /forge:health anytime to check project health`,
443
486
  ``,
444
487
  `Note: Marketplace skills auto-recommendation is Claude-Code-only.`,
445
488
  `Pi users install extensions manually.`,
@@ -452,7 +495,19 @@ export function registerForgeInit(pi) {
452
495
  ]
453
496
  : []),
454
497
  ].join("\n");
455
- sendToAgent(report);
498
+ await sendToAgent(report);
499
+ // โ”€โ”€ post-init: emit synthetic event for registered hooks (FORGE-S21-T04) โ”€โ”€
500
+ // Fires AFTER the report so the user sees the summary before enhancement
501
+ // or other hook-triggered workflows begin.
502
+ // Errors inside hooks are caught by emitSyntheticEvent โ€” fail-open.
503
+ {
504
+ let projectPrefixForHook = "";
505
+ const projForHook = configCache.project;
506
+ if (projForHook && typeof projForHook.prefix === "string") {
507
+ projectPrefixForHook = projForHook.prefix;
508
+ }
509
+ await emitSyntheticEvent({ type: "init-complete", projectPrefix: projectPrefixForHook, cwd }, ctx);
510
+ }
456
511
  },
457
512
  });
458
513
  }