@entelligentsia/forgecli 0.6.6 → 0.7.6

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 +88 -0
  2. package/README.md +28 -1
  3. package/dist/bin/forge.js +20 -0
  4. package/dist/bin/forge.js.map +1 -1
  5. package/dist/extensions/forgecli/approve.d.ts +24 -0
  6. package/dist/extensions/forgecli/approve.js +202 -0
  7. package/dist/extensions/forgecli/approve.js.map +1 -0
  8. package/dist/extensions/forgecli/audience-gate.d.ts +4 -0
  9. package/dist/extensions/forgecli/audience-gate.js +8 -5
  10. package/dist/extensions/forgecli/audience-gate.js.map +1 -1
  11. package/dist/extensions/forgecli/collate.d.ts +24 -0
  12. package/dist/extensions/forgecli/collate.js +199 -0
  13. package/dist/extensions/forgecli/collate.js.map +1 -0
  14. package/dist/extensions/forgecli/commit.d.ts +24 -0
  15. package/dist/extensions/forgecli/commit.js +202 -0
  16. package/dist/extensions/forgecli/commit.js.map +1 -0
  17. package/dist/extensions/forgecli/fix-bug.d.ts +75 -0
  18. package/dist/extensions/forgecli/fix-bug.js +1133 -0
  19. package/dist/extensions/forgecli/fix-bug.js.map +1 -0
  20. package/dist/extensions/forgecli/forge-commands.js +7 -0
  21. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  22. package/dist/extensions/forgecli/forge-init.js +16 -8
  23. package/dist/extensions/forgecli/forge-init.js.map +1 -1
  24. package/dist/extensions/forgecli/forge-subagent.d.ts +29 -0
  25. package/dist/extensions/forgecli/forge-subagent.js +14 -1
  26. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  27. package/dist/extensions/forgecli/hook-dispatcher.d.ts +53 -1
  28. package/dist/extensions/forgecli/hook-dispatcher.js +47 -1
  29. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  30. package/dist/extensions/forgecli/hooks/post-init-hook.d.ts +15 -0
  31. package/dist/extensions/forgecli/hooks/post-init-hook.js +127 -0
  32. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -0
  33. package/dist/extensions/forgecli/hooks/post-sprint-hook.d.ts +37 -0
  34. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +166 -0
  35. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -0
  36. package/dist/extensions/forgecli/index.js +47 -0
  37. package/dist/extensions/forgecli/index.js.map +1 -1
  38. package/dist/extensions/forgecli/review-code.d.ts +24 -0
  39. package/dist/extensions/forgecli/review-code.js +202 -0
  40. package/dist/extensions/forgecli/review-code.js.map +1 -0
  41. package/dist/extensions/forgecli/review-plan.d.ts +24 -0
  42. package/dist/extensions/forgecli/review-plan.js +203 -0
  43. package/dist/extensions/forgecli/review-plan.js.map +1 -0
  44. package/dist/extensions/forgecli/run-sprint.d.ts +18 -0
  45. package/dist/extensions/forgecli/run-sprint.js +33 -1
  46. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  47. package/dist/extensions/forgecli/run-task.d.ts +21 -2
  48. package/dist/extensions/forgecli/run-task.js +33 -9
  49. package/dist/extensions/forgecli/run-task.js.map +1 -1
  50. package/dist/extensions/forgecli/session-registry.d.ts +10 -0
  51. package/dist/extensions/forgecli/session-registry.js +9 -0
  52. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  53. package/dist/extensions/forgecli/validate.d.ts +24 -0
  54. package/dist/extensions/forgecli/validate.js +202 -0
  55. package/dist/extensions/forgecli/validate.js.map +1 -0
  56. package/dist/extensions/forgecli/wf-engine/engine.d.ts +23 -0
  57. package/dist/extensions/forgecli/wf-engine/engine.js +384 -0
  58. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -0
  59. package/dist/extensions/forgecli/wf-engine/event-parser.d.ts +6 -0
  60. package/dist/extensions/forgecli/wf-engine/event-parser.js +29 -0
  61. package/dist/extensions/forgecli/wf-engine/event-parser.js.map +1 -0
  62. package/dist/extensions/forgecli/wf-engine/id-gen.d.ts +6 -0
  63. package/dist/extensions/forgecli/wf-engine/id-gen.js +17 -0
  64. package/dist/extensions/forgecli/wf-engine/id-gen.js.map +1 -0
  65. package/dist/extensions/forgecli/wf-engine/loader.d.ts +2 -0
  66. package/dist/extensions/forgecli/wf-engine/loader.js +100 -0
  67. package/dist/extensions/forgecli/wf-engine/loader.js.map +1 -0
  68. package/dist/extensions/forgecli/wf-engine/predicate.d.ts +7 -0
  69. package/dist/extensions/forgecli/wf-engine/predicate.js +36 -0
  70. package/dist/extensions/forgecli/wf-engine/predicate.js.map +1 -0
  71. package/dist/extensions/forgecli/wf-engine/prompt-compiler.d.ts +15 -0
  72. package/dist/extensions/forgecli/wf-engine/prompt-compiler.js +23 -0
  73. package/dist/extensions/forgecli/wf-engine/prompt-compiler.js.map +1 -0
  74. package/dist/extensions/forgecli/wf-engine/register.d.ts +9 -0
  75. package/dist/extensions/forgecli/wf-engine/register.js +59 -0
  76. package/dist/extensions/forgecli/wf-engine/register.js.map +1 -0
  77. package/dist/extensions/forgecli/wf-engine/remit-check.d.ts +6 -0
  78. package/dist/extensions/forgecli/wf-engine/remit-check.js +42 -0
  79. package/dist/extensions/forgecli/wf-engine/remit-check.js.map +1 -0
  80. package/dist/extensions/forgecli/wf-engine/state-store.d.ts +13 -0
  81. package/dist/extensions/forgecli/wf-engine/state-store.js +43 -0
  82. package/dist/extensions/forgecli/wf-engine/state-store.js.map +1 -0
  83. package/dist/extensions/forgecli/wf-engine/types.d.ts +66 -0
  84. package/dist/extensions/forgecli/wf-engine/types.js +2 -0
  85. package/dist/extensions/forgecli/wf-engine/types.js.map +1 -0
  86. package/dist/extensions/forgecli/wf-engine/worker.d.ts +11 -0
  87. package/dist/extensions/forgecli/wf-engine/worker.js +50 -0
  88. package/dist/extensions/forgecli/wf-engine/worker.js.map +1 -0
  89. package/dist/forge-payload/.base-pack/workflows/_fragments/context-injection.md +10 -4
  90. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +12 -0
  91. package/dist/forge-payload/.schemas/bug.schema.json +4 -2
  92. package/dist/forge-payload/.schemas/event.schema.json +22 -3
  93. package/dist/forge-payload/commands/add-pipeline.md +342 -0
  94. package/dist/forge-payload/commands/add-task.md +269 -0
  95. package/dist/forge-payload/commands/ask.md +43 -0
  96. package/dist/forge-payload/commands/calibrate.md +356 -0
  97. package/dist/forge-payload/commands/config.md +202 -0
  98. package/dist/forge-payload/commands/enhance.md +38 -0
  99. package/dist/forge-payload/commands/health.md +225 -0
  100. package/dist/forge-payload/commands/init.md +165 -0
  101. package/dist/forge-payload/commands/materialize.md +119 -0
  102. package/dist/forge-payload/commands/migrate.md +160 -0
  103. package/dist/forge-payload/commands/quiz-agent.md +38 -0
  104. package/dist/forge-payload/commands/regenerate.md +673 -0
  105. package/dist/forge-payload/commands/remove.md +174 -0
  106. package/dist/forge-payload/commands/report-bug.md +191 -0
  107. package/dist/forge-payload/commands/store-query.md +73 -0
  108. package/dist/forge-payload/commands/store-repair.md +187 -0
  109. package/dist/forge-payload/commands/update-tools.md +56 -0
  110. package/dist/forge-payload/commands/update.md +1376 -0
  111. package/dist/forge-payload/tools/preflight-gate.cjs +2 -1
  112. package/dist/forge-payload/tools/read-verdict.cjs +41 -8
  113. package/dist/forge-payload/tools/store-cli.cjs +4 -3
  114. package/node_modules/argparse/CHANGELOG.md +216 -0
  115. package/node_modules/argparse/LICENSE +254 -0
  116. package/node_modules/argparse/README.md +84 -0
  117. package/node_modules/argparse/argparse.js +3707 -0
  118. package/node_modules/argparse/lib/sub.js +67 -0
  119. package/node_modules/argparse/lib/textwrap.js +440 -0
  120. package/node_modules/argparse/package.json +31 -0
  121. package/node_modules/cliui/CHANGELOG.md +121 -0
  122. package/node_modules/color-convert/CHANGELOG.md +54 -0
  123. package/node_modules/esprima/ChangeLog +235 -0
  124. package/node_modules/js-yaml/LICENSE +21 -0
  125. package/node_modules/js-yaml/README.md +247 -0
  126. package/node_modules/js-yaml/bin/js-yaml.js +126 -0
  127. package/node_modules/js-yaml/dist/js-yaml.js +3880 -0
  128. package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
  129. package/node_modules/js-yaml/dist/js-yaml.mjs +3856 -0
  130. package/node_modules/js-yaml/index.js +47 -0
  131. package/node_modules/js-yaml/lib/common.js +59 -0
  132. package/node_modules/js-yaml/lib/dumper.js +965 -0
  133. package/node_modules/js-yaml/lib/exception.js +55 -0
  134. package/node_modules/js-yaml/lib/loader.js +1733 -0
  135. package/node_modules/js-yaml/lib/schema/core.js +11 -0
  136. package/node_modules/js-yaml/lib/schema/default.js +22 -0
  137. package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
  138. package/node_modules/js-yaml/lib/schema/json.js +19 -0
  139. package/node_modules/js-yaml/lib/schema.js +121 -0
  140. package/node_modules/js-yaml/lib/snippet.js +101 -0
  141. package/node_modules/js-yaml/lib/type/binary.js +125 -0
  142. package/node_modules/js-yaml/lib/type/bool.js +35 -0
  143. package/node_modules/js-yaml/lib/type/float.js +97 -0
  144. package/node_modules/js-yaml/lib/type/int.js +156 -0
  145. package/node_modules/js-yaml/lib/type/map.js +8 -0
  146. package/node_modules/js-yaml/lib/type/merge.js +12 -0
  147. package/node_modules/js-yaml/lib/type/null.js +35 -0
  148. package/node_modules/js-yaml/lib/type/omap.js +44 -0
  149. package/node_modules/js-yaml/lib/type/pairs.js +53 -0
  150. package/node_modules/js-yaml/lib/type/seq.js +8 -0
  151. package/node_modules/js-yaml/lib/type/set.js +29 -0
  152. package/node_modules/js-yaml/lib/type/str.js +8 -0
  153. package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
  154. package/node_modules/js-yaml/lib/type.js +66 -0
  155. package/node_modules/js-yaml/package.json +66 -0
  156. package/node_modules/mz/HISTORY.md +66 -0
  157. package/node_modules/proper-lockfile/CHANGELOG.md +108 -0
  158. package/node_modules/source-map/CHANGELOG.md +301 -0
  159. package/node_modules/thenify/History.md +11 -0
  160. package/node_modules/thenify-all/History.md +11 -0
  161. package/node_modules/y18n/CHANGELOG.md +100 -0
  162. package/node_modules/yargs/CHANGELOG.md +88 -0
  163. package/node_modules/yargs-parser/CHANGELOG.md +263 -0
  164. package/package.json +6 -2
  165. package/workflows/lead-qualifier/prompts/digest.md +44 -0
  166. package/workflows/lead-qualifier/prompts/draft-outreach.md +44 -0
  167. package/workflows/lead-qualifier/prompts/enrich.md +52 -0
  168. package/workflows/lead-qualifier/prompts/intake.md +48 -0
  169. package/workflows/lead-qualifier/prompts/mark-cold.md +38 -0
  170. package/workflows/lead-qualifier/prompts/score.md +45 -0
  171. package/workflows/lead-qualifier/workflow.yaml +95 -0
  172. package/workflows/research-brief/prompts/brief-synthesize.md +43 -0
  173. package/workflows/research-brief/prompts/intake.md +51 -0
  174. package/workflows/research-brief/prompts/source-critique.md +38 -0
  175. package/workflows/research-brief/prompts/source-score.md +38 -0
  176. package/workflows/research-brief/prompts/source-summarize.md +54 -0
  177. package/workflows/research-brief/workflow.yaml +66 -0
  178. package/dist/extensions/forgecli/session-monitor-widget.d.ts +0 -37
  179. package/dist/extensions/forgecli/session-monitor-widget.js +0 -320
  180. package/dist/extensions/forgecli/session-monitor-widget.js.map +0 -1
  181. package/dist/extensions/forgecli/session-monitor.d.ts +0 -2
  182. package/dist/extensions/forgecli/session-monitor.js +0 -135
  183. package/dist/extensions/forgecli/session-monitor.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,94 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.6] — 2026-05-16
11
+
12
+ ### Fixed
13
+ - `build-payload` now bundles the forge plugin command markdowns
14
+ (`forge/forge/commands/*.md`) into `dist/forge-payload/commands/`.
15
+ Without this step, `/forge:health`, `/forge:config`, and any other
16
+ command routed via `delegateMarkdownCommand` failed with `ENOENT`
17
+ against the installed payload.
18
+
19
+ ### Changed
20
+ - `assertAudience` now treats `subagent` audience as advisory. Users
21
+ can invoke every chain step manually (`/forge:review-plan`,
22
+ `/forge:review-code`, `/forge:approve`, `/forge:commit`,
23
+ `/forge:validate`) from the CLI — orchestrators are an auto-mode
24
+ convenience, not the sole legitimate caller. `orchestrator-only`
25
+ workflows still refuse subagent invocation as before. Workflow
26
+ front-matter is unchanged; the audience field remains for
27
+ documentation.
28
+
29
+ ## [0.7.5] — 2026-05-16
30
+
31
+ ### Changed
32
+ - `run-workflow` now narrates each phase to the main viewport: the engine
33
+ emits `↪ <role>: "<first meaningful line>"` when the subagent first
34
+ speaks, and `↩ <role>: "<last meaningful line>"` after the phase
35
+ terminal — plus `◆ <summary>` when the node emitted one. The chip strip
36
+ stays compact (glyph + role only); the narrative lives in chip[0] /
37
+ main viewport so the user can scroll the story of the run.
38
+
39
+ ### Reverted
40
+ - 0.7.4's chip-strip preview enrichment (`"<first>" … "<last>"`). The
41
+ registry still captures `firstTurnPreview` / `lastTurnPreview` on each
42
+ `PhaseSummary` — useful for future per-phase rendering — but the strip
43
+ reverts to showing only `session.currentTurnPreview`.
44
+
45
+ ## [0.7.4] — 2026-05-16
46
+
47
+ ### Changed
48
+ - (Superseded by 0.7.5.) Thread-switcher strip preview was changed to
49
+ show `"<first turn>" … "<last turn>"` from the most-recent phase. The
50
+ intended UX target was the main viewport, not the chip strip — the
51
+ strip change is reverted in 0.7.5. The `PhaseSummary.firstTurnPreview`
52
+ / `lastTurnPreview` fields survive.
53
+
54
+ ## [0.7.3] — 2026-05-16
55
+
56
+ ### Added
57
+ - Workflow engine sessions now flow into the shared `SessionRegistry`, so
58
+ `/forge:run-workflow` instances appear in the live thread-switcher chip
59
+ strip alongside `/forge:run-task`, `/forge:run-sprint`, and `/forge:fix-bug`.
60
+ Engine emits `startSession`/`startPhase`/`bumpTurn`/`setTurnPreview`/
61
+ `recordToolStart`/`recordToolEnd`/`appendTail`/`completePhase`/
62
+ `completeSession` at the right boundaries; LLM tool-use events are
63
+ forwarded from the worker via the existing `onEvent` callback.
64
+ - Each node iteration is its own phase (`<nodeId>#<iter>` for loop bodies)
65
+ so the chip strip shows per-iteration progress.
66
+
67
+ ## [0.7.2] — 2026-05-15
68
+
69
+ ### Fixed
70
+ - `/forge:run-workflow` now resolves `<workflowId>` against `CWD/workflows/<id>` first,
71
+ then falls back to the bundled `PKG_ROOT/workflows/<id>`. Previously the install dir
72
+ was the only search path, so user-authored workflows in their project tree were
73
+ ignored.
74
+
75
+ ## [0.7.1] — 2026-05-15
76
+
77
+ ### Added
78
+ - Workflow engine: conditional edges via `when: "<path> <op> <literal>"` — first matching
79
+ success edge wins, falls back to unconditional edge. Supports `==`, `!=`, `<`, `<=`, `>`, `>=`
80
+ against dotted paths into `state.*` or `loop.item.*`.
81
+ - Workflow engine: `loop.group` + `loop.head` for per-item pipelines. Multiple nodes
82
+ sharing a `group` share one cursor — execution flows item-by-item through the
83
+ pipeline rather than node-by-node across all items. Group exit is expressed as
84
+ `edges: - { from: <head>, on: exhausted, to: <next> }`.
85
+ - `workflows/lead-qualifier/` — demo workflow exercising both features. Intake produces
86
+ N leads; each lead flows `enrich → score → (warm: draft-outreach | cold: mark-cold)` per
87
+ the `score >= 4` predicate; final `digest` writes `BRIEF.md`.
88
+
89
+ ## [0.7.0] — 2026-05-15
90
+
91
+ ### Added
92
+ - Generic workflow execution engine (`/forge:run-workflow <workflowId> [args]`) — PoC.
93
+ Reads workflow.yaml + prompts/*.md from `workflows/<workflowId>/`. Runs a node graph
94
+ with LLM workers. Persists state, events, and artifacts under `.forge-wf/runs/<instanceId>/`.
95
+ Includes the `research-brief` example workflow (5 nodes, 3 in a loop).
96
+ Plan 14.
97
+
10
98
  ## [0.6.6] — 2026-05-15
11
99
 
12
100
  Sprint finalization ceremony (Plan 12). Pairs with forge-plugin 0.43.16.
package/README.md CHANGED
@@ -197,7 +197,14 @@ On any npm error or version mismatch the script logs a `[warn] registry check fa
197
197
 
198
198
  | Command | Status |
199
199
  |--------------------------------------------|---------------------|
200
- | `/forge:enhance` (Phase 2) | Shipped (0.5.0) |
200
+ | Subagent audience relaxed to advisory | Shipped (0.7.6) |
201
+ | Bundle plugin command markdowns in payload | Shipped (0.7.6) |
202
+ | Generic workflow engine (`/forge:run-workflow`) | Shipped (0.7.5) |
203
+ | `/forge:run-task` orchestrator handler | Shipped (0.7.5) |
204
+ | `/forge:run-sprint` orchestrator handler | Shipped (0.7.5) |
205
+ | `/forge:fix-bug` orchestrator handler | Shipped (0.7.5) |
206
+ | Atomic chain sub-workflow Kickoff Shims ×6 | Shipped (0.7.5) |
207
+ | `/forge:enhance` (Phase 2) | Shipped (0.6.6) |
201
208
  | `/forge:plan` | Shipped (0.5.0) |
202
209
  | `/forge:implement` | Shipped (0.5.0) |
203
210
  | FS-level two-layer boundary guard | Shipped (0.5.0) |
@@ -216,6 +223,26 @@ Track via [issues](https://github.com/Entelligentsia/forge-cli/issues).
216
223
 
217
224
  | Version | Headline |
218
225
  |---------|----------|
226
+ | 0.7.6 | Fix: bundle plugin command markdowns (`/forge:health`, `/forge:config` no longer ENOENT). Subagent audience relaxed to advisory — users can invoke every chain step manually |
227
+ | 0.7.5 | Workflow engine UX — phase narration in main viewport; chip strip stays compact |
228
+ | 0.7.4 | (Superseded by 0.7.5) Thread-switcher chip-strip preview enrichment |
229
+ | 0.7.3 | Workflow engine sessions in shared SessionRegistry — live thread-switcher chip strip |
230
+ | 0.7.2 | `/forge:run-workflow` CWD-first workflow resolution |
231
+ | 0.7.1 | Workflow engine: conditional edges + `loop.group` / `loop.head` per-item pipelines |
232
+ | 0.7.0 | Generic workflow execution engine (`/forge:run-workflow`) PoC — Plan 14 |
233
+ | 0.6.6 | Sprint finalization ceremony — `dispatchSprintCeremony` + `sprint-complete`/`sprint-halted` event variants. Pairs with forge-plugin 0.43.16 |
234
+ | 0.6.5 | Telemetry contract Slice 2 — runtime emit site. Pairs with forge-plugin 0.43.14 |
235
+ | 0.6.4 | Fixes: orchestrator runtime-attribution and event-emission regressions |
236
+ | 0.6.3 | Thread-switcher UX — single-viewport subagent tail browsing |
237
+ | 0.6.2 | Bundled forge plugin bumped to v0.43.12 — fixes silent fragment drop |
238
+ | 0.6.1 | HLO-S01 friction-fix sweep — bundled forge plugin bumped to v0.43.11 |
239
+ | 0.5.7 | `/forge:sprint-plan` completion-gap fix (paired with forge plugin v0.43.3) |
240
+ | 0.5.6 | Pack-06 materialization-marker regression fix (paired with forge plugin v0.43.2) |
241
+ | 0.5.5 | Hot-fix: lands the `/forge:init` per-phase verify+retry+recover implementation that 0.5.4 shipped without |
242
+ | 0.5.4 | `/forge:init` per-phase verify + retry + recover |
243
+ | 0.5.3 | UX: KB-folder confirm question rephrased so default-Yes is the safe path |
244
+ | 0.5.2 | Hot-patch: `forge_ask_user` UI rendering — text/choice prompts now show the question |
245
+ | 0.5.1 | Hot-patch: direct-exec contract for forge tools. Pairs with forge-plugin v0.43.1 |
219
246
  | 0.5.0 | Foundation finish — central loaders + 3 native kickoff handlers + FS-level boundary guard |
220
247
  | 0.4.0 | Native sprint-intake + sprint-plan handlers — SDLC entry path self-hosted |
221
248
  | 0.3.0 | Pi-runtime parity adapters — `forge:ask_user` TUI tool + hook safety net |
package/dist/bin/forge.js CHANGED
@@ -104,6 +104,26 @@ if (parsed.forgeAction === "help") {
104
104
  }
105
105
  // Apply forge env overrides
106
106
  Object.assign(process.env, parsed.env);
107
+ // Default prompt-cache retention to "long" for all Forge sessions.
108
+ //
109
+ // Rationale: Forge subagent phases (plan, review_plan, implement, review_code,
110
+ // approve, commit) routinely run ~10 minutes per phase, and a sprint chains
111
+ // 4–8 such phases per task across the same persona/system-prompt prefix.
112
+ // Anthropic's default 5-minute cache TTL expires mid-phase; OpenAI's default
113
+ // in-memory cache evicts between phases. "long" gives Anthropic a 1h TTL and
114
+ // OpenAI 24h retention — comfortably covering a phase and the gap to the next.
115
+ //
116
+ // Cost: on Anthropic, 1h cache writes cost 25% more than 5m writes — but a
117
+ // single subsequent cache read (90% cheaper than fresh input) repays that
118
+ // premium ~3.6×, and every Forge phase reads the same prefix many times. On
119
+ // OpenAI, 24h retention is free. On proxies/compat backends, pi-ai ignores
120
+ // this env var, so this default is safe everywhere.
121
+ //
122
+ // Users who want the upstream pi-ai default keep an explicit value:
123
+ // PI_CACHE_RETENTION=short forge ...
124
+ if (!process.env.PI_CACHE_RETENTION) {
125
+ process.env.PI_CACHE_RETENTION = "long";
126
+ }
107
127
  // Fast-path subcommand: spawn the bundled cjs tool directly. This skips
108
128
  // the entire pi/agent boot and turns 26s cold-starts into <100ms shells.
109
129
  if (parsed.forgeAction === "subcommand" && parsed.subcommandTool) {
@@ -1 +1 @@
1
- {"version":3,"file":"forge.js","sourceRoot":"","sources":["../../src/bin/forge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forge.js","sourceRoot":"","sources":["../../src/bin/forge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ExtensionAPI } from "@entelligentsia/pi-coding-agent";
2
+ export type ArgMode = "empty" | "file" | "text";
3
+ export interface ParsedArgs {
4
+ mode: ArgMode;
5
+ taskRef: string;
6
+ sourceLabel: string;
7
+ }
8
+ export declare function parseApproveArgs(rawArgs: string, cwd: string): ParsedArgs;
9
+ export declare function extractPersonaNames(workflowMd: string): string[];
10
+ export interface MaterializationCheck {
11
+ ok: boolean;
12
+ missing: string[];
13
+ }
14
+ export declare function checkMaterialization(workflowPath: string, workflowMd: string): MaterializationCheck;
15
+ export interface ComposeKickoffOpts {
16
+ workflowMd: string;
17
+ personaIdentity: string;
18
+ parsed: ParsedArgs;
19
+ }
20
+ export declare function composeKickoff(opts: ComposeKickoffOpts): string;
21
+ export interface RegisterApproveOptions {
22
+ cwd?: string;
23
+ }
24
+ export declare function registerApprove(pi: ExtensionAPI, options?: RegisterApproveOptions): void;
@@ -0,0 +1,202 @@
1
+ // forge:approve — native kickoff handler (FORGE-S21-T10).
2
+ //
3
+ // Replaces the auto-generated stub previously installed by
4
+ // registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
5
+ // (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
6
+ //
7
+ // Note: The materialized workflow (architect_approve.md) declares
8
+ // `audience: subagent` — advisory only. Users may invoke this command
9
+ // manually from the CLI; assertAudience never refuses subagent-audience
10
+ // workflows. Orchestrator chains still dispatch via runForgeSubagent
11
+ // directly and do NOT route through this handler.
12
+ //
13
+ // Iron Laws:
14
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
15
+ // IL4 — no JSON.stringify-into-subagent dispatch.
16
+ // IL6 — no shell-string interpolation; no spawn calls here.
17
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
18
+ // continuation.
19
+ import * as fs from "node:fs";
20
+ import * as path from "node:path";
21
+ import { assertAudience } from "./audience-gate.js";
22
+ import { sendKickoff } from "./kickoff.js";
23
+ import { loadPersona, PersonaSkillLoaderError } from "./loaders/persona-skill-loader.js";
24
+ import { loadWorkflow, WorkflowLoaderError } from "./loaders/workflow-loader.js";
25
+ export function parseApproveArgs(rawArgs, cwd) {
26
+ const trimmed = (rawArgs ?? "").trim();
27
+ if (trimmed === "") {
28
+ return { mode: "empty", taskRef: "", sourceLabel: "(no input — architect infers task from store/context)" };
29
+ }
30
+ if (trimmed.startsWith("@")) {
31
+ const ref = trimmed.slice(1).trim();
32
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
33
+ const seed = fs.readFileSync(filePath, "utf8");
34
+ return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
35
+ }
36
+ return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
37
+ }
38
+ // Frontmatter persona extraction (permissive) ------------------------------
39
+ export function extractPersonaNames(workflowMd) {
40
+ const lines = workflowMd.split(/\r?\n/);
41
+ if (lines.length === 0 || lines[0] !== "---")
42
+ return [];
43
+ let inside = false;
44
+ let depsBlock = false;
45
+ for (let i = 0; i < lines.length; i++) {
46
+ const line = lines[i];
47
+ if (i === 0 && line === "---") {
48
+ inside = true;
49
+ continue;
50
+ }
51
+ if (!inside)
52
+ break;
53
+ if (line === "---")
54
+ break;
55
+ if (/^deps\s*:\s*$/.test(line)) {
56
+ depsBlock = true;
57
+ continue;
58
+ }
59
+ const m = /^\s*personas\s*:\s*\[([^\]]*)\]\s*$/.exec(line);
60
+ if (m && (depsBlock || /^\s/.test(line))) {
61
+ return m[1]
62
+ .split(",")
63
+ .map((s) => s.trim().replace(/^["']|["']$/g, ""))
64
+ .filter((s) => s.length > 0);
65
+ }
66
+ if (depsBlock && /^[A-Za-z0-9_-]+\s*:/.test(line) && !/^\s/.test(line)) {
67
+ depsBlock = false;
68
+ }
69
+ }
70
+ return [];
71
+ }
72
+ export function checkMaterialization(workflowPath, workflowMd) {
73
+ const missing = [];
74
+ if (!workflowMd.includes("Store-Write Verification")) {
75
+ missing.push("Store-Write Verification");
76
+ }
77
+ if (!workflowMd.includes("Iron Laws")) {
78
+ missing.push("Iron Laws");
79
+ }
80
+ if (!workflowMd.includes("forge_store")) {
81
+ missing.push("forge_store");
82
+ }
83
+ const personas = extractPersonaNames(workflowMd);
84
+ if (personas.length === 0) {
85
+ missing.push("deps.personas: declaration");
86
+ }
87
+ else {
88
+ const bodyStart = (() => {
89
+ if (!workflowMd.startsWith("---\n") && !workflowMd.startsWith("---\r\n"))
90
+ return 0;
91
+ const re = /\r?\n---\r?\n/;
92
+ const m = re.exec(workflowMd);
93
+ return m ? m.index + m[0].length : 0;
94
+ })();
95
+ const body = workflowMd.slice(bodyStart);
96
+ const anyHit = personas.some((name) => {
97
+ if (!name)
98
+ return false;
99
+ const tokenRegex = new RegExp(`\\b${name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`);
100
+ return body.includes(`${name}.md`) || tokenRegex.test(body);
101
+ });
102
+ if (!anyHit) {
103
+ missing.push(`persona file path (${personas.join(", ")})`);
104
+ }
105
+ }
106
+ void workflowPath;
107
+ return { ok: missing.length === 0, missing };
108
+ }
109
+ export function composeKickoff(opts) {
110
+ const { workflowMd, personaIdentity, parsed } = opts;
111
+ const sections = ["# /forge:approve", ""];
112
+ if (personaIdentity.trim().length > 0) {
113
+ sections.push(personaIdentity.trim(), "");
114
+ }
115
+ sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read all review artifacts for `engineering/sprints/<SPRINT_ID>/<TASK_ID>/` (PLAN_REVIEW.md, CODE_REVIEW.md).", "2. Query the store for the task and its sprint/feature context via `forge_store_query` — do NOT raw-read `.forge/store/`.", "3. Follow the workflow Algorithm verbatim: assess the full task lifecycle against architecture and acceptance criteria.", "4. Write `ARCHITECT_APPROVAL.md` and `APPROVAL-SUMMARY.json` to the task directory using the `write` tool.", "5. Update task status by calling the `forge_store` MCP tool: `{command:'update-status', args:['task','<TASK_ID>','status','<new-status>']}`. Never raw-write `.forge/store/`. Do NOT bash-shell `forge store ...`.", "6. Honour Pack-06 Read/Write/Ask/Store discipline: writes go via the `forge_store` MCP tool; in-conversation clarifications use `forge_ask_user`.");
116
+ sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
117
+ if (parsed.mode === "empty") {
118
+ sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
119
+ }
120
+ else {
121
+ sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
122
+ }
123
+ return sections.join("\n");
124
+ }
125
+ // Registration -------------------------------------------------------------
126
+ const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "architect_approve.md");
127
+ export function registerApprove(pi, options = {}) {
128
+ pi.registerCommand("forge:approve", {
129
+ description: "Run the architect-approve workflow for a Forge task. " +
130
+ "Usage: /forge:approve [@<file> | <free-form text>]. " +
131
+ "Note: this workflow is subagent-only; standalone invocations are refused. " +
132
+ "Orchestrator chains dispatch directly via runForgeSubagent.",
133
+ async handler(args, ctx) {
134
+ const cwd = options.cwd ?? process.cwd();
135
+ const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
136
+ let workflowMd;
137
+ let workflowAudience;
138
+ try {
139
+ const loaded = loadWorkflow(workflowPath);
140
+ workflowMd = loaded.rawMarkdown;
141
+ workflowAudience = loaded.audience;
142
+ }
143
+ catch (err) {
144
+ if (err instanceof WorkflowLoaderError) {
145
+ if (err.code === "missing_file") {
146
+ ctx.ui.notify(`× forge:approve — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:regenerate first.`, "error");
147
+ }
148
+ else {
149
+ ctx.ui.notify(`× forge:approve — workflow load failed (${err.code}): ${err.message}`, "error");
150
+ }
151
+ return;
152
+ }
153
+ const e = err;
154
+ ctx.ui.notify(`× forge:approve — failed to read workflow: ${e.message ?? "unknown"}`, "error");
155
+ return;
156
+ }
157
+ let parsed;
158
+ try {
159
+ parsed = parseApproveArgs(args, cwd);
160
+ }
161
+ catch (err) {
162
+ const e = err;
163
+ ctx.ui.notify(`× forge:approve — failed to read seed: ${e.message ?? "unknown"}`, "error");
164
+ return;
165
+ }
166
+ const check = checkMaterialization(workflowPath, workflowMd);
167
+ if (!check.ok) {
168
+ for (const marker of check.missing) {
169
+ ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
170
+ }
171
+ return;
172
+ }
173
+ const personas = extractPersonaNames(workflowMd);
174
+ let personaIdentity = "";
175
+ if (personas.length > 0) {
176
+ try {
177
+ const persona = loadPersona(personas[0], { cwd });
178
+ personaIdentity = persona.identity;
179
+ }
180
+ catch (err) {
181
+ if (err instanceof PersonaSkillLoaderError) {
182
+ ctx.ui.notify(`× forge:approve — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
183
+ return;
184
+ }
185
+ const e = err;
186
+ ctx.ui.notify(`× forge:approve — persona load error: ${e.message ?? "unknown"}`, "error");
187
+ return;
188
+ }
189
+ }
190
+ if (!assertAudience({ workflowName: "architect_approve", audience: workflowAudience }, ctx)) {
191
+ return;
192
+ }
193
+ const kickoff = composeKickoff({
194
+ workflowMd,
195
+ personaIdentity,
196
+ parsed,
197
+ });
198
+ sendKickoff(pi, kickoff);
199
+ },
200
+ });
201
+ }
202
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/approve.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,2DAA2D;AAC3D,uEAAuE;AACvE,uEAAuE;AACvE,EAAE;AACF,kEAAkE;AAClE,sEAAsE;AACtE,wEAAwE;AACxE,qEAAqE;AACrE,kDAAkD;AAClD,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,oDAAoD;AACpD,8DAA8D;AAC9D,wEAAwE;AACxE,wBAAwB;AAExB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAYjF,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,GAAW;IAC5D,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;IAC7G,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,GAAG,GAAG,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;AACnF,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACxD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACV,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,MAAM;QACnB,IAAI,IAAI,KAAK,KAAK;YAAE,MAAM;QAC1B,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACV,CAAC;QACD,MAAM,CAAC,GAAG,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC,CAAC,CAAC;iBACT,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;iBAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,SAAS,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,SAAS,GAAG,KAAK,CAAC;QACnB,CAAC;IACF,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AASD,MAAM,UAAU,oBAAoB,CAAC,YAAoB,EAAE,UAAkB;IAC5E,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACP,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;YACvB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,CAAC,CAAC;YACnF,MAAM,EAAE,GAAG,eAAe,CAAC;YAC3B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,CAAC;IACF,CAAC;IAED,KAAK,YAAY,CAAC;IAClB,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAUD,MAAM,UAAU,cAAc,CAAC,IAAwB;IACtD,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAErD,MAAM,QAAQ,GAAa,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,QAAQ,CAAC,IAAI,CACZ,aAAa,EACb,EAAE,EACF,uCAAuC,EACvC,EAAE,EACF,iHAAiH,EACjH,2HAA2H,EAC3H,yHAAyH,EACzH,4GAA4G,EAC5G,oNAAoN,EACpN,mJAAmJ,CACnJ,CAAC;IAEF,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAE9E,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,sDAAsD,CAAC,CAAC;IAC3F,CAAC;SAAM,CAAC;QACP,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAE7E,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAMnF,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,UAAkC,EAAE;IACrF,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE;QACnC,WAAW,EACV,uDAAuD;YACvD,sDAAsD;YACtD,4EAA4E;YAC5E,6DAA6D;QAC9D,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,GAA4B;YACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAEvD,IAAI,UAAkB,CAAC;YACvB,IAAI,gBAAsE,CAAC;YAC3E,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC1C,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;gBAChC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YACpC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;oBACxC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBACjC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,2CAA2C,iBAAiB,+CAA+C,EAC3G,OAAO,CACP,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACP,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,2CAA2C,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;oBAChG,CAAC;oBACD,OAAO;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC/F,OAAO;YACR,CAAC;YAED,IAAI,MAAkB,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC3F,OAAO;YACR,CAAC;YAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACf,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACpC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0BAA0B,MAAM,iBAAiB,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzF,CAAC;gBACD,OAAO;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,eAAe,GAAG,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;oBAClD,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACpC,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACvB,IAAI,GAAG,YAAY,uBAAuB,EAAE,CAAC;wBAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,8BAA8B,QAAQ,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EACtF,OAAO,CACP,CAAC;wBACF,OAAO;oBACR,CAAC;oBACD,MAAM,CAAC,GAAG,GAA2B,CAAC;oBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC1F,OAAO;gBACR,CAAC;YACF,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC7F,OAAO;YACR,CAAC;YAED,MAAM,OAAO,GAAG,cAAc,CAAC;gBAC9B,UAAU;gBACV,eAAe;gBACf,MAAM;aACN,CAAC,CAAC;YAEH,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1B,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -22,5 +22,9 @@ export interface AudienceCheckInput {
22
22
  *
23
23
  * Refusal message for orchestrator-only violations (AC#3 verbatim):
24
24
  * "× workflow <name> is orchestrator-only; cannot run from subagent context"
25
+ *
26
+ * Note: `subagent` audience is advisory only — users may invoke any
27
+ * `subagent`-audience workflow manually from the orchestrator (CLI) context.
28
+ * Only `orchestrator-only` produces refusals.
25
29
  */
26
30
  export declare function assertAudience(input: AudienceCheckInput, ctx: ExtensionCommandContext): boolean;
@@ -24,6 +24,10 @@ export { CallerContextStore } from "./subagent/caller-context.js";
24
24
  *
25
25
  * Refusal message for orchestrator-only violations (AC#3 verbatim):
26
26
  * "× workflow <name> is orchestrator-only; cannot run from subagent context"
27
+ *
28
+ * Note: `subagent` audience is advisory only — users may invoke any
29
+ * `subagent`-audience workflow manually from the orchestrator (CLI) context.
30
+ * Only `orchestrator-only` produces refusals.
27
31
  */
28
32
  export function assertAudience(input, ctx) {
29
33
  const { workflowName, audience } = input;
@@ -36,11 +40,10 @@ export function assertAudience(input, ctx) {
36
40
  ctx.ui.notify(`× workflow ${workflowName} is orchestrator-only; cannot run from subagent context — forge-cli internal error if you did not run it as a subagent`, "error");
37
41
  return false;
38
42
  }
39
- // "subagent" — allowed only from subagent context.
40
- if (audience === "subagent" && callerContext === "orchestrator") {
41
- ctx.ui.notify(`× workflow ${workflowName} is subagent-only; cannot run from orchestrator context`, "error");
42
- return false;
43
- }
43
+ // "subagent" — advisory hint, allowed from any caller.
44
+ // Users must be able to run every step manually (orchestrators are auto-mode);
45
+ // this audience is preserved in workflow front-matter for documentation but
46
+ // no longer enforced against orchestrator callers.
44
47
  return true;
45
48
  }
46
49
  //# sourceMappingURL=audience-gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audience-gate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/audience-gate.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oEAAoE;AACpE,EAAE;AACF,iEAAiE;AACjE,+EAA+E;AAC/E,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,wEAAwE;AACxE,4CAA4C;AAC5C,0EAA0E;AAI1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AASlE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,KAAyB,EAAE,GAA4B;IACrF,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,kBAAkB,CAAC,GAAG,EAAE,CAAC;IAEtE,gDAAgD;IAChD,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAEpC,gEAAgE;IAChE,IAAI,QAAQ,KAAK,mBAAmB,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,cAAc,YAAY,wHAAwH,EAClJ,OAAO,CACP,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,IAAI,QAAQ,KAAK,UAAU,IAAI,aAAa,KAAK,cAAc,EAAE,CAAC;QACjE,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,cAAc,YAAY,yDAAyD,EACnF,OAAO,CACP,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"audience-gate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/audience-gate.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oEAAoE;AACpE,EAAE;AACF,iEAAiE;AACjE,+EAA+E;AAC/E,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,wEAAwE;AACxE,4CAA4C;AAC5C,0EAA0E;AAI1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AASlE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAAC,KAAyB,EAAE,GAA4B;IACrF,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,kBAAkB,CAAC,GAAG,EAAE,CAAC;IAEtE,gDAAgD;IAChD,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAEpC,gEAAgE;IAChE,IAAI,QAAQ,KAAK,mBAAmB,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,cAAc,YAAY,wHAAwH,EAClJ,OAAO,CACP,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IAED,uDAAuD;IACvD,+EAA+E;IAC/E,4EAA4E;IAC5E,mDAAmD;IACnD,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { ExtensionAPI } from "@entelligentsia/pi-coding-agent";
2
+ export type ArgMode = "empty" | "file" | "text";
3
+ export interface ParsedArgs {
4
+ mode: ArgMode;
5
+ taskRef: string;
6
+ sourceLabel: string;
7
+ }
8
+ export declare function parseCollateArgs(rawArgs: string, cwd: string): ParsedArgs;
9
+ export declare function extractPersonaNames(workflowMd: string): string[];
10
+ export interface MaterializationCheck {
11
+ ok: boolean;
12
+ missing: string[];
13
+ }
14
+ export declare function checkMaterialization(workflowPath: string, workflowMd: string): MaterializationCheck;
15
+ export interface ComposeKickoffOpts {
16
+ workflowMd: string;
17
+ personaIdentity: string;
18
+ parsed: ParsedArgs;
19
+ }
20
+ export declare function composeKickoff(opts: ComposeKickoffOpts): string;
21
+ export interface RegisterCollateOptions {
22
+ cwd?: string;
23
+ }
24
+ export declare function registerCollate(pi: ExtensionAPI, options?: RegisterCollateOptions): void;