@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
@@ -0,0 +1,416 @@
1
+ export const meta = {
2
+ name: 'wfl:run-sprint',
3
+ description: 'Code-orchestrated port of /forge:run-sprint — load sprint, topo-sort into dependency waves, drive each task through the wfl:run-task sub-workflow, escalate-don\'t-halt, collate + report.',
4
+ whenToUse: 'Run all tasks in a Forge sprint via a deterministic JS driver instead of the LLM orchestrator. Pass the sprint id as args, e.g. args: "FORGE-S27".',
5
+ phases: [
6
+ { title: 'Load', detail: 'one agent reads the sprint + its tasks via store-cli, returns the task graph' },
7
+ { title: 'Execute', detail: 'per dependency wave: invoke the wfl:run-task sub-workflow per task (parallel within a wave); escalate-don\'t-halt' },
8
+ { title: 'Collate', detail: 'run collate.cjs, summarise committed / escalated / carried-over' },
9
+ ],
10
+ }
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // wfl:run-sprint — a code-orchestrated port of .forge/workflows/run_sprint.md
14
+ //
15
+ // Why a script: run_sprint.md is a deterministic FSM (Kahn's-algorithm wave
16
+ // sort + per-task dispatch + escalate-don't-halt + collate). In the LLM
17
+ // orchestrator that loop is hand-run turn-by-turn. Here the JS holds the loop,
18
+ // branching, and intermediate results; agents only do I/O and run pipelines.
19
+ //
20
+ // Runtime constraint (per the Workflow tool): the SCRIPT has no filesystem or
21
+ // shell access — agents run all commands. So sprint/task loading and collation
22
+ // are agent() calls; wave computation + routing are JS.
23
+ //
24
+ // COMPOSITION: each task is driven by the wfl:run-task SUB-WORKFLOW (this file's
25
+ // sibling, .claude/workflows/wfl-run-task.js), invoked inline via the workflow()
26
+ // hook. That child ports orchestrate_task.md's phase FSM — it owns the per-phase
27
+ // loop, revision counters, verdict routing, and per-task escalation. This driver
28
+ // owns only the OUTER wave-sort FSM and escalate-don't-halt at the sprint grain.
29
+ // Nesting is one level: this sprint workflow -> wfl:run-task. wfl:run-task itself
30
+ // calls no further workflow(), so the one-level limit holds.
31
+ //
32
+ // Behaviour parity with run_sprint.md:
33
+ // Step 1 Load -> loadSprint() (skip terminal; honour executionMode)
34
+ // Step 2 Sort -> computeWaves() (Kahn's algorithm, cycle = halt)
35
+ // Step 3 Execute -> per-wave dispatch (sequential | wave-parallel | full-parallel)
36
+ // via wfl:run-task + escalate-don't-halt
37
+ // Step 4 Post-Sprint -> collate + report
38
+ //
39
+ // Invocation (Workflow tool): { name: 'wfl:run-sprint', args: 'FORGE-S27' }
40
+ // args may also be an object: { sprintId: 'FORGE-S27', mode: 'sequential' }
41
+ // (mode override is optional; defaults to the sprint record's executionMode).
42
+ // ---------------------------------------------------------------------------
43
+
44
+ const TERMINAL = ['committed', 'abandoned'] // skip on load (already done)
45
+ const TERMINAL_OK = ['committed', 'abandoned', 'escalated'] // acceptable end-of-dispatch states
46
+ const TERMINAL_OK_SET = new Set(TERMINAL_OK) // O(1) membership test for resume guard (#17)
47
+
48
+ // Phase banner map — visual phase identity for log lines (LOW #22).
49
+ // Maps the sprint orchestrator's phases to the persona label used in log output.
50
+ const BANNER_MAP = {
51
+ 'load': 'forge-orchestrator',
52
+ 'execute': 'forge-orchestrator',
53
+ 'collate': 'forge-collator',
54
+ }
55
+
56
+ const LOAD_SCHEMA = {
57
+ type: 'object',
58
+ additionalProperties: false,
59
+ required: ['sprintId', 'executionMode', 'tasks'],
60
+ properties: {
61
+ sprintId: { type: 'string' },
62
+ executionMode: { type: 'string', enum: ['sequential', 'wave-parallel', 'full-parallel'] },
63
+ tasks: {
64
+ type: 'array',
65
+ items: {
66
+ type: 'object',
67
+ additionalProperties: false,
68
+ required: ['taskId', 'status', 'dependencies'],
69
+ properties: {
70
+ taskId: { type: 'string' },
71
+ status: { type: 'string' },
72
+ dependencies: { type: 'array', items: { type: 'string' } },
73
+ },
74
+ },
75
+ },
76
+ },
77
+ }
78
+
79
+ const COLLATE_SCHEMA = {
80
+ type: 'object',
81
+ additionalProperties: false,
82
+ required: ['committed', 'escalated', 'carriedOver'],
83
+ properties: {
84
+ committed: { type: 'integer' },
85
+ escalated: { type: 'integer' },
86
+ carriedOver: { type: 'integer' },
87
+ summary: { type: 'string' },
88
+ },
89
+ }
90
+
91
+ // --- Step 2: Kahn's-algorithm wave computation (port of run_sprint.md) -------
92
+ function computeWaves(tasks) {
93
+ const graph = {}, inDegree = {}, ids = new Set(tasks.map(t => t.taskId))
94
+ for (const t of tasks) { graph[t.taskId] = new Set(); inDegree[t.taskId] = 0 }
95
+ for (const t of tasks) {
96
+ for (const dep of t.dependencies || []) {
97
+ if (ids.has(dep)) { graph[dep].add(t.taskId); inDegree[t.taskId] += 1 }
98
+ }
99
+ }
100
+ const waves = []
101
+ let queue = Object.keys(inDegree).filter(id => inDegree[id] === 0).sort()
102
+ while (queue.length) {
103
+ const wave = [...queue].sort() // deterministic ordering within a wave
104
+ waves.push(wave)
105
+ const next = []
106
+ for (const id of wave) {
107
+ for (const succ of graph[id]) {
108
+ inDegree[succ] -= 1
109
+ if (inDegree[succ] === 0) next.push(succ)
110
+ }
111
+ }
112
+ queue = next
113
+ }
114
+ const remaining = Object.keys(inDegree).filter(id => inDegree[id] > 0)
115
+ if (remaining.length) throw new Error(`Dependency cycle detected among: ${remaining.join(', ')}`)
116
+ return waves
117
+ }
118
+
119
+ // --- Step 3 helper: dispatch one task through its full pipeline -------------
120
+ // Delegates to the wfl:run-task SUB-WORKFLOW (.claude/workflows/wfl-run-task.js),
121
+ // which owns the per-phase FSM, revision loops, verdict routing, and per-task
122
+ // escalation. We normalise its return into the {taskId, status, terminal, note}
123
+ // shape the collation step expects, and apply escalate-don't-halt at the sprint
124
+ // grain: a task that escalates is logged and the sprint continues.
125
+ async function dispatchTask(sprintId, taskId, mode) {
126
+ // Gap #4 (AC3): emit task-dispatch event before invoking wfl:run-task.
127
+ await agent(
128
+ [
129
+ `Emit a task-dispatch event for task ${taskId} in sprint ${sprintId}.`,
130
+ `node .forge/tools/store-cli.cjs emit ${sprintId}`,
131
+ `'{"eventId":"<uuid-v4>","type":"task-dispatch","taskId":"${taskId}","sprintId":"${sprintId}",`,
132
+ `"role":"orchestrator","action":"task-dispatch","phase":"dispatch","iteration":1,`,
133
+ `"startTimestamp":"<ISO-now>","endTimestamp":"<ISO-now>","durationMinutes":0,`,
134
+ `"model":"<your-model-id>","provider":"anthropic"}'`,
135
+ 'Replace <uuid-v4> with a UUID v4 string (e.g. crypto.randomUUID()), <ISO-now> with the',
136
+ 'current UTC ISO 8601 timestamp, and <your-model-id> with the actual model you are using.',
137
+ 'Do NOT modify any other store records.',
138
+ ].join(' '),
139
+ { label: `task-dispatch:${taskId}`, phase: 'Execute' }
140
+ )
141
+
142
+ // Gap #3 (AC1): worktree isolation — documented-latent stub.
143
+ // Sequential mode: skip worktree ops (no parallel file-system contention).
144
+ // wave-parallel / full-parallel: bracket dispatch with per-task worktree lifecycle.
145
+ // DISPOSITION: implemented as documented-latent for FORGE-S28 (sequential mode only).
146
+ // When parallel modes are exercised in a future sprint, remove the sequential guard
147
+ // and promote these agent calls to full implementation with conflict-escalation logic.
148
+ let worktreeActive = false
149
+ if (mode !== 'sequential') {
150
+ // Pre-dispatch: create an isolated worktree for this task.
151
+ await agent(
152
+ [
153
+ `Create a git worktree for task ${taskId} to isolate parallel pipeline I/O.`,
154
+ `git worktree add ../worktrees/${taskId} HEAD`,
155
+ 'Assert exit 0; if the command fails, log the error and escalate (do NOT halt the sprint).',
156
+ 'Return { ok: true } on success or { ok: false, error: "<msg>" } on failure.',
157
+ ].join(' '),
158
+ { label: `worktree-add:${taskId}`, phase: 'Execute' }
159
+ )
160
+ worktreeActive = true
161
+ }
162
+
163
+ let child
164
+ try {
165
+ // workflow() runs the child inline (shared concurrency cap, agent counter,
166
+ // budget). It throws on unknown name / child error — catch so one bad task
167
+ // never halts the whole sprint.
168
+ child = await workflow('wfl:run-task', { taskId })
169
+ } catch (err) {
170
+ log(`⚠ ${taskId} — wfl:run-task threw (${err?.message || err}) — escalating, continuing sprint.`)
171
+ if (worktreeActive) {
172
+ // Teardown worktree even on error (try/finally equivalent).
173
+ await agent(
174
+ `Remove the git worktree for task ${taskId} after pipeline error. Run: git worktree remove --force ../worktrees/${taskId}`,
175
+ { label: `worktree-remove:${taskId}`, phase: 'Execute' }
176
+ )
177
+ }
178
+ return { taskId, status: 'escalated', terminal: false, note: `wfl:run-task threw: ${err?.message || err}` }
179
+ }
180
+
181
+ if (worktreeActive) {
182
+ // Post-dispatch: rebase and remove worktree.
183
+ await agent(
184
+ [
185
+ `Merge results from task ${taskId} worktree back to main and remove the worktree.`,
186
+ `Run: git -C ../worktrees/${taskId} rebase origin/main`,
187
+ '(If rebase conflicts: log and escalate — do NOT halt.)',
188
+ `Then run: git worktree remove --force ../worktrees/${taskId}`,
189
+ ].join(' '),
190
+ { label: `worktree-remove:${taskId}`, phase: 'Execute' }
191
+ )
192
+ }
193
+
194
+ if (!child) {
195
+ return { taskId, status: 'unknown', terminal: false, note: 'wfl:run-task returned null (skipped/errored)' }
196
+ }
197
+
198
+ // wfl:run-task returns either a skipped result ({skipped, taskStatus}) or a
199
+ // terminal result ({finalStatus, escalated, escalationReason}).
200
+ const status = child.skipped ? child.taskStatus
201
+ : child.escalated ? 'escalated'
202
+ : (child.finalStatus || 'unknown')
203
+ // A skipped child is terminal-acceptable regardless of taskStatus: the child
204
+ // deliberately chose not to run the task (e.g. it is `blocked` and waiting on
205
+ // a dependency, or already `committed`/`abandoned`). Re-dispatching + then
206
+ // escalating a legitimately blocked task is wrong — leave it as-is to carry
207
+ // over. Only a genuinely non-terminal *run* (status `unknown`/stalled) retries.
208
+ const terminal = child.skipped || TERMINAL_OK_SET.has(status)
209
+ const note = child.escalationReason
210
+ || (child.skipped ? `skipped (status ${child.taskStatus})` : `pipeline ${status} after ${child.phasesRun ?? '?'} phase(s)`)
211
+
212
+ // Gap #17 — Re-spawn guard: 2 attempts before escalating.
213
+ // Mirrors run_sprint.md §Step 3 lines 105–124: if the first dispatch returns
214
+ // a non-terminal status (context overflow, mid-pipeline stall), re-dispatch
215
+ // once before escalating. wfl:run-task takes only a task id and resumes from
216
+ // the task's store state (completed phases are skipped by their pre-flight
217
+ // gates), so this is a clean re-dispatch — there is no resumeFrom argument.
218
+ if (!terminal) {
219
+ log(`⚠ ${taskId} did not reach terminal (status: ${status}) — re-dispatching once before escalating.`)
220
+ let child2
221
+ try {
222
+ child2 = await workflow('wfl:run-task', { taskId })
223
+ } catch (err2) {
224
+ log(`⚠ ${taskId} — retry threw (${err2?.message || err2}) — escalating after 2 attempts.`)
225
+ return { taskId, status: 'escalated', terminal: false, note: `respawn exhausted (attempt 2 threw): ${err2?.message || err2}` }
226
+ }
227
+ if (!child2) {
228
+ log(`⚠ ${taskId} — retry returned null — escalating after 2 attempts.`)
229
+ return { taskId, status: 'escalated', terminal: false, note: 'respawn exhausted (attempt 2 returned null)' }
230
+ }
231
+ const status2 = child2.skipped ? child2.taskStatus
232
+ : child2.escalated ? 'escalated'
233
+ : (child2.finalStatus || 'unknown')
234
+ const terminal2 = TERMINAL_OK_SET.has(status2)
235
+ if (!terminal2) {
236
+ log(`⚠ ${taskId} did not reach terminal after 2 attempts (status: ${status2}) — escalating.`)
237
+ return { taskId, status: 'escalated', terminal: false, note: `respawn-exhausted after 2 attempts (final status: ${status2})` }
238
+ }
239
+ return {
240
+ taskId,
241
+ status: status2,
242
+ terminal: terminal2,
243
+ note: child2.escalationReason || `resumed from ${status}, completed as ${status2}`,
244
+ }
245
+ }
246
+
247
+ return { taskId, status, terminal, note }
248
+ }
249
+
250
+ // --- Main -------------------------------------------------------------------
251
+ const sprintId = (typeof args === 'string' ? args : args?.sprintId)
252
+ if (!sprintId) throw new Error('wfl:run-sprint requires a sprint id — pass args: "FORGE-S27"')
253
+ const modeOverride = (typeof args === 'object' && args?.mode) || null
254
+
255
+ // Step 1 — Load sprint + tasks (agent does the store I/O; script has none).
256
+ phase('Load')
257
+ const loaded = await agent(
258
+ [
259
+ `Load Forge sprint ${sprintId}.`,
260
+ `\`node .forge/tools/store-cli.cjs read sprint ${sprintId} --json\` and read every task in`,
261
+ `.forge/store/tasks/ whose sprintId === ${sprintId}.`,
262
+ 'Return: sprintId, executionMode (the sprint record\'s mode; default "sequential" if absent),',
263
+ 'and tasks[] each with taskId, status, and dependencies[].',
264
+ 'Do NOT modify anything. Read-only.',
265
+ ].join(' '),
266
+ { label: `load:${sprintId}`, phase: 'Load', schema: LOAD_SCHEMA }
267
+ )
268
+ if (!loaded) throw new Error(`Could not load sprint ${sprintId}`)
269
+
270
+ const mode = modeOverride || loaded.executionMode || 'sequential'
271
+ // Skip already-terminal tasks (committed/abandoned) — run_sprint.md Step 1.
272
+ const active = loaded.tasks.filter(t => !TERMINAL.includes(t.status))
273
+ log(`Sprint ${sprintId}: ${loaded.tasks.length} task(s), ${active.length} to run, mode=${mode}`)
274
+ if (!active.length) {
275
+ log('No non-terminal tasks — nothing to run.')
276
+ return { sprintId, mode, dispatched: 0, results: [] }
277
+ }
278
+
279
+ // Step 2 — Sort into dependency waves.
280
+ const allWaves = computeWaves(active)
281
+ // full-parallel collapses to one wave; sequential expands to one task per step.
282
+ let waves
283
+ if (mode === 'full-parallel') waves = [active.map(t => t.taskId)]
284
+ else if (mode === 'sequential') waves = allWaves.flat().map(id => [id])
285
+ else waves = allWaves // wave-parallel
286
+ log(`Dependency plan: ${waves.length} step(s) — ${waves.map(w => `[${w.join(',')}]`).join(' → ')}`)
287
+
288
+ // Gap #4 (AC2): emit sprint-start event before the wave loop begins.
289
+ await agent(
290
+ [
291
+ `Emit a sprint-start event for sprint ${sprintId}.`,
292
+ 'paths.forgeRoot, then run:',
293
+ `node .forge/tools/store-cli.cjs emit ${sprintId}`,
294
+ `'{"eventId":"<uuid-v4>","type":"sprint-start","sprintId":"${sprintId}",`,
295
+ `"role":"orchestrator","action":"sprint-start",`,
296
+ `"startTimestamp":"<ISO-now>","endTimestamp":"<ISO-now>","durationMinutes":0,`,
297
+ `"model":"<your-model-id>","provider":"anthropic","taskCount":${active.length}}'`,
298
+ 'Replace <uuid-v4> with a UUID v4 string, <ISO-now> with the current UTC ISO 8601 timestamp,',
299
+ 'and <your-model-id> with the actual model you are using.',
300
+ 'Do NOT modify any other store records.',
301
+ ].join(' '),
302
+ { label: `sprint-start:${sprintId}`, phase: 'Execute' }
303
+ )
304
+
305
+ // LOW #23: transition sprint status → active before the wave loop begins.
306
+ // Mirrors run_sprint.md Step 1: the prose orchestrator calls
307
+ // `store-cli update-status sprint <id> active` right after loading the sprint
308
+ // and before processing any wave. Without this the sprint stays in `planned`
309
+ // status during execution, which misrepresents state in /forge:status output.
310
+ await agent(
311
+ [
312
+ `Transition sprint ${sprintId} to active status.`,
313
+ `node .forge/tools/store-cli.cjs update-status sprint ${sprintId} active`,
314
+ 'If the sprint is already active or completed, the command is a no-op — that is fine.',
315
+ 'Return "ok".',
316
+ ].join(' '),
317
+ { label: `sprint-active:${sprintId}`, phase: 'Execute' }
318
+ )
319
+
320
+ // Step 3 — Execute. Parallel within a wave; escalate-don't-halt.
321
+ phase('Execute')
322
+
323
+ // Gap #15 — Clear the sprint progress log before dispatching any task.
324
+ // Mirrors run_sprint.md §Step 3 "Clear Progress Log at Sprint Start" (lines 73–82).
325
+ // store-cli exits 0 for a missing progress log — idempotent, fire-and-continue.
326
+ await agent(
327
+ [
328
+ `Clear the sprint progress log for ${sprintId} before dispatching any task.`,
329
+ `node .forge/tools/store-cli.cjs progress-clear ${sprintId}`,
330
+ 'Exit 0 for a missing log is expected and fine. Do NOT modify any other store records.',
331
+ ].join(' '),
332
+ { label: `progress-clear:${sprintId}`, phase: 'Execute' }
333
+ )
334
+
335
+ const results = []
336
+ for (let i = 0; i < waves.length; i++) {
337
+ const wave = waves[i]
338
+ log(`▶ wave ${i + 1}/${waves.length}: ${wave.join(', ')}`)
339
+ const waveResults = await parallel(wave.map(taskId => () => dispatchTask(sprintId, taskId, mode)))
340
+ results.push(...waveResults.filter(Boolean))
341
+ }
342
+
343
+ // Gap #18-sprint — Sprint-side friction emission after wave loop, before collation.
344
+ // Mirrors run_sprint.md §Iron Laws: "Every failure must produce a visible signal and a
345
+ // structured event." Drains FRICTION-*.jsonl written by sub-agents and emits a
346
+ // type:friction event for any task that never reached terminal after 2 attempts.
347
+ // Fire-and-continue: skip silently if no escalations and no FRICTION-*.jsonl files.
348
+ await agent(
349
+ [
350
+ `Sprint ${sprintId} wave loop complete. Drain any queued friction records and emit sprint-level friction events.`,
351
+ `Escalated task outcomes: ${JSON.stringify(results.filter(r => !r.terminal || r.status === 'escalated').map(r => ({ id: r.taskId, status: r.status, note: r.note })))}.`,
352
+ '',
353
+ 'Step 1 — For each escalated/non-terminal task listed above, emit a type:friction event:',
354
+ ` node .forge/tools/store-cli.cjs emit ${sprintId} '{"eventId":"<uuid-v4>","type":"friction","sprintId":"${sprintId}","workflow":"wfl:run-sprint","persona":"orchestrator","issue":"respawn-exhausted","taskId":"<task-id>","startTimestamp":"<ISO-now>","endTimestamp":"<ISO-now>","durationMinutes":0,"model":"<your-model-id>","provider":"anthropic"}'`,
355
+ ' Replace <uuid-v4>, <task-id>, <ISO-now>, <your-model-id> with actual values.',
356
+ '',
357
+ 'Step 2 — Drain any .forge/cache/FRICTION-*.jsonl files:',
358
+ ' For each line in each FRICTION-*.jsonl file, emit the record as a type:friction event via store-cli.',
359
+ ' After emitting all records from a file, delete the file.',
360
+ '',
361
+ 'If no escalations occurred AND no FRICTION-*.jsonl files exist, do nothing (skip silently).',
362
+ 'Do NOT modify task or sprint store records.',
363
+ ].join(' '),
364
+ { label: `friction-drain:${sprintId}`, phase: 'Execute' }
365
+ )
366
+
367
+ // Step 4 — Post-sprint collation + report (agent does the I/O + status writes).
368
+ phase('Collate')
369
+ const committed = results.filter(r => r.status === 'committed').length
370
+ const escalated = results.filter(r => r.status === 'escalated' || !r.terminal).length
371
+ const carriedOver = results.filter(r => r.status === 'abandoned').length
372
+ const committedIds = results.filter(r => r.status === 'committed').map(r => r.taskId)
373
+ const report = await agent(
374
+ [
375
+ `All tasks for ${sprintId} have reached a terminal state.`,
376
+ '`node .forge/tools/collate.cjs`.',
377
+ `Then set the sprint status: "completed" if all tasks committed, otherwise "partially-completed", via store-cli update-status.`,
378
+ `Per-task outcomes: ${JSON.stringify(results.map(r => ({ id: r.taskId, status: r.status })))}.`,
379
+ // Gap #4 (AC4): emit sprint-complete event with outcome counts.
380
+ `Then emit a sprint-complete event via:`,
381
+ `node .forge/tools/store-cli.cjs emit ${sprintId}`,
382
+ `'{"eventId":"<uuid-v4>","type":"sprint-complete","sprintId":"${sprintId}",`,
383
+ `"role":"orchestrator","action":"sprint-complete",`,
384
+ `"startTimestamp":"<sprint-start-ISO>","endTimestamp":"<ISO-now>","durationMinutes":<elapsed>,`,
385
+ `"model":"<your-model-id>","provider":"anthropic",`,
386
+ `"taskCount":${results.length},"completedTaskIds":${JSON.stringify(committedIds)},`,
387
+ `"verdict":"${committed === results.length ? 'complete' : 'partial'}",`,
388
+ `"waveCount":${waves.length},"maxConcurrency":${mode === 'sequential' ? 1 : waves.reduce((m, w) => Math.max(m, w.length), 1)}}'`,
389
+ 'Replace placeholders: <uuid-v4>=UUID v4, <sprint-start-ISO>=sprint start timestamp,',
390
+ '<ISO-now>=current UTC ISO 8601, <elapsed>=minutes elapsed since sprint-start, <your-model-id>=actual model.',
391
+ // Gap #16 (AC2): rebuild context pack — mirrors collator_agent.md §Algorithm §3.
392
+ // On exit 1 (architecture dir absent), skip silently.
393
+ `Then rebuild the context pack: node .forge/tools/build-context-pack.cjs --arch-dir engineering/architecture --out-md .forge/cache/context-pack.md --out-json .forge/cache/context-pack.json`,
394
+ '(If build-context-pack.cjs exits 1 because the architecture dir is absent, skip silently and continue.)',
395
+ // Gap #16 (AC3): write WRITEBACK-SUMMARY.json to sprint artifact path.
396
+ // Use sprint.path from the store read (not a reconstructed template).
397
+ `Then read the sprint record: node .forge/tools/store-cli.cjs read sprint ${sprintId} --json`,
398
+ 'Extract sprint.path. Write WRITEBACK-SUMMARY.json to that path with this shape:',
399
+ `{ "objective": "Sprint ${sprintId} collation complete", "key_changes": [<list of committed task ids>], "verdict": "<complete|partial>", "written_at": "<ISO-now>" }`,
400
+ // Gap #16 (AC4): invoke forge:refresh-kb-links via Skill tool.
401
+ `Then invoke the forge:refresh-kb-links skill via the Skill tool to refresh KB and workflow links in agent instruction files.`,
402
+ `Return committed/escalated/carriedOver counts and a one-line summary.`,
403
+ ].join(' '),
404
+ { label: `collate:${sprintId}`, phase: 'Collate', schema: COLLATE_SCHEMA }
405
+ )
406
+
407
+ log(`🌊 Sprint ${sprintId} complete — 〇 committed:${committed} △ escalated:${escalated} ── carried/abandoned:${carriedOver}`)
408
+ log(`Next: /forge:retrospective ${sprintId}`)
409
+
410
+ return {
411
+ sprintId,
412
+ mode,
413
+ waves,
414
+ results,
415
+ counts: report || { committed, escalated, carriedOver },
416
+ }