@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/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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-layer.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/config-layer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Component, Focusable } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { type InitOptions } from "./state.js";
|
|
4
|
+
export interface ConfigTuiComponentOptions extends InitOptions {
|
|
5
|
+
/** Called by the component when the user has quit (with discard or via clean exit). */
|
|
6
|
+
onExit: (exitCode: number) => void;
|
|
7
|
+
/** Called when a write to disk completes successfully — surfaces "saved to X". */
|
|
8
|
+
onSaved?: (target: string) => void;
|
|
9
|
+
/** Called on write failure — surfaces the error to the parent ctx. */
|
|
10
|
+
onError?: (message: string) => void;
|
|
11
|
+
/** Optional invalidate hook supplied by the TUI driver (forces re-render). */
|
|
12
|
+
requestRender?: () => void;
|
|
13
|
+
/** pi TUI theme — drives all colour choices inside the overlay. */
|
|
14
|
+
theme: Theme;
|
|
15
|
+
}
|
|
16
|
+
export declare class ConfigTuiComponent implements Component, Focusable {
|
|
17
|
+
private state;
|
|
18
|
+
private readonly opts;
|
|
19
|
+
/** Focusable — pi sets this to true when the overlay has keyboard focus.
|
|
20
|
+
* Without this, arrow keys don't route to handleInput (see commit 07e886f). */
|
|
21
|
+
focused: boolean;
|
|
22
|
+
/** Timer handle for the auto-clearing save banner (guards against unmount). */
|
|
23
|
+
private clearStatusTimer?;
|
|
24
|
+
constructor(opts: ConfigTuiComponentOptions);
|
|
25
|
+
invalidate(): void;
|
|
26
|
+
render(width: number): string[];
|
|
27
|
+
handleInput(data: string): void;
|
|
28
|
+
private handleResult;
|
|
29
|
+
private dispatch;
|
|
30
|
+
private maybeExit;
|
|
31
|
+
private maybePersist;
|
|
32
|
+
/** Schedule save-banner auto-clear. Guards against unmount (Hard Rule 5). */
|
|
33
|
+
private scheduleClearStatus;
|
|
34
|
+
}
|
|
35
|
+
export declare function createConfigTuiComponent(opts: ConfigTuiComponentOptions): ConfigTuiComponent;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// Composite Component that drives the config TUI.
|
|
2
|
+
//
|
|
3
|
+
// Phase 2: thin orchestrator that delegates render and handleInput to the
|
|
4
|
+
// active Screen implementation. The Component & Focusable impl stays here;
|
|
5
|
+
// per-view logic moved into screens/*.ts modules.
|
|
6
|
+
//
|
|
7
|
+
// The component composes:
|
|
8
|
+
// - state/ reducer (single source of truth)
|
|
9
|
+
// - screens/* renderers + input handlers (delegated via Screen interface)
|
|
10
|
+
// - config-writer.ts for atomic persistence on commit-persona-edit
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import { Key, matchesKey, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
13
|
+
import { DynamicBorder } from "@earendil-works/pi-coding-agent";
|
|
14
|
+
import { writeRoutingConfig } from "../config-writer.js";
|
|
15
|
+
import { getActiveView, initialState, reducer, } from "./state.js";
|
|
16
|
+
import { AdvancedMenuScreen } from "./screens/advanced-menu.js";
|
|
17
|
+
import { TierMenuScreen } from "./screens/tier-menu.js";
|
|
18
|
+
import { TierPickerScreen } from "./screens/tier-picker.js";
|
|
19
|
+
import { ConfirmQuitScreen, renderSaveBanner } from "./screens/confirm-quit.js";
|
|
20
|
+
import { PersonasListScreen } from "./screens/personas-list.js";
|
|
21
|
+
import { PersonaPickerScreen } from "./screens/persona-picker.js";
|
|
22
|
+
import { PersonaEditorScreen } from "./screens/persona-editor.js";
|
|
23
|
+
import { ShowResolvedScreen } from "./screens/show-resolved.js";
|
|
24
|
+
import { OverridesListPipelinesScreen } from "./screens/overrides-list.js";
|
|
25
|
+
import { OverridesListPhasesScreen } from "./screens/overrides-list-phases.js";
|
|
26
|
+
import { OverrideEditorScreen } from "./screens/override-editor.js";
|
|
27
|
+
function debugLog(line) {
|
|
28
|
+
if (process.env.FORGE_DEBUG_INPUT !== "1")
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
const ts = new Date().toISOString();
|
|
32
|
+
const path = process.env.FORGE_DEBUG_INPUT_LOG ?? "/tmp/forge-input-router.log";
|
|
33
|
+
fs.appendFileSync(path, `${ts} [config-tui] ${line}\n`);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
/* swallow */
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function hexEscape(s) {
|
|
40
|
+
return [...s]
|
|
41
|
+
.map((c) => {
|
|
42
|
+
const cp = c.codePointAt(0);
|
|
43
|
+
if (cp >= 0x20 && cp <= 0x7e)
|
|
44
|
+
return c;
|
|
45
|
+
return `\\x${cp.toString(16).padStart(2, "0")}`;
|
|
46
|
+
})
|
|
47
|
+
.join("");
|
|
48
|
+
}
|
|
49
|
+
// ── Screen factory ──────────────────────────────────────────────────────────
|
|
50
|
+
const SCREEN_INSTANCES = {
|
|
51
|
+
"confirm-quit": new ConfirmQuitScreen(),
|
|
52
|
+
"tier-menu": new TierMenuScreen(),
|
|
53
|
+
"tier-picker": new TierPickerScreen(),
|
|
54
|
+
"advanced-menu": new AdvancedMenuScreen(),
|
|
55
|
+
"personas-list": new PersonasListScreen(),
|
|
56
|
+
"persona-picker": new PersonaPickerScreen(),
|
|
57
|
+
"persona-editor": new PersonaEditorScreen(),
|
|
58
|
+
"show-resolved": new ShowResolvedScreen(),
|
|
59
|
+
"overrides-list-pipelines": new OverridesListPipelinesScreen(),
|
|
60
|
+
"overrides-list-phases": new OverridesListPhasesScreen(),
|
|
61
|
+
"override-editor": new OverrideEditorScreen(),
|
|
62
|
+
};
|
|
63
|
+
function createScreen(view) {
|
|
64
|
+
return SCREEN_INSTANCES[view.kind] ?? SCREEN_INSTANCES["tier-menu"];
|
|
65
|
+
}
|
|
66
|
+
// ── Hard Rule 4: Explicit layer-to-action mapping ──────────────────────────
|
|
67
|
+
function persistLayerForAction(action) {
|
|
68
|
+
switch (action.kind) {
|
|
69
|
+
case "commit-tier-model": return action.layer;
|
|
70
|
+
case "commit-persona-edit": return action.layer;
|
|
71
|
+
case "delete-persona-entry": return action.layer;
|
|
72
|
+
case "commit-override-name": return "project"; // L4 lives on project only
|
|
73
|
+
case "commit-override-inline": return "project"; // L4 lives on project only
|
|
74
|
+
case "clear-phase-override": return "project"; // L4 lives on project only
|
|
75
|
+
default: return undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export class ConfigTuiComponent {
|
|
79
|
+
state;
|
|
80
|
+
opts;
|
|
81
|
+
/** Focusable — pi sets this to true when the overlay has keyboard focus.
|
|
82
|
+
* Without this, arrow keys don't route to handleInput (see commit 07e886f). */
|
|
83
|
+
focused = false;
|
|
84
|
+
/** Timer handle for the auto-clearing save banner (guards against unmount). */
|
|
85
|
+
clearStatusTimer;
|
|
86
|
+
constructor(opts) {
|
|
87
|
+
this.opts = opts;
|
|
88
|
+
this.state = initialState(opts);
|
|
89
|
+
}
|
|
90
|
+
invalidate() {
|
|
91
|
+
// Stateless renderer; no cache to drop. (Hard Rule 3: no render caching.)
|
|
92
|
+
}
|
|
93
|
+
render(width) {
|
|
94
|
+
const theme = this.opts.theme;
|
|
95
|
+
const view = getActiveView(this.state);
|
|
96
|
+
// Delegate rendering to the active screen (or confirm-quit overlay).
|
|
97
|
+
let contentLines;
|
|
98
|
+
if (this.state.confirmQuit) {
|
|
99
|
+
// show the underlying screen plus the confirm-quit overlay
|
|
100
|
+
const screen = createScreen(view);
|
|
101
|
+
const baseLines = screen.render(this.state, width, theme);
|
|
102
|
+
const quitLines = SCREEN_INSTANCES["confirm-quit"].render(this.state, width, theme);
|
|
103
|
+
contentLines = [...baseLines, ...renderSaveBanner(this.state, width, theme), ...quitLines];
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const screen = createScreen(view);
|
|
107
|
+
contentLines = [
|
|
108
|
+
...screen.render(this.state, width, theme),
|
|
109
|
+
...renderSaveBanner(this.state, width, theme),
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
// ── Modal frame ────────────────────────────────────────────────────
|
|
113
|
+
const bgFn = (s) => theme.bg("selectedBg", s);
|
|
114
|
+
const lines = [];
|
|
115
|
+
// Top border
|
|
116
|
+
lines.push(...new DynamicBorder((s) => theme.fg("borderAccent", s)).render(width));
|
|
117
|
+
// Content: each line padded to full width so the background colour fills
|
|
118
|
+
// the entire row. visibleWidth correctly ignores ANSI codes added by theme.
|
|
119
|
+
// truncateToWidth ensures no line exceeds the terminal width.
|
|
120
|
+
for (const line of contentLines) {
|
|
121
|
+
const truncated = truncateToWidth(line, width, "");
|
|
122
|
+
const vis = visibleWidth(truncated);
|
|
123
|
+
const padded = vis < width ? truncated + " ".repeat(width - vis) : truncated;
|
|
124
|
+
lines.push(bgFn(padded));
|
|
125
|
+
}
|
|
126
|
+
// Bottom border
|
|
127
|
+
lines.push(...new DynamicBorder((s) => theme.fg("borderAccent", s)).render(width));
|
|
128
|
+
return lines;
|
|
129
|
+
}
|
|
130
|
+
handleInput(data) {
|
|
131
|
+
debugLog(`handleInput IN data="${hexEscape(data)}" focused=${this.focused} view=${getActiveView(this.state).kind}`);
|
|
132
|
+
if (this.state.shouldExit) {
|
|
133
|
+
debugLog(`handleInput RETURN (shouldExit)`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Universal: q always requests quit
|
|
137
|
+
if (matchesKey(data, "q")) {
|
|
138
|
+
this.dispatch({ kind: "request-quit" });
|
|
139
|
+
this.maybeExit();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// confirmQuit modal hijacks subsequent input
|
|
143
|
+
if (this.state.confirmQuit) {
|
|
144
|
+
const result = SCREEN_INSTANCES["confirm-quit"].handleInput(data, this.state);
|
|
145
|
+
this.handleResult(result);
|
|
146
|
+
// After confirm-quit, check if we should exit
|
|
147
|
+
this.maybeExit();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (matchesKey(data, Key.escape)) {
|
|
151
|
+
this.dispatch({ kind: "pop-view" });
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Delegate to the active screen's handleInput
|
|
155
|
+
const view = getActiveView(this.state);
|
|
156
|
+
const screen = createScreen(view);
|
|
157
|
+
const result = screen.handleInput(data, this.state);
|
|
158
|
+
this.handleResult(result);
|
|
159
|
+
}
|
|
160
|
+
// ── Result dispatcher ─────────────────────────────────────────────────────
|
|
161
|
+
handleResult(result) {
|
|
162
|
+
switch (result.kind) {
|
|
163
|
+
case "dispatch":
|
|
164
|
+
this.dispatch(result.action);
|
|
165
|
+
this.maybePersist(result.action);
|
|
166
|
+
break;
|
|
167
|
+
case "dispatch-seq":
|
|
168
|
+
for (const action of result.actions) {
|
|
169
|
+
this.dispatch(action);
|
|
170
|
+
}
|
|
171
|
+
// Persist the last action (the one that triggers the write)
|
|
172
|
+
if (result.actions.length > 0) {
|
|
173
|
+
this.maybePersist(result.actions[result.actions.length - 1]);
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
case "pop":
|
|
177
|
+
this.dispatch({ kind: "pop-view" });
|
|
178
|
+
break;
|
|
179
|
+
case "quit":
|
|
180
|
+
this.dispatch({ kind: "request-quit" });
|
|
181
|
+
this.maybeExit();
|
|
182
|
+
break;
|
|
183
|
+
case "error":
|
|
184
|
+
this.opts.onError?.(result.message);
|
|
185
|
+
this.opts.requestRender?.();
|
|
186
|
+
break;
|
|
187
|
+
case "consumed":
|
|
188
|
+
this.opts.requestRender?.();
|
|
189
|
+
break;
|
|
190
|
+
case "no-op":
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// ── Dispatcher helpers ────────────────────────────────────────────────────
|
|
195
|
+
dispatch(action) {
|
|
196
|
+
this.state = reducer(this.state, action);
|
|
197
|
+
this.opts.requestRender?.();
|
|
198
|
+
}
|
|
199
|
+
maybeExit() {
|
|
200
|
+
if (this.state.shouldExit) {
|
|
201
|
+
if (this.clearStatusTimer)
|
|
202
|
+
clearTimeout(this.clearStatusTimer); // Hard Rule 5
|
|
203
|
+
this.opts.onExit(0);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
maybePersist(action) {
|
|
207
|
+
const layer = persistLayerForAction(action);
|
|
208
|
+
if (!layer)
|
|
209
|
+
return;
|
|
210
|
+
try {
|
|
211
|
+
const buffer = layer === "global" ? this.state.buffer.global : this.state.buffer.project;
|
|
212
|
+
const target = writeRoutingConfig({ layer, cwd: this.state.cwd, buffer });
|
|
213
|
+
this.dispatch({ kind: "mark-clean", lastSaved: { target, layer } });
|
|
214
|
+
this.scheduleClearStatus(); // Hard Rule 5
|
|
215
|
+
this.opts.onSaved?.(target);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
219
|
+
this.opts.onError?.(msg);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Schedule save-banner auto-clear. Guards against unmount (Hard Rule 5). */
|
|
223
|
+
scheduleClearStatus() {
|
|
224
|
+
if (this.clearStatusTimer)
|
|
225
|
+
clearTimeout(this.clearStatusTimer);
|
|
226
|
+
this.clearStatusTimer = setTimeout(() => {
|
|
227
|
+
if (!this.state.shouldExit) {
|
|
228
|
+
this.dispatch({ kind: "clear-status" });
|
|
229
|
+
}
|
|
230
|
+
}, 3000);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
export function createConfigTuiComponent(opts) {
|
|
234
|
+
return new ConfigTuiComponent(opts);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/config-tui/component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { InitOptions } from "./state.js";
|
|
2
|
+
export type ConfigTuiRoute = {
|
|
3
|
+
kind: "tier-menu";
|
|
4
|
+
} | {
|
|
5
|
+
kind: "show";
|
|
6
|
+
resolved: boolean;
|
|
7
|
+
json: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
kind: "dispatch";
|
|
10
|
+
pipeline: string | undefined;
|
|
11
|
+
json: boolean;
|
|
12
|
+
} | {
|
|
13
|
+
kind: "edit-persona";
|
|
14
|
+
persona: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: "edit-override";
|
|
17
|
+
pipeline: string;
|
|
18
|
+
phaseRole: string;
|
|
19
|
+
};
|
|
20
|
+
export interface ConfigTuiArgsError {
|
|
21
|
+
error: string;
|
|
22
|
+
}
|
|
23
|
+
export type ParseConfigTuiResult = ConfigTuiRoute | ConfigTuiArgsError;
|
|
24
|
+
export declare function parseConfigTuiArgs(args: string[]): ParseConfigTuiResult;
|
|
25
|
+
/**
|
|
26
|
+
* Caller-provided interaction surface. The pi-extension wrapper supplies
|
|
27
|
+
* `ctx.mountConfigTui` to give us TUI access; the bin surface omits it (and
|
|
28
|
+
* gets a non-interactive fallback message).
|
|
29
|
+
*/
|
|
30
|
+
export interface ConfigTuiCallbacks {
|
|
31
|
+
write: (line: string) => void;
|
|
32
|
+
writeErr?: (line: string) => void;
|
|
33
|
+
/** Present only when invoked inside a pi session (TUI mount available). */
|
|
34
|
+
ctx?: {
|
|
35
|
+
notify: (msg: string, level?: string) => void;
|
|
36
|
+
mountConfigTui?: (init: InitOptions) => Promise<number>;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export declare function readPipelineCatalogue(cwd: string): string[] | null;
|
|
40
|
+
export declare function runConfigTui(args: string[], cwd: string, cb: ConfigTuiCallbacks): Promise<number>;
|