@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.
- package/CHANGELOG.md +88 -0
- package/README.md +28 -1
- package/dist/bin/forge.js +20 -0
- package/dist/bin/forge.js.map +1 -1
- package/dist/extensions/forgecli/approve.d.ts +24 -0
- package/dist/extensions/forgecli/approve.js +202 -0
- package/dist/extensions/forgecli/approve.js.map +1 -0
- package/dist/extensions/forgecli/audience-gate.d.ts +4 -0
- package/dist/extensions/forgecli/audience-gate.js +8 -5
- package/dist/extensions/forgecli/audience-gate.js.map +1 -1
- package/dist/extensions/forgecli/collate.d.ts +24 -0
- package/dist/extensions/forgecli/collate.js +199 -0
- package/dist/extensions/forgecli/collate.js.map +1 -0
- package/dist/extensions/forgecli/commit.d.ts +24 -0
- package/dist/extensions/forgecli/commit.js +202 -0
- package/dist/extensions/forgecli/commit.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.d.ts +75 -0
- package/dist/extensions/forgecli/fix-bug.js +1133 -0
- package/dist/extensions/forgecli/fix-bug.js.map +1 -0
- package/dist/extensions/forgecli/forge-commands.js +7 -0
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-init.js +16 -8
- package/dist/extensions/forgecli/forge-init.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +29 -0
- package/dist/extensions/forgecli/forge-subagent.js +14 -1
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/hook-dispatcher.d.ts +53 -1
- package/dist/extensions/forgecli/hook-dispatcher.js +47 -1
- package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
- package/dist/extensions/forgecli/hooks/post-init-hook.d.ts +15 -0
- package/dist/extensions/forgecli/hooks/post-init-hook.js +127 -0
- package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -0
- package/dist/extensions/forgecli/hooks/post-sprint-hook.d.ts +37 -0
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js +166 -0
- package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -0
- package/dist/extensions/forgecli/index.js +47 -0
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/review-code.d.ts +24 -0
- package/dist/extensions/forgecli/review-code.js +202 -0
- package/dist/extensions/forgecli/review-code.js.map +1 -0
- package/dist/extensions/forgecli/review-plan.d.ts +24 -0
- package/dist/extensions/forgecli/review-plan.js +203 -0
- package/dist/extensions/forgecli/review-plan.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.d.ts +18 -0
- package/dist/extensions/forgecli/run-sprint.js +33 -1
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.d.ts +21 -2
- package/dist/extensions/forgecli/run-task.js +33 -9
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/session-registry.d.ts +10 -0
- package/dist/extensions/forgecli/session-registry.js +9 -0
- package/dist/extensions/forgecli/session-registry.js.map +1 -1
- package/dist/extensions/forgecli/validate.d.ts +24 -0
- package/dist/extensions/forgecli/validate.js +202 -0
- package/dist/extensions/forgecli/validate.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/engine.d.ts +23 -0
- package/dist/extensions/forgecli/wf-engine/engine.js +384 -0
- package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/event-parser.d.ts +6 -0
- package/dist/extensions/forgecli/wf-engine/event-parser.js +29 -0
- package/dist/extensions/forgecli/wf-engine/event-parser.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/id-gen.d.ts +6 -0
- package/dist/extensions/forgecli/wf-engine/id-gen.js +17 -0
- package/dist/extensions/forgecli/wf-engine/id-gen.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/loader.d.ts +2 -0
- package/dist/extensions/forgecli/wf-engine/loader.js +100 -0
- package/dist/extensions/forgecli/wf-engine/loader.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/predicate.d.ts +7 -0
- package/dist/extensions/forgecli/wf-engine/predicate.js +36 -0
- package/dist/extensions/forgecli/wf-engine/predicate.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/prompt-compiler.d.ts +15 -0
- package/dist/extensions/forgecli/wf-engine/prompt-compiler.js +23 -0
- package/dist/extensions/forgecli/wf-engine/prompt-compiler.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/register.d.ts +9 -0
- package/dist/extensions/forgecli/wf-engine/register.js +59 -0
- package/dist/extensions/forgecli/wf-engine/register.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/remit-check.d.ts +6 -0
- package/dist/extensions/forgecli/wf-engine/remit-check.js +42 -0
- package/dist/extensions/forgecli/wf-engine/remit-check.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/state-store.d.ts +13 -0
- package/dist/extensions/forgecli/wf-engine/state-store.js +43 -0
- package/dist/extensions/forgecli/wf-engine/state-store.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/types.d.ts +66 -0
- package/dist/extensions/forgecli/wf-engine/types.js +2 -0
- package/dist/extensions/forgecli/wf-engine/types.js.map +1 -0
- package/dist/extensions/forgecli/wf-engine/worker.d.ts +11 -0
- package/dist/extensions/forgecli/wf-engine/worker.js +50 -0
- package/dist/extensions/forgecli/wf-engine/worker.js.map +1 -0
- package/dist/forge-payload/.base-pack/workflows/_fragments/context-injection.md +10 -4
- package/dist/forge-payload/.base-pack/workflows/fix_bug.md +12 -0
- package/dist/forge-payload/.schemas/bug.schema.json +4 -2
- package/dist/forge-payload/.schemas/event.schema.json +22 -3
- package/dist/forge-payload/commands/add-pipeline.md +342 -0
- package/dist/forge-payload/commands/add-task.md +269 -0
- package/dist/forge-payload/commands/ask.md +43 -0
- package/dist/forge-payload/commands/calibrate.md +356 -0
- package/dist/forge-payload/commands/config.md +202 -0
- package/dist/forge-payload/commands/enhance.md +38 -0
- package/dist/forge-payload/commands/health.md +225 -0
- package/dist/forge-payload/commands/init.md +165 -0
- package/dist/forge-payload/commands/materialize.md +119 -0
- package/dist/forge-payload/commands/migrate.md +160 -0
- package/dist/forge-payload/commands/quiz-agent.md +38 -0
- package/dist/forge-payload/commands/regenerate.md +673 -0
- package/dist/forge-payload/commands/remove.md +174 -0
- package/dist/forge-payload/commands/report-bug.md +191 -0
- package/dist/forge-payload/commands/store-query.md +73 -0
- package/dist/forge-payload/commands/store-repair.md +187 -0
- package/dist/forge-payload/commands/update-tools.md +56 -0
- package/dist/forge-payload/commands/update.md +1376 -0
- package/dist/forge-payload/tools/preflight-gate.cjs +2 -1
- package/dist/forge-payload/tools/read-verdict.cjs +41 -8
- package/dist/forge-payload/tools/store-cli.cjs +4 -3
- package/node_modules/argparse/CHANGELOG.md +216 -0
- package/node_modules/argparse/LICENSE +254 -0
- package/node_modules/argparse/README.md +84 -0
- package/node_modules/argparse/argparse.js +3707 -0
- package/node_modules/argparse/lib/sub.js +67 -0
- package/node_modules/argparse/lib/textwrap.js +440 -0
- package/node_modules/argparse/package.json +31 -0
- package/node_modules/cliui/CHANGELOG.md +121 -0
- package/node_modules/color-convert/CHANGELOG.md +54 -0
- package/node_modules/esprima/ChangeLog +235 -0
- package/node_modules/js-yaml/LICENSE +21 -0
- package/node_modules/js-yaml/README.md +247 -0
- package/node_modules/js-yaml/bin/js-yaml.js +126 -0
- package/node_modules/js-yaml/dist/js-yaml.js +3880 -0
- package/node_modules/js-yaml/dist/js-yaml.min.js +2 -0
- package/node_modules/js-yaml/dist/js-yaml.mjs +3856 -0
- package/node_modules/js-yaml/index.js +47 -0
- package/node_modules/js-yaml/lib/common.js +59 -0
- package/node_modules/js-yaml/lib/dumper.js +965 -0
- package/node_modules/js-yaml/lib/exception.js +55 -0
- package/node_modules/js-yaml/lib/loader.js +1733 -0
- package/node_modules/js-yaml/lib/schema/core.js +11 -0
- package/node_modules/js-yaml/lib/schema/default.js +22 -0
- package/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
- package/node_modules/js-yaml/lib/schema/json.js +19 -0
- package/node_modules/js-yaml/lib/schema.js +121 -0
- package/node_modules/js-yaml/lib/snippet.js +101 -0
- package/node_modules/js-yaml/lib/type/binary.js +125 -0
- package/node_modules/js-yaml/lib/type/bool.js +35 -0
- package/node_modules/js-yaml/lib/type/float.js +97 -0
- package/node_modules/js-yaml/lib/type/int.js +156 -0
- package/node_modules/js-yaml/lib/type/map.js +8 -0
- package/node_modules/js-yaml/lib/type/merge.js +12 -0
- package/node_modules/js-yaml/lib/type/null.js +35 -0
- package/node_modules/js-yaml/lib/type/omap.js +44 -0
- package/node_modules/js-yaml/lib/type/pairs.js +53 -0
- package/node_modules/js-yaml/lib/type/seq.js +8 -0
- package/node_modules/js-yaml/lib/type/set.js +29 -0
- package/node_modules/js-yaml/lib/type/str.js +8 -0
- package/node_modules/js-yaml/lib/type/timestamp.js +88 -0
- package/node_modules/js-yaml/lib/type.js +66 -0
- package/node_modules/js-yaml/package.json +66 -0
- package/node_modules/mz/HISTORY.md +66 -0
- package/node_modules/proper-lockfile/CHANGELOG.md +108 -0
- package/node_modules/source-map/CHANGELOG.md +301 -0
- package/node_modules/thenify/History.md +11 -0
- package/node_modules/thenify-all/History.md +11 -0
- package/node_modules/y18n/CHANGELOG.md +100 -0
- package/node_modules/yargs/CHANGELOG.md +88 -0
- package/node_modules/yargs-parser/CHANGELOG.md +263 -0
- package/package.json +6 -2
- package/workflows/lead-qualifier/prompts/digest.md +44 -0
- package/workflows/lead-qualifier/prompts/draft-outreach.md +44 -0
- package/workflows/lead-qualifier/prompts/enrich.md +52 -0
- package/workflows/lead-qualifier/prompts/intake.md +48 -0
- package/workflows/lead-qualifier/prompts/mark-cold.md +38 -0
- package/workflows/lead-qualifier/prompts/score.md +45 -0
- package/workflows/lead-qualifier/workflow.yaml +95 -0
- package/workflows/research-brief/prompts/brief-synthesize.md +43 -0
- package/workflows/research-brief/prompts/intake.md +51 -0
- package/workflows/research-brief/prompts/source-critique.md +38 -0
- package/workflows/research-brief/prompts/source-score.md +38 -0
- package/workflows/research-brief/prompts/source-summarize.md +54 -0
- package/workflows/research-brief/workflow.yaml +66 -0
- package/dist/extensions/forgecli/session-monitor-widget.d.ts +0 -37
- package/dist/extensions/forgecli/session-monitor-widget.js +0 -320
- package/dist/extensions/forgecli/session-monitor-widget.js.map +0 -1
- package/dist/extensions/forgecli/session-monitor.d.ts +0 -2
- package/dist/extensions/forgecli/session-monitor.js +0 -135
- 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
|
-
|
|
|
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) {
|
package/dist/bin/forge.js.map
CHANGED
|
@@ -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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
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;
|