@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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/config-tui/screens/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,4EAA4E;AAC5E,+CAA+C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ConfigTuiState } from "./state.js";
|
|
2
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
export { TierMenuScreen } from "./screens/tier-menu.js";
|
|
4
|
+
export { TierPickerScreen } from "./screens/tier-picker.js";
|
|
5
|
+
export { AdvancedMenuScreen } from "./screens/advanced-menu.js";
|
|
6
|
+
export { PersonasListScreen } from "./screens/personas-list.js";
|
|
7
|
+
export { PersonaPickerScreen } from "./screens/persona-picker.js";
|
|
8
|
+
export { PersonaEditorScreen } from "./screens/persona-editor.js";
|
|
9
|
+
export { ShowResolvedScreen, computeResolvedRows, type ResolvedRow } from "./screens/show-resolved.js";
|
|
10
|
+
export { OverridesListPipelinesScreen } from "./screens/overrides-list.js";
|
|
11
|
+
export { OverridesListPhasesScreen } from "./screens/overrides-list-phases.js";
|
|
12
|
+
export { OverrideEditorScreen } from "./screens/override-editor.js";
|
|
13
|
+
export { ConfirmQuitScreen, renderSaveBanner } from "./screens/confirm-quit.js";
|
|
14
|
+
export { type InputResult, type Screen } from "./screens/types.js";
|
|
15
|
+
export declare function renderTierMenu(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
16
|
+
export declare function renderAdvancedMenu(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
17
|
+
export declare function renderPersonasList(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
18
|
+
export declare function renderPersonaPicker(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
19
|
+
export declare function renderPersonaEditor(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
20
|
+
export declare function renderShowResolved(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
21
|
+
export declare function renderOverridesListPipelines(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
22
|
+
export declare function renderOverridesListPhases(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
23
|
+
export declare function renderOverrideEditor(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
24
|
+
export declare function renderActive(state: ConfigTuiState, width: number, theme: Theme): string[];
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Screen renderers and routing — barrel re-export for backward compatibility.
|
|
2
|
+
//
|
|
3
|
+
// Phase 3: theming + width safety. All screen classes now use theme helpers
|
|
4
|
+
// for visible strings and truncate their output to terminal width.
|
|
5
|
+
import { getActiveView, } from "./state/selectors.js";
|
|
6
|
+
import { TierMenuScreen } from "./screens/tier-menu.js";
|
|
7
|
+
import { TierPickerScreen } from "./screens/tier-picker.js";
|
|
8
|
+
import { AdvancedMenuScreen } from "./screens/advanced-menu.js";
|
|
9
|
+
import { ConfirmQuitScreen, renderSaveBanner } from "./screens/confirm-quit.js";
|
|
10
|
+
import { PersonasListScreen } from "./screens/personas-list.js";
|
|
11
|
+
import { PersonaPickerScreen } from "./screens/persona-picker.js";
|
|
12
|
+
import { PersonaEditorScreen } from "./screens/persona-editor.js";
|
|
13
|
+
import { ShowResolvedScreen } from "./screens/show-resolved.js";
|
|
14
|
+
import { OverridesListPipelinesScreen } from "./screens/overrides-list.js";
|
|
15
|
+
import { OverridesListPhasesScreen } from "./screens/overrides-list-phases.js";
|
|
16
|
+
import { OverrideEditorScreen } from "./screens/override-editor.js";
|
|
17
|
+
// ── Screen instances for renderActive ───────────────────────────────────────
|
|
18
|
+
const SCREEN_INSTANCES = {
|
|
19
|
+
"tier-menu": new TierMenuScreen(),
|
|
20
|
+
"tier-picker": new TierPickerScreen(),
|
|
21
|
+
"advanced-menu": new AdvancedMenuScreen(),
|
|
22
|
+
"personas-list": new PersonasListScreen(),
|
|
23
|
+
"persona-picker": new PersonaPickerScreen(),
|
|
24
|
+
"persona-editor": new PersonaEditorScreen(),
|
|
25
|
+
"show-resolved": new ShowResolvedScreen(),
|
|
26
|
+
"overrides-list-pipelines": new OverridesListPipelinesScreen(),
|
|
27
|
+
"overrides-list-phases": new OverridesListPhasesScreen(),
|
|
28
|
+
"override-editor": new OverrideEditorScreen(),
|
|
29
|
+
};
|
|
30
|
+
// ── Re-exports for backward compatibility ───────────────────────────────────
|
|
31
|
+
export { TierMenuScreen } from "./screens/tier-menu.js";
|
|
32
|
+
export { TierPickerScreen } from "./screens/tier-picker.js";
|
|
33
|
+
export { AdvancedMenuScreen } from "./screens/advanced-menu.js";
|
|
34
|
+
export { PersonasListScreen } from "./screens/personas-list.js";
|
|
35
|
+
export { PersonaPickerScreen } from "./screens/persona-picker.js";
|
|
36
|
+
export { PersonaEditorScreen } from "./screens/persona-editor.js";
|
|
37
|
+
export { ShowResolvedScreen, computeResolvedRows } from "./screens/show-resolved.js";
|
|
38
|
+
export { OverridesListPipelinesScreen } from "./screens/overrides-list.js";
|
|
39
|
+
export { OverridesListPhasesScreen } from "./screens/overrides-list-phases.js";
|
|
40
|
+
export { OverrideEditorScreen } from "./screens/override-editor.js";
|
|
41
|
+
export { ConfirmQuitScreen, renderSaveBanner } from "./screens/confirm-quit.js";
|
|
42
|
+
// ── Render functions (backward-compatible wrappers) ──────────────────────
|
|
43
|
+
export function renderTierMenu(state, width, theme) {
|
|
44
|
+
return SCREEN_INSTANCES["tier-menu"].render(state, width, theme);
|
|
45
|
+
}
|
|
46
|
+
export function renderAdvancedMenu(state, width, theme) {
|
|
47
|
+
return SCREEN_INSTANCES["advanced-menu"].render(state, width, theme);
|
|
48
|
+
}
|
|
49
|
+
export function renderPersonasList(state, width, theme) {
|
|
50
|
+
return SCREEN_INSTANCES["personas-list"].render(state, width, theme);
|
|
51
|
+
}
|
|
52
|
+
export function renderPersonaPicker(state, width, theme) {
|
|
53
|
+
return SCREEN_INSTANCES["persona-picker"].render(state, width, theme);
|
|
54
|
+
}
|
|
55
|
+
export function renderPersonaEditor(state, width, theme) {
|
|
56
|
+
return SCREEN_INSTANCES["persona-editor"].render(state, width, theme);
|
|
57
|
+
}
|
|
58
|
+
export function renderShowResolved(state, width, theme) {
|
|
59
|
+
return SCREEN_INSTANCES["show-resolved"].render(state, width, theme);
|
|
60
|
+
}
|
|
61
|
+
export function renderOverridesListPipelines(state, width, theme) {
|
|
62
|
+
return SCREEN_INSTANCES["overrides-list-pipelines"].render(state, width, theme);
|
|
63
|
+
}
|
|
64
|
+
export function renderOverridesListPhases(state, width, theme) {
|
|
65
|
+
return SCREEN_INSTANCES["overrides-list-phases"].render(state, width, theme);
|
|
66
|
+
}
|
|
67
|
+
export function renderOverrideEditor(state, width, theme) {
|
|
68
|
+
return SCREEN_INSTANCES["override-editor"].render(state, width, theme);
|
|
69
|
+
}
|
|
70
|
+
// ── Top-level router ─────────────────────────────────────────────────────────
|
|
71
|
+
export function renderActive(state, width, theme) {
|
|
72
|
+
const view = getActiveView(state);
|
|
73
|
+
const screen = SCREEN_INSTANCES[view.kind];
|
|
74
|
+
const lines = screen ? screen.render(state, width, theme) : [];
|
|
75
|
+
// Decorations: save banner stacks at the bottom, confirm-quit modal on top.
|
|
76
|
+
return [...lines, ...renderSaveBanner(state, width, theme), ...new ConfirmQuitScreen().render(state, width, theme)];
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=screens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screens.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/config-tui/screens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ConfigBuffer, PhaseOverride } from "./model.js";
|
|
2
|
+
import type { ConfigLayer } from "../../config-writer.js";
|
|
3
|
+
import type { PersonaModel } from "../../config-layer.js";
|
|
4
|
+
import type { Tier } from "../tier-meta.js";
|
|
5
|
+
export declare function writePersonaEntry(buffer: ConfigBuffer, layer: ConfigLayer, persona: string, entry: PersonaModel): ConfigBuffer;
|
|
6
|
+
export declare function deletePersonaEntry(buffer: ConfigBuffer, layer: ConfigLayer, persona: string): ConfigBuffer;
|
|
7
|
+
/** Fan out a single model into all persona entries for a tier.
|
|
8
|
+
* E.g. setting Heavy → anthropic:claude-opus writes architect and supervisor. */
|
|
9
|
+
export declare function writeTierAssignment(buffer: ConfigBuffer, layer: ConfigLayer, tier: Tier, entry: PersonaModel): ConfigBuffer;
|
|
10
|
+
export declare function writePhaseOverride(buffer: ConfigBuffer, pipelineName: string, phaseRole: string, override: PhaseOverride): ConfigBuffer;
|
|
11
|
+
export declare function clearPhaseOverride(buffer: ConfigBuffer, pipelineName: string, phaseRole: string): ConfigBuffer;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Config TUI buffer mutation helpers — pure functions, no I/O.
|
|
2
|
+
// Split from state.ts (Phase 1).
|
|
3
|
+
import { TIER_PERSONAS } from "../tier-meta.js";
|
|
4
|
+
export function writePersonaEntry(buffer, layer, persona, entry) {
|
|
5
|
+
const targetLayer = buffer[layer];
|
|
6
|
+
const personaModels = { ...(targetLayer["persona-models"] ?? {}) };
|
|
7
|
+
personaModels[persona] = entry;
|
|
8
|
+
const updatedLayer = { ...targetLayer, "persona-models": personaModels };
|
|
9
|
+
return { ...buffer, [layer]: updatedLayer };
|
|
10
|
+
}
|
|
11
|
+
export function deletePersonaEntry(buffer, layer, persona) {
|
|
12
|
+
const targetLayer = buffer[layer];
|
|
13
|
+
const personaModels = { ...(targetLayer["persona-models"] ?? {}) };
|
|
14
|
+
if (!(persona in personaModels))
|
|
15
|
+
return buffer;
|
|
16
|
+
delete personaModels[persona];
|
|
17
|
+
const updatedLayer = { ...targetLayer };
|
|
18
|
+
if (Object.keys(personaModels).length === 0) {
|
|
19
|
+
delete updatedLayer["persona-models"];
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
updatedLayer["persona-models"] = personaModels;
|
|
23
|
+
}
|
|
24
|
+
return { ...buffer, [layer]: updatedLayer };
|
|
25
|
+
}
|
|
26
|
+
/** Fan out a single model into all persona entries for a tier.
|
|
27
|
+
* E.g. setting Heavy → anthropic:claude-opus writes architect and supervisor. */
|
|
28
|
+
export function writeTierAssignment(buffer, layer, tier, entry) {
|
|
29
|
+
const personas = TIER_PERSONAS[tier];
|
|
30
|
+
let next = buffer;
|
|
31
|
+
for (const persona of personas) {
|
|
32
|
+
next = writePersonaEntry(next, layer, persona, entry);
|
|
33
|
+
}
|
|
34
|
+
return next;
|
|
35
|
+
}
|
|
36
|
+
export function writePhaseOverride(buffer, pipelineName, phaseRole, override) {
|
|
37
|
+
const project = { ...buffer.project };
|
|
38
|
+
const pipelines = { ...(project.pipelines ?? {}) };
|
|
39
|
+
const pipeline = { ...(pipelines[pipelineName] ?? {}) };
|
|
40
|
+
const phases = { ...(pipeline.phases ?? {}) };
|
|
41
|
+
phases[phaseRole] = { ...phases[phaseRole], "model-override": override };
|
|
42
|
+
pipeline.phases = phases;
|
|
43
|
+
pipelines[pipelineName] = pipeline;
|
|
44
|
+
project.pipelines = pipelines;
|
|
45
|
+
return { ...buffer, project };
|
|
46
|
+
}
|
|
47
|
+
export function clearPhaseOverride(buffer, pipelineName, phaseRole) {
|
|
48
|
+
const existingPipeline = buffer.project.pipelines?.[pipelineName];
|
|
49
|
+
const existingPhases = existingPipeline?.phases;
|
|
50
|
+
if (!existingPhases)
|
|
51
|
+
return buffer;
|
|
52
|
+
const existingPhase = existingPhases[phaseRole];
|
|
53
|
+
if (!existingPhase || existingPhase["model-override"] === undefined)
|
|
54
|
+
return buffer;
|
|
55
|
+
const project = { ...buffer.project };
|
|
56
|
+
const pipelines = { ...(project.pipelines ?? {}) };
|
|
57
|
+
const pipeline = { ...pipelines[pipelineName] };
|
|
58
|
+
const phases = { ...existingPhases };
|
|
59
|
+
const nextPhase = { ...phases[phaseRole] };
|
|
60
|
+
delete nextPhase["model-override"];
|
|
61
|
+
if (Object.keys(nextPhase).length === 0) {
|
|
62
|
+
delete phases[phaseRole];
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
phases[phaseRole] = nextPhase;
|
|
66
|
+
}
|
|
67
|
+
if (Object.keys(phases).length === 0) {
|
|
68
|
+
delete pipeline.phases;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
pipeline.phases = phases;
|
|
72
|
+
}
|
|
73
|
+
// If the pipeline has no persona-models and no remaining phase overrides, drop it.
|
|
74
|
+
const hasPipelinePersonaModels = pipeline["persona-models"] !== undefined &&
|
|
75
|
+
Object.keys(pipeline["persona-models"]).length > 0;
|
|
76
|
+
const hasPhases = Object.keys(pipeline.phases ?? {}).length > 0;
|
|
77
|
+
if (!hasPipelinePersonaModels && !hasPhases) {
|
|
78
|
+
delete pipelines[pipelineName];
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
pipelines[pipelineName] = pipeline;
|
|
82
|
+
}
|
|
83
|
+
if (Object.keys(pipelines).length === 0) {
|
|
84
|
+
delete project.pipelines;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
project.pipelines = pipelines;
|
|
88
|
+
}
|
|
89
|
+
return { ...buffer, project };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/config-tui/state/buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Canonical phase definitions for the "default" pipeline.
|
|
2
|
+
// Inlined here so the config-tui module doesn't import the orchestrator
|
|
3
|
+
// (which would pull in pi-coding-agent runtime). Stays in sync via tests.
|
|
4
|
+
export const CANONICAL_PHASES = [
|
|
5
|
+
{ role: "plan", personaNoun: "engineer" },
|
|
6
|
+
{ role: "review-plan", personaNoun: "supervisor" },
|
|
7
|
+
{ role: "implement", personaNoun: "engineer" },
|
|
8
|
+
{ role: "review-code", personaNoun: "supervisor" },
|
|
9
|
+
{ role: "validate", personaNoun: "qa-engineer" },
|
|
10
|
+
{ role: "approve", personaNoun: "architect" },
|
|
11
|
+
{ role: "writeback", personaNoun: "collator" },
|
|
12
|
+
{ role: "commit", personaNoun: "engineer" },
|
|
13
|
+
];
|
|
14
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/config-tui/state/constants.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,wEAAwE;AACxE,0EAA0E;AAE1E,MAAM,CAAC,MAAM,gBAAgB,GAAyD;IACpF,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;IACzC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE;IAClD,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE;IAC9C,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE;IAClD,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;IAChD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE;IAC7C,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;CAC5C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { View, ConfigBuffer, AvailableModel, InitOptions, ConfigTuiState, ConfigTuiAction, PhaseOverride, ResolvedPersonaEntry, PersonaPickerEntry, PipelineOverrideSummary, TierAssignment, } from "./model.js";
|
|
2
|
+
export { CANONICAL_PHASES } from "./constants.js";
|
|
3
|
+
export { initialState } from "./init.js";
|
|
4
|
+
export { reducer } from "./reducer.js";
|
|
5
|
+
export { getActiveView, listResolvedPersonas, listPersonaPickerEntries, uniqueProviders, listPipelineOverrideSummaries, getPhaseOverride, getTierAssignment, getAllTierAssignments, getTierForPersona, getPersonasInTier, getPhaseTable, sourceToLabel, type PhaseTableRow, type ScopedTierAssignment, getScopedTierAssignment, getAllScopedTierAssignments, isConfigEmpty, personaSourceLabel, } from "./selectors.js";
|
|
6
|
+
export { writePersonaEntry, deletePersonaEntry, writePhaseOverride, clearPhaseOverride, writeTierAssignment, } from "./buffer.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Barrel re-export for config-tui state modules.
|
|
2
|
+
// Split from state.ts (Phase 1). All public symbols remain accessible from
|
|
3
|
+
// the same import path: `./state.js` → re-exports from split modules.
|
|
4
|
+
export { CANONICAL_PHASES } from "./constants.js";
|
|
5
|
+
export { initialState } from "./init.js";
|
|
6
|
+
export { reducer } from "./reducer.js";
|
|
7
|
+
export { getActiveView, listResolvedPersonas, listPersonaPickerEntries, uniqueProviders, listPipelineOverrideSummaries, getPhaseOverride, getTierAssignment, getAllTierAssignments, getTierForPersona, getPersonasInTier, getPhaseTable, sourceToLabel, getScopedTierAssignment, getAllScopedTierAssignments, isConfigEmpty, personaSourceLabel, } from "./selectors.js";
|
|
8
|
+
export { writePersonaEntry, deletePersonaEntry, writePhaseOverride, clearPhaseOverride, writeTierAssignment, } from "./buffer.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/config-tui/state/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,2EAA2E;AAC3E,sEAAsE;AAgBtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,aAAa,EAGb,uBAAuB,EACvB,2BAA2B,EAC3B,aAAa,EACb,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Config TUI state constructor — pure function, no I/O.
|
|
2
|
+
// Split from state.ts (Phase 1).
|
|
3
|
+
export function initialState(opts) {
|
|
4
|
+
const buffer = {
|
|
5
|
+
global: opts.global ? cloneJSON(opts.global) : {},
|
|
6
|
+
project: opts.project ? cloneJSON(opts.project) : {},
|
|
7
|
+
};
|
|
8
|
+
const firstView = { kind: "tier-menu", cursor: 0 };
|
|
9
|
+
// Default scope: project when in a project, global otherwise.
|
|
10
|
+
const scope = opts.pipelineCatalogue !== null ? "project" : "global";
|
|
11
|
+
return {
|
|
12
|
+
buffer,
|
|
13
|
+
view: [firstView],
|
|
14
|
+
cwd: opts.cwd,
|
|
15
|
+
personaCatalogue: opts.personaCatalogue,
|
|
16
|
+
pipelineCatalogue: opts.pipelineCatalogue,
|
|
17
|
+
availableModels: opts.availableModels,
|
|
18
|
+
authenticatedProviders: opts.authenticatedProviders,
|
|
19
|
+
dirty: false,
|
|
20
|
+
scope,
|
|
21
|
+
authError: opts.authError ?? null,
|
|
22
|
+
confirmQuit: false,
|
|
23
|
+
shouldExit: false,
|
|
24
|
+
lastSaved: null,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function cloneJSON(value) {
|
|
28
|
+
return JSON.parse(JSON.stringify(value));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/config-tui/state/init.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,iCAAiC;AAIjC,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,MAAM,MAAM,GAA6B;QACvC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACjD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;KACrD,CAAC;IAEF,MAAM,SAAS,GACb,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAEnC,8DAA8D;IAC9D,MAAM,KAAK,GAA4B,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE9F,OAAO;QACL,MAAM;QACN,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;QACnD,KAAK,EAAE,KAAK;QACZ,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;QACjC,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAI,KAAQ;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import type { GlobalConfig, PersonaModel, ProjectConfig } from "../../config-layer.js";
|
|
2
|
+
import type { Tier } from "../tier-meta.js";
|
|
3
|
+
export type PhaseOverride = string | PersonaModel;
|
|
4
|
+
export type ConfigLayer = "global" | "project";
|
|
5
|
+
export type View = {
|
|
6
|
+
kind: "tier-menu";
|
|
7
|
+
cursor: number;
|
|
8
|
+
} | {
|
|
9
|
+
kind: "tier-picker";
|
|
10
|
+
tier: Tier;
|
|
11
|
+
step: "pick-provider" | "pick-model";
|
|
12
|
+
provider: string | undefined;
|
|
13
|
+
cursor: number;
|
|
14
|
+
} | {
|
|
15
|
+
kind: "advanced-menu";
|
|
16
|
+
cursor: number;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "personas-list";
|
|
19
|
+
cursor: number;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "persona-picker";
|
|
22
|
+
cursor: number;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "persona-editor";
|
|
25
|
+
persona: string;
|
|
26
|
+
step: "pick-provider" | "pick-model" | "pick-layer";
|
|
27
|
+
provider: string | undefined;
|
|
28
|
+
model: string | undefined;
|
|
29
|
+
/** Cursor index inside the active step's list (provider/model/layer). */
|
|
30
|
+
cursor: number;
|
|
31
|
+
} | {
|
|
32
|
+
kind: "show-resolved";
|
|
33
|
+
cursor: number;
|
|
34
|
+
} | {
|
|
35
|
+
kind: "overrides-list-pipelines";
|
|
36
|
+
cursor: number;
|
|
37
|
+
} | {
|
|
38
|
+
kind: "overrides-list-phases";
|
|
39
|
+
pipeline: string;
|
|
40
|
+
cursor: number;
|
|
41
|
+
} | {
|
|
42
|
+
kind: "override-editor";
|
|
43
|
+
pipeline: string;
|
|
44
|
+
phaseRole: string;
|
|
45
|
+
step: "pick-type" | "pick-name" | "pick-provider" | "pick-model";
|
|
46
|
+
/** For the inline path: chosen provider before the model picker. */
|
|
47
|
+
provider: string | undefined;
|
|
48
|
+
cursor: number;
|
|
49
|
+
};
|
|
50
|
+
export type TierAssignment = {
|
|
51
|
+
status: "set";
|
|
52
|
+
provider: string;
|
|
53
|
+
model: string;
|
|
54
|
+
layer: ConfigLayer;
|
|
55
|
+
} | {
|
|
56
|
+
status: "mixed";
|
|
57
|
+
} | {
|
|
58
|
+
status: "unset";
|
|
59
|
+
};
|
|
60
|
+
export interface ResolvedPersonaEntry {
|
|
61
|
+
persona: string;
|
|
62
|
+
provider: string;
|
|
63
|
+
model: string;
|
|
64
|
+
source: "L1" | "L2";
|
|
65
|
+
}
|
|
66
|
+
export interface PersonaPickerEntry {
|
|
67
|
+
persona: string;
|
|
68
|
+
assignment: ResolvedPersonaEntry | undefined;
|
|
69
|
+
inCatalogue: boolean;
|
|
70
|
+
}
|
|
71
|
+
export interface PipelineOverrideSummary {
|
|
72
|
+
pipeline: string;
|
|
73
|
+
overrideCount: number;
|
|
74
|
+
}
|
|
75
|
+
export interface ConfigBuffer {
|
|
76
|
+
global: GlobalConfig;
|
|
77
|
+
project: ProjectConfig;
|
|
78
|
+
}
|
|
79
|
+
export interface AvailableModel {
|
|
80
|
+
provider: string;
|
|
81
|
+
id: string;
|
|
82
|
+
}
|
|
83
|
+
export interface InitOptions {
|
|
84
|
+
global: GlobalConfig | null;
|
|
85
|
+
project: ProjectConfig | null;
|
|
86
|
+
cwd: string;
|
|
87
|
+
personaCatalogue: string[];
|
|
88
|
+
/** null when no `.forge/config.json` exists (forge-cli run outside a Forge project). */
|
|
89
|
+
pipelineCatalogue: string[] | null;
|
|
90
|
+
availableModels: AvailableModel[];
|
|
91
|
+
authenticatedProviders: string[];
|
|
92
|
+
/** If model discovery failed, surfaces the diagnostic instead of a silent empty list. */
|
|
93
|
+
authError?: string;
|
|
94
|
+
}
|
|
95
|
+
export interface ConfigTuiState {
|
|
96
|
+
buffer: ConfigBuffer;
|
|
97
|
+
view: View[];
|
|
98
|
+
cwd: string;
|
|
99
|
+
personaCatalogue: string[];
|
|
100
|
+
pipelineCatalogue: string[] | null;
|
|
101
|
+
availableModels: AvailableModel[];
|
|
102
|
+
authenticatedProviders: string[];
|
|
103
|
+
/** True iff buffer differs from the initial state (or from disk). */
|
|
104
|
+
dirty: boolean;
|
|
105
|
+
/** Active write scope for tier-level commits (toggled by `tab` on tier-menu). */
|
|
106
|
+
scope: ConfigLayer;
|
|
107
|
+
/** If model/auth discovery failed at init, a diagnostic string. */
|
|
108
|
+
authError: string | null;
|
|
109
|
+
/** Pending quit confirmation modal. */
|
|
110
|
+
confirmQuit: boolean;
|
|
111
|
+
/** True when the TUI should unmount. */
|
|
112
|
+
shouldExit: boolean;
|
|
113
|
+
/** Last save path + layer (auto-cleared after 3 seconds). */
|
|
114
|
+
lastSaved: {
|
|
115
|
+
target: string;
|
|
116
|
+
layer: ConfigLayer;
|
|
117
|
+
} | null;
|
|
118
|
+
}
|
|
119
|
+
export type ConfigTuiAction = {
|
|
120
|
+
kind: "select-tier";
|
|
121
|
+
tier: Tier;
|
|
122
|
+
} | {
|
|
123
|
+
kind: "set-tier-provider";
|
|
124
|
+
tier: Tier;
|
|
125
|
+
provider: string;
|
|
126
|
+
} | {
|
|
127
|
+
kind: "commit-tier-model";
|
|
128
|
+
tier: Tier;
|
|
129
|
+
provider: string;
|
|
130
|
+
model: string;
|
|
131
|
+
layer: ConfigLayer;
|
|
132
|
+
} | {
|
|
133
|
+
kind: "toggle-scope";
|
|
134
|
+
} | {
|
|
135
|
+
kind: "push-view";
|
|
136
|
+
view: View;
|
|
137
|
+
} | {
|
|
138
|
+
kind: "pop-view";
|
|
139
|
+
} | {
|
|
140
|
+
kind: "cursor-move";
|
|
141
|
+
delta: number;
|
|
142
|
+
} | {
|
|
143
|
+
kind: "begin-persona-edit";
|
|
144
|
+
persona: string;
|
|
145
|
+
} | {
|
|
146
|
+
kind: "set-persona-provider";
|
|
147
|
+
provider: string;
|
|
148
|
+
} | {
|
|
149
|
+
kind: "set-persona-model";
|
|
150
|
+
model: string;
|
|
151
|
+
} | {
|
|
152
|
+
kind: "commit-persona-edit";
|
|
153
|
+
layer: ConfigLayer;
|
|
154
|
+
} | {
|
|
155
|
+
kind: "delete-persona-entry";
|
|
156
|
+
layer: ConfigLayer;
|
|
157
|
+
persona: string;
|
|
158
|
+
} | {
|
|
159
|
+
kind: "begin-override-edit";
|
|
160
|
+
pipeline: string;
|
|
161
|
+
phaseRole: string;
|
|
162
|
+
} | {
|
|
163
|
+
kind: "set-override-step";
|
|
164
|
+
step: "pick-type" | "pick-name" | "pick-provider" | "pick-model";
|
|
165
|
+
} | {
|
|
166
|
+
kind: "set-override-provider";
|
|
167
|
+
provider: string;
|
|
168
|
+
} | {
|
|
169
|
+
kind: "commit-override-name";
|
|
170
|
+
name: string;
|
|
171
|
+
} | {
|
|
172
|
+
kind: "commit-override-inline";
|
|
173
|
+
provider: string;
|
|
174
|
+
model: string;
|
|
175
|
+
} | {
|
|
176
|
+
kind: "clear-phase-override";
|
|
177
|
+
pipeline: string;
|
|
178
|
+
phaseRole: string;
|
|
179
|
+
} | {
|
|
180
|
+
kind: "mark-clean";
|
|
181
|
+
lastSaved?: {
|
|
182
|
+
target: string;
|
|
183
|
+
layer: ConfigLayer;
|
|
184
|
+
};
|
|
185
|
+
} | {
|
|
186
|
+
kind: "clear-status";
|
|
187
|
+
} | {
|
|
188
|
+
kind: "request-quit";
|
|
189
|
+
} | {
|
|
190
|
+
kind: "confirm-quit";
|
|
191
|
+
discard: boolean;
|
|
192
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/config-tui/state/model.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,iEAAiE"}
|