@entelligentsia/forgecli 0.8.4 → 0.9.1
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 +61 -0
- package/README.md +165 -2
- 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
|
@@ -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();
|
package/dist/bin/forge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge.js","sourceRoot":"","sources":["../../src/bin/forge.ts"],"names":[],"mappings":";AAEA,+CAA+C;AAC/C,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AACvD,OAAO,QAAQ,MAAM,iCAAiC,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"forge.js","sourceRoot":"","sources":["../../src/bin/forge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
export interface RegisterConfigCommandOptions {
|
|
3
|
+
/** When null, /forge:config is registered but only the routing-config bits
|
|
4
|
+
* are reachable — plugin-config display is hidden (no .forge to read).
|
|
5
|
+
*/
|
|
6
|
+
forgeRoot: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function registerConfigCommand(pi: ExtensionAPI, _opts: RegisterConfigCommandOptions): void;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Native /forge:config handler — replaces the LLM-backed delegateMarkdownCommand
|
|
2
|
+
// stub that previously lived in forge-commands.ts.
|
|
3
|
+
//
|
|
4
|
+
// Plan 16 Slice 4a + 4b. The handler delegates to runConfigTui which is the
|
|
5
|
+
// same entry point used by the `forge config` bin subcommand — single source
|
|
6
|
+
// of truth for the routing config TUI / show flow. The wrapper supplies a
|
|
7
|
+
// `mountConfigTui` callback that uses ctx.ui.custom() to overlay the TUI.
|
|
8
|
+
import { createConfigTuiComponent } from "./config-tui/component.js";
|
|
9
|
+
import { runConfigTui } from "./config-tui/handler.js";
|
|
10
|
+
import { getInputRouter } from "./input-router.js";
|
|
11
|
+
export function registerConfigCommand(pi, _opts) {
|
|
12
|
+
pi.registerCommand("forge:config", {
|
|
13
|
+
description: "Inspect or change forge-cli routing config (persona-models, pipeline overrides) and view Forge project config",
|
|
14
|
+
async handler(args, ctx) {
|
|
15
|
+
const argv = args.trim().length === 0 ? [] : args.trim().split(/\s+/);
|
|
16
|
+
const mountConfigTui = async (init) => {
|
|
17
|
+
// Mark overlay active so forge-input-router suppresses arrow-activator
|
|
18
|
+
// listeners (thread-switcher's ↓, whats-new's ↓) while the TUI owns
|
|
19
|
+
// input focus.
|
|
20
|
+
const router = getInputRouter();
|
|
21
|
+
router.pushOverlay();
|
|
22
|
+
try {
|
|
23
|
+
const exitCode = await ctx.ui.custom((tui, theme, _kb, done) => {
|
|
24
|
+
// Component drives done() on q or successful confirm-quit.
|
|
25
|
+
// Pi TUI key rule 3: call tui.requestRender() after state changes.
|
|
26
|
+
const component = createConfigTuiComponent({
|
|
27
|
+
...init,
|
|
28
|
+
onExit: (code) => done(code),
|
|
29
|
+
onSaved: (target) => ctx.ui.notify(`forge config: saved → ${target}`, "info"),
|
|
30
|
+
onError: (msg) => ctx.ui.notify(`forge config: ${msg}`, "error"),
|
|
31
|
+
requestRender: () => tui.requestRender(),
|
|
32
|
+
theme,
|
|
33
|
+
});
|
|
34
|
+
return component;
|
|
35
|
+
}, {
|
|
36
|
+
overlay: true,
|
|
37
|
+
overlayOptions: {
|
|
38
|
+
width: "100%",
|
|
39
|
+
anchor: "center",
|
|
40
|
+
margin: 0,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
return exitCode;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
router.popOverlay();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const exitCode = await runConfigTui(argv, process.cwd(), {
|
|
50
|
+
write: () => { },
|
|
51
|
+
writeErr: (s) => ctx.ui.notify(s, "error"),
|
|
52
|
+
ctx: {
|
|
53
|
+
notify: (msg, level) => {
|
|
54
|
+
const lvl = (level === "warning" || level === "error" ? level : "info");
|
|
55
|
+
ctx.ui.notify(msg, lvl);
|
|
56
|
+
},
|
|
57
|
+
mountConfigTui,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
if (exitCode !== 0) {
|
|
61
|
+
ctx.ui.notify(`forge:config exited with code ${exitCode}`, "warning");
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=config-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-command.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/config-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface PersonaModel {
|
|
2
|
+
provider: string;
|
|
3
|
+
model: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
}
|
|
6
|
+
export type PersonaModelsMap = Record<string, PersonaModel>;
|
|
7
|
+
export interface PhaseConfig {
|
|
8
|
+
"model-override"?: string | PersonaModel;
|
|
9
|
+
}
|
|
10
|
+
export interface PipelineConfig {
|
|
11
|
+
"persona-models"?: PersonaModelsMap;
|
|
12
|
+
/** Phase overrides keyed by role string. */
|
|
13
|
+
phases?: Record<string, PhaseConfig>;
|
|
14
|
+
}
|
|
15
|
+
export interface GlobalConfig {
|
|
16
|
+
"persona-models"?: PersonaModelsMap;
|
|
17
|
+
}
|
|
18
|
+
export interface ProjectConfig {
|
|
19
|
+
"persona-models"?: PersonaModelsMap;
|
|
20
|
+
pipelines?: Record<string, PipelineConfig>;
|
|
21
|
+
}
|
|
22
|
+
export interface MergedConfig {
|
|
23
|
+
/** Shallow-merged persona-models (project wins on key collision). */
|
|
24
|
+
"persona-models"?: PersonaModelsMap;
|
|
25
|
+
/** Project-only pipelines (L3/L4 config lives here). */
|
|
26
|
+
pipelines?: Record<string, PipelineConfig>;
|
|
27
|
+
/** The raw global config for L1 lookups — null if absent or invalid. */
|
|
28
|
+
_global: GlobalConfig | null;
|
|
29
|
+
/** The raw project config for L2 lookups — null if absent or invalid. */
|
|
30
|
+
_project: ProjectConfig | null;
|
|
31
|
+
}
|
|
32
|
+
export interface LayeredConfig {
|
|
33
|
+
global: GlobalConfig | null;
|
|
34
|
+
project: ProjectConfig | null;
|
|
35
|
+
merged: MergedConfig;
|
|
36
|
+
errors: string[];
|
|
37
|
+
}
|
|
38
|
+
export declare function loadLayeredConfig(cwd: string): LayeredConfig;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { Ajv } from "ajv";
|
|
5
|
+
import schema from "./forge-cli-schema.json" with { type: "json" };
|
|
6
|
+
const ajv = new Ajv({ allErrors: true });
|
|
7
|
+
const validate = ajv.compile(schema);
|
|
8
|
+
function validateConfig(raw, label) {
|
|
9
|
+
const ok = validate(raw);
|
|
10
|
+
if (!ok) {
|
|
11
|
+
const messages = validate.errors?.map((e) => `${e.instancePath || "/"} ${e.message}`).join("; ") ?? "unknown";
|
|
12
|
+
return { valid: false, error: `forge-cli ${label} config schema error: ${messages}` };
|
|
13
|
+
}
|
|
14
|
+
return { valid: true, data: raw };
|
|
15
|
+
}
|
|
16
|
+
function readJsonFile(filePath) {
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
19
|
+
}
|
|
20
|
+
catch (_err) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function loadLayeredConfig(cwd) {
|
|
25
|
+
const errors = [];
|
|
26
|
+
const globalPath = path.join(getAgentDir(), "forge-cli", "config.json");
|
|
27
|
+
const projectPath = path.join(cwd, ".pi", "forge-cli", "config.json");
|
|
28
|
+
let globalConfig = null;
|
|
29
|
+
let projectConfig = null;
|
|
30
|
+
const rawGlobal = readJsonFile(globalPath);
|
|
31
|
+
if (rawGlobal !== null) {
|
|
32
|
+
const result = validateConfig(rawGlobal, "global");
|
|
33
|
+
if (result.valid) {
|
|
34
|
+
globalConfig = result.data;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
errors.push(result.error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const rawProject = readJsonFile(projectPath);
|
|
41
|
+
if (rawProject !== null) {
|
|
42
|
+
const result = validateConfig(rawProject, "project");
|
|
43
|
+
if (result.valid) {
|
|
44
|
+
projectConfig = result.data;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
errors.push(result.error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Shallow-merge persona-models: global first, project overwrites per key
|
|
51
|
+
const mergedPersonaModels = {
|
|
52
|
+
...(globalConfig?.["persona-models"] ?? {}),
|
|
53
|
+
...(projectConfig?.["persona-models"] ?? {}),
|
|
54
|
+
};
|
|
55
|
+
const merged = {
|
|
56
|
+
_global: globalConfig,
|
|
57
|
+
_project: projectConfig,
|
|
58
|
+
};
|
|
59
|
+
if (Object.keys(mergedPersonaModels).length > 0) {
|
|
60
|
+
merged["persona-models"] = mergedPersonaModels;
|
|
61
|
+
}
|
|
62
|
+
// Pipelines are project-only (global config is project-agnostic)
|
|
63
|
+
if (projectConfig?.pipelines) {
|
|
64
|
+
merged.pipelines = projectConfig.pipelines;
|
|
65
|
+
}
|
|
66
|
+
return { global: globalConfig, project: projectConfig, merged, errors };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=config-layer.js.map
|