@entelligentsia/forgecli 1.0.3 → 1.0.14

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 (497) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +2 -1
  3. package/dist/CHANGELOG-forge-plugin.md +250 -0
  4. package/dist/CHANGELOG-pi.md +94 -0
  5. package/dist/bin/forge.js +0 -0
  6. package/dist/extensions/forgecli/config-layer.d.ts +16 -0
  7. package/dist/extensions/forgecli/config-layer.js +5 -0
  8. package/dist/extensions/forgecli/config-layer.js.map +1 -1
  9. package/dist/extensions/forgecli/dashboard/component.d.ts +102 -0
  10. package/dist/extensions/forgecli/dashboard/component.js +882 -0
  11. package/dist/extensions/forgecli/dashboard/component.js.map +1 -0
  12. package/dist/extensions/forgecli/dashboard/register.d.ts +2 -0
  13. package/dist/extensions/forgecli/dashboard/register.js +45 -0
  14. package/dist/extensions/forgecli/dashboard/register.js.map +1 -0
  15. package/dist/extensions/forgecli/dashboard/view-model.d.ts +35 -0
  16. package/dist/extensions/forgecli/dashboard/view-model.js +54 -0
  17. package/dist/extensions/forgecli/dashboard/view-model.js.map +1 -0
  18. package/dist/extensions/forgecli/fix-bug.js +72 -7
  19. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  20. package/dist/extensions/forgecli/forge-artifact-tool.js +27 -4
  21. package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
  22. package/dist/extensions/forgecli/forge-cli-schema.json +4 -0
  23. package/dist/extensions/forgecli/forge-commands.js +1 -0
  24. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  25. package/dist/extensions/forgecli/forge-init/phase4-register.js +53 -0
  26. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  27. package/dist/extensions/forgecli/forge-subagent.js +6 -4
  28. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  29. package/dist/extensions/forgecli/forge-tools.js +2 -2
  30. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  31. package/dist/extensions/forgecli/index.js +5 -0
  32. package/dist/extensions/forgecli/index.js.map +1 -1
  33. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +54 -0
  34. package/dist/extensions/forgecli/lib/halt-advisor.js +90 -0
  35. package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
  36. package/dist/extensions/forgecli/migration-engine.js +25 -12
  37. package/dist/extensions/forgecli/migration-engine.js.map +1 -1
  38. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +25 -0
  39. package/dist/extensions/forgecli/orchestrator-status-bar.js +183 -0
  40. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
  41. package/dist/extensions/forgecli/orchestrator-tree.d.ts +96 -0
  42. package/dist/extensions/forgecli/orchestrator-tree.js +390 -0
  43. package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -0
  44. package/dist/extensions/forgecli/project-orientation.js +12 -8
  45. package/dist/extensions/forgecli/project-orientation.js.map +1 -1
  46. package/dist/extensions/forgecli/regenerate.d.ts +16 -0
  47. package/dist/extensions/forgecli/regenerate.js +110 -0
  48. package/dist/extensions/forgecli/regenerate.js.map +1 -1
  49. package/dist/extensions/forgecli/run-sprint.js +33 -3
  50. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  51. package/dist/extensions/forgecli/run-task.d.ts +32 -0
  52. package/dist/extensions/forgecli/run-task.js +185 -12
  53. package/dist/extensions/forgecli/run-task.js.map +1 -1
  54. package/dist/extensions/forgecli/subagent/phase-guard.js +15 -5
  55. package/dist/extensions/forgecli/subagent/phase-guard.js.map +1 -1
  56. package/dist/extensions/forgecli/subagent/phase-summary-map.d.ts +1 -0
  57. package/dist/extensions/forgecli/subagent/phase-summary-map.js +17 -0
  58. package/dist/extensions/forgecli/subagent/phase-summary-map.js.map +1 -1
  59. package/dist/extensions/forgecli/thread-switcher.js +105 -764
  60. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  61. package/dist/extensions/forgecli/viewport-events.js +32 -0
  62. package/dist/extensions/forgecli/viewport-events.js.map +1 -1
  63. package/dist/forge-payload/.base-pack/commands/fix-bug.md +1 -1
  64. package/dist/forge-payload/.base-pack/commands/run-sprint.md +1 -1
  65. package/dist/forge-payload/.base-pack/commands/run-task.md +1 -1
  66. package/dist/forge-payload/.base-pack/personas/architect.md +1 -1
  67. package/dist/forge-payload/.base-pack/personas/bug-fixer.md +1 -1
  68. package/dist/forge-payload/.base-pack/personas/collator.md +3 -3
  69. package/dist/forge-payload/.base-pack/personas/engineer.md +1 -1
  70. package/dist/forge-payload/.base-pack/personas/librarian.md +1 -1
  71. package/dist/forge-payload/.base-pack/personas/orchestrator.md +1 -1
  72. package/dist/forge-payload/.base-pack/personas/product-manager.md +1 -1
  73. package/dist/forge-payload/.base-pack/personas/qa-engineer.md +1 -1
  74. package/dist/forge-payload/.base-pack/personas/supervisor.md +1 -1
  75. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +1 -1
  76. package/dist/forge-payload/.base-pack/workflows/_fragments/friction-emit.md +1 -1
  77. package/dist/forge-payload/.base-pack/workflows/_fragments/iron-laws.md +1 -1
  78. package/dist/forge-payload/.base-pack/workflows/_fragments/progress-reporting.md +2 -2
  79. package/dist/forge-payload/.base-pack/workflows/_fragments/store-cli-verbs.md +29 -5
  80. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +8 -10
  81. package/dist/forge-payload/.base-pack/workflows/architect_review_sprint_completion.md +2 -2
  82. package/dist/forge-payload/.base-pack/workflows/architect_sprint_intake.md +2 -2
  83. package/dist/forge-payload/.base-pack/workflows/architect_sprint_plan.md +5 -5
  84. package/dist/forge-payload/.base-pack/workflows/collator_agent.md +5 -7
  85. package/dist/forge-payload/.base-pack/workflows/commit_task.md +7 -9
  86. package/dist/forge-payload/.base-pack/workflows/enhance.md +5 -5
  87. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +9 -9
  88. package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +12 -13
  89. package/dist/forge-payload/.base-pack/workflows/plan_task.md +5 -6
  90. package/dist/forge-payload/.base-pack/workflows/review_code.md +8 -8
  91. package/dist/forge-payload/.base-pack/workflows/review_plan.md +8 -8
  92. package/dist/forge-payload/.base-pack/workflows/sprint_retrospective.md +3 -3
  93. package/dist/forge-payload/.base-pack/workflows/triage.md +13 -10
  94. package/dist/forge-payload/.base-pack/workflows/update_implementation.md +2 -2
  95. package/dist/forge-payload/.base-pack/workflows/update_plan.md +2 -2
  96. package/dist/forge-payload/.base-pack/workflows/validate_task.md +6 -8
  97. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +490 -0
  98. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-sprint.js +416 -0
  99. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +608 -0
  100. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  101. package/dist/forge-payload/.schemas/_defs/locator.schema.json +13 -0
  102. package/dist/forge-payload/.schemas/bug.schema.json +1 -0
  103. package/dist/forge-payload/.schemas/config.schema.json +2 -3
  104. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  105. package/dist/forge-payload/.schemas/event.schema.json +16 -0
  106. package/dist/forge-payload/.schemas/migrations.json +299 -0
  107. package/dist/forge-payload/.schemas/sprint.schema.json +1 -0
  108. package/dist/forge-payload/.schemas/task.schema.json +1 -0
  109. package/dist/forge-payload/commands/health.md +29 -0
  110. package/dist/forge-payload/commands/rebuild.md +143 -15
  111. package/dist/forge-payload/commands/update.md +28 -27
  112. package/dist/forge-payload/hooks/preflight-session.cjs +99 -0
  113. package/dist/forge-payload/init/phases/phase-3-materialize.md +18 -5
  114. package/dist/forge-payload/integrity.json +7 -6
  115. package/dist/forge-payload/meta/fragments/tool-discipline.md +1 -1
  116. package/dist/forge-payload/meta/personas/meta-architect.md +1 -1
  117. package/dist/forge-payload/meta/personas/meta-bug-fixer.md +1 -1
  118. package/dist/forge-payload/meta/personas/meta-collator.md +7 -7
  119. package/dist/forge-payload/meta/personas/meta-engineer.md +1 -1
  120. package/dist/forge-payload/meta/personas/meta-orchestrator.md +1 -1
  121. package/dist/forge-payload/meta/personas/meta-supervisor.md +1 -1
  122. package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +1 -1
  123. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +1 -1
  124. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +1 -1
  125. package/dist/forge-payload/meta/workflows/_fragments/iron-laws.md +1 -1
  126. package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +2 -2
  127. package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +29 -5
  128. package/dist/forge-payload/meta/workflows/meta-approve.md +8 -10
  129. package/dist/forge-payload/meta/workflows/meta-bug-triage.md +13 -10
  130. package/dist/forge-payload/meta/workflows/meta-collate.md +6 -8
  131. package/dist/forge-payload/meta/workflows/meta-commit.md +7 -9
  132. package/dist/forge-payload/meta/workflows/meta-enhance.md +5 -5
  133. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +35 -11
  134. package/dist/forge-payload/meta/workflows/meta-implement.md +18 -9
  135. package/dist/forge-payload/meta/workflows/meta-migrate.md +13 -14
  136. package/dist/forge-payload/meta/workflows/meta-new-sprint.md +3 -3
  137. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +175 -82
  138. package/dist/forge-payload/meta/workflows/meta-plan-sprint.md +6 -6
  139. package/dist/forge-payload/meta/workflows/meta-plan-task.md +12 -6
  140. package/dist/forge-payload/meta/workflows/meta-retro.md +4 -4
  141. package/dist/forge-payload/meta/workflows/meta-retrospective.md +4 -4
  142. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +8 -8
  143. package/dist/forge-payload/meta/workflows/meta-review-plan.md +8 -8
  144. package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +3 -3
  145. package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +3 -3
  146. package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +6 -6
  147. package/dist/forge-payload/meta/workflows/meta-update-implementation.md +2 -2
  148. package/dist/forge-payload/meta/workflows/meta-update-plan.md +2 -2
  149. package/dist/forge-payload/meta/workflows/meta-validate.md +6 -8
  150. package/dist/forge-payload/schemas/_defs/locator.schema.json +13 -0
  151. package/dist/forge-payload/schemas/bug.schema.json +1 -0
  152. package/dist/forge-payload/schemas/config.schema.json +2 -3
  153. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  154. package/dist/forge-payload/schemas/event.schema.json +16 -0
  155. package/dist/forge-payload/schemas/sprint.schema.json +1 -0
  156. package/dist/forge-payload/schemas/structure-manifest.json +76 -73
  157. package/dist/forge-payload/schemas/task.schema.json +1 -0
  158. package/dist/forge-payload/skills/refresh-kb-links/SKILL.md +14 -7
  159. package/dist/forge-payload/tools/artifact-store.cjs +242 -0
  160. package/dist/forge-payload/tools/artifact.cjs +60 -120
  161. package/dist/forge-payload/tools/banners.cjs +29 -10
  162. package/dist/forge-payload/tools/check-structure.cjs +88 -7
  163. package/dist/forge-payload/tools/collate.cjs +16 -2
  164. package/dist/forge-payload/tools/lib/artifact-kinds.cjs +95 -0
  165. package/dist/forge-payload/tools/lib/store-nlp.cjs +6 -0
  166. package/dist/forge-payload/tools/lib/store-query-exec.cjs +39 -5
  167. package/dist/forge-payload/tools/lib/suggest.cjs +2 -1
  168. package/dist/forge-payload/tools/manage-config.cjs +5 -7
  169. package/dist/forge-payload/tools/parse-gates.cjs +73 -1
  170. package/dist/forge-payload/tools/postflight-gate.cjs +252 -0
  171. package/dist/forge-payload/tools/preflight-gate.cjs +102 -5
  172. package/dist/forge-payload/tools/store-cli.cjs +50 -15
  173. package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -4
  174. package/dist/forge-payload/tools/verify-phase.cjs +17 -0
  175. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts +5 -2
  176. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  177. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +81 -18
  178. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  179. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  180. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +1 -0
  181. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  182. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  183. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +19 -24
  184. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  185. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +1 -0
  186. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  187. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +14 -1
  188. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  189. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +22 -8
  190. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  191. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  192. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  193. package/node_modules/@earendil-works/pi-ai/README.md +1 -1
  194. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +374 -122
  195. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  196. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +424 -232
  197. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  198. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts +1 -1
  199. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  200. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +38 -2
  201. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  202. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  203. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +21 -12
  204. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  205. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  206. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +6 -10
  207. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  208. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  209. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  211. package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
  212. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js +5 -3
  213. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
  214. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +1 -1
  215. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js +3 -4
  216. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +1 -1
  217. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
  218. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +2 -3
  219. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
  220. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  221. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +159 -78
  222. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  223. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  224. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +16 -11
  225. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  226. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  227. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +4 -1
  228. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  229. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  230. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +6 -10
  231. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  232. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  233. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js +1 -0
  234. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
  235. package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
  236. package/node_modules/@earendil-works/pi-ai/dist/stream.js +14 -2
  237. package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
  238. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -4
  239. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  240. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  241. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts +6 -0
  242. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts.map +1 -0
  243. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js +34 -0
  244. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js.map +1 -0
  245. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts +9 -7
  246. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -1
  247. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js +8 -7
  248. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -1
  249. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  250. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +1 -1
  251. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  252. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +1 -1
  253. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  254. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +1 -1
  255. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  256. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts +10 -1
  257. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  258. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js +179 -79
  259. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  260. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  261. package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +94 -0
  262. package/node_modules/@earendil-works/pi-coding-agent/README.md +9 -0
  263. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts +3 -0
  264. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  265. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js +27 -0
  266. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js.map +1 -1
  267. package/node_modules/@earendil-works/pi-coding-agent/dist/config.d.ts.map +1 -1
  268. package/node_modules/@earendil-works/pi-coding-agent/dist/config.js +15 -2
  269. package/node_modules/@earendil-works/pi-coding-agent/dist/config.js.map +1 -1
  270. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts +1 -0
  271. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts.map +1 -1
  272. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js +1 -0
  273. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js.map +1 -1
  274. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts +5 -1
  275. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  276. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +28 -4
  277. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  278. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  279. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js +18 -24
  280. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  281. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -1
  282. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  283. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  284. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  285. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts +7 -5
  286. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  287. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  288. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  289. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js +65 -13
  290. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  291. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  292. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js +1 -1
  293. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  294. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.d.ts +9 -1
  295. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  296. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.js +134 -11
  297. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  298. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.d.ts +2 -0
  299. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  300. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js +10 -6
  301. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js.map +1 -1
  302. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts +6 -7
  303. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  304. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js +75 -28
  305. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  306. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts +2 -0
  307. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  308. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js +14 -9
  309. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  310. package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  311. package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js +0 -3
  312. package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  313. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  314. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js +7 -10
  315. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  316. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  317. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  318. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  319. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  320. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  321. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +5 -7
  322. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  323. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  324. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +6 -7
  325. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  326. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.d.ts +5 -2
  327. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
  328. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.js +17 -1
  329. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
  330. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  331. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +5 -6
  332. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  333. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts +2 -0
  334. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts.map +1 -1
  335. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js +2 -0
  336. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js.map +1 -1
  337. package/node_modules/@earendil-works/pi-coding-agent/dist/main.d.ts.map +1 -1
  338. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js +69 -16
  339. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js.map +1 -1
  340. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  341. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js +118 -1
  342. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js.map +1 -1
  343. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +1 -3
  344. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  345. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +2 -4
  346. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  347. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  348. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
  349. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  350. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
  351. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  352. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
  353. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  354. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  355. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.js +10 -0
  356. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  357. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  358. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +3 -1
  359. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  360. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -0
  361. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  362. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  363. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.d.ts +4 -0
  364. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.d.ts.map +1 -0
  365. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.js +13 -0
  366. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.js.map +1 -0
  367. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.d.ts +3 -0
  368. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.d.ts.map +1 -0
  369. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.js +7 -0
  370. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.js.map +1 -0
  371. package/node_modules/@earendil-works/pi-coding-agent/docs/custom-provider.md +13 -10
  372. package/node_modules/@earendil-works/pi-coding-agent/docs/development.md +1 -1
  373. package/node_modules/@earendil-works/pi-coding-agent/docs/extensions.md +12 -6
  374. package/node_modules/@earendil-works/pi-coding-agent/docs/models.md +25 -12
  375. package/node_modules/@earendil-works/pi-coding-agent/docs/providers.md +13 -5
  376. package/node_modules/@earendil-works/pi-coding-agent/docs/quickstart.md +1 -0
  377. package/node_modules/@earendil-works/pi-coding-agent/docs/rpc.md +2 -1
  378. package/node_modules/@earendil-works/pi-coding-agent/docs/sdk.md +6 -0
  379. package/node_modules/@earendil-works/pi-coding-agent/docs/session-format.md +1 -1
  380. package/node_modules/@earendil-works/pi-coding-agent/docs/sessions.md +8 -0
  381. package/node_modules/@earendil-works/pi-coding-agent/docs/settings.md +7 -3
  382. package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +2 -0
  383. package/node_modules/@earendil-works/pi-coding-agent/docs/tui.md +2 -2
  384. package/node_modules/@earendil-works/pi-coding-agent/docs/usage.md +9 -0
  385. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/README.md +1 -0
  386. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  387. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
  388. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +54 -3
  389. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  390. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/git-merge-and-resolve.ts +115 -0
  391. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/input-transform-streaming.ts +39 -0
  392. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
  393. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
  394. package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +443 -61
  395. package/node_modules/@earendil-works/pi-coding-agent/package.json +6 -6
  396. package/node_modules/@earendil-works/pi-tui/README.md +2 -2
  397. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  398. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +24 -83
  399. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  400. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
  401. package/node_modules/@earendil-works/pi-tui/dist/components/input.js +7 -55
  402. package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +1 -1
  403. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +7 -1
  404. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  405. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +12 -2
  406. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  408. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  409. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  410. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +1 -1
  411. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  412. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +34 -7
  413. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  414. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +33 -10
  415. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  416. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +172 -37
  417. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  418. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts +6 -1
  419. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  420. package/node_modules/@earendil-works/pi-tui/dist/utils.js +27 -15
  421. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  422. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts +25 -0
  423. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +1 -0
  424. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js +96 -0
  425. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +1 -0
  426. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  427. package/node_modules/@entelligentsia/forge-compress/LICENSE +21 -0
  428. package/node_modules/@entelligentsia/forge-compress/README.md +85 -0
  429. package/node_modules/@mariozechner/clipboard/Cargo.toml +3 -3
  430. package/node_modules/@mariozechner/clipboard/index.d.ts +34 -20
  431. package/node_modules/@mariozechner/clipboard/index.js +546 -257
  432. package/node_modules/@mariozechner/clipboard/package.json +5 -6
  433. package/node_modules/@mariozechner/clipboard/package.json.prepack-backup +14 -14
  434. package/node_modules/@mariozechner/clipboard/src/lib.rs +4 -9
  435. package/node_modules/@mariozechner/clipboard-linux-x64-gnu/clipboard.linux-x64-gnu.node +0 -0
  436. package/node_modules/@mariozechner/clipboard-linux-x64-gnu/package.json +2 -2
  437. package/package.json +7 -7
  438. package/dist/bin/forgecli.d.ts +0 -2
  439. package/dist/bin/forgecli.js +0 -6
  440. package/dist/bin/forgecli.js.map +0 -1
  441. package/dist/extensions/forgecli/config-tui/index.d.ts +0 -5
  442. package/dist/extensions/forgecli/config-tui/index.js +0 -5
  443. package/dist/extensions/forgecli/config-tui/index.js.map +0 -1
  444. package/dist/extensions/forgecli/loaders/persona-skill-loader.d.ts +0 -45
  445. package/dist/extensions/forgecli/loaders/persona-skill-loader.js +0 -227
  446. package/dist/extensions/forgecli/loaders/persona-skill-loader.js.map +0 -1
  447. package/dist/extensions/forgecli/loaders/template-render.d.ts +0 -20
  448. package/dist/extensions/forgecli/loaders/template-render.js +0 -85
  449. package/dist/extensions/forgecli/loaders/template-render.js.map +0 -1
  450. package/dist/extensions/forgecli/loaders/workflow-loader.d.ts +0 -41
  451. package/dist/extensions/forgecli/loaders/workflow-loader.js +0 -164
  452. package/dist/extensions/forgecli/loaders/workflow-loader.js.map +0 -1
  453. package/dist/forge-payload/.base-pack/commands/quiz-agent.md +0 -6
  454. package/dist/forge-payload/.base-pack/commands/retrospective.md +0 -6
  455. package/dist/forge-payload/.base-pack/commands/sprint-intake.md +0 -6
  456. package/dist/forge-payload/.base-pack/commands/sprint-plan.md +0 -6
  457. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +0 -446
  458. package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +0 -934
  459. package/dist/forge-payload/.base-pack/workflows/run_sprint.md +0 -225
  460. package/dist/forge-payload/commands/calibrate.md +0 -10
  461. package/dist/forge-payload/commands/materialize.md +0 -119
  462. package/dist/forge-payload/commands/migrate.md +0 -12
  463. package/dist/forge-payload/commands/quiz-agent.md +0 -6
  464. package/dist/forge-payload/commands/regenerate.md +0 -6
  465. package/dist/forge-payload/commands/store-query.md +0 -6
  466. package/dist/forge-payload/commands/store-repair.md +0 -6
  467. package/dist/forge-payload/commands/update-tools.md +0 -10
  468. package/dist/forge-payload/meta/templates/meta-retrospective.md +0 -28
  469. package/dist/forge-payload/tools/prompts/sprint-plan-prompt.md +0 -70
  470. package/dist/forge-payload/tools/schemas/task-list.schema.json +0 -53
  471. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts +0 -4
  472. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts.map +0 -1
  473. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js +0 -3
  474. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js.map +0 -1
  475. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts +0 -20
  476. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts.map +0 -1
  477. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js +0 -92
  478. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js.map +0 -1
  479. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts +0 -18
  480. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts.map +0 -1
  481. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js +0 -42
  482. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js.map +0 -1
  483. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts +0 -10
  484. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts.map +0 -1
  485. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js +0 -31
  486. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js.map +0 -1
  487. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts +0 -30
  488. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts.map +0 -1
  489. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js +0 -170
  490. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js.map +0 -1
  491. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts +0 -26
  492. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts.map +0 -1
  493. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js +0 -90
  494. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js.map +0 -1
  495. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +0 -3
  496. package/node_modules/@mariozechner/clipboard-linux-x64-musl/clipboard.linux-x64-musl.node +0 -0
  497. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +0 -25
@@ -84,6 +84,12 @@ with a colon delimiter (both forms are equivalent).
84
84
  /forge:rebuild workflows plan_task # single workflow file only
85
85
  /forge:rebuild workflows:plan_task # same — colon form (from migration entries)
86
86
  /forge:rebuild workflows sprint_plan # single workflow file only
87
+ /forge:rebuild workflows-js # .claude/workflows/ JS orchestration workflows (verbatim copy)
88
+ /forge:rebuild workflows-js wfl-run-task # single JS workflow file only
89
+ /forge:rebuild workflows-js:wfl-run-task # same — colon form (from migration entries)
90
+ /forge:rebuild tools # .forge/tools/ verbatim re-copy from $FORGE_ROOT/tools/
91
+ /forge:rebuild tools store-cli # single tool file only (name with or without .cjs)
92
+ /forge:rebuild tools:store-cli # same — colon form (from migration entries)
87
93
  /forge:rebuild commands # .claude/commands/ slash command wrappers
88
94
  /forge:rebuild templates # document templates only
89
95
  /forge:rebuild templates PLAN_TEMPLATE # single template file only
@@ -311,14 +317,14 @@ write, record hash.
311
317
  --kb "$(node "$FORGE_ROOT/tools/manage-config.cjs" get paths.engineering 2>/dev/null || echo engineering)" \
312
318
  --out .forge/init-context.md --json-out .forge/init-context.json
313
319
  ```
314
- 2. Read `$FORGE_ROOT/init/workflow-gen-plan.json` (16-entry fan-out table).
320
+ 2. Read `$FORGE_ROOT/init/workflow-gen-plan.json` (15-entry fan-out table).
315
321
  Let `M_total` = the entry count.
316
322
 
317
323
  3. Render the workflows badge, then emit the count:
318
324
  ```sh
319
325
  node "$FORGE_ROOT/tools/banners.cjs" --badge ember
320
326
  ```
321
- Then emit: `Generating workflows (<N> atomic + orchestration, parallel)...`
327
+ Then emit: `Generating workflows (<N> atomic, parallel)...`
322
328
  4. Check each file for manual modifications before any clearing:
323
329
  ```sh
324
330
  node "$FORGE_ROOT/tools/generation-manifest.cjs" check .forge/workflows/{filename}.md
@@ -334,27 +340,143 @@ write, record hash.
334
340
  `$FORGE_ROOT/init/generation/generate-workflows.md` as the per-subagent rulebook
335
341
  (same fan-out pattern as `/forge:init` Phase 7d). Spawn one per entry.
336
342
  7. Collect results. Retry failures once in a single Agent call.
337
- 8. Spawn orchestration subagent:
338
- ```
339
- Read $FORGE_ROOT/init/generation/generate-orchestration.md and follow it.
340
- FORGE_ROOT: {FORGE_ROOT}
341
- Input: $FORGE_ROOT/meta/workflows/meta-orchestrate.md + .forge/workflows/
342
- Output: .forge/workflows/orchestrate_task.md and .forge/workflows/run_sprint.md
343
- ```
344
- 9. **Replay user enhancements** (forge#107 / Approach A):
343
+
344
+ > **LLM orchestration retired.** `orchestrate_task` / `run_sprint` / `fix_bug`
345
+ > are no longer generated. The deterministic JS drivers in
346
+ > `.claude/workflows/wfl-*.js` (category `workflows-js`) are the only
347
+ > orchestration truth; `/forge:run-task`, `/forge:run-sprint`, and
348
+ > `/forge:fix-bug` dispatch to them via `workflow(wfl:*)`. The prose specs
349
+ > `meta-orchestrate.md` / `meta-fix-bug.md` remain in `meta/` as reference
350
+ > docs only neither built into the base-pack nor regenerated here.
351
+
352
+ 8. **Replay user enhancements** (forge#107 / Approach A):
345
353
  ```sh
346
354
  node "$FORGE_ROOT/tools/manage-versions.cjs" replay --target workflows
347
355
  ```
348
356
  Walks snapshots; restores enhanced `workflows/<name>.md` files. Later
349
357
  snapshots win on collision.
350
- 10. For each written file: record hash `node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/workflows/{filename}.md`
358
+ 9. For each written file: record hash `node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/workflows/{filename}.md`
351
359
  (this runs AFTER replay so the recorded hash reflects the restored content).
352
- 11. Emit ` 〇 workflows — <N> files written`.
360
+ 10. Emit ` 〇 workflows — <N> files written`.
353
361
 
354
362
  **Do NOT touch:** `.claude/commands/`, `.forge/config.json`, or any knowledge base file.
355
363
 
356
364
  ---
357
365
 
366
+ ## Category: `workflows-js` — verbatim copy (full or single file)
367
+
368
+ Re-materialise the JS orchestration workflows in `.claude/workflows/` from the
369
+ plugin base-pack. Unlike the `workflows` category (LLM-generated `.forge/`
370
+ markdown with placeholder substitution and KB enrichment), the
371
+ `workflows-js` files are **deterministic verbatim copies** from
372
+ `$FORGE_ROOT/init/base-pack/workflows-js/` — no LLM, no placeholder
373
+ substitution, no enrichment. The output is byte-identical to the base-pack
374
+ source (enforced by `workflows-js-drift.test.cjs`), so this category mirrors
375
+ the `workflows:_fragments` copy pattern, not the generation pattern.
376
+
377
+ Render a badge, then proceed:
378
+
379
+ ```sh
380
+ node "$FORGE_ROOT/tools/banners.cjs" --badge ember
381
+ ```
382
+
383
+ **If a sub-target is provided** (e.g. `/forge:rebuild workflows-js wfl-run-task`
384
+ or the colon form `workflows-js:wfl-run-task`), copy only the single file. The
385
+ sub-target may be given with or without the `.js` extension; normalise to
386
+ `<sub-target>.js`.
387
+
388
+ 1. Verify `$FORGE_ROOT/init/base-pack/workflows-js/<sub-target>.js` exists. If
389
+ not, list the available files and exit cleanly.
390
+ 2. Ensure `.claude/workflows/` exists (create if absent).
391
+ 3. Copy verbatim (no substitution) to `.claude/workflows/<sub-target>.js`.
392
+ 4. Record a manifest hash:
393
+ ```sh
394
+ node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/<sub-target>.js
395
+ ```
396
+ 5. Emit ` 〇 workflows-js:<sub-target> — copied`.
397
+
398
+ **If no sub-target** — full copy, directory fan-out:
399
+
400
+ 1. Enumerate all `.js` files in `$FORGE_ROOT/init/base-pack/workflows-js/`.
401
+ Let `N` = the count.
402
+ 2. Emit: `Copying workflows-js (<N> files)...`
403
+ 3. Ensure `.claude/workflows/` exists (create if absent).
404
+ 4. For each file, copy verbatim to `.claude/workflows/<filename>`, then record
405
+ a manifest hash:
406
+ ```sh
407
+ node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/<filename>
408
+ ```
409
+ 5. Emit ` 〇 workflows-js — <N> files copied`.
410
+
411
+ > **Note:** Only the base-pack-sourced JS workflows (`wfl-*.js`) are written.
412
+ > Custom or project-specific files in `.claude/workflows/` are never
413
+ > overwritten or deleted. Verify with `ls .claude/workflows/`.
414
+
415
+ ---
416
+
417
+ ## Category: `tools` — verbatim copy (full or single file)
418
+
419
+ Re-materialise the vendored plugin tools in `.forge/tools/` from the installed
420
+ plugin. Unlike workflow and persona categories (LLM-generated with placeholder
421
+ substitution), tools files are **deterministic verbatim copies** from
422
+ `$FORGE_ROOT/tools/` — no LLM, no substitution, no enrichment. The output is
423
+ byte-identical to the plugin source.
424
+
425
+ **If a sub-target is provided** (e.g. `/forge:rebuild tools store-cli`
426
+ or the colon form `tools:store-cli`), copy only the single file. The sub-target
427
+ may be given with or without the `.cjs` extension; normalise to `<sub-target>.cjs`.
428
+ Sub-targets in the `lib/` namespace may be specified with the `lib/` prefix
429
+ (e.g. `tools:lib/schema-loader` or `tools:lib/schema-loader.cjs`).
430
+
431
+ **Single-file steps:**
432
+
433
+ 1. Resolve the source path: if the sub-target starts with `lib/`, look in
434
+ `$FORGE_ROOT/tools/lib/<name>.cjs`; otherwise look in `$FORGE_ROOT/tools/<name>.cjs`.
435
+ If the source does not exist, list the available files and exit cleanly.
436
+ 2. Ensure the target directory exists (`.forge/tools/` or `.forge/tools/lib/`).
437
+ 3. Copy verbatim to the resolved `.forge/tools/` path.
438
+ 4. Record a manifest hash:
439
+ ```sh
440
+ node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/tools/<sub-target>.cjs
441
+ ```
442
+ 5. Emit ` 〇 tools:<sub-target> — copied`.
443
+
444
+ **If no sub-target** — full re-copy, directory fan-out:
445
+
446
+ 1. Enumerate all `*.cjs` **and `*.js`** files in `$FORGE_ROOT/tools/` (top-level
447
+ only, exclude `*.test.cjs`/`*.test.js`). Let `N_top` = the count.
448
+ Enumerate all `*.cjs` **and `*.js`** files in `$FORGE_ROOT/tools/lib/` (exclude
449
+ `*.test.cjs`/`*.test.js`). Let `N_lib` = the count.
450
+ Both extensions are required: e.g. `store-cli.cjs` loads `lib/validate.js` and
451
+ `collate.cjs` loads `lib/result.js`; a `.cjs`-only copy breaks them.
452
+ 2. Emit: `Copying tools (<N_top> tool files + <N_lib> lib files)...`
453
+ 3. Ensure `.forge/tools/` and `.forge/tools/lib/` exist (create if absent).
454
+ 4. For each top-level file, copy verbatim to `.forge/tools/<filename>`, then
455
+ record a manifest hash:
456
+ ```sh
457
+ node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/tools/<filename>
458
+ ```
459
+ 5. For each lib file, copy verbatim to `.forge/tools/lib/<filename>`, then
460
+ record a manifest hash:
461
+ ```sh
462
+ node "$FORGE_ROOT/tools/generation-manifest.cjs" record .forge/tools/lib/<filename>
463
+ ```
464
+ 6. Write (or overwrite) the version marker so `/forge:health` can detect staleness:
465
+ ```sh
466
+ ACTIVE_VERSION=$(node -e "console.log(require('$FORGE_ROOT/.claude-plugin/plugin.json').version)")
467
+ node -e "
468
+ const fs = require('fs');
469
+ fs.writeFileSync('.forge/tools/.forge-tools-version', JSON.stringify({ version: '${ACTIVE_VERSION}' }) + '\n');
470
+ "
471
+ ```
472
+ 7. Emit ` 〇 tools — <N_top + N_lib> files copied`.
473
+
474
+ > **Note:** This is a full re-copy of the plugin tools at the installed
475
+ > `$FORGE_ROOT` version. Use `/forge:rebuild tools` after `/forge:update` to
476
+ > refresh `.forge/tools/` to the new plugin version.
477
+
478
+ ---
479
+
358
480
  ## Category: `commands` — full rebuild
359
481
 
360
482
  Re-generate `.claude/commands/` slash command wrappers from the current
@@ -549,7 +671,7 @@ are not yet represented in review checklist items.
549
671
 
550
672
  ## Default (no argument)
551
673
 
552
- Run all five categories respecting dependencies — with maximum parallelism:
674
+ Run all categories respecting dependencies — with maximum parallelism:
553
675
 
554
676
  1. **Build brief** (once, synchronous):
555
677
  ```sh
@@ -572,8 +694,14 @@ Run all five categories respecting dependencies — with maximum parallelism:
572
694
  Spawn orchestration and commands subagents in a **SINGLE Agent tool message**.
573
695
  Wait for both.
574
696
 
575
- This runs in 4 serial steps instead of 5 sequential category passes, with all
576
- fan-outs parallelised within each step.
697
+ 5. **workflows-js** (deterministic verbatim copy no LLM, independent):
698
+ Run the `workflows-js` category (full copy) as described above: copy every
699
+ `.js` file from `$FORGE_ROOT/init/base-pack/workflows-js/` into
700
+ `.claude/workflows/` and record manifest hashes. This step has no
701
+ dependencies and can run alongside step 4.
702
+
703
+ This runs in a handful of serial steps instead of sequential per-category
704
+ passes, with all fan-outs parallelised within each step.
577
705
 
578
706
  ## Flag: `--enrich`
579
707
 
@@ -242,7 +242,7 @@ Now evaluate — **stop at the first matching row and follow only that row's act
242
242
 
243
243
  | # | Condition | Action |
244
244
  |---|-----------|--------|
245
- | 1 | `REMOTE_VERSION` == `LOCAL_VERSION` and `LOCAL_VERSION` == baseline | Print "Forge {LOCAL_VERSION} — up to date. No pending migrations." Then execute **Step 4 config refresh** (paths.forgeRoot, paths.forgeRef, backfill) and proceed to **Step 5**. |
245
+ | 1 | `REMOTE_VERSION` == `LOCAL_VERSION` and `LOCAL_VERSION` == baseline | Print "Forge {LOCAL_VERSION} — up to date. No pending migrations." Then execute **Step 4 config refresh** (paths.forgeRef, backfill) and proceed to **Step 5**. |
246
246
  | 2 | `REMOTE_VERSION` == `LOCAL_VERSION` and `LOCAL_VERSION` != baseline | Jump to **Step 2B** (project migration — no install needed). |
247
247
  | 3 | `IS_CANARY` is true | Jump to **Step 2B** (canary — no install needed). |
248
248
  | 4 | `LOCAL_VERSION` > `REMOTE_VERSION` | Print "Local version ({LOCAL_VERSION}) is ahead of the release channel ({REMOTE_VERSION}). No install needed — applying any pending project migrations." then jump to **Step 2B**. |
@@ -459,27 +459,17 @@ path) — skip the re-derivation and keep the original value.
459
459
  node "$FORGE_ROOT/tools/banners.cjs" --phase 4 7 "Apply migrations" forge
460
460
  ```
461
461
 
462
- > **Sequencing note:** `paths.forgeRoot` is written at the very start of Step 4,
463
- > before any migration targets or regeneration commands execute. This ensures all
464
- > subsequent tool invocations in Step 4 (including `build-init-context.cjs` called
465
- > by regeneration sub-steps) use the current, correct plugin path.
466
- >
467
- > **Config refresh always runs.** The Step 4 header section (forgeRoot, forgeRef,
468
- > backfill) executes regardless of whether migrations are pending — even Row 1
462
+ > **Config refresh always runs.** The Step 4 header section (forgeRef, backfill)
463
+ > executes regardless of whether migrations are pending even Row 1
469
464
  > ("up to date") proceeds through this section before skipping to Step 5. The
470
465
  > "skip to Step 5" directive skips only the migration chain walk and regeneration.
471
466
  > Missing config fields can accumulate across version boundaries; backfill ensures
472
467
  > the config stays structurally complete after every `/forge:update` invocation.
473
468
 
474
- **Refresh `paths.forgeRoot` before applying migrations:**
475
-
476
- ```sh
477
- node "$FORGE_ROOT/tools/manage-config.cjs" set paths.forgeRoot "$FORGE_ROOT"
478
- ```
479
-
480
- **Write `paths.forgeRef` (FR-010):** Also write the installed plugin version
469
+ **Write `paths.forgeRef` (FR-010):** Write the installed plugin version
481
470
  as `paths.forgeRef` to config. This makes the config portable across machines —
482
- `forgeRef` is a version string rather than an absolute path:
471
+ `forgeRef` is a version string rather than an absolute path, and is used by
472
+ `forge-preflight.cjs` to resolve the plugin root via cache lookup:
483
473
 
484
474
  ```sh
485
475
  LOCAL_VERSION=$(node -e "console.log(require('$FORGE_ROOT/.claude-plugin/plugin.json').version)")
@@ -491,7 +481,7 @@ required or recommended fields may have been added since the project was last
491
481
  initialized. `manage-config backfill` reads the config schema, compares it
492
482
  against the current `.forge/config.json`, and writes defaults for any missing
493
483
  fields with schema-defined defaults. It also stamps the top-level `version`
494
- field from the bundled plugin version. Run after setting forgeRoot/forgeRef:
484
+ field from the bundled plugin version. Run after setting forgeRef:
495
485
 
496
486
  ```sh
497
487
  node "$FORGE_ROOT/tools/manage-config.cjs" backfill --forge-root "$FORGE_ROOT"
@@ -576,12 +566,14 @@ Execute regeneration targets in this order:
576
566
  | 5 | `commands` | Must run after `workflows` | — |
577
567
  | 6 | `knowledge-base` sub-targets | — (independent) | — |
578
568
  | 7 | `schemas` | — (independent) | **Run schema refresh inline** (see Schema Refresh below). Emit: `〇 Refreshing schemas…` |
569
+ | 8 | `workflows-js` | — (independent) | Deterministic verbatim copy of `.claude/workflows/*.js` from base-pack via `/forge:rebuild workflows-js` (no LLM, no placeholder substitution). |
579
570
 
580
571
  > **Known special targets — note for migration authors:** `hooks` and `schemas` are
581
572
  > special-cased here. Future `migrations.json` entries should only use recognised
582
573
  > target names; using unknown bare-category targets will produce a warning and be
583
574
  > skipped. The recognised targets are: `hooks`, `tools`, `workflows`, `templates`,
584
- > `personas`, `commands`, `knowledge-base`, `skills`, `schemas`.
575
+ > `personas`, `commands`, `knowledge-base`, `skills`, `schemas`, `workflows-js`.
576
+ > `workflows-js` accepts granular sub-targets (e.g. `workflows-js:wfl-run-task`).
585
577
 
586
578
  `commands` depends on `workflows` because command wrappers reference workflow
587
579
  filenames. All other targets are independent and could run in parallel, but
@@ -666,16 +658,16 @@ reading and following `$FORGE_ROOT/commands/regenerate.md`:
666
658
  **Category-to-command mapping:** most categories are handled by
667
659
  `/forge:rebuild`, but the `tools` and `schemas` categories are special.
668
660
 
669
- When `tools` appears in the aggregated result, run the schema refresh inline
670
- (see **Schema Refresh** section below) instead of invoking `/forge:rebuild tools`.
671
- Tools ship with the plugin and are invoked directly via `$FORGE_ROOT/tools/`.
661
+ When `tools` appears in the aggregated result, invoke `/forge:rebuild tools`
662
+ to re-copy the current plugin's tools closure into `.forge/tools/`. This is
663
+ the actual re-vendor step do NOT run schema refresh inline instead.
672
664
 
673
665
  When `schemas` appears in the aggregated result, run the schema refresh inline
674
- (same **Schema Refresh** section). Do NOT delegate to the removed `/forge:update-tools` command.
666
+ (see **Schema Refresh** section below). Do NOT delegate to the removed `/forge:update-tools` command.
675
667
 
676
668
  ### Schema Refresh
677
669
 
678
- When the migration chain includes a `schemas` or `tools` target, refresh schemas inline:
670
+ When the migration chain includes a `schemas` target, refresh schemas inline:
679
671
 
680
672
  ```sh
681
673
  mkdir -p .forge/schemas
@@ -1004,8 +996,18 @@ engineer_update_implementation.md → renamed to update_implementation.md
1004
996
  engineer_fix_bug.md → renamed to fix_bug.md
1005
997
  supervisor_review_plan.md → renamed to review_plan.md
1006
998
  supervisor_review_implementation.md → renamed to review_code.md
999
+ orchestrate_task.md → retired (v1.2.0); orchestration runs through .claude/workflows/wfl-run-task.js
1000
+ run_sprint.md → retired (v1.2.0); orchestration runs through .claude/workflows/wfl-run-sprint.js
1001
+ fix_bug.md → retired (v1.2.0); orchestration runs through .claude/workflows/wfl-fix-bug.js
1007
1002
  ```
1008
1003
 
1004
+ > **Note:** `orchestrate_task.md` / `run_sprint.md` / `fix_bug.md` are LLM
1005
+ > orchestration prose retired in v1.2.0 — they are no longer generated, and the
1006
+ > deterministic JS drivers in `.claude/workflows/wfl-*.js` are the only
1007
+ > orchestration truth. They are listed here so `/forge:update` removes the
1008
+ > orphaned files from `.forge/workflows/` (the `/forge:rebuild` regeneration
1009
+ > only clears manifest entries, it does not delete files on disk).
1010
+
1009
1011
  For each found workflow file, check manifest status:
1010
1012
  ```sh
1011
1013
  node "$FORGE_ROOT/tools/generation-manifest.cjs" check .forge/workflows/{old-name}.md
@@ -1314,12 +1316,12 @@ Proceed to **Step 6**.
1314
1316
  node "$FORGE_ROOT/tools/banners.cjs" --phase 6 7 "Record state" drift
1315
1317
  ```
1316
1318
 
1317
- > **Note:** `paths.forgeRoot` and `paths.forgeRef` were already written at the start
1318
- > of Step 4. Step 6 does not repeat those writes — it records migration state only.
1319
+ > **Note:** `paths.forgeRef` was already written at the start
1320
+ > of Step 4. Step 6 does not repeat that write — it records migration state only.
1319
1321
 
1320
1322
  **Write `.forge/update-check-cache.json`** to record the completed migration.
1321
1323
  Read the existing file if present, update `migratedFrom`, `localVersion`,
1322
- `distribution`, `forgeRoot`, `forgeRef`, `updateStatus`, `pendingReason`, and
1324
+ `distribution`, `forgeRef`, `updateStatus`, `pendingReason`, and
1323
1325
  `pendingMigrations`, then write it back. Use the Write or Edit tool — do not run
1324
1326
  a shell command for this step. The `.forge/` directory always exists at this
1325
1327
  point (it was checked earlier), so no `mkdir -p` is needed.
@@ -1330,7 +1332,6 @@ If the file does not exist, create it with:
1330
1332
  "migratedFrom": "<LOCAL_VERSION>",
1331
1333
  "localVersion": "<LOCAL_VERSION>",
1332
1334
  "distribution": "<DISTRIBUTION>",
1333
- "forgeRoot": "<FORGE_ROOT>",
1334
1335
  "forgeRef": "<LOCAL_VERSION>",
1335
1336
  "updateStatus": "complete",
1336
1337
  "pendingReason": null,
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // Forge hook: preflight-session (FORGE-S27-T01 / item A1).
5
+ //
6
+ // SessionStart hook that primes the orchestrator preflight cache blob
7
+ // (.forge/cache/preflight-status.json) by running forge-preflight.cjs once.
8
+ //
9
+ // SCOPING NOTE: SessionStart fires BEFORE any command is invoked and its
10
+ // envelope carries no per-command signal, so this hook is deliberately
11
+ // command-name-INDEPENDENT. Authoritative scoping to run-task / fix-bug /
12
+ // run-sprint lives in the orchestration command-preamble path (which reads the
13
+ // blob). This hook only ever:
14
+ // - is a STRICT NO-OP when .forge/ is absent (never changes behavior for
15
+ // non-Forge projects or unrelated commands);
16
+ // - primes the blob when .forge/ is present;
17
+ // - is FRESHNESS-GUARDED (idempotent): if an existing blob already matches
18
+ // the current config mtime + MASTER_INDEX hash, it is left untouched;
19
+ // - FAILS OPEN: any error -> stderr warning + exit 0. A hook failure must
20
+ // never block session start.
21
+
22
+ process.on('uncaughtException', (err) => {
23
+ try { process.stderr.write(`forge preflight-session: internal error (fail-open): ${err.message}\n`); } catch (_) {}
24
+ process.exit(0);
25
+ });
26
+
27
+ const fs = require('fs');
28
+ const path = require('path');
29
+ const { spawnSync } = require('child_process');
30
+
31
+ // Read + discard the envelope on fd 0 (fail-open on any parse error).
32
+ try { fs.readFileSync(0, 'utf8'); } catch (_) { /* envelope optional */ }
33
+
34
+ // Strict no-op when .forge/ is absent.
35
+ const forgeDir = path.join(process.cwd(), '.forge');
36
+ const configPath = path.join(forgeDir, 'config.json');
37
+ if (!fs.existsSync(forgeDir) || !fs.existsSync(configPath)) {
38
+ process.exit(0);
39
+ }
40
+
41
+ const cacheDir = path.join(forgeDir, 'cache');
42
+ const blobPath = path.join(cacheDir, 'preflight-status.json');
43
+
44
+ // Freshness guard (idempotency): if the existing blob was computed from the
45
+ // current config mtime, leave it untouched. forge-preflight records configMtime
46
+ // in the blob; MASTER_INDEX changes flow through masterIndexHash, which the
47
+ // blob also records, but the config mtime is the cheap primary key here.
48
+ function configMtimeMs() {
49
+ try { return fs.statSync(configPath).mtimeMs; } catch (_) { return null; }
50
+ }
51
+
52
+ try {
53
+ if (fs.existsSync(blobPath)) {
54
+ const existing = JSON.parse(fs.readFileSync(blobPath, 'utf8'));
55
+ const curMtime = configMtimeMs();
56
+ if (existing && typeof existing.configMtime === 'number' &&
57
+ curMtime !== null && existing.configMtime === curMtime) {
58
+ // Blob is current — no rewrite, no duplicated side effect.
59
+ process.exit(0);
60
+ }
61
+ }
62
+ } catch (_) { /* corrupt blob -> fall through and recompute */ }
63
+
64
+ // Resolve forge-preflight.cjs. Prefer CLAUDE_PLUGIN_ROOT (set by the runtime),
65
+ // fall back to config.paths.forgeRoot.
66
+ let forgeRoot = process.env.CLAUDE_PLUGIN_ROOT || null;
67
+ if (!forgeRoot) {
68
+ try {
69
+ const cfg = JSON.parse(fs.readFileSync(configPath, 'utf8'));
70
+ forgeRoot = cfg && cfg.paths && cfg.paths.forgeRoot;
71
+ } catch (_) { /* leave null */ }
72
+ }
73
+ if (!forgeRoot) process.exit(0); // cannot locate the tool — fail open
74
+
75
+ const tool = path.join(forgeRoot, 'tools', 'forge-preflight.cjs');
76
+ if (!fs.existsSync(tool)) process.exit(0);
77
+
78
+ // Run preflight and capture its single JSON blob.
79
+ const res = spawnSync('node', [tool, '--path', process.cwd()], {
80
+ cwd: process.cwd(),
81
+ encoding: 'utf8',
82
+ timeout: 8000,
83
+ });
84
+ if (res.status !== 0 || !res.stdout) process.exit(0); // fail open
85
+
86
+ // Validate it parses before writing — never half-write a corrupt blob.
87
+ let blob;
88
+ try { blob = JSON.parse(res.stdout); } catch (_) { process.exit(0); }
89
+ if (!blob || typeof blob !== 'object') process.exit(0);
90
+
91
+ try {
92
+ fs.mkdirSync(cacheDir, { recursive: true });
93
+ // Atomic-ish write: tmp + rename so a crash never leaves a partial blob.
94
+ const tmpPath = blobPath + '.tmp';
95
+ fs.writeFileSync(tmpPath, JSON.stringify(blob, null, 2), 'utf8');
96
+ fs.renameSync(tmpPath, blobPath);
97
+ } catch (_) { /* fail open */ }
98
+
99
+ process.exit(0);
@@ -63,11 +63,24 @@ node "$FORGE_ROOT/tools/substitute-placeholders.cjs" \
63
63
  ```
64
64
 
65
65
  Output directories (managed by the tool's `SUBDIR_OUTPUT_MAP`):
66
- - `base-pack/commands/` → `.claude/commands/<prefix-lowercased>/`
67
- - `base-pack/personas/` → `.forge/personas/`
68
- - `base-pack/skills/` → `.forge/skills/`
69
- - `base-pack/workflows/` → `.forge/workflows/`
70
- - `base-pack/templates/` → `.forge/templates/`
66
+ - `base-pack/commands/` → `.claude/commands/<prefix-lowercased>/`
67
+ - `base-pack/personas/` → `.forge/personas/`
68
+ - `base-pack/skills/` → `.forge/skills/`
69
+ - `base-pack/workflows/` → `.forge/workflows/`
70
+ - `base-pack/templates/` → `.forge/templates/`
71
+ - `base-pack/workflows-js/` → `.claude/workflows/` (JS orchestration workflows — FORGE-S28-T01)
72
+
73
+ ### Step 3a — Record generated JS workflows in the generation manifest
74
+
75
+ After `substitute-placeholders.cjs` writes the JS workflows, record them in the generation
76
+ manifest so `/forge:rebuild` and `/forge:health` can detect stale or missing copies:
77
+
78
+ ```sh
79
+ node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/wfl-run-task.js
80
+ node "$FORGE_ROOT/tools/generation-manifest.cjs" record .claude/workflows/wfl-run-sprint.js
81
+ ```
82
+
83
+ If either `record` call exits non-zero, the file was not written — re-run Step 3 and retry.
71
84
 
72
85
  If `project-context.json` is absent or missing required keys, halt Phase 3:
73
86
  ```
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.0.3",
3
- "generated": "2026-05-28",
2
+ "version": "1.2.14",
3
+ "generated": "2026-06-03",
4
4
  "note": "Tamper-evident only. Authoritative source: /forge:update from remote.",
5
5
  "files": {
6
6
  "commands/add-pipeline.md": "529a2fc01be49815efa2cf1147528827ff1bfc12ce2ac8663b5a3a9781f8682e",
@@ -9,27 +9,28 @@
9
9
  "commands/check-agent.md": "f92121cb150d4cf601654e25c28d0c13389039518d05433f1040d727054b127e",
10
10
  "commands/config.md": "e67185f98cf0b045890398083991b9d48f32bf0d53bafda1eaca3ce0337ce49c",
11
11
  "commands/enhance.md": "d28f6414119e84973809d32900bb7245b51f565aed86112bc7a994bc6941b547",
12
- "commands/health.md": "29c3e5f9808d996f53a432c4b3aff1c3346d7a40fff54518d8ea2ac2c6ba9d12",
12
+ "commands/health.md": "8f8160d67c09eed9be12445674fc2ab76cf31d548c6268c71f9777dca30c4e47",
13
13
  "commands/init.md": "cf7a70d55f718304820c310465071d3eea9d14a43131623f46b686499f630d4d",
14
- "commands/rebuild.md": "e6d1e0bc29fd21c4c9109d8f40045b782207dfa6db2d98a9bf8c7254a80f09c6",
14
+ "commands/rebuild.md": "9de3a3c1e41169e18758c8598e297c2f395f9daefdd9772783b9b676982cf1c2",
15
15
  "commands/remove.md": "0ca5ec94d52959afaadd74910bd2c81c9872b71c9cc1ce8b89e5af69c06b304f",
16
16
  "commands/repair.md": "22e21614eee31ee630ead3f587b0b948b8c537e54ecef3b65e7d819c55c0ebd4",
17
17
  "commands/report-bug.md": "af8a54bf8887b35e5c880898dd45783f6c2e80d3dc031d6479a6be613ac43053",
18
18
  "commands/search.md": "befc4ba9f3146e7599308b35b95ec315e16895c0c18c9c2bab7549619d79bf1c",
19
19
  "commands/status.md": "2fa82a0b11d493918781aec6d95c39411f84fa923662ff3152b6de0cc830d755",
20
- "commands/update.md": "a7eac4362a927eae708ee3844ef8d920f3166d1eafde36323d2dd92789fbdec9",
20
+ "commands/update.md": "c8b69b43567fa5fc328bb3dde31f386d0f577bbcc65dafd525400ae2fb16b132",
21
21
  "agents/store-query-validator.md": "f4c3573edcf6e28809515705362df611806a805c5269404fb17e31433cf3a81c",
22
22
  "agents/tomoshibi.md": "0c1032df80dfc25a4f482b1276965b5318754d95ccde9f24820846d564e49a27",
23
23
  "hooks/check-update.cjs": "9607cc0c51bedcbc123f5ea1d7a492916f29ee1f838846eec64776d5df70bbea",
24
24
  "hooks/forge-permissions.cjs": "8de18fe7e6c9ee1751926275a37f4bb68a5a53090d366d2aa44157c106e7857e",
25
25
  "hooks/post-init.cjs": "b05d65e7192d126733995989998a0b480604e0cc152887e6d7d0807fba3cf70d",
26
26
  "hooks/post-sprint.cjs": "28ddbd2c49d8b746c35d23a90b02362bc684d188159536a971b2d650bb85f3a9",
27
+ "hooks/preflight-session.cjs": "7b1ad8f12f2a1bb94650e2b632da0ed21862071bf63f4e6452c88007be630fae",
27
28
  "hooks/triage-error.cjs": "e47fcb81fd0f99b8ecc449b38765cdc6929bde2461b5f1727d26bc31f76bfcfa",
28
29
  "hooks/validate-write.cjs": "3ec7bbbb2cc19f22c78da5a9e7b5031066f4b669c76a10c9f8a92a1a48fcea0a",
29
30
  "schemas/transitions/bug.json": "27b17da42d1cebffbd4f61ab3dcd432a0017aa71997d548ed80d22c2fc3fad6a",
30
31
  "schemas/transitions/sprint.json": "2e0a629396e687b0ca88e1814ac3e35d84533a5d55b25237ab67feddce3c9deb",
31
32
  "schemas/transitions/task.json": "4c71849747baa0d585756e57c56325ff6219c078178374e60815dff91e25e3e7",
32
- "schemas/enum-catalog.json": "93dc3d1656d9d638c8eaecc14ce66554b63149a4779869e6536cf0e620e5b37b",
33
+ "schemas/enum-catalog.json": "14fa6c470292fb433a4e33503669f567bd53e3851b25000c05ddca0fdfdd6e58",
33
34
  "tools/verify-integrity.cjs": "3ec3c970dd3d7c3001f8f373bcc40556803eadd2fc2afafb14f1c232cba4cc3f"
34
35
  }
35
36
  }
@@ -35,7 +35,7 @@ project config outside `.forge/store/` are fine to `read`/`grep` directly.
35
35
  Never construct artifact paths manually — the tool resolves them from entity IDs.
36
36
  - Use `forge_verify_apply` after applying edits to confirm changes landed on disk.
37
37
  If `unchanged` is non-empty, re-apply those edits.
38
- - Never `bash node "$FORGE_ROOT/tools/store-cli.cjs" ...` — use the named MCP tool instead.
38
+ - Never `bash node .forge/tools/store-cli.cjs ...` — use the named MCP tool instead.
39
39
  The tool is schema-validated and shorter.
40
40
  - Workflow text saying `forge_store write sprint '<json>'` means: call the MCP tool
41
41
  `forge_store` with that 2-positional shape. Not a shell command.
@@ -64,7 +64,7 @@ When generating a project-specific Architect persona, incorporate:
64
64
 
65
65
  **Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
66
66
  ```bash
67
- FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)") && node "$FORGE_ROOT/tools/banners.cjs" north
67
+ node .forge/tools/banners.cjs north
68
68
  ```
69
69
  Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
70
70
  `🗻 **{Project} Architect** — I hold the shape of the whole. I give final sign-off.`
@@ -67,7 +67,7 @@ When generating a project-specific Bug Fixer, incorporate:
67
67
 
68
68
  **Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
69
69
  ```bash
70
- FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)") && node "$FORGE_ROOT/tools/banners.cjs" rift
70
+ node .forge/tools/banners.cjs rift
71
71
  ```
72
72
  Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
73
73
  `🍂 **{Project} Bug Fixer** — I find what has decayed and restore it.`
@@ -42,9 +42,9 @@ invokes the generated tool or falls back to manual collation.
42
42
 
43
43
  ## Preferred Method
44
44
 
45
- Read `paths.forgeRoot` from `.forge/config.json` → set as `FORGE_ROOT`. Then run:
45
+ Run the vendored collate tool:
46
46
  ```bash
47
- node "$FORGE_ROOT/tools/collate.cjs"
47
+ node .forge/tools/collate.cjs
48
48
  ```
49
49
 
50
50
  ## Fallback Method
@@ -56,17 +56,17 @@ the same outputs following the collation algorithm in
56
56
  ## Generation Instructions
57
57
 
58
58
  When generating a project-specific Collator, incorporate:
59
- - Emit the runtime-read pattern exactly as shown above — do NOT substitute
60
- `paths.forgeRoot` as a literal string at generation time. The `$FORGE_ROOT`
61
- variable must remain in the generated file so the path resolves from
62
- `.forge/config.json` when the workflow runs, not when it is generated.
59
+ - Emit the vendored project-relative invocation exactly as shown above —
60
+ `node .forge/tools/collate.cjs`. The tools closure is vendored into
61
+ `.forge/tools/` by `/forge:rebuild`, so the path resolves at runtime
62
+ without any plugin-root lookup.
63
63
  - The project's language for invoking the tool
64
64
  - The store path (.forge/store/)
65
65
  - The project prefix for ID formatting
66
66
 
67
67
  **Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
68
68
  ```bash
69
- FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)") && node "$FORGE_ROOT/tools/banners.cjs" drift
69
+ node .forge/tools/banners.cjs drift
70
70
  ```
71
71
  Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
72
72
  `🍃 **{Project} Collator** — I gather what exists and arrange it into views.`
@@ -64,7 +64,7 @@ When generating a project-specific Engineer persona, incorporate:
64
64
 
65
65
  **Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
66
66
  ```bash
67
- FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)") && node "$FORGE_ROOT/tools/banners.cjs" forge
67
+ node .forge/tools/banners.cjs forge
68
68
  ```
69
69
  Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
70
70
  `🌱 **{Project} Engineer** — I plan and build. I do not move forward until the code is clean.`
@@ -65,7 +65,7 @@ When generating a project-specific Orchestrator, incorporate:
65
65
 
66
66
  **Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
67
67
  ```bash
68
- FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)") && node "$FORGE_ROOT/tools/banners.cjs" tide
68
+ node .forge/tools/banners.cjs tide
69
69
  ```
70
70
  Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
71
71
  `🌊 **{Project} Orchestrator** — I move tasks through their lifecycle. I do not do the work; I watch that it flows.`
@@ -86,7 +86,7 @@ When generating a project-specific Supervisor persona, incorporate:
86
86
 
87
87
  **Persona block format** — every generated workflow for this persona must open by running the identity banner using the Bash tool:
88
88
  ```bash
89
- FORGE_ROOT=$(node -e "console.log(require('./.forge/config.json').paths.forgeRoot)") && node "$FORGE_ROOT/tools/banners.cjs" oracle
89
+ node .forge/tools/banners.cjs oracle
90
90
  ```
91
91
  Use `--badge` for compact inline contexts. The plain-text fallback for non-terminal output is:
92
92
  `🌿 **{Project} Supervisor** — I review before things move forward. I read the actual code, not the report.`
@@ -10,7 +10,7 @@ needed.
10
10
 
11
11
  ## Inputs
12
12
 
13
- - `.forge/config.json` — paths (specifically `paths.forgeRoot` for schema resolution)
13
+ - `.forge/config.json` — project paths and prefix
14
14
  - `.forge/schemas/*.schema.json` — canonical JSON Schema files (primary source)
15
15
  - `forge/schemas/*.schema.json` — in-tree source schemas (fallback for dogfooding)
16
16
  - CLI arguments — command, entity type, JSON payload, flags
@@ -59,7 +59,7 @@ After the subagent returns, the orchestrator constructs the event from:
59
59
  The orchestrator then emits via:
60
60
 
61
61
  ```
62
- node "$FORGE_ROOT/tools/store-cli.cjs" emit {sprintId} '{complete-event-json}'
62
+ node .forge/tools/store-cli.cjs emit {sprintId} '{complete-event-json}'
63
63
  ```
64
64
 
65
65
  ## Why no example record here