@entelligentsia/forgecli 0.8.4 → 0.9.0
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 +53 -0
- package/dist/bin/argv.d.ts +2 -2
- package/dist/bin/argv.js +17 -0
- package/dist/bin/argv.js.map +1 -1
- package/dist/bin/config.d.ts +69 -0
- package/dist/bin/config.js +315 -0
- package/dist/bin/config.js.map +1 -0
- package/dist/bin/doctor.d.ts +1 -0
- package/dist/bin/doctor.js +12 -0
- package/dist/bin/doctor.js.map +1 -1
- package/dist/bin/forge.js +7 -0
- package/dist/bin/forge.js.map +1 -1
- package/dist/extensions/forgecli/config-command.d.ts +8 -0
- package/dist/extensions/forgecli/config-command.js +66 -0
- package/dist/extensions/forgecli/config-command.js.map +1 -0
- package/dist/extensions/forgecli/config-layer.d.ts +38 -0
- package/dist/extensions/forgecli/config-layer.js +68 -0
- package/dist/extensions/forgecli/config-layer.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/component.d.ts +35 -0
- package/dist/extensions/forgecli/config-tui/component.js +236 -0
- package/dist/extensions/forgecli/config-tui/component.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/handler.d.ts +40 -0
- package/dist/extensions/forgecli/config-tui/handler.js +240 -0
- package/dist/extensions/forgecli/config-tui/handler.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/index.d.ts +5 -0
- package/dist/extensions/forgecli/config-tui/index.js +5 -0
- package/dist/extensions/forgecli/config-tui/index.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/keys.d.ts +26 -0
- package/dist/extensions/forgecli/config-tui/keys.js +33 -0
- package/dist/extensions/forgecli/config-tui/keys.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/plugin-config-reader.d.ts +23 -0
- package/dist/extensions/forgecli/config-tui/plugin-config-reader.js +58 -0
- package/dist/extensions/forgecli/config-tui/plugin-config-reader.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/advanced-menu.d.ts +7 -0
- package/dist/extensions/forgecli/config-tui/screens/advanced-menu.js +83 -0
- package/dist/extensions/forgecli/config-tui/screens/advanced-menu.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/confirm-quit.d.ts +11 -0
- package/dist/extensions/forgecli/config-tui/screens/confirm-quit.js +54 -0
- package/dist/extensions/forgecli/config-tui/screens/confirm-quit.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/override-editor.d.ts +11 -0
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js +233 -0
- package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.d.ts +7 -0
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +91 -0
- package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/overrides-list.d.ts +7 -0
- package/dist/extensions/forgecli/config-tui/screens/overrides-list.js +71 -0
- package/dist/extensions/forgecli/config-tui/screens/overrides-list.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/persona-editor.d.ts +10 -0
- package/dist/extensions/forgecli/config-tui/screens/persona-editor.js +182 -0
- package/dist/extensions/forgecli/config-tui/screens/persona-editor.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/persona-picker.d.ts +7 -0
- package/dist/extensions/forgecli/config-tui/screens/persona-picker.js +76 -0
- package/dist/extensions/forgecli/config-tui/screens/persona-picker.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/personas-list.d.ts +7 -0
- package/dist/extensions/forgecli/config-tui/screens/personas-list.js +98 -0
- package/dist/extensions/forgecli/config-tui/screens/personas-list.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/shared.d.ts +29 -0
- package/dist/extensions/forgecli/config-tui/screens/shared.js +100 -0
- package/dist/extensions/forgecli/config-tui/screens/shared.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.d.ts +23 -0
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +128 -0
- package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/tier-menu.d.ts +7 -0
- package/dist/extensions/forgecli/config-tui/screens/tier-menu.js +135 -0
- package/dist/extensions/forgecli/config-tui/screens/tier-menu.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/tier-picker.d.ts +9 -0
- package/dist/extensions/forgecli/config-tui/screens/tier-picker.js +122 -0
- package/dist/extensions/forgecli/config-tui/screens/tier-picker.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens/types.d.ts +24 -0
- package/dist/extensions/forgecli/config-tui/screens/types.js +5 -0
- package/dist/extensions/forgecli/config-tui/screens/types.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/screens.d.ts +24 -0
- package/dist/extensions/forgecli/config-tui/screens.js +78 -0
- package/dist/extensions/forgecli/config-tui/screens.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +11 -0
- package/dist/extensions/forgecli/config-tui/state/buffer.js +91 -0
- package/dist/extensions/forgecli/config-tui/state/buffer.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state/constants.d.ts +4 -0
- package/dist/extensions/forgecli/config-tui/state/constants.js +14 -0
- package/dist/extensions/forgecli/config-tui/state/constants.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state/index.d.ts +6 -0
- package/dist/extensions/forgecli/config-tui/state/index.js +9 -0
- package/dist/extensions/forgecli/config-tui/state/index.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state/init.d.ts +2 -0
- package/dist/extensions/forgecli/config-tui/state/init.js +30 -0
- package/dist/extensions/forgecli/config-tui/state/init.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state/model.d.ts +192 -0
- package/dist/extensions/forgecli/config-tui/state/model.js +4 -0
- package/dist/extensions/forgecli/config-tui/state/model.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state/reducer.d.ts +2 -0
- package/dist/extensions/forgecli/config-tui/state/reducer.js +212 -0
- package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +91 -0
- package/dist/extensions/forgecli/config-tui/state/selectors.js +231 -0
- package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/state.d.ts +6 -0
- package/dist/extensions/forgecli/config-tui/state.js +11 -0
- package/dist/extensions/forgecli/config-tui/state.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/theme.d.ts +37 -0
- package/dist/extensions/forgecli/config-tui/theme.js +88 -0
- package/dist/extensions/forgecli/config-tui/theme.js.map +1 -0
- package/dist/extensions/forgecli/config-tui/tier-meta.d.ts +28 -0
- package/dist/extensions/forgecli/config-tui/tier-meta.js +69 -0
- package/dist/extensions/forgecli/config-tui/tier-meta.js.map +1 -0
- package/dist/extensions/forgecli/config-writer.d.ts +16 -0
- package/dist/extensions/forgecli/config-writer.js +63 -0
- package/dist/extensions/forgecli/config-writer.js.map +1 -0
- package/dist/extensions/forgecli/fix-bug.js +85 -1
- package/dist/extensions/forgecli/fix-bug.js.map +1 -1
- package/dist/extensions/forgecli/forge-cli-schema.json +54 -0
- package/dist/extensions/forgecli/forge-commands.js +3 -8
- package/dist/extensions/forgecli/forge-commands.js.map +1 -1
- package/dist/extensions/forgecli/forge-subagent.d.ts +13 -0
- package/dist/extensions/forgecli/forge-subagent.js +19 -0
- package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
- package/dist/extensions/forgecli/index.js +16 -0
- package/dist/extensions/forgecli/index.js.map +1 -1
- package/dist/extensions/forgecli/input-router.d.ts +33 -0
- package/dist/extensions/forgecli/input-router.js +133 -0
- package/dist/extensions/forgecli/input-router.js.map +1 -0
- package/dist/extensions/forgecli/model-resolver.d.ts +32 -0
- package/dist/extensions/forgecli/model-resolver.js +65 -0
- package/dist/extensions/forgecli/model-resolver.js.map +1 -0
- package/dist/extensions/forgecli/model-validator.d.ts +29 -0
- package/dist/extensions/forgecli/model-validator.js +107 -0
- package/dist/extensions/forgecli/model-validator.js.map +1 -0
- package/dist/extensions/forgecli/run-sprint.js +59 -0
- package/dist/extensions/forgecli/run-sprint.js.map +1 -1
- package/dist/extensions/forgecli/run-task.js +93 -1
- package/dist/extensions/forgecli/run-task.js.map +1 -1
- package/dist/extensions/forgecli/thread-switcher.js +5 -2
- package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
- package/dist/extensions/forgecli/whats-new-widget.js +5 -2
- package/dist/extensions/forgecli/whats-new-widget.js.map +1 -1
- package/package.json +11 -3
- package/dist/extensions/forgecli/review-command.d.ts +0 -2
- package/dist/extensions/forgecli/review-command.js +0 -184
- package/dist/extensions/forgecli/review-command.js.map +0 -1
- package/dist/forge-payload/.tools/banners.cjs +0 -435
- package/dist/forge-payload/.tools/build-context-pack.cjs +0 -290
- package/dist/forge-payload/.tools/build-init-context.cjs +0 -322
- package/dist/forge-payload/.tools/build-overlay.cjs +0 -326
- package/dist/forge-payload/.tools/build-persona-pack.cjs +0 -226
- package/dist/forge-payload/.tools/collate.cjs +0 -1041
- package/dist/forge-payload/.tools/generation-manifest.cjs +0 -311
- package/dist/forge-payload/.tools/lib/forge-root.cjs +0 -59
- package/dist/forge-payload/.tools/lib/paths.cjs +0 -29
- package/dist/forge-payload/.tools/lib/pricing.cjs +0 -165
- package/dist/forge-payload/.tools/lib/project-root.cjs +0 -32
- package/dist/forge-payload/.tools/lib/result.js +0 -40
- package/dist/forge-payload/.tools/lib/store-facade.cjs +0 -162
- package/dist/forge-payload/.tools/lib/store-nlp.cjs +0 -250
- package/dist/forge-payload/.tools/lib/store-query-exec.cjs +0 -272
- package/dist/forge-payload/.tools/lib/validate.js +0 -141
- package/dist/forge-payload/.tools/manage-config.cjs +0 -340
- package/dist/forge-payload/.tools/manage-versions.cjs +0 -365
- package/dist/forge-payload/.tools/package.json +0 -3
- package/dist/forge-payload/.tools/parse-gates.cjs +0 -151
- package/dist/forge-payload/.tools/parse-verdict.cjs +0 -67
- package/dist/forge-payload/.tools/preflight-gate.cjs +0 -350
- package/dist/forge-payload/.tools/prompts/sprint-plan-prompt.md +0 -70
- package/dist/forge-payload/.tools/schemas/task-list.schema.json +0 -53
- package/dist/forge-payload/.tools/seed-store.cjs +0 -237
- package/dist/forge-payload/.tools/store-cli.cjs +0 -1226
- package/dist/forge-payload/.tools/store-query.cjs +0 -319
- package/dist/forge-payload/.tools/store.cjs +0 -315
- package/dist/forge-payload/.tools/substitute-placeholders.cjs +0 -625
- package/dist/forge-payload/.tools/validate-store.cjs +0 -593
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,59 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.0] — 2026-05-18
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Per-persona model routing** — Forge now routes each pipeline phase
|
|
14
|
+
(plan, review-plan, implement, review-code, validate, approve, writeback,
|
|
15
|
+
commit) to a specific AI model via persona-model assignments resolved
|
|
16
|
+
through a four-level cascade: per-step override → per-persona override →
|
|
17
|
+
tier baseline → pi current. The cascade is invisible to the user;
|
|
18
|
+
plain-English labels ("Heavy tier (global)", "Step override") replace
|
|
19
|
+
internal L1/L2/L3/L4 jargon everywhere it appears.
|
|
20
|
+
- **Tiered-baseline config TUI** — `/forge:config` (and `forge config`)
|
|
21
|
+
now opens a three-knob landing screen: pick **Heavy** (architect,
|
|
22
|
+
supervisor), **Standard** (engineer, bug-fixer, qa-engineer,
|
|
23
|
+
product-manager), or **Light** (collator, librarian, orchestrator) —
|
|
24
|
+
one model per tier and all nine personas are configured in under 30
|
|
25
|
+
seconds. Tier selections commit immediately (no separate save step).
|
|
26
|
+
Scope toggles between project and global per tier-pick.
|
|
27
|
+
- **`forge config show --resolved`** — prints a phase-by-phase table
|
|
28
|
+
showing which model runs each step, which persona handles it, and where
|
|
29
|
+
the assignment comes from (tier baseline, persona override, step
|
|
30
|
+
override, or pi-current fallback).
|
|
31
|
+
- **`forge config dispatch [--pipeline=<name>] [--json]`** — per-phase
|
|
32
|
+
dispatch trace without making an LLM call. Shows the resolved model
|
|
33
|
+
and source for every phase of the chosen pipeline.
|
|
34
|
+
- **`forge config show --strict-models`** — validates that every
|
|
35
|
+
resolved model exists in the authenticated provider catalog. Exits
|
|
36
|
+
non-zero if any persona or step resolves to an unavailable model.
|
|
37
|
+
- **Advanced menu** — per-persona and per-step overrides are reachable
|
|
38
|
+
from a dedicated "Advanced" screen, clearly separated from the
|
|
39
|
+
primary tier knobs. Explanation banners explain that most users
|
|
40
|
+
don't need these.
|
|
41
|
+
- **Observability** — each phase now logs `requested_model` and
|
|
42
|
+
`model_observed` so users can verify that the intended model ran.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
- **Bug-fix pipeline uses same persona routing** — `runBugPipeline`
|
|
46
|
+
now dispatches via `resolveModelForPhase` for every phase, consistent
|
|
47
|
+
with the task pipeline.
|
|
48
|
+
- **Config TUI theming + width safety** — all screens use the pi TUI
|
|
49
|
+
theme (accent, muted, warning, border, etc.) and truncate to
|
|
50
|
+
terminal width via `safeLines`. Adaptive-width confirm-quit dialog.
|
|
51
|
+
- **Config TUI `top-menu` removed** — replaced entirely by the tier-menu
|
|
52
|
+
landing screen. The `isEmpty` state snapshot is now a selector
|
|
53
|
+
(`isConfigEmpty`) derived from the buffer.
|
|
54
|
+
|
|
55
|
+
### Fixed
|
|
56
|
+
- **Forge-project detection** — `forge config` detects a Forge project
|
|
57
|
+
by the presence of `.forge/config.json` (not `.pi/`).
|
|
58
|
+
- **Dirty tracking + confirm-quit** — save clears dirty; quit while
|
|
59
|
+
dirty opens a themed modal instead of exiting immediately.
|
|
60
|
+
- **Scroll for long pickers** — provider and model pickers window
|
|
61
|
+
around the cursor when lists exceed the viewport.
|
|
62
|
+
|
|
10
63
|
## [0.8.4] — 2026-05-18
|
|
11
64
|
|
|
12
65
|
### Changed
|
package/dist/bin/argv.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** Parsed result when `--version`, `--help`, `doctor`, `update`, or a fast-path subcommand is requested. */
|
|
2
|
-
export type ForgeAction = "version" | "help" | "doctor" | "update" | "subcommand" | null;
|
|
1
|
+
/** Parsed result when `--version`, `--help`, `doctor`, `update`, `config`, or a fast-path subcommand is requested. */
|
|
2
|
+
export type ForgeAction = "version" | "help" | "doctor" | "update" | "config" | "subcommand" | null;
|
|
3
3
|
/**
|
|
4
4
|
* Whitelist of bare subcommands that bypass pi and exec a bundled cjs tool
|
|
5
5
|
* directly. Each entry maps the user-typed subcommand to the cjs filename
|
package/dist/bin/argv.js
CHANGED
|
@@ -88,6 +88,11 @@ export function parseForgeArgv(argv) {
|
|
|
88
88
|
i++;
|
|
89
89
|
continue;
|
|
90
90
|
}
|
|
91
|
+
if (token === "--strict-models") {
|
|
92
|
+
env.FORGE_STRICT_MODELS = "1";
|
|
93
|
+
i++;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
91
96
|
if (token === "--registry") {
|
|
92
97
|
if (i + 1 >= argv.length) {
|
|
93
98
|
return { error: "forge: --registry requires a path argument. Run `forge --help` for usage." };
|
|
@@ -136,6 +141,18 @@ export function parseForgeArgv(argv) {
|
|
|
136
141
|
subcommandArgs: argv.slice(i + 1),
|
|
137
142
|
};
|
|
138
143
|
}
|
|
144
|
+
// ── `forge config` — routing config subcommand (Plan 16) ────────────
|
|
145
|
+
// Intercepts `config show [--resolved] [--json]`. Bare `config` with no
|
|
146
|
+
// args is also handled (prints usage). Anything else falls through to pi.
|
|
147
|
+
// Only matches the first bare token, no flags collected yet.
|
|
148
|
+
if (token === "config" && piArgv.length === 0) {
|
|
149
|
+
return {
|
|
150
|
+
forgeAction: "config",
|
|
151
|
+
piArgv: [],
|
|
152
|
+
env,
|
|
153
|
+
subcommandArgs: argv.slice(i + 1),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
139
156
|
// ── Fast-path subcommand (forge store, forge collate, etc.) ──────────
|
|
140
157
|
// Only matches the FIRST bare token, and only when no flags have
|
|
141
158
|
// been collected yet (so `forge --cwd /tmp store ...` still treats
|
package/dist/bin/argv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argv.js","sourceRoot":"","sources":["../../src/bin/argv.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"argv.js","sourceRoot":"","sources":["../../src/bin/argv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface ConfigArgs {
|
|
2
|
+
subcommand: "show" | "dispatch" | "usage";
|
|
3
|
+
resolved: boolean;
|
|
4
|
+
json: boolean;
|
|
5
|
+
/** dispatch-only: pipeline name override (defaults to "default" for task, "fix-bug" for bug). */
|
|
6
|
+
pipeline?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ConfigArgsError {
|
|
9
|
+
error: string;
|
|
10
|
+
}
|
|
11
|
+
export type ParseConfigResult = ConfigArgs | ConfigArgsError;
|
|
12
|
+
export declare function parseConfigArgs(args: string[]): ParseConfigResult;
|
|
13
|
+
export interface PersonaModelEntry {
|
|
14
|
+
persona: string;
|
|
15
|
+
provider: string;
|
|
16
|
+
model: string;
|
|
17
|
+
available: boolean;
|
|
18
|
+
source: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ConfigShowOutput {
|
|
21
|
+
personaModels: Record<string, PersonaModelEntry>;
|
|
22
|
+
pipelines: Record<string, PipelineShowOutput>;
|
|
23
|
+
}
|
|
24
|
+
export interface PipelineShowOutput {
|
|
25
|
+
personaModels: Record<string, PersonaModelEntry>;
|
|
26
|
+
phases: Array<{
|
|
27
|
+
role: string;
|
|
28
|
+
override: string | null;
|
|
29
|
+
available: boolean;
|
|
30
|
+
source: string;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
type WriteFn = (line: string) => void;
|
|
34
|
+
export declare function runConfigShow(opts: ConfigArgs, cwd: string, write: WriteFn): Promise<number>;
|
|
35
|
+
export interface DispatchPhaseRow {
|
|
36
|
+
pipeline: "default" | "fix-bug";
|
|
37
|
+
phaseRole: string;
|
|
38
|
+
persona: string;
|
|
39
|
+
requested: {
|
|
40
|
+
provider: string;
|
|
41
|
+
model: string;
|
|
42
|
+
} | null;
|
|
43
|
+
source: string;
|
|
44
|
+
/** True if pi.modelRegistry.find(provider, model) returns a Model — i.e. setModel
|
|
45
|
+
* will actually take effect at dispatch time. False = will silently fall through
|
|
46
|
+
* to pi's current model.
|
|
47
|
+
*/
|
|
48
|
+
registered: boolean | null;
|
|
49
|
+
/** When registered === true, the exact id the registry returned. May differ from
|
|
50
|
+
* `requested.model` if pi aliases (e.g. "claude-haiku-4-5" → "claude-haiku-4-5-20251001").
|
|
51
|
+
*/
|
|
52
|
+
registryId: string | null;
|
|
53
|
+
}
|
|
54
|
+
export interface DispatchOutput {
|
|
55
|
+
cwd: string;
|
|
56
|
+
taskPipeline: string;
|
|
57
|
+
taskPhases: DispatchPhaseRow[];
|
|
58
|
+
bugPhases: DispatchPhaseRow[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Walk run-task's PHASES and fix-bug's BUG_PHASES; for each, compute the requested
|
|
62
|
+
* model via the same resolveModelForPhase the orchestrator uses, and verify that
|
|
63
|
+
* pi's ModelRegistry can resolve the requested id. Prints a table or JSON.
|
|
64
|
+
*
|
|
65
|
+
* No LLM call. No pi session. Pure inspection.
|
|
66
|
+
*/
|
|
67
|
+
export declare function runConfigDispatch(args: ConfigArgs, cwd: string, write: (line: string) => void): number;
|
|
68
|
+
export declare function runConfig(args: string[], cwd?: string): Promise<number>;
|
|
69
|
+
export {};
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
// forge config — routing config inspector (Plan 16, Slice 3).
|
|
2
|
+
//
|
|
3
|
+
// Subcommands:
|
|
4
|
+
// forge config show Print persona-models and pipeline overrides
|
|
5
|
+
// forge config show --resolved Same, with per-entry cascade source annotation
|
|
6
|
+
// forge config show --json Machine-readable JSON output
|
|
7
|
+
// forge config show --resolved --json Both
|
|
8
|
+
// forge config dispatch Per-phase dispatch trace (no LLM call)
|
|
9
|
+
// forge config dispatch --json Machine-readable JSON output
|
|
10
|
+
//
|
|
11
|
+
// This command reads from:
|
|
12
|
+
// ~/.pi/agent/forge-cli/config.json (L1 global)
|
|
13
|
+
// <cwd>/.pi/forge-cli/config.json (L2/L3/L4 project)
|
|
14
|
+
// <cwd>/.forge/config.json (pipeline catalogue — optional)
|
|
15
|
+
// And checks availability against the pi ModelRegistry (same as `forge doctor`).
|
|
16
|
+
//
|
|
17
|
+
// The persona catalogue is read from the bundled base-pack personas dir.
|
|
18
|
+
import * as fs from "node:fs";
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
import { AuthStorage, ModelRegistry } from "@earendil-works/pi-coding-agent";
|
|
22
|
+
import { loadLayeredConfig } from "../extensions/forgecli/config-layer.js";
|
|
23
|
+
import { lookupPersonaModel, resolveModelForPhase } from "../extensions/forgecli/model-resolver.js";
|
|
24
|
+
import { PHASES } from "../extensions/forgecli/run-task.js";
|
|
25
|
+
import { BUG_PHASES } from "../extensions/forgecli/fix-bug.js";
|
|
26
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
27
|
+
const __dirname = path.dirname(__filename);
|
|
28
|
+
export function parseConfigArgs(args) {
|
|
29
|
+
if (args.length === 0) {
|
|
30
|
+
return { subcommand: "usage", resolved: false, json: false };
|
|
31
|
+
}
|
|
32
|
+
const [sub, ...rest] = args;
|
|
33
|
+
if (sub === "show") {
|
|
34
|
+
let resolved = false;
|
|
35
|
+
let json = false;
|
|
36
|
+
for (const flag of rest) {
|
|
37
|
+
if (flag === "--resolved") {
|
|
38
|
+
resolved = true;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (flag === "--json") {
|
|
42
|
+
json = true;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
return { error: `forge config show: unknown flag "${flag}"` };
|
|
46
|
+
}
|
|
47
|
+
return { subcommand: "show", resolved, json };
|
|
48
|
+
}
|
|
49
|
+
if (sub === "dispatch") {
|
|
50
|
+
let json = false;
|
|
51
|
+
let pipeline;
|
|
52
|
+
for (const flag of rest) {
|
|
53
|
+
if (flag === "--json") {
|
|
54
|
+
json = true;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (flag.startsWith("--pipeline=")) {
|
|
58
|
+
pipeline = flag.slice("--pipeline=".length);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
return { error: `forge config dispatch: unknown flag "${flag}"` };
|
|
62
|
+
}
|
|
63
|
+
return { subcommand: "dispatch", resolved: false, json, pipeline };
|
|
64
|
+
}
|
|
65
|
+
return { error: `forge config: unknown subcommand "${sub}". Try: forge config show [--resolved] [--json] | dispatch [--pipeline=<name>] [--json]` };
|
|
66
|
+
}
|
|
67
|
+
// ── Persona catalogue ────────────────────────────────────────────────────────
|
|
68
|
+
function readPersonaCatalogue() {
|
|
69
|
+
const personasDir = path.resolve(__dirname, "..", "forge-payload", ".base-pack", "personas");
|
|
70
|
+
try {
|
|
71
|
+
return fs.readdirSync(personasDir)
|
|
72
|
+
.filter((f) => f.endsWith(".md") && !f.endsWith("-skills.md"))
|
|
73
|
+
.map((f) => f.replace(/\.md$/, ""));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ── Pipeline catalogue from .forge/config.json ───────────────────────────────
|
|
80
|
+
function readPipelineCatalogue(cwd) {
|
|
81
|
+
const forgeCfgPath = path.join(cwd, ".forge", "config.json");
|
|
82
|
+
try {
|
|
83
|
+
const raw = fs.readFileSync(forgeCfgPath, "utf-8");
|
|
84
|
+
const cfg = JSON.parse(raw);
|
|
85
|
+
if (cfg && typeof cfg === "object" && "pipelines" in cfg) {
|
|
86
|
+
const pipelines = cfg.pipelines;
|
|
87
|
+
if (pipelines && typeof pipelines === "object") {
|
|
88
|
+
return Object.keys(pipelines);
|
|
89
|
+
}
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export async function runConfigShow(opts, cwd, write) {
|
|
99
|
+
const { resolved: showResolved, json } = opts;
|
|
100
|
+
const { merged } = loadLayeredConfig(cwd);
|
|
101
|
+
const personaCatalogue = readPersonaCatalogue();
|
|
102
|
+
const pipelineCatalogue = readPipelineCatalogue(cwd);
|
|
103
|
+
const authStorage = AuthStorage.create();
|
|
104
|
+
const modelRegistry = ModelRegistry.create(authStorage);
|
|
105
|
+
const available = modelRegistry.getAvailable();
|
|
106
|
+
const hasPersonaModels = merged._global?.["persona-models"] !== undefined ||
|
|
107
|
+
merged._project?.["persona-models"] !== undefined;
|
|
108
|
+
const hasPipelines = merged.pipelines !== undefined && Object.keys(merged.pipelines).length > 0;
|
|
109
|
+
if (!hasPersonaModels && !hasPipelines) {
|
|
110
|
+
if (json) {
|
|
111
|
+
write(JSON.stringify({ personaModels: {}, pipelines: {} }, null, 2));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
write("No forge-cli model routing config found.");
|
|
115
|
+
write("");
|
|
116
|
+
write("Create ~/.pi/agent/forge-cli/config.json or <project>/.pi/forge-cli/config.json");
|
|
117
|
+
write("to configure persona → model routing.");
|
|
118
|
+
}
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
// Build the persona entries map
|
|
122
|
+
const personaModels = {};
|
|
123
|
+
// Collect all persona names defined across both layers
|
|
124
|
+
const allPersonaNames = new Set([
|
|
125
|
+
...Object.keys(merged._global?.["persona-models"] ?? {}),
|
|
126
|
+
...Object.keys(merged._project?.["persona-models"] ?? {}),
|
|
127
|
+
]);
|
|
128
|
+
for (const personaName of Array.from(allPersonaNames).sort()) {
|
|
129
|
+
const lookup = lookupPersonaModel(personaName, "default", merged);
|
|
130
|
+
if (!lookup.model)
|
|
131
|
+
continue;
|
|
132
|
+
const isAvail = available.some((m) => m.provider === lookup.model.provider && m.id === lookup.model.model);
|
|
133
|
+
personaModels[personaName] = {
|
|
134
|
+
persona: personaName,
|
|
135
|
+
provider: lookup.model.provider,
|
|
136
|
+
model: lookup.model.model,
|
|
137
|
+
available: isAvail,
|
|
138
|
+
source: lookup.source,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Build pipeline output
|
|
142
|
+
const pipelinesOutput = {};
|
|
143
|
+
for (const [pipelineName, pipelineCfg] of Object.entries(merged.pipelines ?? {})) {
|
|
144
|
+
const pipelinePersonaModels = {};
|
|
145
|
+
for (const [key, value] of Object.entries(pipelineCfg["persona-models"] ?? {})) {
|
|
146
|
+
const isAvail = available.some((m) => m.provider === value.provider && m.id === value.model);
|
|
147
|
+
pipelinePersonaModels[key] = {
|
|
148
|
+
persona: key,
|
|
149
|
+
provider: value.provider,
|
|
150
|
+
model: value.model,
|
|
151
|
+
available: isAvail,
|
|
152
|
+
source: "L3",
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const phasesOutput = Object.entries(pipelineCfg.phases ?? {}).map(([role, phase]) => {
|
|
156
|
+
const override = phase["model-override"];
|
|
157
|
+
if (!override)
|
|
158
|
+
return { role, override: null, available: true, source: "inherit" };
|
|
159
|
+
if (typeof override === "string") {
|
|
160
|
+
return { role, override, available: true, source: "L4-name" };
|
|
161
|
+
}
|
|
162
|
+
const isAvail = available.some((m) => m.provider === override.provider && m.id === override.model);
|
|
163
|
+
return {
|
|
164
|
+
role,
|
|
165
|
+
override: `${override.provider}:${override.model}`,
|
|
166
|
+
available: isAvail,
|
|
167
|
+
source: "L4-inline",
|
|
168
|
+
};
|
|
169
|
+
});
|
|
170
|
+
pipelinesOutput[pipelineName] = { personaModels: pipelinePersonaModels, phases: phasesOutput };
|
|
171
|
+
}
|
|
172
|
+
if (json) {
|
|
173
|
+
write(JSON.stringify({ personaModels, pipelines: pipelinesOutput }, null, 2));
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
// Human-readable output
|
|
177
|
+
write("forge config — model routing" + (showResolved ? " (resolved)" : ""));
|
|
178
|
+
write("");
|
|
179
|
+
if (Object.keys(personaModels).length > 0) {
|
|
180
|
+
write("persona-models:");
|
|
181
|
+
const colWidths = {
|
|
182
|
+
persona: Math.max(8, ...Object.keys(personaModels).map((k) => k.length)),
|
|
183
|
+
model: Math.max(5, ...Object.values(personaModels).map((e) => `${e.provider}:${e.model}`.length)),
|
|
184
|
+
};
|
|
185
|
+
for (const entry of Object.values(personaModels)) {
|
|
186
|
+
const availBadge = entry.available ? "✓" : "✗ unavailable";
|
|
187
|
+
const modelStr = `${entry.provider}:${entry.model}`;
|
|
188
|
+
const personaPad = entry.persona.padEnd(colWidths.persona);
|
|
189
|
+
const modelPad = modelStr.padEnd(colWidths.model);
|
|
190
|
+
if (showResolved) {
|
|
191
|
+
write(` ${personaPad} → ${modelPad} ${availBadge} ${entry.source}`);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
write(` ${personaPad} → ${modelPad} ${availBadge}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
write("");
|
|
198
|
+
}
|
|
199
|
+
if (pipelineCatalogue !== null && hasPipelines) {
|
|
200
|
+
write("pipeline overrides:");
|
|
201
|
+
for (const [pName, pOut] of Object.entries(pipelinesOutput)) {
|
|
202
|
+
const inCatalogue = pipelineCatalogue.includes(pName);
|
|
203
|
+
const marker = inCatalogue ? "" : " ⚠ (not in .forge/config.json)";
|
|
204
|
+
write(` [${pName}]${marker}`);
|
|
205
|
+
for (const [key, entry] of Object.entries(pOut.personaModels)) {
|
|
206
|
+
const badge = entry.available ? "✓" : "✗ unavailable";
|
|
207
|
+
write(` ${key} → ${entry.provider}:${entry.model} ${badge}`);
|
|
208
|
+
}
|
|
209
|
+
for (const phase of pOut.phases) {
|
|
210
|
+
if (phase.override) {
|
|
211
|
+
const badge = phase.available ? "✓" : "✗ unavailable";
|
|
212
|
+
write(` phase[${phase.role}] → ${phase.override} ${badge} ${phase.source}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
write("");
|
|
217
|
+
}
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Walk run-task's PHASES and fix-bug's BUG_PHASES; for each, compute the requested
|
|
222
|
+
* model via the same resolveModelForPhase the orchestrator uses, and verify that
|
|
223
|
+
* pi's ModelRegistry can resolve the requested id. Prints a table or JSON.
|
|
224
|
+
*
|
|
225
|
+
* No LLM call. No pi session. Pure inspection.
|
|
226
|
+
*/
|
|
227
|
+
export function runConfigDispatch(args, cwd, write) {
|
|
228
|
+
const taskPipeline = args.pipeline ?? "default";
|
|
229
|
+
const bugPipeline = "fix-bug";
|
|
230
|
+
const { merged } = loadLayeredConfig(cwd);
|
|
231
|
+
const registry = ModelRegistry.create(AuthStorage.create());
|
|
232
|
+
const traceOne = (pipelineName, phaseRole, personaNoun) => {
|
|
233
|
+
const res = resolveModelForPhase(pipelineName, phaseRole, personaNoun, merged);
|
|
234
|
+
if (!res.model) {
|
|
235
|
+
return {
|
|
236
|
+
pipeline: pipelineName,
|
|
237
|
+
phaseRole,
|
|
238
|
+
persona: personaNoun,
|
|
239
|
+
requested: null,
|
|
240
|
+
source: res.source,
|
|
241
|
+
registered: null,
|
|
242
|
+
registryId: null,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
const found = registry.find?.(res.model.provider, res.model.model);
|
|
246
|
+
return {
|
|
247
|
+
pipeline: pipelineName,
|
|
248
|
+
phaseRole,
|
|
249
|
+
persona: personaNoun,
|
|
250
|
+
requested: { provider: res.model.provider, model: res.model.model },
|
|
251
|
+
source: res.source,
|
|
252
|
+
registered: !!found,
|
|
253
|
+
registryId: found?.id ?? null,
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
const taskPhases = PHASES.map((p) => traceOne(taskPipeline, p.role, p.personaNoun));
|
|
257
|
+
const bugPhases = BUG_PHASES.map((p) => traceOne(bugPipeline, p.role, p.personaNoun));
|
|
258
|
+
if (args.json) {
|
|
259
|
+
const out = { cwd, taskPipeline, taskPhases, bugPhases };
|
|
260
|
+
write(JSON.stringify(out, null, 2));
|
|
261
|
+
return 0;
|
|
262
|
+
}
|
|
263
|
+
// Human-readable table.
|
|
264
|
+
const fmt = (row) => {
|
|
265
|
+
const req = row.requested
|
|
266
|
+
? `${row.requested.provider}:${row.requested.model}`
|
|
267
|
+
: "(inherit pi current)";
|
|
268
|
+
let find;
|
|
269
|
+
if (row.registered === null) {
|
|
270
|
+
find = "(skipped — setModel not called)";
|
|
271
|
+
}
|
|
272
|
+
else if (row.registered) {
|
|
273
|
+
find = `✓ ${row.registryId}`;
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
find = `✗ MISS — setModel will silently inherit pi current`;
|
|
277
|
+
}
|
|
278
|
+
return `${row.phaseRole.padEnd(13)} ${row.persona.padEnd(16)} ${req.padEnd(36)} ${find}`;
|
|
279
|
+
};
|
|
280
|
+
write(`forge config dispatch — cwd=${cwd}`);
|
|
281
|
+
write("");
|
|
282
|
+
write(`── run-task PHASES (pipeline: ${taskPipeline}) ─────────────────────────────`);
|
|
283
|
+
write("phase persona requested registry.find");
|
|
284
|
+
write("───── ─────── ───────── ─────────────");
|
|
285
|
+
for (const row of taskPhases)
|
|
286
|
+
write(fmt(row));
|
|
287
|
+
write("");
|
|
288
|
+
write(`── fix-bug BUG_PHASES (pipeline: ${bugPipeline}) ───────────────────────────`);
|
|
289
|
+
write("phase persona requested registry.find");
|
|
290
|
+
write("───── ─────── ───────── ─────────────");
|
|
291
|
+
for (const row of bugPhases)
|
|
292
|
+
write(fmt(row));
|
|
293
|
+
write("");
|
|
294
|
+
write("source map (raw resolver):");
|
|
295
|
+
for (const row of taskPhases) {
|
|
296
|
+
write(` task[${row.phaseRole.padEnd(13)}] ${row.source}`);
|
|
297
|
+
}
|
|
298
|
+
for (const row of bugPhases) {
|
|
299
|
+
write(` bug [${row.phaseRole.padEnd(13)}] ${row.source}`);
|
|
300
|
+
}
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
// ── Entry point ───────────────────────────────────────────────────────────────
|
|
304
|
+
export async function runConfig(args, cwd = process.cwd()) {
|
|
305
|
+
// Plan 16 Slice 4b: delegate to runConfigTui so the bin and pi-extension
|
|
306
|
+
// surfaces share the same argv parser + routing. The bin has no ctx, so
|
|
307
|
+
// interactive subcommands print a "use /forge:config from pi" fallback.
|
|
308
|
+
// Lazy import to avoid a circular dependency at module load.
|
|
309
|
+
const { runConfigTui } = await import("../extensions/forgecli/config-tui/handler.js");
|
|
310
|
+
return runConfigTui(args, cwd, {
|
|
311
|
+
write: (s) => process.stdout.write(s),
|
|
312
|
+
writeErr: (s) => process.stderr.write(s),
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/bin/config.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/doctor.d.ts
CHANGED
package/dist/bin/doctor.js
CHANGED
|
@@ -30,6 +30,17 @@ export async function runDoctorProbe(versions, cwd = process.cwd()) {
|
|
|
30
30
|
const available = modelRegistry.getAvailable();
|
|
31
31
|
const configuredProviders = Array.from(new Set(available.map((m) => m.provider))).sort();
|
|
32
32
|
const status = available.length > 0 ? "ready" : stored.length > 0 ? "no-models" : "no-credentials";
|
|
33
|
+
// Build byProvider: group available model ids by provider, sorted for stable output.
|
|
34
|
+
const byProviderMap = new Map();
|
|
35
|
+
for (const m of available) {
|
|
36
|
+
const ids = byProviderMap.get(m.provider) ?? [];
|
|
37
|
+
ids.push(m.id);
|
|
38
|
+
byProviderMap.set(m.provider, ids);
|
|
39
|
+
}
|
|
40
|
+
const byProvider = {};
|
|
41
|
+
for (const key of Array.from(byProviderMap.keys()).sort()) {
|
|
42
|
+
byProvider[key] = (byProviderMap.get(key) ?? []).sort();
|
|
43
|
+
}
|
|
33
44
|
const report = {
|
|
34
45
|
forgeCli: versions.forgeCli,
|
|
35
46
|
forgePlugin: versions.forgePlugin,
|
|
@@ -44,6 +55,7 @@ export async function runDoctorProbe(versions, cwd = process.cwd()) {
|
|
|
44
55
|
total: all.length,
|
|
45
56
|
available: available.length,
|
|
46
57
|
samples: available.slice(0, 5).map((m) => ({ provider: m.provider, id: m.id })),
|
|
58
|
+
byProvider,
|
|
47
59
|
},
|
|
48
60
|
settings: {
|
|
49
61
|
defaultProvider: settingsManager.getDefaultProvider(),
|
package/dist/bin/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/bin/doctor.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,iEAAiE;AACjE,wEAAwE;AACxE,mEAAmE;AACnE,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AACvE,kBAAkB;AAElB,OAAO,EACN,WAAW,EACX,8BAA8B,EAC9B,WAAW,EACX,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,eAAe,GACf,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/bin/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/forge.js
CHANGED
|
@@ -13,6 +13,7 @@ import { isParseError, parseForgeArgv } from "./argv.js";
|
|
|
13
13
|
import { runDoctor } from "./doctor.js";
|
|
14
14
|
import { applyForgeOwnedEnvDefaults } from "./env-defaults.js";
|
|
15
15
|
import { runUpdate } from "./update-cli.js";
|
|
16
|
+
import { runConfig } from "./config.js";
|
|
16
17
|
// ---------------------------------------------------------------------------
|
|
17
18
|
// Version information (resolved at startup from package.json files)
|
|
18
19
|
// ---------------------------------------------------------------------------
|
|
@@ -61,6 +62,7 @@ Forge-owned options:
|
|
|
61
62
|
--help, -h Print this help message
|
|
62
63
|
--no-update-check Skip forge update check (sets FORGE_NO_UPDATE_CHECK=1)
|
|
63
64
|
--non-interactive Bypass all Y/N gates with defaults, e.g. for CI (sets FORGE_NON_INTERACTIVE=1)
|
|
65
|
+
--strict-models Treat unavailable/unknown model config entries as errors (sets FORGE_STRICT_MODELS=1)
|
|
64
66
|
--registry <path> Override model registry path (sets FORGE_MODEL_REGISTRY=path)
|
|
65
67
|
|
|
66
68
|
Pi options (forwarded verbatim):
|
|
@@ -84,6 +86,7 @@ Unknown flags are rejected — forge performs strict argv ownership.
|
|
|
84
86
|
Subcommands:
|
|
85
87
|
doctor [--json] Preflight check — pi auth, model availability, settings
|
|
86
88
|
update [--check] [--yes] [--version <spec>] Guided upgrade (npm i -g)
|
|
89
|
+
config show [--resolved] [--json] Model routing config inspector
|
|
87
90
|
|
|
88
91
|
Slash commands (inside a Forge project):
|
|
89
92
|
/forge:init Bootstrap a new Forge SDLC project
|
|
@@ -123,6 +126,10 @@ if (parsed.forgeAction === "update") {
|
|
|
123
126
|
const exitCode = await runUpdate(parsed.subcommandArgs ?? [], { forgeCli: pkg.version ?? "unknown" });
|
|
124
127
|
process.exit(exitCode);
|
|
125
128
|
}
|
|
129
|
+
if (parsed.forgeAction === "config") {
|
|
130
|
+
const exitCode = await runConfig(parsed.subcommandArgs ?? []);
|
|
131
|
+
process.exit(exitCode);
|
|
132
|
+
}
|
|
126
133
|
// Apply forge env overrides
|
|
127
134
|
Object.assign(process.env, parsed.env);
|
|
128
135
|
applyForgeOwnedEnvDefaults();
|