@entelligentsia/forgecli 1.0.10 → 1.0.20

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 (183) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/dist/CHANGELOG-forge-plugin.md +211 -0
  3. package/dist/bin/forge.js +0 -0
  4. package/dist/extensions/forgecli/config-layer.js.map +1 -1
  5. package/dist/extensions/forgecli/context-governor-compaction.d.ts +83 -0
  6. package/dist/extensions/forgecli/context-governor-compaction.js +302 -0
  7. package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -0
  8. package/dist/extensions/forgecli/context-governor.d.ts +173 -0
  9. package/dist/extensions/forgecli/context-governor.js +618 -0
  10. package/dist/extensions/forgecli/context-governor.js.map +1 -0
  11. package/dist/extensions/forgecli/dashboard/component.d.ts +105 -0
  12. package/dist/extensions/forgecli/dashboard/component.js +861 -0
  13. package/dist/extensions/forgecli/dashboard/component.js.map +1 -0
  14. package/dist/extensions/forgecli/dashboard/register.d.ts +2 -0
  15. package/dist/extensions/forgecli/dashboard/register.js +31 -0
  16. package/dist/extensions/forgecli/dashboard/register.js.map +1 -0
  17. package/dist/extensions/forgecli/dashboard/theme.d.ts +27 -0
  18. package/dist/extensions/forgecli/dashboard/theme.js +91 -0
  19. package/dist/extensions/forgecli/dashboard/theme.js.map +1 -0
  20. package/dist/extensions/forgecli/dashboard/view-model.d.ts +35 -0
  21. package/dist/extensions/forgecli/dashboard/view-model.js +54 -0
  22. package/dist/extensions/forgecli/dashboard/view-model.js.map +1 -0
  23. package/dist/extensions/forgecli/fix-bug.js +126 -7
  24. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  25. package/dist/extensions/forgecli/forge-artifact-tool.js +2 -1
  26. package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
  27. package/dist/extensions/forgecli/forge-commands.js +1 -0
  28. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  29. package/dist/extensions/forgecli/forge-init/phase4-register.js +53 -0
  30. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  31. package/dist/extensions/forgecli/forge-subagent.d.ts +20 -1
  32. package/dist/extensions/forgecli/forge-subagent.js +23 -7
  33. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  34. package/dist/extensions/forgecli/forge-tools.js +3 -1
  35. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  36. package/dist/extensions/forgecli/hook-dispatcher.d.ts +3 -1
  37. package/dist/extensions/forgecli/hook-dispatcher.js +37 -3
  38. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  39. package/dist/extensions/forgecli/index.js +38 -1
  40. package/dist/extensions/forgecli/index.js.map +1 -1
  41. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +59 -0
  42. package/dist/extensions/forgecli/lib/halt-advisor.js +113 -0
  43. package/dist/extensions/forgecli/lib/halt-advisor.js.map +1 -0
  44. package/dist/extensions/forgecli/migration-engine.js +25 -12
  45. package/dist/extensions/forgecli/migration-engine.js.map +1 -1
  46. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +26 -0
  47. package/dist/extensions/forgecli/orchestrator-status-bar.js +213 -0
  48. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +1 -0
  49. package/dist/extensions/forgecli/orchestrator-tree.d.ts +96 -0
  50. package/dist/extensions/forgecli/orchestrator-tree.js +390 -0
  51. package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -0
  52. package/dist/extensions/forgecli/project-orientation.js +12 -8
  53. package/dist/extensions/forgecli/project-orientation.js.map +1 -1
  54. package/dist/extensions/forgecli/regenerate.d.ts +16 -0
  55. package/dist/extensions/forgecli/regenerate.js +110 -0
  56. package/dist/extensions/forgecli/regenerate.js.map +1 -1
  57. package/dist/extensions/forgecli/run-sprint.d.ts +3 -1
  58. package/dist/extensions/forgecli/run-sprint.js +34 -3
  59. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  60. package/dist/extensions/forgecli/run-task.d.ts +66 -1
  61. package/dist/extensions/forgecli/run-task.js +323 -12
  62. package/dist/extensions/forgecli/run-task.js.map +1 -1
  63. package/dist/extensions/forgecli/thread-switcher.d.ts +4 -1
  64. package/dist/extensions/forgecli/thread-switcher.js +118 -762
  65. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  66. package/dist/extensions/forgecli/viewport-events.js +32 -0
  67. package/dist/extensions/forgecli/viewport-events.js.map +1 -1
  68. package/dist/forge-payload/.base-pack/commands/fix-bug.md +1 -1
  69. package/dist/forge-payload/.base-pack/commands/run-sprint.md +1 -1
  70. package/dist/forge-payload/.base-pack/commands/run-task.md +1 -1
  71. package/dist/forge-payload/.base-pack/personas/architect.md +1 -1
  72. package/dist/forge-payload/.base-pack/personas/bug-fixer.md +1 -1
  73. package/dist/forge-payload/.base-pack/personas/collator.md +3 -3
  74. package/dist/forge-payload/.base-pack/personas/engineer.md +1 -1
  75. package/dist/forge-payload/.base-pack/personas/librarian.md +1 -1
  76. package/dist/forge-payload/.base-pack/personas/orchestrator.md +1 -1
  77. package/dist/forge-payload/.base-pack/personas/product-manager.md +1 -1
  78. package/dist/forge-payload/.base-pack/personas/qa-engineer.md +1 -1
  79. package/dist/forge-payload/.base-pack/personas/supervisor.md +1 -1
  80. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +1 -1
  81. package/dist/forge-payload/.base-pack/workflows/_fragments/friction-emit.md +1 -1
  82. package/dist/forge-payload/.base-pack/workflows/_fragments/iron-laws.md +1 -1
  83. package/dist/forge-payload/.base-pack/workflows/_fragments/progress-reporting.md +2 -2
  84. package/dist/forge-payload/.base-pack/workflows/_fragments/store-cli-verbs.md +11 -2
  85. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +6 -7
  86. package/dist/forge-payload/.base-pack/workflows/architect_review_sprint_completion.md +2 -2
  87. package/dist/forge-payload/.base-pack/workflows/architect_sprint_intake.md +2 -2
  88. package/dist/forge-payload/.base-pack/workflows/architect_sprint_plan.md +5 -5
  89. package/dist/forge-payload/.base-pack/workflows/collator_agent.md +4 -6
  90. package/dist/forge-payload/.base-pack/workflows/commit_task.md +5 -6
  91. package/dist/forge-payload/.base-pack/workflows/enhance.md +5 -5
  92. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +15 -7
  93. package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +12 -13
  94. package/dist/forge-payload/.base-pack/workflows/plan_task.md +12 -6
  95. package/dist/forge-payload/.base-pack/workflows/review_code.md +12 -11
  96. package/dist/forge-payload/.base-pack/workflows/review_plan.md +12 -11
  97. package/dist/forge-payload/.base-pack/workflows/sprint_retrospective.md +3 -3
  98. package/dist/forge-payload/.base-pack/workflows/triage.md +12 -9
  99. package/dist/forge-payload/.base-pack/workflows/update_implementation.md +2 -2
  100. package/dist/forge-payload/.base-pack/workflows/update_plan.md +2 -2
  101. package/dist/forge-payload/.base-pack/workflows/validate_task.md +9 -9
  102. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +490 -0
  103. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-sprint.js +416 -0
  104. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +608 -0
  105. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  106. package/dist/forge-payload/.schemas/config.schema.json +2 -3
  107. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  108. package/dist/forge-payload/.schemas/event.schema.json +16 -0
  109. package/dist/forge-payload/.schemas/migrations.json +359 -18
  110. package/dist/forge-payload/commands/health.md +29 -0
  111. package/dist/forge-payload/commands/rebuild.md +143 -15
  112. package/dist/forge-payload/commands/update.md +28 -27
  113. package/dist/forge-payload/hooks/preflight-session.cjs +99 -0
  114. package/dist/forge-payload/init/phases/phase-3-materialize.md +18 -5
  115. package/dist/forge-payload/integrity.json +7 -6
  116. package/dist/forge-payload/meta/fragments/tool-discipline.md +1 -1
  117. package/dist/forge-payload/meta/personas/meta-architect.md +1 -1
  118. package/dist/forge-payload/meta/personas/meta-bug-fixer.md +1 -1
  119. package/dist/forge-payload/meta/personas/meta-collator.md +7 -7
  120. package/dist/forge-payload/meta/personas/meta-engineer.md +1 -1
  121. package/dist/forge-payload/meta/personas/meta-orchestrator.md +1 -1
  122. package/dist/forge-payload/meta/personas/meta-supervisor.md +1 -1
  123. package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +1 -1
  124. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +1 -1
  125. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +1 -1
  126. package/dist/forge-payload/meta/workflows/_fragments/iron-laws.md +1 -1
  127. package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +2 -2
  128. package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +11 -2
  129. package/dist/forge-payload/meta/workflows/meta-approve.md +6 -7
  130. package/dist/forge-payload/meta/workflows/meta-bug-triage.md +12 -9
  131. package/dist/forge-payload/meta/workflows/meta-collate.md +5 -7
  132. package/dist/forge-payload/meta/workflows/meta-commit.md +5 -6
  133. package/dist/forge-payload/meta/workflows/meta-enhance.md +5 -5
  134. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +35 -11
  135. package/dist/forge-payload/meta/workflows/meta-implement.md +15 -7
  136. package/dist/forge-payload/meta/workflows/meta-migrate.md +13 -14
  137. package/dist/forge-payload/meta/workflows/meta-new-sprint.md +3 -3
  138. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +138 -39
  139. package/dist/forge-payload/meta/workflows/meta-plan-sprint.md +6 -6
  140. package/dist/forge-payload/meta/workflows/meta-plan-task.md +12 -6
  141. package/dist/forge-payload/meta/workflows/meta-retro.md +4 -4
  142. package/dist/forge-payload/meta/workflows/meta-retrospective.md +4 -4
  143. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +12 -11
  144. package/dist/forge-payload/meta/workflows/meta-review-plan.md +12 -11
  145. package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +3 -3
  146. package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +3 -3
  147. package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +6 -6
  148. package/dist/forge-payload/meta/workflows/meta-update-implementation.md +2 -2
  149. package/dist/forge-payload/meta/workflows/meta-update-plan.md +2 -2
  150. package/dist/forge-payload/meta/workflows/meta-validate.md +9 -9
  151. package/dist/forge-payload/schemas/config.schema.json +2 -3
  152. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  153. package/dist/forge-payload/schemas/event.schema.json +16 -0
  154. package/dist/forge-payload/schemas/structure-manifest.json +75 -73
  155. package/dist/forge-payload/skills/refresh-kb-links/SKILL.md +14 -7
  156. package/dist/forge-payload/tools/banners.cjs +29 -10
  157. package/dist/forge-payload/tools/check-structure.cjs +88 -7
  158. package/dist/forge-payload/tools/collate.cjs +48 -2
  159. package/dist/forge-payload/tools/manage-config.cjs +5 -7
  160. package/dist/forge-payload/tools/parse-gates.cjs +73 -1
  161. package/dist/forge-payload/tools/postflight-gate.cjs +298 -0
  162. package/dist/forge-payload/tools/preflight-gate.cjs +47 -0
  163. package/dist/forge-payload/tools/substitute-placeholders.cjs +5 -4
  164. package/dist/forge-payload/tools/verify-phase.cjs +17 -0
  165. package/package.json +2 -2
  166. package/dist/bin/forgecli.d.ts +0 -2
  167. package/dist/bin/forgecli.js +0 -6
  168. package/dist/bin/forgecli.js.map +0 -1
  169. package/dist/extensions/forgecli/config-tui/index.d.ts +0 -5
  170. package/dist/extensions/forgecli/config-tui/index.js +0 -5
  171. package/dist/extensions/forgecli/config-tui/index.js.map +0 -1
  172. package/dist/extensions/forgecli/loaders/persona-skill-loader.d.ts +0 -45
  173. package/dist/extensions/forgecli/loaders/persona-skill-loader.js +0 -227
  174. package/dist/extensions/forgecli/loaders/persona-skill-loader.js.map +0 -1
  175. package/dist/extensions/forgecli/loaders/template-render.d.ts +0 -20
  176. package/dist/extensions/forgecli/loaders/template-render.js +0 -85
  177. package/dist/extensions/forgecli/loaders/template-render.js.map +0 -1
  178. package/dist/extensions/forgecli/loaders/workflow-loader.d.ts +0 -41
  179. package/dist/extensions/forgecli/loaders/workflow-loader.js +0 -164
  180. package/dist/extensions/forgecli/loaders/workflow-loader.js.map +0 -1
  181. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +0 -446
  182. package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +0 -928
  183. package/dist/forge-payload/.base-pack/workflows/run_sprint.md +0 -225
package/CHANGELOG.md CHANGED
@@ -7,6 +7,197 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.0.20] — 2026-06-04
11
+
12
+ Release roll-up of the post-S30 stabilization train (1.0.15–1.0.19) plus the
13
+ dashboard/status-bar TUI pass. Pairs with forge plugin **v1.2.17**.
14
+
15
+ ### Fixed
16
+
17
+ - **Status-bar/dashboard TUI pass** (Iron-Laws compliance follow-ups):
18
+ Focusable/theming/width-safety/timer guards and consolidated entry;
19
+ ↑/Esc deactivation via the input router with ○ focus indicator;
20
+ ○/● colour carries node status (accent=running, success=completed,
21
+ error=failed); spinner shows activity without a redundant node glyph.
22
+
23
+ ## [1.0.19] — 2026-06-04
24
+
25
+ ### Changed
26
+
27
+ - **Halt-advisor model = the heavy model the runtime resolves point-in-time —
28
+ the `advisorModel` config entry is removed.** Supersedes the 1.0.18 advisor
29
+ resolution. There is no dedicated knob: "heavy" is the approve/architect
30
+ slot resolved through the existing routing cascade (L4 phase override →
31
+ project → user/global → default), exactly as the approve phase itself would
32
+ resolve; when the cascade bottoms out at inherit, the session's current
33
+ model (pi default) is used. This mirrors the Claude Code plugin route, where
34
+ the advisor runs on the opus-class session model. The `advisorModel` key is
35
+ dropped from `GlobalConfig`/`ProjectConfig`/`MergedConfig`, the config
36
+ merge, and `forge-cli-schema.json` (it was never exposed in `/forge:config`
37
+ and never set in practice).
38
+
39
+ ## [1.0.18] — 2026-06-04
40
+
41
+ Coordinated release matching forge plugin **v1.2.17** (postflight-gate
42
+ false-halt fixes). Bundles the dashboard Iron-Laws compliance pass
43
+ (Focusable, theming, width-safety, timer guards, consolidated entry).
44
+
45
+ ### Fixed
46
+
47
+ - **Halt advisor no longer runs on `anthropic/undefined`.** pi's
48
+ `ModelRegistry.getAvailable()` returns Model objects whose identifier is
49
+ `.id`, not `.model`; the blind `available[0] as PersonaModel` cast produced
50
+ `{ provider, model: undefined }` and the advisor dispatched against a
51
+ nonexistent model (observed on the CART-S03-T01 halt). `resolveAdvisorModel`
52
+ now maps both shapes, skips entries without a usable identifier, and —
53
+ before falling back to the registry at all — prefers the **session's
54
+ current model**, which is provider-neutral and known-good. Config
55
+ `advisorModel` slot still wins when set.
56
+
57
+ ## [1.0.17] — 2026-06-04
58
+
59
+ ### Fixed
60
+
61
+ - **Context-governor dedup hardening — reads-only, error-aware, re-queryable.**
62
+ CART-S02-T04 transcripts surfaced three Rule-1 defects:
63
+ 1. *Write masking (serious):* the dedup key carried no read/write
64
+ distinction, so a `forge_artifact` WRITE confirmation was replaced by a
65
+ pointer registered by an earlier READ of the same path — a failed write
66
+ would have been silently masked. Dedup now applies only to read-like
67
+ commands (`read`/`get*`/`list`/`describe`/`template`); every mutation
68
+ result passes through verbatim, and the command participates in the key
69
+ (read vs list never conflate).
70
+ 2. *Impossible re-query:* the pointer said "re-query if needed", but every
71
+ re-query of the same key returned another pointer — agents responded by
72
+ switching to bash `cat` workarounds (wasted turns, path-guess errors).
73
+ Pointers now ALTERNATE: served at most once in a row, the immediately
74
+ repeated call is honoured with full (still trimmed/clamped) content.
75
+ Wording updated to "call again to re-fetch".
76
+ 3. *Error interaction:* errored results were registered and replaced by
77
+ pointers. Error results now bypass all curation — never registered,
78
+ never replaced, always verbatim.
79
+
80
+ ## [1.0.16] — 2026-06-03
81
+
82
+ Coordinated release matching forge plugin **v1.2.15**.
83
+
84
+ ### Fixed
85
+
86
+ - **Zero-usage "husk" turns no longer corrupt phase telemetry.** Failed/retry
87
+ turns emit assistant messages with all-zero usage; the accumulator in
88
+ `forge-subagent.ts` counted them as turns and — because
89
+ `usage.totalTokens ?? prev` treats `0` as non-nullish — overwrote the
90
+ running `contextTokens` with 0, which is why every aborted phase transcript
91
+ reported `contextTokens: 0`. Husk turns are now excluded from `turns` and
92
+ the context figure only updates on a positive total.
93
+
94
+ - **Incomplete (cancelled/failed) phase attempts now emit their billed
95
+ tokens.** The cancel and halt-on-failure branches in `run-task.ts` and
96
+ `fix-bug.ts` returned without emitting a phase event, so the provider-billed
97
+ tokens of aborted attempts never reached the store — collate's COST_REPORT
98
+ under-counted real spend (CART-S02-T03 baseline: 259,950 tokens invisible
99
+ across two aborted plan passes). New `emitIncompletePhaseEvent` helper emits
100
+ the canonical phase event with `verdict: "aborted"` (cancel) /
101
+ `"failed"` (halt) and the captured partial usage; zero-token attempts are
102
+ skipped (no husk noise). Pairs with forge plugin v1.2.15, whose COST_REPORT
103
+ gains an **Incomplete Passes** section.
104
+
105
+ ## [1.0.15] — 2026-06-03
106
+
107
+ ### Fixed
108
+
109
+ - **forge-compress savings prints no longer corrupt the `/forge:dashboard`
110
+ TUI.** `compressWithTelemetry` (forge-tools.ts) and the `forge_artifact`
111
+ read path wrote dim `[forge-compress] N→M tok (X% saved)` lines straight to
112
+ stderr — raw ANSI under an active TUI overlay garbles the screen. The prints
113
+ were redundant: the same stats already flow through tool-result
114
+ `details.compression` → viewport-events → session-registry/orchestrator-tree
115
+ → the dashboard's aggregate `⇌Nt` savings suffix. Removed both stderr writes;
116
+ the dashboard remains the single surface for compression savings.
117
+
118
+ - **Context governor was dormant in production — Mechanisms A–D never reached
119
+ phase subagent sessions.** Benchmarking CART-S02-T03 under
120
+ `FORGE_CTX_GOVERNOR=1` showed zero curation markers and no token reduction.
121
+ Three wiring defects, all in the FORGE-S30-T07 integration layer (the
122
+ mechanisms themselves were correct):
123
+ 1. `registerHookDispatcher(pi, …, governor)` in `index.ts` only governs the
124
+ **parent** session; every phase runs in an isolated `createAgentSession`
125
+ subagent the parent's hooks never see.
126
+ 2. `resolvePhaseKey` probed `ctx.persona`/`ctx.phase`, which pi never
127
+ populates (and `FORGE_PHASE_KEY` is read but never set) — so every phase
128
+ resolved the inert `default` policy.
129
+ 3. The policy table only shipped `architect/plan` and `engineer/review`,
130
+ matching **no** real `${personaNoun}/${role}` pipeline key; and
131
+ `createGovernor` was constructed without `steerFn`/`summarySentinel`/
132
+ `compactFn`, leaving Mechanism B steer, Mechanism C shed, and the
133
+ Mechanism E proactive trigger unreachable.
134
+
135
+ Fix: new `buildGovernorFactory({ phaseKey, cwd })` (`context-governor.ts`)
136
+ is constructed **per phase** by `run-task.ts` — which knows the
137
+ `${personaNoun}/${role}` key — and injected into each subagent session via
138
+ `extensionFactories`, alongside a `buildForgeCompactionFactory` now carrying
139
+ warm-tier path opts (`cwd`/`phaseKey`/`entityId`/`sprintId` — previously
140
+ threaded from `index.ts` with no opts, so warm-tier merge was dead). The
141
+ factory wires `steerFn` → `pi.sendUserMessage(…, { deliverAs: "steer" })`,
142
+ `summarySentinel` → read-only `.forge/store/{tasks,bugs}/<id>.json`
143
+ `summaries[<phase>]` probe, and `compactFn` → `ctx.compact()`. The policy
144
+ table now ships entries for all six governed pipeline keys (`engineer/plan`,
145
+ `supervisor/review-plan`, `engineer/implement`, `supervisor/review-code`,
146
+ `qa-engineer/validate`, `architect/approve`) with `read` budgets kept more
147
+ generous than `bash` so file reads aren't over-clamped; `writeback`/`commit`
148
+ stay on `default`. Flag-gating is unchanged (`FORGE_CTX_GOVERNOR=1`), and
149
+ `registerRunTask`/`registerRunSprint` keep `extensionFactories` as a test
150
+ seam.
151
+
152
+ ## [1.0.14] — 2026-06-03
153
+
154
+ Coordinated release matching forge plugin **v1.2.14**.
155
+
156
+ ### Fixed
157
+
158
+ - **A missing verdict now routes through the halt-recovery advisor instead of a
159
+ bare escalation.** In `run-task.ts` (and `fix-bug.ts`) the review-phase
160
+ `verdict === "missing"` branch early-returned `status:"failed"` with a raw
161
+ *"Escalating"* notify **before** reaching the postflight-gate → `runHaltAdvisor`
162
+ hand-off — so a subagent that completed but failed to write its phase summary
163
+ surfaced as an undiagnosed halt. Review-phase workflows declare no `outputs`
164
+ block, so the postflight gate is a pass-through for them and the `readVerdict`
165
+ check is the effective gate. The branch now synthesizes a `GateFailureData`
166
+ (`reasonCode: "verdict-missing"`) and invokes `runHaltAdvisor` (the same path
167
+ the gate-failure branches use), returning `"halted"`, so the strongest
168
+ configured model diagnoses the missing-summary cause. Best-effort, non-fatal.
169
+ Regression test added (`run-task.test.ts` Test 1d).
170
+
171
+ ## [1.0.11] — 2026-06-03
172
+
173
+ Coordinated release matching forge plugin **v1.2.7** (FORGE-S29 vendored-tools
174
+ sprint — retire FORGE_ROOT via vendored `.forge/tools/`).
175
+
176
+ ### Added
177
+
178
+ - **`forge:rebuild tools` handler (`runRebuildTools`)** — copies bundled tools
179
+ (`*.cjs`, `lib/`) from the forge-cli payload into `.forge/tools/` of the
180
+ target project. Accepts optional `singleTool` for sub-target re-copy.
181
+ Tested in `test/extensions/forgecli/regenerate.test.ts`.
182
+ - **`forge:rebuild tools` wired in `phase4-register.ts`** — `tools` category
183
+ registered in the rebuild handler; single-tool sub-targets pass through as
184
+ `singleTool`.
185
+ - **`migration-engine.ts` `regenerate:tools`** — `applyRegenerate` now handles
186
+ the `tools` category by delegating to `runRebuildTools`; migrations that
187
+ include `regenerate:["tools"]` (introduced in plugin v1.2.3–v1.2.7) are
188
+ applied automatically.
189
+ - **`project-orientation.ts` tools-version check** — `checkForgeTools` added;
190
+ reads `.forge/tools/.forge-tools-version` and reports stale/absent state so
191
+ `forge:health` can surface the vendored-tools staleness check (mirrors
192
+ plugin-side check introduced in v1.2.5).
193
+ - **`tmp-smoke.sh` E2E-T05-TOOLS-VENDORED gate** — new smoke assertion
194
+ confirms `.forge/tools/` is populated (`.forge-tools-version` marker present)
195
+ after `/forge:init` runs with the v1.2.x+ plugin.
196
+
197
+ ### Changed
198
+
199
+ - `forge-subagent.ts` — minor hardening (no observable behaviour change).
200
+
10
201
  ## [1.0.10] — 2026-05-31
11
202
 
12
203
  Coordinated release matching forge plugin **v1.0.10** (the issue #111
@@ -5,6 +5,217 @@ Format: newest first. Breaking changes are marked **△ Breaking**.
5
5
 
6
6
  ---
7
7
 
8
+ ## [1.2.17] — 2026-06-04
9
+
10
+ ### Fixed
11
+
12
+ - **Postflight output guard no longer false-halts every phase.** The S26-T19
13
+ guards were dormant until the v1.2.16 base-pack recompile activated them;
14
+ their first live firing halted CART-S03-T01's plan phase despite full
15
+ success. Two deterministic bugs in `postflight-gate.cjs`:
16
+ 1. *Require predicates never resolved* — the outputs blocks use bare record
17
+ paths (`summaries.plan.verdict`) while the CLI passes
18
+ `state = { task: record }`; every bare require read `undefined` and
19
+ failed unconditionally. `readField` now falls back to the entity record
20
+ (`state.task` / `state.bug`) after the direct walk.
21
+ 2. *Artifact paths missed the `sprints/` segment* — `{sprint}` was
22
+ substituted with the bare sprintId, probing
23
+ `<engineering>/<sprintId>/<taskId>` instead of the canonical
24
+ `<engineering>/sprints/<sprintId>/<taskId>`. New `buildSubstitutions()`
25
+ resolves `{sprint}` to the path segment under engineering
26
+ (`sprints/<id>` for tasks, `bugs` for bug records).
27
+
28
+ ---
29
+
30
+ ## [1.2.16] — 2026-06-04
31
+
32
+ ### Fixed
33
+
34
+ - **Review/validate phases no longer self-limit on iteration count**
35
+ ([forge-engineering#34](https://github.com/Entelligentsia/forge-engineering/issues/34)).
36
+ The standalone-invocation fallback in `review_plan` / `review_code` /
37
+ `validate_task` read `maxReviewIterations` from `.forge/config.json` —
38
+ producing a *"Key not found"* error on every review phase and, worse,
39
+ duplicating a protection the orchestrator already owns. Loop budgeting and
40
+ termination are solely the orchestrator's job (`run-task` enforces
41
+ `maxIterations` deterministically; exhaustion escalates to a human), and a
42
+ deliberate human standalone re-run **is** the escape hatch for stuck items —
43
+ a phase consulting its own cap could refuse exactly that recovery. Workflows
44
+ now treat user-invoked runs as iteration 1 with no limit and never read an
45
+ iteration cap from config; orchestrated runs continue to take `N of M` from
46
+ the orchestrator-injected Review Loop Context block. Prompt-text only.
47
+
48
+ ---
49
+
50
+ ## [1.2.15] — 2026-06-03
51
+
52
+ ### Fixed
53
+
54
+ - **COST_REPORT now accounts incomplete (aborted/failed) phase attempts.**
55
+ Cancelled and halted phase attempts bill real provider tokens, but their
56
+ events arrived as token-less husks — the CART-S02-T03 benchmark baseline
57
+ under-counted by exactly 259,950 tokens across two aborted plan passes.
58
+ forge-cli ≥1.0.16 now emits phase events with `verdict: "aborted"` (user
59
+ cancel) / `"failed"` (halt-on-failure) carrying the captured partial usage;
60
+ `collate.cjs` adds an **Incomplete Passes** section to COST_REPORT (task,
61
+ phase, outcome, tokens per attempt). Per-Task / Per-Role / Model-Split
62
+ totals sum verdict-agnostically, so the previously-invisible spend lands in
63
+ the totals automatically once events arrive. Report-layer only — no schema
64
+ change (`verdict` was already a free-string event field); older forge-cli
65
+ versions simply produce no incomplete-pass events.
66
+
67
+ ---
68
+
69
+ ## [1.2.14] — 2026-06-03
70
+
71
+ ### Fixed
72
+
73
+ - **Corrected the `set-summary` / `set-bug-summary` call signature in the review and triage workflows.** `meta-review-implementation.md`, `meta-review-plan.md`, and `meta-bug-triage.md` documented a `forge_store` invocation with named `entity`/`id`/`phase` fields — `forge_store({ command:"set-summary", entity:"task", id:"{taskId}", phase:"code_review" })` — but the `forge_store` tool schema accepts only `{ command, args[] }`. Handed a signature that does not exist, subagents mis-built `args` and landed the record id in the phase slot; the phase-ownership guard rejected it (`expected summary key 'code_review'`), `summaries.code_review` was never written, and the orchestrator halted the task as *"verdict missing"*. All sites now use the canonical positional form `forge_store({ command:"set-summary", args:["{taskId}", "code_review"] })` plus a one-line signature reminder; `_fragments/store-cli-verbs.md` now documents the `forge_store { command, args[] }` shape and the "id in both slots" failure. Also fixed a `forge_store read` call in `meta-bug-triage.md` that used the same invalid named form. Prompt-text only — no tool or schema change.
74
+
75
+ **Regenerate:** workflows:review_code workflows:review_plan workflows:bug-triage
76
+
77
+ > Manual: Run `/forge:update`, then `/forge:rebuild workflows` to refresh `.forge/workflows/`.
78
+
79
+ ---
80
+
81
+ ## [1.2.3] — 2026-06-02
82
+
83
+ ### Fixed
84
+
85
+ - **Hardened `FORGE_ROOT` / `.forge/config.json` resolution in the packaged JS workflow drivers.** A friction trace of a real `/fix-bug` run found phase subagents systematically probing `../.forge/config.json` (the **parent** directory — 5 of 11 subagents, blocked as "path escapes project root") and one invoking the preflight gate with an unexported `$FORGE_ROOT` that expanded to `''` → `Cannot find module '/tools/preflight-gate.cjs'`. Root cause: the per-phase subagent preamble said only *"Resolve FORGE_ROOT from .forge/config.json paths.forgeRoot"* — no cwd anchor, and no instruction to **export** `$FORGE_ROOT`, even though every command used it as a shell variable. Replaced all ~23 preamble sites across `wfl-run-task.js` / `wfl-run-sprint.js` / `wfl-fix-bug.js` with a directive that (a) anchors the config to `./.forge/config.json` in the current working directory ("never a parent directory"), (b) tells the agent to **export** `FORGE_ROOT`, and (c) STOPs if `$FORGE_ROOT` is empty or `$FORGE_ROOT/tools` is missing. Added a regression guard in `workflows-js-drift.test.cjs`. Prompt-text only — no orchestration-logic change.
86
+
87
+ **Regenerate:** workflows-js:wfl-run-task, workflows-js:wfl-run-sprint, workflows-js:wfl-fix-bug
88
+
89
+ > Manual: Run `/forge:update`, then `/forge:rebuild workflows-js` to refresh `.claude/workflows/wfl-*.js`.
90
+
91
+ ---
92
+
93
+ ## [1.2.2] — 2026-06-02
94
+
95
+ ### Fixed
96
+
97
+ Three orchestration-logic edge-case bugs in the packaged JS workflow drivers, found by an adversarial review of the v1.2.1 packaged workflows (all are runtime-only — `node --check` and shape tests can't catch them):
98
+
99
+ - **`wfl-run-sprint.js` — re-dispatch passed an unhonored `resumeFrom`.** The respawn guard called `workflow('wfl:run-task', { taskId, resumeFrom })`, but `wfl:run-task` parses only the task id, so `resumeFrom` was silently dropped. Removed the misleading arg and corrected the comment/log: the retry is a clean re-dispatch that resumes from the task's store state (completed phases are skipped by their pre-flight gates).
100
+ - **`wfl-run-sprint.js` — `blocked` tasks were force-escalated.** A skipped child (`{skipped, taskStatus}`) was treated as non-terminal unless its status was in `{committed, abandoned, escalated}`, so a legitimately `blocked` task (waiting on a dependency) was re-dispatched and then escalated after two no-op attempts. A skipped child is now terminal-acceptable regardless of `taskStatus`.
101
+ - **`wfl-fix-bug.js` — finalize null-dispatch reported a clean fix.** The finalize dispatch had no null guard, so a skipped/errored finalize (`agent()` returns `null`) fell through `finalizeResult?.escalated` and the run returned `bugStatus:'fixed', escalated:false` even though collate + the finalize gate never ran. It now escalates on a null finalize while preserving `bugStatus:'fixed'` (commit already wrote it).
102
+
103
+ Added text-contract regression guards in `workflows-js-drift.test.cjs`. Deferred to a follow-up (filed for triage): revision-counter/eventId attribution (`wfl-run-task`), count-bucket taxonomy + `full-parallel` dependency ordering (`wfl-run-sprint`), and two MINORs in `wfl-fix-bug` (`phase('Pipeline')` grouping, `escalateBug` `bugId`).
104
+
105
+ **Regenerate:** workflows-js:wfl-run-sprint, workflows-js:wfl-fix-bug
106
+
107
+ > Manual: Run `/forge:update`, then `/forge:rebuild workflows-js` to refresh `.claude/workflows/wfl-run-sprint.js` and `wfl-fix-bug.js`.
108
+
109
+ ---
110
+
111
+ ## [1.2.1] — 2026-06-02
112
+
113
+ ### Fixed
114
+
115
+ - **`wfl-fix-bug.js` could never launch — invalid meta.** The fix-bug JS driver declared its meta with `desc:` and `steps:` instead of `description:` and `phases:`. The Workflow runtime rejects a missing/empty `meta.description` (`"meta.description must be a non-empty string"`), and the named-workflow registry silently skipped it — so `/forge:fix-bug` (and any `/<prefix>:fix-bug`) dispatched `workflow('wfl:fix-bug', …)` to a workflow that wasn't registered. This shipped latent since the driver was authored and was exposed by the v1.2.0 prose retirement (which removed the `fix_bug.md` fallback). Renamed `desc → description` and `steps → phases` (with a `Resolve` phase) to match `wfl-run-task.js` / `wfl-run-sprint.js`. Added a meta-contract regression guard in `workflows-js-drift.test.cjs` asserting every JS driver exposes `name` + non-empty `description` + `phases`.
116
+
117
+ **Regenerate:** workflows-js:wfl-fix-bug
118
+
119
+ > Manual: Run `/forge:update`, then `/forge:rebuild workflows-js` to refresh `.claude/workflows/wfl-fix-bug.js`. `/<prefix>:fix-bug` then launches `wfl:fix-bug` correctly.
120
+
121
+ ---
122
+
123
+ ## [1.2.0] — 2026-06-02
124
+
125
+ ### Changed
126
+
127
+ - **Retired LLM orchestration prose — the JS drivers are the only truth.** The deterministic JS orchestrators (`.claude/workflows/wfl-run-task.js`, `wfl-run-sprint.js`, `wfl-fix-bug.js` — category `workflows-js`) fully replace the prose workflows `orchestrate_task.md`, `run_sprint.md`, and `fix_bug.md`. `/forge:run-task`, `/forge:run-sprint`, and `/forge:fix-bug` already dispatch to them via `workflow(wfl:*)`. The three prose orchestrators are no longer built into the base-pack, no longer generated into `.forge/workflows/`, and no longer tested:
128
+ - `build-base-pack.cjs` and `build-manifest.cjs` drop the three workflow mappings (`structure-manifest.json` / `enum-catalog.json` regenerated).
129
+ - `workflow-gen-plan.json` goes 16 → 15 entries (drops `fix_bug`).
130
+ - The `/forge:rebuild` orchestration-generation step and the `generate-orchestration.md` rulebook are removed; the base-pack `workflows/{orchestrate_task,run_sprint,fix_bug}.md` files are deleted.
131
+ - The `orchestrators-retired` and `orchestrator-base-pack-parity` drift tests are removed; `base-pack-byte-budget`, `build-base-pack`, `build-manifest`, and `placeholder-coverage` tests updated to the new counts. Only the JS drivers (`wfl-*` tests + `workflows-js-drift`) are tested.
132
+ - `meta-orchestrate.md` and `meta-fix-bug.md` are **kept in `meta/`** as reference specs only — not built, not generated, not tested.
133
+
134
+ **Regenerate:** workflows, workflows-js
135
+
136
+ > Manual: Run `/forge:update` — its `delete-workflow` scan removes the retired `orchestrate_task.md` / `run_sprint.md` / `fix_bug.md` orphans from `.forge/workflows/` (prompting before deleting any you have hand-edited). `/forge:rebuild` only regenerates and clears manifest entries; it does **not** delete files on disk. Orchestration runs through `.claude/workflows/wfl-*.js` — no other action needed.
137
+
138
+ ---
139
+
140
+ ## [1.1.2] — 2026-06-02
141
+
142
+ ### Fixed
143
+
144
+ - **`collate.cjs` silently skipped task `INDEX.md` when a task's store `path` pointed at a file.** `resolveTaskDir` Case 1 returned `basename(task.path)` assuming `path` was the task *directory*. For records whose `path` pointed at a file inside the dir (e.g. `.../FORGE-S22-T04/PLAN.md`), it returned `PLAN.md`; the downstream `existsSync(sprintDir/PLAN.md)` check then failed and the task's `INDEX.md` was never written. Symptom: 18 task `INDEX.md` files across FORGE-S22/S23 were missing despite valid store records. Case 1 now verifies its candidate resolves to a real directory on disk and otherwise falls through to the filesystem scan, which resolves the dir by `taskId`. Two regression tests added.
145
+
146
+ **Regenerate:** tools:collate
147
+
148
+ > Manual: After `/forge:update`, run `/forge:collate` (or `/forge:rebuild`) to regenerate any task `INDEX.md` files that were previously skipped.
149
+
150
+ ---
151
+
152
+ ## [1.1.1] — 2026-06-02
153
+
154
+ ### Changed
155
+
156
+ - **`wfl-run-task.js` LOW-polish orchestration parity (FORGE-S28-T09).** Five low-severity gaps addressed:
157
+ - **#19 `task_skipped` event.** `emitSkip()` agent helper added. When the pre-task SKIP_STATUS guard fires (task is `blocked`, `escalated`, `committed`, or `abandoned`), the driver now emits a `task-dispatch/action:skip` event so downstream collators have a complete per-task accounting.
158
+ - **#20 `writeback` in default pipeline.** The hardcoded default pipeline prompt in the resolve-agent now includes `writeback` (mapping to `update_implementation.md`) between `approve` and `commit`, matching the full `orchestrate_task.md §3` default.
159
+ - **#21 Progress-Monitor IPC documented as structural limitation.** A comment in the `SIDE-EFFECT OWNERSHIP` section explains that IPC with a Progress-Monitor is a host-layer concern (the Pi/forge-cli TS layer must open the pipe before spawning the Workflow tool); no implementation in the JS driver is possible or correct.
160
+ - **#22 `BANNER_MAP` constant.** Both `wfl-run-task.js` and `wfl-run-sprint.js` gain a `BANNER_MAP` constant mapping roles/phases to persona banner labels. The `wfl-run-task` phase-start log line now emits `[forge-architect]` / `[forge-engineer]` / `[forge-validator]` for visual phase identity.
161
+ - **#24 already complete** — orchestrator-side eventId composition was wired in T05 (Gap #14). No further change.
162
+
163
+ - **`wfl-run-sprint.js` LOW-polish orchestration parity (FORGE-S28-T09).**
164
+ - **#22 `BANNER_MAP` constant** — as above.
165
+ - **#23 sprint→`active` before wave loop.** An agent step is added between the sprint-start event and `phase('Execute')` to call `store-cli update-status sprint <id> active`, mirroring `run_sprint.md Step 1`. Without this the sprint stayed in `planned` status during execution.
166
+
167
+ ### Fixed
168
+
169
+ - **`forge/package.json` no-npm-packages test regression.** An accidental `"dependencies"` field referencing a local `@entelligentsia/forgecli` tgz had been left in `forge/package.json`, causing one failing test in the `placeholder-coverage` suite. Removed.
170
+
171
+ **Regenerate:** `workflows-js:wfl-run-task`, `workflows-js:wfl-run-sprint`
172
+
173
+ > Manual: run `/forge:update` then `/forge:rebuild workflows-js` to refresh `.claude/workflows/wfl-*.js`.
174
+
175
+ ---
176
+
177
+ ## [1.1.0] — 2026-06-02
178
+
179
+ ### Added
180
+
181
+ - **`workflows-js` is now a first-class rebuild/update target.** The JS orchestration workflows under `.claude/workflows/` (`wfl-run-task.js`, `wfl-run-sprint.js`, `wfl-fix-bug.js`) are verbatim copies from the plugin base-pack, but were previously materialized **only** at `/forge:init` time — there was no `/forge:rebuild` or `/forge:update` path to refresh them, so fixes to a base-pack JS workflow could not reach existing installs. `/forge:rebuild workflows-js` (and the granular `workflows-js:wfl-run-task` sub-target) now performs a deterministic verbatim copy + manifest record, `/forge:update` recognises `workflows-js` as a regenerate target, and `build-manifest.cjs` declares a `workflows-js` namespace so `/forge:health` / `check-structure` cover these files. Modeled on the existing `workflows:_fragments` verbatim-copy pattern — no LLM, no placeholder substitution.
182
+
183
+ **Regenerate:** `workflows-js:wfl-run-task`
184
+
185
+ ### Fixed
186
+
187
+ - **FORGE-BUG-041 — `wfl-run-task.js` registered an invalid `StructuredOutput` schema, escalating every task.** `emitRetryEvent` and `mergeSidecar` passed `schema: { type: 'string' }` to `agent()`. The workflow runtime registers the `StructuredOutput` tool using that schema as its `input_schema`, but the Anthropic API rejects any tool whose `input_schema.type` is not `'object'` (HTTP 400). The subagent could therefore never call `StructuredOutput`, and the workflow threw after the nudge limit. Because `mergeSidecar` runs after every phase's complete event, each `wfl:run-task` task succeeded its plan phase then died at the post-phase sidecar merge — so every task in a `wfl:run-sprint` run escalated immediately after planning. Fixed by dropping the invalid `schema` option from both calls (their return value is discarded; this matches the sibling schemaless task-dispatch emit agent). Added a regression guard to `wfl-run-task-parity.test.cjs`. The `workflows-js` rebuild wiring above lets `/forge:update` auto-deliver this fix to existing installs.
188
+
189
+ ---
190
+
191
+ ## [1.0.11] — 2026-05-31
192
+
193
+ ### Added
194
+
195
+ - **`forge-preflight.cjs` — aggregated pre-dispatch glue tool (A1).** Consolidates all deterministic pre-dispatch checks (entity read, status gate, sprint context, persona load) into a single blob read, eliminating ~20 hand-run tool round-trips from the orchestrator preamble. The orchestrator now opens every task with a single `forge-preflight --task <id>` call and gets a structured blob covering status, sprint context, dependency chain, and persona directive.
196
+
197
+ - **`preflight-session.cjs` — SessionStart hook pre-warming (A1).** New hook wired into `hooks.json` that runs on session start for `run-task`, `fix-bug`, and `run-sprint` contexts. Pre-warms the preflight blob so the first call into the orchestrator arrives with context already loaded; fails open (no-op) when `.forge/` is absent.
198
+
199
+ - **`token-forensics.cjs` — message.id dedup harness (NH2).** Stand-alone diagnostic tool for correct through-model token accounting. Deduplicates by `message.id` to prevent double-counting when the same API response appears in multiple cost-reporting paths.
200
+
201
+ ### Changed
202
+
203
+ - **`banners.cjs` gains `--quiet` flag; `orchestrate_task` loop uses it (A3).** Verbose banner output no longer accretes in the transcript across the orchestration loop. Passing `--quiet` suppresses the decorative banner sections; the orchestrator loop now calls `banners --quiet` by default.
204
+
205
+ - **`meta-orchestrate.md` state-ledger compaction discipline (A4).** `/compact` is now instructed to retain the one-line `[checkpoint]` ledger entry and shed raw tool output. Prevents state-ledger loss during long orchestration sessions.
206
+
207
+ - **`meta-fix-bug.md` preflight and digest treatment ported from orchestrate_task (NH1).** A1 preflight cross-reference, A3 `--quiet` flag treatment, and spurious cost-bullet removal applied to the bug-fix workflow glue so fix-bug sessions receive the same waste-reduction treatment as run-task sessions.
208
+
209
+ ### Not shipped in this release
210
+
211
+ - **A2 (context-pack / forge-compress port)** — escalated; not included. Users will not receive the context-pack or persona-pack build changes in this release. A2 remains open for a follow-on sprint.
212
+
213
+ **Regenerate:** tools:forge-preflight, hooks:preflight-session, workflows:orchestrate_task, workflows:fix_bug, tools:banners, tools:token-forensics
214
+
215
+ > Manual: run `/forge:update` to copy the updated tools and hooks into your project.
216
+
217
+ ---
218
+
8
219
  ## [1.0.10] — 2026-05-31
9
220
 
10
221
  ### Changed
package/dist/bin/forge.js CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"config-layer.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/config-layer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-layer.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/config-layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
+ /**
3
+ * Structured Forge facts extracted from messagesToSummarize.
4
+ * All fields are arrays of strings for serialization into the compaction summary.
5
+ */
6
+ export interface ForgeFactSummary {
7
+ /** FORGE-X-Y / FORGE-X-Y-TN patterns extracted from message text. */
8
+ storeIds: string[];
9
+ /** Lines containing [x] or [ ] checkbox patterns (Markdown task lists). */
10
+ acStateLines: string[];
11
+ /** Lines matching → <status> or update-status ... status <value>. */
12
+ transitionLines: string[];
13
+ /** File refs: engineering/, .forge/, *.ts/*.md/*.cjs/*.json paths. */
14
+ fileRefs: string[];
15
+ /** Text blocks containing [FRICTION] or type:friction. */
16
+ frictionBlocks: string[];
17
+ }
18
+ /**
19
+ * Options for buildForgeCompactionFactory.
20
+ */
21
+ export interface ForgeCompactionOptions {
22
+ /**
23
+ * Absolute path to the project CWD (for warm-tier summary file lookup).
24
+ * When omitted, warm-tier merge is skipped unless summaryReader is provided.
25
+ */
26
+ cwd?: string;
27
+ /**
28
+ * Phase key for summary filename resolution (e.g. "architect/plan").
29
+ * When omitted, warm-tier merge is skipped.
30
+ */
31
+ phaseKey?: string;
32
+ /**
33
+ * Task/entity ID for summary path resolution (e.g. "FORGE-S30-T09").
34
+ * When omitted, warm-tier merge is skipped.
35
+ */
36
+ entityId?: string;
37
+ /**
38
+ * Sprint ID for summary path resolution (e.g. "FORGE-S30").
39
+ * When omitted, warm-tier merge is skipped.
40
+ */
41
+ sprintId?: string;
42
+ /**
43
+ * Injected summary reader (test seam). Receives the resolved summary
44
+ * file path (empty string when path resolution is skipped) and returns
45
+ * the raw JSON string or null. Defaults to fs.readFileSync.
46
+ * Must not throw — return null on any failure.
47
+ */
48
+ summaryReader?: (filePath: string) => string | null;
49
+ }
50
+ /**
51
+ * Extract structured Forge facts from an array of message-like objects.
52
+ *
53
+ * Pure function — no fs I/O, no LLM calls, provider-neutral.
54
+ * Accepts any array (unknown[]) to be safe against varying pi message shapes.
55
+ * Text content is extracted from `.content[].text` (assistant messages)
56
+ * and from direct string entries.
57
+ *
58
+ * @param messagesToSummarize Array of message-like objects from preparation.
59
+ * @returns ForgeFactSummary with all extracted patterns.
60
+ */
61
+ export declare function extractForgeFacts(messagesToSummarize: unknown[]): ForgeFactSummary;
62
+ /**
63
+ * Build an ExtensionFactory that registers a session_before_compact handler
64
+ * returning a deterministically-composed CompactionResult.
65
+ *
66
+ * The handler:
67
+ * 1. Validates that event.preparation is present and well-formed.
68
+ * 2. Extracts Forge facts from event.preparation.messagesToSummarize
69
+ * (no LLM call, provider-neutral).
70
+ * 3. Reads the warm-tier {PHASE}-SUMMARY.json if opts provide path context,
71
+ * or invokes opts.summaryReader("") as a test seam.
72
+ * 4. Assembles a compact structured summary string.
73
+ * 5. Returns { compaction: { summary, firstKeptEntryId, tokensBefore } }.
74
+ * 6. Returns undefined on any error (IL7 — lets pi compact normally).
75
+ *
76
+ * Pack 07: reads summary files but never writes .forge/store/.
77
+ * IL10: no pi-mono edits, no dispatch contract changes.
78
+ * NOT wired into index.ts/run-task.ts — deferred to T07 production integration.
79
+ *
80
+ * @param opts ForgeCompactionOptions (default: empty — no warm-tier).
81
+ * @returns ExtensionFactory for passing to DefaultResourceLoader.extensionFactories.
82
+ */
83
+ export declare function buildForgeCompactionFactory(opts?: ForgeCompactionOptions): ExtensionFactory;