@entelligentsia/forgecli 1.0.21 → 1.0.25

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 (232) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/CHANGELOG-forge-plugin.md +118 -0
  3. package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
  4. package/dist/extensions/forgecli/forge-tools.js +73 -0
  5. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  6. package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
  7. package/dist/extensions/forgecli/lib/forge-root.js +14 -1
  8. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
  9. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
  10. package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
  11. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
  12. package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
  13. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
  14. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
  15. package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
  16. package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
  17. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
  18. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
  19. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
  20. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  21. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  22. package/dist/forge-payload/.schemas/event.schema.json +8 -3
  23. package/dist/forge-payload/.schemas/migrations.json +56 -0
  24. package/dist/forge-payload/integrity.json +3 -3
  25. package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
  26. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
  27. package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
  28. package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
  29. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
  30. package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
  31. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
  32. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  33. package/dist/forge-payload/schemas/event.schema.json +8 -3
  34. package/dist/forge-payload/schemas/structure-manifest.json +4 -2
  35. package/dist/forge-payload/tools/commit-task.cjs +218 -0
  36. package/dist/forge-payload/tools/store-cli.cjs +6 -1
  37. package/node_modules/@mariozechner/clipboard/package.json +2 -1
  38. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
  39. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
  40. package/package.json +2 -2
  41. package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
  42. package/dist/extensions/forgecli/add-pipeline.js +0 -143
  43. package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
  44. package/dist/extensions/forgecli/add-task.d.ts +0 -20
  45. package/dist/extensions/forgecli/add-task.js +0 -154
  46. package/dist/extensions/forgecli/add-task.js.map +0 -1
  47. package/dist/extensions/forgecli/approve.d.ts +0 -22
  48. package/dist/extensions/forgecli/approve.js +0 -152
  49. package/dist/extensions/forgecli/approve.js.map +0 -1
  50. package/dist/extensions/forgecli/banner.d.ts +0 -10
  51. package/dist/extensions/forgecli/banner.js +0 -36
  52. package/dist/extensions/forgecli/banner.js.map +0 -1
  53. package/dist/extensions/forgecli/calibrate.d.ts +0 -64
  54. package/dist/extensions/forgecli/calibrate.js +0 -481
  55. package/dist/extensions/forgecli/calibrate.js.map +0 -1
  56. package/dist/extensions/forgecli/collate.d.ts +0 -22
  57. package/dist/extensions/forgecli/collate.js +0 -134
  58. package/dist/extensions/forgecli/collate.js.map +0 -1
  59. package/dist/extensions/forgecli/commit.d.ts +0 -22
  60. package/dist/extensions/forgecli/commit.js +0 -152
  61. package/dist/extensions/forgecli/commit.js.map +0 -1
  62. package/dist/extensions/forgecli/config-command.d.ts +0 -8
  63. package/dist/extensions/forgecli/config-command.js +0 -67
  64. package/dist/extensions/forgecli/config-command.js.map +0 -1
  65. package/dist/extensions/forgecli/config-layer.d.ts +0 -53
  66. package/dist/extensions/forgecli/config-layer.js +0 -72
  67. package/dist/extensions/forgecli/config-layer.js.map +0 -1
  68. package/dist/extensions/forgecli/config-writer.d.ts +0 -16
  69. package/dist/extensions/forgecli/config-writer.js +0 -69
  70. package/dist/extensions/forgecli/config-writer.js.map +0 -1
  71. package/dist/extensions/forgecli/enhance.d.ts +0 -27
  72. package/dist/extensions/forgecli/enhance.js +0 -199
  73. package/dist/extensions/forgecli/enhance.js.map +0 -1
  74. package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
  75. package/dist/extensions/forgecli/fix-bug.js +0 -1580
  76. package/dist/extensions/forgecli/fix-bug.js.map +0 -1
  77. package/dist/extensions/forgecli/forge-header.d.ts +0 -12
  78. package/dist/extensions/forgecli/forge-header.js +0 -114
  79. package/dist/extensions/forgecli/forge-header.js.map +0 -1
  80. package/dist/extensions/forgecli/forge-init.d.ts +0 -26
  81. package/dist/extensions/forgecli/forge-init.js +0 -514
  82. package/dist/extensions/forgecli/forge-init.js.map +0 -1
  83. package/dist/extensions/forgecli/forge-root.d.ts +0 -10
  84. package/dist/extensions/forgecli/forge-root.js +0 -62
  85. package/dist/extensions/forgecli/forge-root.js.map +0 -1
  86. package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
  87. package/dist/extensions/forgecli/forge-update-command.js +0 -435
  88. package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
  89. package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
  90. package/dist/extensions/forgecli/friction-emit.js +0 -245
  91. package/dist/extensions/forgecli/friction-emit.js.map +0 -1
  92. package/dist/extensions/forgecli/implement.d.ts +0 -22
  93. package/dist/extensions/forgecli/implement.js +0 -170
  94. package/dist/extensions/forgecli/implement.js.map +0 -1
  95. package/dist/extensions/forgecli/init-context.d.ts +0 -99
  96. package/dist/extensions/forgecli/init-context.js +0 -178
  97. package/dist/extensions/forgecli/init-context.js.map +0 -1
  98. package/dist/extensions/forgecli/init-progress.d.ts +0 -39
  99. package/dist/extensions/forgecli/init-progress.js +0 -117
  100. package/dist/extensions/forgecli/init-progress.js.map +0 -1
  101. package/dist/extensions/forgecli/input-router.d.ts +0 -33
  102. package/dist/extensions/forgecli/input-router.js +0 -136
  103. package/dist/extensions/forgecli/input-router.js.map +0 -1
  104. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
  105. package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
  106. package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
  107. package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
  108. package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
  109. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
  110. package/dist/extensions/forgecli/materialize.d.ts +0 -16
  111. package/dist/extensions/forgecli/materialize.js +0 -195
  112. package/dist/extensions/forgecli/materialize.js.map +0 -1
  113. package/dist/extensions/forgecli/migrate.d.ts +0 -22
  114. package/dist/extensions/forgecli/migrate.js +0 -260
  115. package/dist/extensions/forgecli/migrate.js.map +0 -1
  116. package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
  117. package/dist/extensions/forgecli/migration-engine.js +0 -563
  118. package/dist/extensions/forgecli/migration-engine.js.map +0 -1
  119. package/dist/extensions/forgecli/model-registry.d.ts +0 -61
  120. package/dist/extensions/forgecli/model-registry.js +0 -127
  121. package/dist/extensions/forgecli/model-registry.js.map +0 -1
  122. package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
  123. package/dist/extensions/forgecli/model-resolver.js +0 -65
  124. package/dist/extensions/forgecli/model-resolver.js.map +0 -1
  125. package/dist/extensions/forgecli/model-validator.d.ts +0 -29
  126. package/dist/extensions/forgecli/model-validator.js +0 -107
  127. package/dist/extensions/forgecli/model-validator.js.map +0 -1
  128. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
  129. package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
  130. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
  131. package/dist/extensions/forgecli/plan.d.ts +0 -22
  132. package/dist/extensions/forgecli/plan.js +0 -167
  133. package/dist/extensions/forgecli/plan.js.map +0 -1
  134. package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
  135. package/dist/extensions/forgecli/quiz-agent.js +0 -98
  136. package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
  137. package/dist/extensions/forgecli/read-command.d.ts +0 -2
  138. package/dist/extensions/forgecli/read-command.js +0 -100
  139. package/dist/extensions/forgecli/read-command.js.map +0 -1
  140. package/dist/extensions/forgecli/regenerate.d.ts +0 -40
  141. package/dist/extensions/forgecli/regenerate.js +0 -438
  142. package/dist/extensions/forgecli/regenerate.js.map +0 -1
  143. package/dist/extensions/forgecli/remove-command.d.ts +0 -17
  144. package/dist/extensions/forgecli/remove-command.js +0 -124
  145. package/dist/extensions/forgecli/remove-command.js.map +0 -1
  146. package/dist/extensions/forgecli/report-bug.d.ts +0 -25
  147. package/dist/extensions/forgecli/report-bug.js +0 -159
  148. package/dist/extensions/forgecli/report-bug.js.map +0 -1
  149. package/dist/extensions/forgecli/retrospective.d.ts +0 -20
  150. package/dist/extensions/forgecli/retrospective.js +0 -126
  151. package/dist/extensions/forgecli/retrospective.js.map +0 -1
  152. package/dist/extensions/forgecli/review-code.d.ts +0 -35
  153. package/dist/extensions/forgecli/review-code.js +0 -196
  154. package/dist/extensions/forgecli/review-code.js.map +0 -1
  155. package/dist/extensions/forgecli/review-plan.d.ts +0 -35
  156. package/dist/extensions/forgecli/review-plan.js +0 -200
  157. package/dist/extensions/forgecli/review-plan.js.map +0 -1
  158. package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
  159. package/dist/extensions/forgecli/run-sprint.js +0 -716
  160. package/dist/extensions/forgecli/run-sprint.js.map +0 -1
  161. package/dist/extensions/forgecli/run-task.d.ts +0 -204
  162. package/dist/extensions/forgecli/run-task.js +0 -1403
  163. package/dist/extensions/forgecli/run-task.js.map +0 -1
  164. package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
  165. package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
  166. package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
  167. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
  168. package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
  169. package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
  170. package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
  171. package/dist/extensions/forgecli/skill-retriever.js +0 -246
  172. package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
  173. package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
  174. package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
  175. package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
  176. package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
  177. package/dist/extensions/forgecli/sprint-intake.js +0 -91
  178. package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
  179. package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
  180. package/dist/extensions/forgecli/sprint-plan.js +0 -122
  181. package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
  182. package/dist/extensions/forgecli/status-command.d.ts +0 -19
  183. package/dist/extensions/forgecli/status-command.js +0 -140
  184. package/dist/extensions/forgecli/status-command.js.map +0 -1
  185. package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
  186. package/dist/extensions/forgecli/store-error-remediation.js +0 -307
  187. package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
  188. package/dist/extensions/forgecli/store-query.d.ts +0 -22
  189. package/dist/extensions/forgecli/store-query.js +0 -107
  190. package/dist/extensions/forgecli/store-query.js.map +0 -1
  191. package/dist/extensions/forgecli/store-repair.d.ts +0 -17
  192. package/dist/extensions/forgecli/store-repair.js +0 -123
  193. package/dist/extensions/forgecli/store-repair.js.map +0 -1
  194. package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
  195. package/dist/extensions/forgecli/store-resolver.js +0 -263
  196. package/dist/extensions/forgecli/store-resolver.js.map +0 -1
  197. package/dist/extensions/forgecli/store-validator.d.ts +0 -16
  198. package/dist/extensions/forgecli/store-validator.js +0 -32
  199. package/dist/extensions/forgecli/store-validator.js.map +0 -1
  200. package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
  201. package/dist/extensions/forgecli/test-orchestrate.js +0 -182
  202. package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
  203. package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
  204. package/dist/extensions/forgecli/thread-switcher.js +0 -189
  205. package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
  206. package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
  207. package/dist/extensions/forgecli/transition-guard.js +0 -89
  208. package/dist/extensions/forgecli/transition-guard.js.map +0 -1
  209. package/dist/extensions/forgecli/update-check.d.ts +0 -37
  210. package/dist/extensions/forgecli/update-check.js +0 -185
  211. package/dist/extensions/forgecli/update-check.js.map +0 -1
  212. package/dist/extensions/forgecli/update-tools.d.ts +0 -23
  213. package/dist/extensions/forgecli/update-tools.js +0 -135
  214. package/dist/extensions/forgecli/update-tools.js.map +0 -1
  215. package/dist/extensions/forgecli/validate.d.ts +0 -22
  216. package/dist/extensions/forgecli/validate.js +0 -152
  217. package/dist/extensions/forgecli/validate.js.map +0 -1
  218. package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
  219. package/dist/extensions/forgecli/viewport-events.js +0 -243
  220. package/dist/extensions/forgecli/viewport-events.js.map +0 -1
  221. package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
  222. package/dist/extensions/forgecli/viewport-renderer.js +0 -233
  223. package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
  224. package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
  225. package/dist/extensions/forgecli/viewport-theme.js +0 -128
  226. package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
  227. package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
  228. package/dist/extensions/forgecli/whats-new-widget.js +0 -376
  229. package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
  230. package/dist/extensions/forgecli/whats-new.d.ts +0 -120
  231. package/dist/extensions/forgecli/whats-new.js +0 -470
  232. package/dist/extensions/forgecli/whats-new.js.map +0 -1
@@ -1,127 +0,0 @@
1
- // Curated provider/model registry — FORGE-S16-T16 (issue #17).
2
- //
3
- // Loads forgecli's bundled registry/models.json (or a `FORGE_MODEL_REGISTRY`
4
- // override), seeds project-scope `enabledModels` exactly once into
5
- // `<projectRoot>/.forge/pi-settings.json`, and emits a missing-credentials
6
- // banner naming the env vars the user can set. Global pi settings
7
- // (`~/.pi/agent/settings.json`) are never read or written.
8
- import { promises as fs, readFileSync } from "node:fs";
9
- import * as path from "node:path";
10
- import { fileURLToPath } from "node:url";
11
- import { Type } from "typebox";
12
- import { Value } from "typebox/value";
13
- const ProviderSchema = Type.Object({
14
- id: Type.String({ minLength: 1 }),
15
- label: Type.String({ minLength: 1 }),
16
- enabled: Type.Boolean(),
17
- deferredTo: Type.Optional(Type.String()),
18
- modelGlobs: Type.Array(Type.String()),
19
- credentialEnvAny: Type.Array(Type.String()),
20
- });
21
- const RegistrySchema = Type.Object({
22
- version: Type.Literal(1),
23
- providers: Type.Array(ProviderSchema, { minItems: 1 }),
24
- });
25
- const PKG_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
26
- const BUNDLED_PATH = path.join(PKG_ROOT, "registry", "models.json");
27
- function resolveRegistryPath(opts) {
28
- const env = opts.env ?? process.env;
29
- if (opts.registryPath && opts.registryPath.length > 0)
30
- return opts.registryPath;
31
- const envOverride = env.FORGE_MODEL_REGISTRY;
32
- if (typeof envOverride === "string" && envOverride.length > 0)
33
- return envOverride;
34
- return BUNDLED_PATH;
35
- }
36
- export function loadRegistry(opts = {}) {
37
- const target = resolveRegistryPath(opts);
38
- const raw = readFileSync(target, "utf8");
39
- const parsed = JSON.parse(raw);
40
- if (!Value.Check(RegistrySchema, parsed)) {
41
- const errors = [...Value.Errors(RegistrySchema, parsed)]
42
- .slice(0, 3)
43
- .map((e) => e.message)
44
- .join("; ");
45
- throw new Error(`Invalid model registry at ${target}: ${errors || "schema check failed"}`);
46
- }
47
- return parsed;
48
- }
49
- function seededModelGlobs(registry) {
50
- const out = [];
51
- for (const p of registry.providers) {
52
- if (!p.enabled)
53
- continue;
54
- for (const g of p.modelGlobs) {
55
- if (!out.includes(g))
56
- out.push(g);
57
- }
58
- }
59
- return out;
60
- }
61
- function defaultGlob(registry) {
62
- for (const p of registry.providers) {
63
- if (p.enabled && p.modelGlobs.length > 0)
64
- return p.modelGlobs[0];
65
- }
66
- return "claude-*";
67
- }
68
- function seedFilePath(projectRoot) {
69
- return path.join(projectRoot, ".forge", "pi-settings.json");
70
- }
71
- async function pathExists(p) {
72
- try {
73
- await fs.access(p);
74
- return true;
75
- }
76
- catch {
77
- return false;
78
- }
79
- }
80
- export async function seedEnabledModels(opts) {
81
- const target = seedFilePath(opts.projectRoot);
82
- if (await pathExists(target)) {
83
- return { seeded: false, path: target };
84
- }
85
- const now = opts.now ?? (() => Date.now());
86
- const payload = {
87
- schemaVersion: 1,
88
- seededAt: now(),
89
- seedSource: "@entelligentsia/forgecli registry v1",
90
- enabledModels: seededModelGlobs(opts.registry),
91
- defaultModelGlob: defaultGlob(opts.registry),
92
- };
93
- await fs.mkdir(path.dirname(target), { recursive: true });
94
- const tmp = `${target}.${process.pid}.${Date.now()}.tmp`;
95
- await fs.writeFile(tmp, JSON.stringify(payload, null, 2), "utf8");
96
- await fs.rename(tmp, target);
97
- return { seeded: true, path: target };
98
- }
99
- const PRIMARY_ENV_KEYS = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GEMINI_API_KEY", "OPENROUTER_API_KEY"];
100
- export function detectMissingCredentials(registry, env = process.env) {
101
- const requiring = registry.providers.filter((p) => p.enabled && p.credentialEnvAny.length > 0);
102
- if (requiring.length === 0)
103
- return null;
104
- for (const p of requiring) {
105
- for (const key of p.credentialEnvAny) {
106
- const v = env[key];
107
- if (typeof v === "string" && v.length > 0) {
108
- return null;
109
- }
110
- }
111
- }
112
- const lines = [
113
- "forge — no provider credentials configured. Set one of:",
114
- ` ${PRIMARY_ENV_KEYS.join(", ")}`,
115
- "(or run pi /login for OAuth providers).",
116
- ];
117
- return lines.join("\n");
118
- }
119
- export const __test__ = {
120
- BUNDLED_PATH,
121
- resolveRegistryPath,
122
- seedFilePath,
123
- seededModelGlobs,
124
- defaultGlob,
125
- RegistrySchema,
126
- };
127
- //# sourceMappingURL=model-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/model-registry.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- import type { MergedConfig } from "./config-layer.js";
2
- export type { MergedConfig } from "./config-layer.js";
3
- export type ResolveSource = "L4-inline" | "L4-name" | "L3" | "L2" | "L1" | "default" | "inherit";
4
- export type LookupSource = "L3" | "L2" | "L1" | "default" | "missing";
5
- export interface ResolveResult {
6
- model: {
7
- provider: string;
8
- model: string;
9
- } | undefined;
10
- source: ResolveSource;
11
- }
12
- export interface LookupResult {
13
- model: {
14
- provider: string;
15
- model: string;
16
- } | undefined;
17
- source: LookupSource;
18
- }
19
- /**
20
- * Look up a persona-model name through L3 → L2 → L1 → default → missing.
21
- * Used by resolveModelForPhase for L4-name resolution and direct persona lookups.
22
- */
23
- export declare function lookupPersonaModel(personaName: string, pipelineName: string, merged: MergedConfig): LookupResult;
24
- /**
25
- * Resolve the {provider, model} pair for a specific phase invocation.
26
- *
27
- * Cascade order:
28
- * L4-inline → L4-name → L3 → L2 → L1 → default persona-model → inherit
29
- *
30
- * When source is "inherit", model is undefined — caller must skip setModel.
31
- */
32
- export declare function resolveModelForPhase(pipelineName: string, phaseRole: string, personaNoun: string, merged: MergedConfig): ResolveResult;
@@ -1,65 +0,0 @@
1
- function toModel(pm) {
2
- return { provider: pm.provider, model: pm.model };
3
- }
4
- /**
5
- * Look up a persona-model name through L3 → L2 → L1 → default → missing.
6
- * Used by resolveModelForPhase for L4-name resolution and direct persona lookups.
7
- */
8
- export function lookupPersonaModel(personaName, pipelineName, merged) {
9
- // L3 — pipeline-level persona-models
10
- const l3 = merged.pipelines?.[pipelineName]?.["persona-models"]?.[personaName];
11
- if (l3)
12
- return { model: toModel(l3), source: "L3" };
13
- // L2 — project persona-models
14
- const l2 = merged._project?.["persona-models"]?.[personaName];
15
- if (l2)
16
- return { model: toModel(l2), source: "L2" };
17
- // L1 — global persona-models
18
- const l1 = merged._global?.["persona-models"]?.[personaName];
19
- if (l1)
20
- return { model: toModel(l1), source: "L1" };
21
- // default persona-model (same L3→L2→L1 walk with key="default")
22
- if (personaName !== "default") {
23
- const defL3 = merged.pipelines?.[pipelineName]?.["persona-models"]?.["default"];
24
- if (defL3)
25
- return { model: toModel(defL3), source: "default" };
26
- const defL2 = merged._project?.["persona-models"]?.["default"];
27
- if (defL2)
28
- return { model: toModel(defL2), source: "default" };
29
- const defL1 = merged._global?.["persona-models"]?.["default"];
30
- if (defL1)
31
- return { model: toModel(defL1), source: "default" };
32
- }
33
- return { model: undefined, source: "missing" };
34
- }
35
- /**
36
- * Resolve the {provider, model} pair for a specific phase invocation.
37
- *
38
- * Cascade order:
39
- * L4-inline → L4-name → L3 → L2 → L1 → default persona-model → inherit
40
- *
41
- * When source is "inherit", model is undefined — caller must skip setModel.
42
- */
43
- export function resolveModelForPhase(pipelineName, phaseRole, personaNoun, merged) {
44
- const phase = merged.pipelines?.[pipelineName]?.phases?.[phaseRole];
45
- const override = phase?.["model-override"];
46
- if (override !== undefined) {
47
- // L4-inline: override is an inline {provider, model} object
48
- if (typeof override === "object") {
49
- return { model: toModel(override), source: "L4-inline" };
50
- }
51
- // L4-name: override is a persona-model key string
52
- const named = lookupPersonaModel(override, pipelineName, merged);
53
- if (named.source !== "missing") {
54
- return { model: named.model, source: "L4-name" };
55
- }
56
- // L4-name miss: fall through with original personaNoun
57
- }
58
- // L3 → L2 → L1 → default → missing
59
- const lookup = lookupPersonaModel(personaNoun, pipelineName, merged);
60
- if (lookup.source === "missing") {
61
- return { model: undefined, source: "inherit" };
62
- }
63
- return { model: lookup.model, source: lookup.source };
64
- }
65
- //# sourceMappingURL=model-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/model-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- import type { MergedConfig } from "./config-layer.js";
2
- export type ValidationCode = "UNKNOWN_PERSONA" | "MODEL_UNAVAILABLE" | "UNKNOWN_PIPELINE" | "UNRESOLVABLE_OVERRIDE";
3
- export interface ValidationIssue {
4
- code: ValidationCode;
5
- message: string;
6
- /** JSON-pointer-style path to the offending config value */
7
- path?: string;
8
- }
9
- export interface ValidationReport {
10
- errors: ValidationIssue[];
11
- warnings: ValidationIssue[];
12
- }
13
- type AvailableModel = {
14
- provider: string;
15
- id: string;
16
- };
17
- /**
18
- * Validate the merged forge-cli model config against runtime catalogues.
19
- *
20
- * - strict=false: unavailability and unknown persona names are warnings.
21
- * - strict=true: those warnings become errors.
22
- * - Unknown pipeline names are always errors when pipelineCatalogue is non-null;
23
- * warnings when pipelineCatalogue is null (no .forge/config.json found).
24
- * - Unresolvable model-override strings are always errors.
25
- *
26
- * The function is pure — no I/O. Callers pass in the pre-built catalogues.
27
- */
28
- export declare function validateModelConfig(personaCatalogue: string[], pipelineCatalogue: string[] | null, merged: MergedConfig, availableModels: AvailableModel[], strict: boolean): ValidationReport;
29
- export {};
@@ -1,107 +0,0 @@
1
- import { lookupPersonaModel } from "./model-resolver.js";
2
- function isAvailable(pair, available) {
3
- return available.some((m) => m.provider === pair.provider && m.id === pair.model);
4
- }
5
- function modelKey(pair) {
6
- return `${pair.provider}:${pair.model}`;
7
- }
8
- /**
9
- * Validate the merged forge-cli model config against runtime catalogues.
10
- *
11
- * - strict=false: unavailability and unknown persona names are warnings.
12
- * - strict=true: those warnings become errors.
13
- * - Unknown pipeline names are always errors when pipelineCatalogue is non-null;
14
- * warnings when pipelineCatalogue is null (no .forge/config.json found).
15
- * - Unresolvable model-override strings are always errors.
16
- *
17
- * The function is pure — no I/O. Callers pass in the pre-built catalogues.
18
- */
19
- export function validateModelConfig(personaCatalogue, pipelineCatalogue, merged, availableModels, strict) {
20
- const errors = [];
21
- const warnings = [];
22
- function issue(isError, code, message, path) {
23
- (isError ? errors : warnings).push({ code, message, path });
24
- }
25
- // ── 1. Validate top-level and per-layer persona-models entries ────────────
26
- const allPersonaEntries = collectPersonaEntries(merged);
27
- for (const { key, value, path } of allPersonaEntries) {
28
- if (key !== "default" && !personaCatalogue.includes(key)) {
29
- issue(strict, "UNKNOWN_PERSONA", `Unknown persona name "${key}" — not in persona catalogue`, path);
30
- }
31
- if (!isAvailable(value, availableModels)) {
32
- issue(strict, "MODEL_UNAVAILABLE", `${modelKey(value)} (persona "${key}") is not available in ModelRegistry`, path);
33
- }
34
- }
35
- // ── 2. Validate pipeline names + per-pipeline phases ─────────────────────
36
- const pipelines = merged.pipelines ?? {};
37
- for (const [pipelineName, pipelineConfig] of Object.entries(pipelines)) {
38
- const pipelinePath = `pipelines.${pipelineName}`;
39
- // Unknown pipeline name
40
- if (pipelineCatalogue !== null && !pipelineCatalogue.includes(pipelineName)) {
41
- issue(true, "UNKNOWN_PIPELINE", `Unknown pipeline name "${pipelineName}" — not in .forge/config.json`, pipelinePath);
42
- }
43
- else if (pipelineCatalogue === null) {
44
- issue(false, "UNKNOWN_PIPELINE", `Pipeline name "${pipelineName}" could not be verified — no .forge/config.json found`, pipelinePath);
45
- }
46
- // Per-pipeline persona-models entries
47
- const pipelinePersonaModels = pipelineConfig["persona-models"] ?? {};
48
- for (const [key, value] of Object.entries(pipelinePersonaModels)) {
49
- const entryPath = `${pipelinePath}.persona-models.${key}`;
50
- if (key !== "default" && !personaCatalogue.includes(key)) {
51
- issue(strict, "UNKNOWN_PERSONA", `Unknown persona name "${key}" in pipeline "${pipelineName}"`, entryPath);
52
- }
53
- if (!isAvailable(value, availableModels)) {
54
- issue(strict, "MODEL_UNAVAILABLE", `${modelKey(value)} (pipeline "${pipelineName}", persona "${key}") is not available`, entryPath);
55
- }
56
- }
57
- // Per-phase model-override validation
58
- const phases = pipelineConfig.phases ?? {};
59
- for (const [role, phase] of Object.entries(phases)) {
60
- const override = phase["model-override"];
61
- if (override === undefined)
62
- continue;
63
- const phasePath = `${pipelinePath}.phases.${role}.model-override`;
64
- if (typeof override === "string") {
65
- // Named persona-model key — must resolve via the cascade
66
- const resolved = lookupPersonaModel(override, pipelineName, merged);
67
- if (resolved.source === "missing") {
68
- issue(true, "UNRESOLVABLE_OVERRIDE", `phases.${role}.model-override "${override}" in pipeline "${pipelineName}" does not resolve to any persona-model`, phasePath);
69
- }
70
- else if (resolved.model && !isAvailable(resolved.model, availableModels)) {
71
- issue(strict, "MODEL_UNAVAILABLE", `${modelKey(resolved.model)} (override "${override}" in pipeline "${pipelineName}", phase "${role}") is not available`, phasePath);
72
- }
73
- }
74
- else {
75
- // Inline {provider, model} object — check availability only
76
- if (!isAvailable(override, availableModels)) {
77
- issue(strict, "MODEL_UNAVAILABLE", `${modelKey(override)} (inline override in pipeline "${pipelineName}", phase "${role}") is not available`, phasePath);
78
- }
79
- }
80
- }
81
- }
82
- return { errors, warnings };
83
- }
84
- /**
85
- * Collect all persona-model entries across global and project layers,
86
- * deduplicating by key (project wins, same as the merge in config-layer.ts).
87
- * Returns one entry per unique key, with the winning layer's path annotation.
88
- */
89
- function collectPersonaEntries(merged) {
90
- const seen = new Map();
91
- function add(key, value, layer) {
92
- // project layer overwrites global layer (project wins)
93
- if (!seen.has(key) || layer.startsWith("project")) {
94
- seen.set(key, { key, value, path: `${layer}.persona-models.${key}` });
95
- }
96
- }
97
- const global = merged._global?.["persona-models"] ?? {};
98
- for (const [key, value] of Object.entries(global)) {
99
- add(key, value, "global");
100
- }
101
- const project = merged._project?.["persona-models"] ?? {};
102
- for (const [key, value] of Object.entries(project)) {
103
- add(key, value, "project");
104
- }
105
- return Array.from(seen.values());
106
- }
107
- //# sourceMappingURL=model-validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-validator.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/model-validator.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type { Theme } from "@earendil-works/pi-coding-agent";
2
- import type { Component } from "@earendil-works/pi-tui";
3
- import type { OrchestratorTree } from "./orchestrator-tree.js";
4
- export declare class OrchestratorStatusBar implements Component {
5
- private tree;
6
- private theme;
7
- private active;
8
- private disposed;
9
- private invalidationCb?;
10
- private spinnerTimer?;
11
- private spinnerIdx;
12
- private onAction?;
13
- private disposeFns;
14
- constructor(tree: OrchestratorTree, theme: Theme);
15
- setInvalidationCallback(cb: () => void): void;
16
- setOnAction(cb: () => void): void;
17
- setActive(active: boolean): void;
18
- isActive(): boolean;
19
- private ensureSpinnerTimer;
20
- private stopSpinnerTimer;
21
- render(width: number): string[];
22
- invalidate(): void;
23
- dispose(): void;
24
- /** Walk depth-first to find the deepest running/cancelling leaf. */
25
- private findDeepestRunningLeaf;
26
- }
@@ -1,213 +0,0 @@
1
- // orchestrator-status-bar.ts — One-line status bar for running orchestrations.
2
- //
3
- // Two render modes, distinguished by focus indicator:
4
- //
5
- // INACTIVE (outline ○ prefix — navigation hint):
6
- // ○ [CART-S03-T01 · writeback:1 ⠋] "preview…" ↓ dashboard
7
- //
8
- // ○ signals "you can ↓ here". Colour carries status: green=completed,
9
- // red=failed, accent=running, muted=other terminal.
10
- //
11
- // ACTIVE (filled ● prefix — focus confirmation):
12
- // ● [CART-S03-T01 · writeback:1 ⠋] "preview…" ⏎ open · esc back
13
- //
14
- // ● signals "you're here". ↑/Esc returns focus to the prompt.
15
- //
16
- // Visual semantics (two dimensions on one circle):
17
- // Shape: ○ = not focused, ● = focused
18
- // Colour: accent=running, success=completed, error=failed, muted=terminal
19
- // ⠋ spinner: shows activity (only for running/cancelling nodes)
20
- //
21
- // Focus lifecycle: ↓ activates → ↑/Esc deactivates → prompt gets focus.
22
- // All activation/deactivation is handled by the ForgeInputRouter listener
23
- // in thread-switcher.ts (not by this widget's handleInput, which is dead
24
- // code for setWidget components since pi-tui routes input to the prompt
25
- // editor before setWidget components).
26
- //
27
- // Iron Laws conformance:
28
- // IL1 — All visible strings route through theme.fg()/bg()/bold(). No raw glyphs.
29
- // IL7 — Spinner timer guarded by disposed flag to prevent stale callbacks.
30
- import { truncateToWidth } from "@earendil-works/pi-tui";
31
- import { fmtTokenMeter } from "./viewport-renderer.js";
32
- // ── Braille spinner ────────────────────────────────────────────────────────
33
- const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
34
- const SPINNER_INTERVAL_MS = 100;
35
- // ── Focus indicator colour: derives the theme colour from the root's
36
- // aggregate status. The shape (○/●) carries focus; the colour carries
37
- // status. Both dimensions on the same circle glyph.
38
- //
39
- // ○ green = not focused, completed ● green = focused, completed
40
- // ○ red = not focused, failed ● red = focused, failed
41
- // ○ dim = not focused, terminal ● dim = focused, terminal
42
- // ○ accent = not focused, running ● accent = focused, running
43
- function focusIndicatorColour(roots, theme) {
44
- // Derive the aggregate status from all visible roots.
45
- // Running/cancelling wins over terminal; failed wins over completed.
46
- const hasRunning = roots.some((r) => r.status === "running" || r.status === "cancelling");
47
- if (hasRunning)
48
- return "accent";
49
- const hasFailed = roots.some((r) => r.status === "failed" || r.status === "escalated");
50
- if (hasFailed)
51
- return "error";
52
- const hasCompleted = roots.some((r) => r.status === "completed");
53
- if (hasCompleted)
54
- return "success";
55
- // Terminal but not failed/completed (cancelled, pending, etc.).
56
- return "muted";
57
- }
58
- // ── OrchestratorStatusBar ──────────────────────────────────────────────────
59
- export class OrchestratorStatusBar {
60
- tree;
61
- theme;
62
- active = false;
63
- disposed = false; // IL7: guards interval callbacks after dispose
64
- invalidationCb;
65
- spinnerTimer;
66
- spinnerIdx = 0;
67
- onAction; // callback to open dashboard
68
- disposeFns = [];
69
- constructor(tree, theme) {
70
- this.tree = tree;
71
- this.theme = theme;
72
- const onChange = () => {
73
- if (!this.disposed) {
74
- this.ensureSpinnerTimer(); // restart spinner if roots became active
75
- this.invalidationCb?.();
76
- }
77
- };
78
- this.tree.on("change", onChange);
79
- this.tree.on("tree", onChange);
80
- this.tree.on("tail", onChange);
81
- this.tree.on("preview", onChange);
82
- this.disposeFns.push(() => { this.tree.off("change", onChange); this.tree.off("tree", onChange); this.tree.off("tail", onChange); this.tree.off("preview", onChange); });
83
- }
84
- setInvalidationCallback(cb) {
85
- this.invalidationCb = cb;
86
- this.ensureSpinnerTimer();
87
- }
88
- setOnAction(cb) {
89
- this.onAction = cb;
90
- }
91
- setActive(active) {
92
- this.active = active;
93
- if (!this.disposed) {
94
- this.ensureSpinnerTimer(); // restart spinner if needed
95
- this.invalidationCb?.();
96
- }
97
- }
98
- isActive() {
99
- return this.active;
100
- }
101
- ensureSpinnerTimer() {
102
- if (this.spinnerTimer)
103
- return;
104
- // Only start the timer when there are running/cancelling roots to animate.
105
- const anyActive = this.tree.getActiveRoots().some((r) => r.status === "running" || r.status === "cancelling");
106
- if (!anyActive)
107
- return; // no spinner needed yet
108
- this.spinnerTimer = setInterval(() => {
109
- // IL7: guard against firing after dispose.
110
- if (this.disposed) {
111
- this.stopSpinnerTimer();
112
- return;
113
- }
114
- const anyActive = this.tree.getActiveRoots().some((r) => r.status === "running" || r.status === "cancelling");
115
- if (!anyActive) {
116
- // One last render to settle spinner, then stop.
117
- this.invalidationCb?.();
118
- this.stopSpinnerTimer();
119
- return;
120
- }
121
- this.spinnerIdx = (this.spinnerIdx + 1) % SPINNER_FRAMES.length;
122
- this.invalidationCb?.();
123
- }, SPINNER_INTERVAL_MS);
124
- }
125
- stopSpinnerTimer() {
126
- if (this.spinnerTimer) {
127
- clearInterval(this.spinnerTimer);
128
- this.spinnerTimer = undefined;
129
- }
130
- }
131
- render(width) {
132
- const roots = this.tree.getActiveRoots();
133
- if (roots.length === 0)
134
- return []; // Hidden when nothing is running.
135
- const dim = (s) => this.theme.fg("dim", s);
136
- const bold = (s) => this.theme.bold(this.theme.fg("accent", s));
137
- // Build a segment for each active root.
138
- const segments = [];
139
- for (const root of roots) {
140
- // Find the deepest running leaf or the root itself.
141
- const leaf = this.findDeepestRunningLeaf(root.id);
142
- const displayNode = leaf ?? root;
143
- // Label: root label, with current phase as suffix if different.
144
- let label = root.label;
145
- if (leaf && leaf.id !== root.id) {
146
- const shortRole = leaf.id.includes(":") ? leaf.id.split(":").slice(1).join(":") : leaf.label;
147
- label = `${root.label} · ${shortRole}`;
148
- }
149
- // Usage footer (right-aligned within segment).
150
- const usage = this.tree.getSubtreeUsage(root.id);
151
- const meter = fmtTokenMeter(usage);
152
- const meterPart = meter ? dim(` ${meter}`) : "";
153
- // IL1: spinner (worm) shows activity — only for running/cancelling.
154
- // Not shown for terminal states (completed, failed, etc.).
155
- const spin = (displayNode.status === "running" || displayNode.status === "cancelling")
156
- ? ` ${this.theme.fg("accent", SPINNER_FRAMES[this.spinnerIdx])}`
157
- : "";
158
- // Turn preview (truncated).
159
- const preview = displayNode.lastTurnPreview
160
- ? dim(` "${truncateToWidth(displayNode.lastTurnPreview, 60)}"`)
161
- : "";
162
- const segment = `${bold(`[${label}]`)}${spin}${preview}${meterPart}`;
163
- segments.push(segment);
164
- }
165
- // Right-side hint depends on active state.
166
- const hint = this.active
167
- ? dim(" ⏎ open · esc back")
168
- : dim(" ↓ dashboard");
169
- // Focus indicator: ○/● coloured by aggregate status.
170
- // Shape: ○ when inactive ("↓ here"), ● when active ("you're here").
171
- // Colour: accent=running, success=completed, error=failed, muted=terminal.
172
- const indicatorColour = focusIndicatorColour(roots, this.theme);
173
- const indicatorGlyph = this.active ? "●" : "○";
174
- const prefix = this.theme.fg(indicatorColour, indicatorGlyph) + " ";
175
- const joined = segments.join(dim(" │ "));
176
- const line = `${prefix}${joined}${hint}`;
177
- return [truncateToWidth(line, width)];
178
- }
179
- invalidate() {
180
- // Re-render driven by external invalidationCb → tui.requestRender().
181
- }
182
- // Note: handleInput is dead code for setWidget("belowEditor") components —
183
- // pi-tui routes input to the prompt editor, not to belowEditor widgets.
184
- // All key handling (↓ focus, ↑/Esc unfocus, Enter open dashboard) is in
185
- // the ForgeInputRouter listener in thread-switcher.ts.
186
- // Keeping the method for Component interface conformance; it does nothing.
187
- dispose() {
188
- this.disposed = true; // IL7: set before clearing timer so callback sees it
189
- this.stopSpinnerTimer();
190
- for (const fn of this.disposeFns)
191
- fn();
192
- this.disposeFns = [];
193
- }
194
- /** Walk depth-first to find the deepest running/cancelling leaf. */
195
- findDeepestRunningLeaf(id) {
196
- const node = this.tree.getNode(id);
197
- if (!node)
198
- return undefined;
199
- if (node.kind === "leaf" && (node.status === "running" || node.status === "cancelling")) {
200
- return node;
201
- }
202
- for (const childId of node.children) {
203
- const found = this.findDeepestRunningLeaf(childId);
204
- if (found)
205
- return found;
206
- }
207
- // If no running leaf, return the root if it's running.
208
- if (node.status === "running" || node.status === "cancelling")
209
- return node;
210
- return undefined;
211
- }
212
- }
213
- //# sourceMappingURL=orchestrator-status-bar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator-status-bar.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/orchestrator-status-bar.ts"],"names":[],"mappings":"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"}