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