@studio-foundation/cli 0.9.0 → 0.11.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 (77) hide show
  1. package/bin/studio.mjs +41 -0
  2. package/dist/binary-preflight.d.ts +28 -0
  3. package/dist/binary-preflight.d.ts.map +1 -0
  4. package/dist/binary-preflight.js +0 -0
  5. package/dist/binary-preflight.js.map +1 -0
  6. package/dist/commands/api.d.ts.map +1 -1
  7. package/dist/commands/api.js +14 -0
  8. package/dist/commands/api.js.map +1 -1
  9. package/dist/commands/cache.d.ts +7 -0
  10. package/dist/commands/cache.d.ts.map +1 -0
  11. package/dist/commands/cache.js +56 -0
  12. package/dist/commands/cache.js.map +1 -0
  13. package/dist/commands/doctor.d.ts +2 -0
  14. package/dist/commands/doctor.d.ts.map +1 -0
  15. package/dist/commands/doctor.js +38 -0
  16. package/dist/commands/doctor.js.map +1 -0
  17. package/dist/commands/init.d.ts +9 -1
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +41 -15
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/integrations.js +2 -2
  22. package/dist/commands/integrations.js.map +1 -1
  23. package/dist/commands/project.d.ts.map +1 -1
  24. package/dist/commands/project.js +17 -20
  25. package/dist/commands/project.js.map +1 -1
  26. package/dist/commands/registry/install.d.ts.map +1 -1
  27. package/dist/commands/registry/install.js +11 -7
  28. package/dist/commands/registry/install.js.map +1 -1
  29. package/dist/commands/replay.d.ts.map +1 -1
  30. package/dist/commands/replay.js +4 -0
  31. package/dist/commands/replay.js.map +1 -1
  32. package/dist/commands/run.d.ts.map +1 -1
  33. package/dist/commands/run.js +57 -20
  34. package/dist/commands/run.js.map +1 -1
  35. package/dist/commands/status.d.ts +2 -0
  36. package/dist/commands/status.d.ts.map +1 -1
  37. package/dist/commands/status.js +77 -33
  38. package/dist/commands/status.js.map +1 -1
  39. package/dist/commands/template/index.d.ts.map +1 -1
  40. package/dist/commands/template/index.js +1 -0
  41. package/dist/commands/template/index.js.map +1 -1
  42. package/dist/commands/templates.d.ts.map +1 -1
  43. package/dist/commands/templates.js +9 -21
  44. package/dist/commands/templates.js.map +1 -1
  45. package/dist/commands/tools.js +3 -3
  46. package/dist/commands/tools.js.map +1 -1
  47. package/dist/config-validation.d.ts +26 -0
  48. package/dist/config-validation.d.ts.map +1 -0
  49. package/dist/config-validation.js +82 -0
  50. package/dist/config-validation.js.map +1 -0
  51. package/dist/config.d.ts +6 -1
  52. package/dist/config.d.ts.map +1 -1
  53. package/dist/config.js +3 -7
  54. package/dist/config.js.map +1 -1
  55. package/dist/generated/bundled-assets.d.ts +4 -0
  56. package/dist/generated/bundled-assets.d.ts.map +1 -0
  57. package/dist/generated/bundled-assets.js +11 -0
  58. package/dist/generated/bundled-assets.js.map +1 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +22 -4
  61. package/dist/index.js.map +1 -1
  62. package/dist/output/formatter.d.ts +13 -1
  63. package/dist/output/formatter.d.ts.map +1 -1
  64. package/dist/output/formatter.js +79 -33
  65. package/dist/output/formatter.js.map +1 -1
  66. package/dist/preflight.d.ts +19 -0
  67. package/dist/preflight.d.ts.map +1 -0
  68. package/dist/preflight.js +111 -0
  69. package/dist/preflight.js.map +1 -0
  70. package/dist/version-guard.d.ts +12 -0
  71. package/dist/version-guard.d.ts.map +1 -0
  72. package/dist/version-guard.js +23 -0
  73. package/dist/version-guard.js.map +1 -0
  74. package/package.json +23 -8
  75. package/templates/.studiorc.yaml +0 -16
  76. package/templates/projects/blank/metadata.json +0 -7
  77. package/templates/studio-config.yaml +0 -14
package/dist/config.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { resolve, join } from 'node:path';
3
3
  import yaml from 'js-yaml';
4
+ import { resolveEnvVars } from '@studio-foundation/engine';
4
5
  import { findStudioDir } from './studio-dir.js';
6
+ export { resolveEnvVars };
5
7
  const LEGACY_CONFIG_NAMES = ['.studiorc.yaml', '.studiorc.yml'];
6
8
  export async function loadConfig(configPath, cwd) {
7
9
  const effectiveCwd = cwd ?? process.cwd();
@@ -48,17 +50,11 @@ async function loadFromFile(filePath) {
48
50
  parsed = yaml.load(resolved);
49
51
  }
50
52
  catch (err) {
51
- throw new Error(`Failed to parse config ${filePath}: ${err instanceof Error ? err.message : String(err)}`);
53
+ throw new Error(`Failed to parse config ${filePath}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
52
54
  }
53
55
  if (!parsed || typeof parsed !== 'object') {
54
56
  return {};
55
57
  }
56
58
  return parsed;
57
59
  }
58
- export function resolveEnvVars(content) {
59
- return content.replace(/\$\{([^}]+)\}/g, (_match, varName) => {
60
- const value = process.env[varName.trim()];
61
- return value === undefined ? '' : value;
62
- });
63
- }
64
60
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AA+BhD,MAAM,mBAAmB,GAAG,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB,EAAE,GAAY;IAChE,MAAM,YAAY,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACrC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,+EAA+E;YAC/E,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QACnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,CAAC;AAmC1B,MAAM,mBAAmB,GAAG,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB,EAAE,GAAY;IAChE,MAAM,YAAY,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACrC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,+EAA+E;YAC/E,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzF,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAsB,CAAC;AAChC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const PACKAGE_VERSION = "0.11.0";
2
+ /** Contents of cli/templates/, keyed by path relative to that directory. */
3
+ export declare const BUNDLED_ASSETS: Record<string, string>;
4
+ //# sourceMappingURL=bundled-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-assets.d.ts","sourceRoot":"","sources":["../../src/generated/bundled-assets.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,4EAA4E;AAC5E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMjD,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Generated by scripts/gen-bundled-assets.mjs — do not edit.
2
+ export const PACKAGE_VERSION = "0.11.0";
3
+ /** Contents of cli/templates/, keyed by path relative to that directory. */
4
+ export const BUNDLED_ASSETS = {
5
+ ".studiorc.yaml": "# Studio Configuration\n\nproviders:\n anthropic:\n apiKey: ${ANTHROPIC_API_KEY}\n # openai:\n # apiKey: ${OPENAI_API_KEY}\n\npaths:\n pipelines: ./pipelines\n contracts: ./configs/contracts\n agents: ./configs/agents\n\ndefaults:\n provider: anthropic\n model: claude-sonnet-4-20250514\n",
6
+ "ONBOARDING.md": "# Onboarding — {{PROJECT_NAME}}\n\nHow to go from a fresh machine to a working run of this project. Generated by\n`studio init`; edit it freely — nothing regenerates over it.\n\n## 1. Install Studio\n\nStudio is a global CLI, not a project dependency. Requires Node.js >= 22.13.\n\n```bash\nnpm install -g @studio-foundation/cli\n```\n\n## 2. Get the project\n\n```bash\ngit clone <this-repo>\ncd {{PROJECT_NAME}}\n```\n\nInstall the app dependencies too, if this project has a `package.json`:\n\n```bash\nnpm install\n```\n\n## 3. Create your local config\n\n`.studio/config.yaml` holds the real values and is gitignored. `.studio/config.example.yaml`\nis its committed twin — every key left uncommented there is required.\n\n```bash\ncp .studio/config.example.yaml .studio/config.yaml\n```\n\nThen fill in what it asks for. Secrets belong in environment variables, referenced\nfrom `config.yaml` as `${VAR}` — never written in the file.\n\n## 4. Check the machine\n\n```bash\nstudio doctor\n```\n\nOne command, four checks: the installed Studio satisfies the project's\n`studio_version`, `config.yaml` has every key the contract declares, every required\nbinary is on PATH and in range, and every `${VAR}` resolves to a non-empty value.\nExit code is `1` on any failure, so it also works as a CI gate.\n\nFix whatever it prints, re-run it, and only then run a pipeline.\n\n## 5. Run\n\n```bash\nstudio list pipelines\nstudio run <pipeline> --input \"...\"\n```\n\nUseful while getting oriented:\n\n```bash\nstudio run <pipeline> --provider mock # no API calls, no key needed\nstudio run <pipeline> --live # stream tool calls as they happen\nstudio status # last run\nstudio logs # raw JSONL of the last run\n```\n",
7
+ "projects/blank/metadata.json": "{\n \"name\": \"blank\",\n \"version\": \"1.0.0\",\n \"description\": \"Empty project structure\",\n \"type\": \"template\",\n \"studio_version\": \">=7.0.0\"\n}\n",
8
+ "studio-config.example.yaml": "# Studio configuration contract — COMMIT this file.\n#\n# config.yaml holds the real values and is gitignored (it contains secrets).\n# To set up a fresh clone:\n#\n# cp .studio/config.example.yaml .studio/config.yaml\n#\n# Every key left uncommented here is REQUIRED in config.yaml — `studio run`\n# stops with a clear error if one is missing. Comment a key out to make it\n# optional.\n#\n# Secrets never belong in this file: reference an environment variable\n# (${VAR}, or ${VAR:-default}) and let config.yaml resolve it.\n\n# Semver range this project needs of Studio itself. `studio run` stops before\n# any stage when the installed CLI falls outside it.\n# studio_version: \">=0.10.0\"\n\n# Binaries this project needs. `studio run` stops before any stage when one is\n# missing from PATH, or falls outside its semver range.\n# requires_binaries:\n# - git\n# - \"node >=18 <=22\"\n\n# providers:\n# anthropic:\n# apiKey: ${ANTHROPIC_API_KEY}\n# openai:\n# apiKey: ${OPENAI_API_KEY}\n# ollama:\n# baseUrl: ${OLLAMA_BASE_URL:-http://localhost:11434}\n\ndefaults:\n provider: ollama\n model: llama3.3\n",
9
+ "studio-config.yaml": "# Studio Configuration\n# This file is gitignored — it contains secrets.\n# See .studio/projects/ for your pipeline configs (those ARE committed).\n\nproviders:\n ollama: {}\n # anthropic:\n # apiKey: ${ANTHROPIC_API_KEY}\n # openai:\n # apiKey: ${OPENAI_API_KEY}\n\ndefaults:\n provider: ollama\n model: llama3.3\n",
10
+ };
11
+ //# sourceMappingURL=bundled-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-assets.js","sourceRoot":"","sources":["../../src/generated/bundled-assets.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAExC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,gBAAgB,EAAE,+SAA+S;IACjU,eAAe,EAAE,4vDAA4vD;IAC7wD,8BAA8B,EAAE,0KAA0K;IAC1M,4BAA4B,EAAE,8mCAA8mC;IAC5oC,oBAAoB,EAAE,wUAAwU;CAC/V,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AASA,OAAO,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,12 @@
1
1
  #!/usr/bin/env node
2
+ // node:sqlite is still marked experimental below Node 25.7 — its warning is noise on every command.
3
+ const emitWarning = process.emitWarning.bind(process);
4
+ process.emitWarning = ((warning, ...rest) => {
5
+ if (String(warning).startsWith('SQLite is an experimental feature'))
6
+ return;
7
+ emitWarning(warning, ...rest);
8
+ });
2
9
  import 'dotenv/config';
3
- import { createRequire } from 'module';
4
10
  import { Command } from 'commander';
5
11
  import chalk from 'chalk';
6
12
  import { runCommand } from './commands/run.js';
@@ -10,6 +16,7 @@ import { logsCommand } from './commands/logs.js';
10
16
  import { replayCommand, restartCommand } from './commands/replay.js';
11
17
  import { validateCommand } from './commands/validate.js';
12
18
  import { initCommand } from './commands/init.js';
19
+ import { doctorCommand } from './commands/doctor.js';
13
20
  import { configCommand } from './commands/config.js';
14
21
  import { toolsCommand } from './commands/tools.js';
15
22
  import { integrationsCommand } from './commands/integrations.js';
@@ -20,15 +27,15 @@ import { apiStartCommand, apiStopCommand, apiStatusCommand } from './commands/ap
20
27
  import { installExtensionCommand } from './commands/install.js';
21
28
  import { createRegistryCommand } from './commands/registry/index.js';
22
29
  import { usersCommand } from './commands/users.js';
30
+ import { cacheCleanCommand } from './commands/cache.js';
23
31
  import { ollamaCommand } from './commands/ollama.js';
24
32
  import { loadConfig } from './config.js';
25
- const require = createRequire(import.meta.url);
26
- const { version } = require('../package.json');
33
+ import { STUDIO_VERSION } from './version-guard.js';
27
34
  const program = new Command();
28
35
  program
29
36
  .name('studio')
30
37
  .description('Studio — Declarative YAML runtime for AI agents')
31
- .version(version);
38
+ .version(STUDIO_VERSION);
32
39
  program
33
40
  .command('run <project/pipeline>')
34
41
  .description('Run a pipeline (e.g. studio run cuisine/recipe-generator)')
@@ -96,6 +103,10 @@ program
96
103
  .option('--yes', 'Skip confirmation prompts (for CI/CD); auto-selects ollama if available')
97
104
  .option('--no-tools', 'Skip tool installation (direct mode only)')
98
105
  .action(initCommand);
106
+ program
107
+ .command('doctor')
108
+ .description('Preflight this machine against the project: Studio version, config contract, required binaries, env vars')
109
+ .action(doctorCommand);
99
110
  program
100
111
  .command('config <action> [args...]')
101
112
  .description('Manage Studio configuration (list, get, set, add-provider)')
@@ -153,6 +164,13 @@ program
153
164
  void installExtensionCommand(extension);
154
165
  });
155
166
  program.addCommand(createRegistryCommand());
167
+ const cacheCmd = program.command('cache').description('Manage Studio caches');
168
+ cacheCmd
169
+ .command('clean')
170
+ .description('Clear the map-stage resume cache (.studio/runs/map-cache/) — cached items are keyed on the item input, not on the provider or model, so clear it before re-running under a different provider')
171
+ .option('--pipeline <name>', 'Only clear entries for this parent pipeline')
172
+ .option('--dry-run', 'Show what would be cleared without deleting')
173
+ .action((opts) => { void cacheCleanCommand(opts); });
156
174
  const usersCmd = program.command('users').description('Manage users');
157
175
  usersCmd
158
176
  .command('list')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,iDAAiD,CAAC;KAC9D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,wBAAwB,CAAC;KACjC,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,oBAAoB,EAAE,oCAAoC,CAAC;KAClE,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;KAC5D,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;KAC5D,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;KACnE,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;KAC/E,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC1C,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;KACnD,MAAM,CAAC,QAAQ,EAAE,mDAAmD,CAAC;KACrE,MAAM,CAAC,aAAa,EAAE,2DAA2D,CAAC;KAClF,MAAM,CAAC,gBAAgB,EAAE,0FAA0F,CAAC;KACpH,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC;KACzC,MAAM,CAAC,QAAQ,EAAE,qCAAqC,CAAC;KACvD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,iFAAiF,CAAC;KAC9F,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,MAAM,CAAC,WAAW,EAAE,8DAA8D,CAAC;KACnF,MAAM,CAAC,sBAAsB,EAAE,oEAAoE,CAAC;KACpG,MAAM,CAAC,mBAAmB,EAAE,oEAAoE,CAAC;KACjG,MAAM,CAAC,CAAC,KAAa,EAAE,OAAoF,EAAE,EAAE;IAC9G,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/G,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;KACpD,MAAM,CAAC,aAAa,EAAE,yBAAyB,EAAE,IAAI,CAAC;KACtD,MAAM,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,8BAA8B,CAAC;KACvC,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;KACtE,MAAM,CAAC,kBAAkB,EAAE,wDAAwD,CAAC;KACpF,MAAM,CAAC,mBAAmB,EAAE,gEAAgE,CAAC;KAC7F,MAAM,CAAC,gBAAgB,EAAE,qFAAqF,CAAC;KAC/G,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;KACrD,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;KAC9D,MAAM,CAAC,OAAO,EAAE,yEAAyE,CAAC;KAC1F,MAAM,CAAC,YAAY,EAAE,2CAA2C,CAAC;KACjE,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,2BAA2B,CAAC;KACpC,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,6GAA6G,CAAC;KACxI,MAAM,CAAC,eAAe,EAAE,0DAA0D,CAAC;KACnF,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,0BAA0B,CAAC;KACnC,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,iCAAiC,CAAC;KAC1C,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,CAAC,MAAc,EAAE,IAAc,EAAE,EAAE;IACzC,KAAK,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,8BAA8B,CAAC;KACvC,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAG5B,OAAO;KACJ,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,4BAA4B,CAAC;KACrC,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;KACnE,MAAM,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;KACrD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,mCAAmC,CAAC;KAC5D,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,CAAC,MAAc,EAAE,OAA2C,EAAE,EAAE;IACtE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,KAAK,eAAe,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,KAAK,cAAc,EAAE,CAAC;IACxB,CAAC;SAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,KAAK,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,MAAM,qCAAqC,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,CAAC,SAAiB,EAAE,EAAE;IAC5B,KAAK,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;AAE5C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;AAEtE,QAAQ;KACL,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,QAAQ;KACL,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,eAAe,EAAE,gCAAgC,EAAE,MAAM,CAAC;KACjE,MAAM,CAAC,CAAC,KAAa,EAAE,IAAuB,EAAE,EAAE,GAAG,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpG,QAAQ;KACL,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,eAAe,CAAC;KAC5B,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE,GAAG,KAAK,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5E,QAAQ;KACL,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE,GAAG,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1E,OAAO;KACJ,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,KAAyB,EAAE,EAAE;IAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,IAAI,wBAAwB,CAAC;IAC9E,KAAK,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,18 @@
1
1
  import type { PipelineRun } from '@studio-foundation/contracts';
2
- export declare function formatResult(run: PipelineRun): void;
2
+ /**
3
+ * Child pipeline runs keyed by the spawning stage's `child_run_id`. When
4
+ * provided, a `call` stage renders its child pipeline's stages nested beneath
5
+ * it — the "pipelines of pipelines" view for a call-chained run.
6
+ */
7
+ export type ChildRunMap = Map<string, PipelineRun>;
8
+ export declare function formatResult(run: PipelineRun, childRuns?: ChildRunMap): void;
3
9
  export declare function formatJson(data: unknown): void;
4
10
  export declare function formatError(error: Error): void;
5
11
  export declare function formatDuration(ms: number): string;
12
+ /**
13
+ * Compact, per-stage duration. Keeps one decimal for sub-minute values so a
14
+ * fast child (1.3s) reads differently from a slow one (16.3s) — the whole point
15
+ * of surfacing per-child timing on the line.
16
+ */
17
+ export declare function formatCompactDuration(ms: number): string;
6
18
  //# sourceMappingURL=formatter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAyEnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE9C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOjD"}
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEnD,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAgC5E;AAqED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE9C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMxD"}
@@ -1,5 +1,5 @@
1
1
  import chalk from 'chalk';
2
- export function formatResult(run) {
2
+ export function formatResult(run, childRuns) {
3
3
  console.log('');
4
4
  console.log(`Pipeline: ${chalk.bold(run.pipeline_name)}`);
5
5
  if (run.status === 'success') {
@@ -27,41 +27,60 @@ export function formatResult(run) {
27
27
  if (run.stages.length > 0) {
28
28
  console.log('');
29
29
  console.log('Stages:');
30
- const total = run.stages.length;
31
- for (let i = 0; i < run.stages.length; i++) {
32
- const stage = run.stages[i];
33
- const index = `[${i + 1}/${total}]`;
34
- const name = stage.stage_name;
35
- // A call/map stage produces no agent runs, so an attempt count is meaningless for it.
36
- const agentRuns = stage.tasks[0]?.agent_runs.length;
37
- const attempts = agentRuns ?? 0;
38
- const dots = '.'.repeat(Math.max(2, 30 - name.length));
39
- if (stage.status === 'success') {
40
- const attemptText = agentRuns !== undefined ? ` (${agentRuns} attempt${agentRuns !== 1 ? 's' : ''})` : '';
41
- console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.green('✓')}${attemptText}`);
42
- }
43
- else if (stage.status === 'rejected') {
44
- console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.red('✗ REJECTED')}`);
45
- }
46
- else if (stage.status === 'failed') {
47
- console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.red('✗ FAILED')} (${attempts} attempts exhausted)`);
48
- // Show errors from the last agent run
49
- const lastAgentRun = stage.tasks[0]?.agent_runs.at(-1);
50
- if (lastAgentRun?.error) {
51
- console.log(`${chalk.gray(' Errors:')}`);
52
- console.log(`${chalk.gray(' -')} ${lastAgentRun.error}`);
53
- }
54
- }
55
- else if (stage.status === 'skipped') {
56
- const reasonText = stage.skipped_reason ? ` (skipped: ${stage.skipped_reason})` : '';
57
- console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.dim('⊘ skipped')}${chalk.gray(reasonText)}`);
58
- }
59
- else {
60
- console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.yellow(stage.status)}`);
30
+ printStages(run.stages, childRuns, ' ');
31
+ }
32
+ console.log('');
33
+ }
34
+ /**
35
+ * Render a list of stages, each on its own line under `indent`. When a stage
36
+ * spawned a child pipeline (its `child_run_id` resolves in `childRuns`), the
37
+ * child's own stages are printed recursively, indented one level deeper.
38
+ */
39
+ function printStages(stages, childRuns, indent) {
40
+ const total = stages.length;
41
+ for (let i = 0; i < stages.length; i++) {
42
+ const stage = stages[i];
43
+ const index = `[${i + 1}/${total}]`;
44
+ const name = stage.stage_name;
45
+ // A call/map stage produces no agent runs, so an attempt count is meaningless for it.
46
+ const agentRuns = stage.tasks[0]?.agent_runs.length;
47
+ const attempts = agentRuns ?? 0;
48
+ const dots = '.'.repeat(Math.max(2, 30 - name.length));
49
+ // Per-stage wall-clock, surfaced next to the status marker. For a call
50
+ // stage this is the child pipeline's duration — the timing that otherwise
51
+ // meant hand-parsing the run JSONL.
52
+ const durationMs = stageDurationMs(stage);
53
+ const durationText = durationMs !== null ? ` ${chalk.gray(formatCompactDuration(durationMs))}` : '';
54
+ if (stage.status === 'success') {
55
+ const attemptText = agentRuns !== undefined ? ` (${agentRuns} attempt${agentRuns !== 1 ? 's' : ''})` : '';
56
+ console.log(`${indent}${index} ${name} ${chalk.gray(dots)} ${chalk.green('✓')}${attemptText}${durationText}`);
57
+ }
58
+ else if (stage.status === 'rejected') {
59
+ console.log(`${indent}${index} ${name} ${chalk.gray(dots)} ${chalk.red('✗ REJECTED')}${durationText}`);
60
+ }
61
+ else if (stage.status === 'failed') {
62
+ console.log(`${indent}${index} ${name} ${chalk.gray(dots)} ${chalk.red('✗ FAILED')} (${attempts} attempts exhausted)${durationText}`);
63
+ // Show errors from the last agent run
64
+ const lastAgentRun = stage.tasks[0]?.agent_runs.at(-1);
65
+ if (lastAgentRun?.error) {
66
+ console.log(`${indent}${chalk.gray(' Errors:')}`);
67
+ console.log(`${indent}${chalk.gray(' -')} ${lastAgentRun.error}`);
61
68
  }
62
69
  }
70
+ else if (stage.status === 'skipped') {
71
+ const reasonText = stage.skipped_reason ? ` (skipped: ${stage.skipped_reason})` : '';
72
+ console.log(`${indent}${index} ${name} ${chalk.gray(dots)} ${chalk.dim('⊘ skipped')}${chalk.gray(reasonText)}`);
73
+ }
74
+ else {
75
+ console.log(`${indent}${index} ${name} ${chalk.gray(dots)} ${chalk.yellow(stage.status)}`);
76
+ }
77
+ // Nest the spawned child pipeline's stages beneath a call stage.
78
+ const child = stage.child_run_id ? childRuns?.get(stage.child_run_id) : undefined;
79
+ if (child && child.stages.length > 0) {
80
+ console.log(`${indent} ${chalk.gray('└─')} ${chalk.dim(child.pipeline_name)}`);
81
+ printStages(child.stages, childRuns, `${indent} `);
82
+ }
63
83
  }
64
- console.log('');
65
84
  }
66
85
  export function formatJson(data) {
67
86
  console.log(JSON.stringify(data, null, 2));
@@ -79,4 +98,31 @@ export function formatDuration(ms) {
79
98
  const remainingSeconds = seconds % 60;
80
99
  return `${minutes}m${remainingSeconds.toString().padStart(2, '0')}s`;
81
100
  }
101
+ /**
102
+ * Compact, per-stage duration. Keeps one decimal for sub-minute values so a
103
+ * fast child (1.3s) reads differently from a slow one (16.3s) — the whole point
104
+ * of surfacing per-child timing on the line.
105
+ */
106
+ export function formatCompactDuration(ms) {
107
+ if (ms < 1000)
108
+ return `${ms}ms`;
109
+ if (ms < 60_000)
110
+ return `${(ms / 1000).toFixed(1)}s`;
111
+ const minutes = Math.floor(ms / 60_000);
112
+ const remainingSeconds = Math.floor((ms % 60_000) / 1000);
113
+ return `${minutes}m${remainingSeconds.toString().padStart(2, '0')}s`;
114
+ }
115
+ /**
116
+ * Wall-clock of a single stage from its recorded timestamps, or null when it
117
+ * can't be derived (missing timestamps) or is zero (e.g. a skipped stage) —
118
+ * callers omit the duration entirely in those cases.
119
+ */
120
+ function stageDurationMs(stage) {
121
+ if (!stage.started_at || !stage.completed_at)
122
+ return null;
123
+ const ms = new Date(stage.completed_at).getTime() - new Date(stage.started_at).getTime();
124
+ if (!Number.isFinite(ms) || ms <= 0)
125
+ return null;
126
+ return ms;
127
+ }
82
128
  //# sourceMappingURL=formatter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { StudioConfig } from './config.js';
2
+ export type CheckStatus = 'ok' | 'warn' | 'fail';
3
+ export interface PreflightCheck {
4
+ name: string;
5
+ status: CheckStatus;
6
+ /** Single line shown next to the check name. */
7
+ detail: string;
8
+ /** Multi-line actionable text, printed below the list when the check didn't pass. */
9
+ fix?: string;
10
+ }
11
+ /**
12
+ * `${VAR}` references in a raw config that resolve to nothing: no `:-` fallback
13
+ * and no value in the environment. `resolveEnvVars` turns those into an empty
14
+ * string, so the key looks present while carrying no value.
15
+ */
16
+ export declare function unsetEnvRefs(raw: string, env?: NodeJS.ProcessEnv): string[];
17
+ /** Every preflight check, in display order. Never throws — a broken check reports itself. */
18
+ export declare function collectChecks(studioDir: string, config: StudioConfig): Promise<PreflightCheck[]>;
19
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWhD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,qFAAqF;IACrF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAQxF;AA4FD,6FAA6F;AAC7F,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CAO3B"}
@@ -0,0 +1,111 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { loadProjectTools } from '@studio-foundation/runner';
4
+ import { CONFIG_FILE, CONFIG_EXAMPLE_FILE, checkConfig, formatConfigCheckError, } from './config-validation.js';
5
+ import { STUDIO_VERSION, checkStudioVersion } from './version-guard.js';
6
+ import { checkBinaries, formatBinaryPreflightError, parseRequirement } from './binary-preflight.js';
7
+ /**
8
+ * `${VAR}` references in a raw config that resolve to nothing: no `:-` fallback
9
+ * and no value in the environment. `resolveEnvVars` turns those into an empty
10
+ * string, so the key looks present while carrying no value.
11
+ */
12
+ export function unsetEnvRefs(raw, env = process.env) {
13
+ const missing = new Set();
14
+ for (const [, expr] of raw.matchAll(/\$\{([^}]+)\}/g)) {
15
+ if (expr.includes(':-'))
16
+ continue;
17
+ const name = expr.trim();
18
+ if (env[name] === undefined || env[name] === '')
19
+ missing.add(name);
20
+ }
21
+ return [...missing];
22
+ }
23
+ function versionCheck(config) {
24
+ const required = config.studio_version;
25
+ const error = checkStudioVersion(required, 'This project');
26
+ const suffix = required ? `(project requires ${required})` : '(no requirement declared)';
27
+ return {
28
+ name: 'Studio version',
29
+ status: error ? 'fail' : 'ok',
30
+ detail: `${STUDIO_VERSION} ${suffix}`,
31
+ ...(error ? { fix: `Error: ${error}` } : {}),
32
+ };
33
+ }
34
+ async function configCheck(studioDir) {
35
+ const result = await checkConfig(studioDir);
36
+ const detail = {
37
+ ok: `matches ${CONFIG_EXAMPLE_FILE}`,
38
+ 'no-contract': `no ${CONFIG_EXAMPLE_FILE} — nothing to enforce`,
39
+ 'missing-config': `${CONFIG_FILE} not found`,
40
+ 'missing-keys': `${CONFIG_FILE} missing ${result.missingKeys.length} key${result.missingKeys.length > 1 ? 's' : ''}: ${result.missingKeys.join(', ')}`,
41
+ }[result.status];
42
+ const fix = formatConfigCheckError(result);
43
+ return {
44
+ name: 'Config',
45
+ status: fix ? 'fail' : 'ok',
46
+ detail,
47
+ ...(fix ? { fix } : {}),
48
+ };
49
+ }
50
+ async function binaryRequirements(studioDir, config) {
51
+ const configsDir = config.paths?.configs ? resolve(config.paths.configs) : studioDir;
52
+ const plugins = await loadProjectTools(join(configsDir, 'tools'), process.cwd());
53
+ return [
54
+ ...(config.requires_binaries ?? []).map((entry) => ({ entry, declaredBy: 'this project' })),
55
+ ...plugins.flatMap((plugin) => (plugin.requiresBinaries ?? []).map((entry) => ({
56
+ entry,
57
+ declaredBy: `tool plugin '${plugin.name}'`,
58
+ }))),
59
+ ];
60
+ }
61
+ function binaryCheck(requirements) {
62
+ const failures = checkBinaries(requirements);
63
+ const fix = formatBinaryPreflightError(failures);
64
+ const names = [...new Set(requirements.map((r) => parseRequirement(r.entry).binary))];
65
+ return {
66
+ name: 'Required binaries',
67
+ status: fix ? 'fail' : 'ok',
68
+ detail: fix
69
+ ? `${[...new Set(failures.map((f) => f.binary))].join(', ')} missing or unsupported`
70
+ : names.length > 0
71
+ ? names.join(', ')
72
+ : 'none declared',
73
+ ...(fix ? { fix } : {}),
74
+ };
75
+ }
76
+ async function envCheck(studioDir) {
77
+ let raw;
78
+ try {
79
+ raw = await readFile(join(studioDir, CONFIG_FILE), 'utf-8');
80
+ }
81
+ catch {
82
+ return { name: 'Env vars', status: 'ok', detail: `no ${CONFIG_FILE} to read` };
83
+ }
84
+ const unset = unsetEnvRefs(raw);
85
+ const referenced = new Set([...raw.matchAll(/\$\{([^}]+)\}/g)].map(([, e]) => e.trim()));
86
+ if (unset.length === 0) {
87
+ return {
88
+ name: 'Env vars',
89
+ status: 'ok',
90
+ detail: referenced.size > 0 ? `${referenced.size} reference(s) resolved` : 'none referenced',
91
+ };
92
+ }
93
+ return {
94
+ name: 'Env vars',
95
+ status: 'warn',
96
+ detail: `${unset.join(', ')} unset — resolves to an empty value`,
97
+ fix: `Warning: ${CONFIG_FILE} references environment variable${unset.length > 1 ? 's' : ''} that ${unset.length > 1 ? 'are' : 'is'} unset:\n` +
98
+ unset.map((name) => ` - ${name}`).join('\n') +
99
+ `\n Export ${unset.length > 1 ? 'them' : 'it'}, or declare a fallback: \${VAR:-default}`,
100
+ };
101
+ }
102
+ /** Every preflight check, in display order. Never throws — a broken check reports itself. */
103
+ export async function collectChecks(studioDir, config) {
104
+ return [
105
+ versionCheck(config),
106
+ await configCheck(studioDir),
107
+ binaryCheck(await binaryRequirements(studioDir, config)),
108
+ await envCheck(studioDir),
109
+ ];
110
+ }
111
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** The running Studio version — the single source is cli/package.json, inlined at build time. */
2
+ export declare const STUDIO_VERSION: string;
3
+ export declare const UPGRADE_HINT = " Upgrade: npm i -g @studio-foundation/cli@latest";
4
+ /**
5
+ * Compare a declared `studio_version` range against the running version.
6
+ *
7
+ * Returns null when compatible (or when nothing is declared), otherwise an
8
+ * unprefixed message — callers wrap it as an error or throw it. `requiredBy`
9
+ * names the declarer and opens the sentence: "This project", "Package 'foo'".
10
+ */
11
+ export declare function checkStudioVersion(required: string | null | undefined, requiredBy: string, current?: string): string | null;
12
+ //# sourceMappingURL=version-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-guard.d.ts","sourceRoot":"","sources":["../src/version-guard.ts"],"names":[],"mappings":"AAGA,iGAAiG;AACjG,eAAO,MAAM,cAAc,EAAE,MAAwB,CAAC;AAEtD,eAAO,MAAM,YAAY,uDAAuD,CAAC;AAEjF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAuB,GAC/B,MAAM,GAAG,IAAI,CAUf"}
@@ -0,0 +1,23 @@
1
+ import semver from 'semver';
2
+ import { PACKAGE_VERSION } from './generated/bundled-assets.js';
3
+ /** The running Studio version — the single source is cli/package.json, inlined at build time. */
4
+ export const STUDIO_VERSION = PACKAGE_VERSION;
5
+ export const UPGRADE_HINT = ' Upgrade: npm i -g @studio-foundation/cli@latest';
6
+ /**
7
+ * Compare a declared `studio_version` range against the running version.
8
+ *
9
+ * Returns null when compatible (or when nothing is declared), otherwise an
10
+ * unprefixed message — callers wrap it as an error or throw it. `requiredBy`
11
+ * names the declarer and opens the sentence: "This project", "Package 'foo'".
12
+ */
13
+ export function checkStudioVersion(required, requiredBy, current = STUDIO_VERSION) {
14
+ if (!required)
15
+ return null;
16
+ if (!semver.validRange(required)) {
17
+ return `${requiredBy} declares an invalid studio_version range: '${required}'.`;
18
+ }
19
+ if (semver.satisfies(current, required, { includePrerelease: true }))
20
+ return null;
21
+ return `${requiredBy} requires Studio ${required}, but you have ${current}.\n${UPGRADE_HINT}`;
22
+ }
23
+ //# sourceMappingURL=version-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-guard.js","sourceRoot":"","sources":["../src/version-guard.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,iGAAiG;AACjG,MAAM,CAAC,MAAM,cAAc,GAAW,eAAe,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAG,oDAAoD,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAmC,EACnC,UAAkB,EAClB,UAAkB,cAAc;IAEhC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,UAAU,+CAA+C,QAAQ,IAAI,CAAC;IAClF,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAElF,OAAO,GAAG,UAAU,oBAAoB,QAAQ,kBAAkB,OAAO,MAAM,YAAY,EAAE,CAAC;AAChG,CAAC"}