@studio-foundation/cli 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/studio.mjs +41 -0
- package/dist/binary-preflight.d.ts +28 -0
- package/dist/binary-preflight.d.ts.map +1 -0
- package/dist/binary-preflight.js +0 -0
- package/dist/binary-preflight.js.map +1 -0
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +14 -0
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/cache.d.ts +7 -0
- package/dist/commands/cache.d.ts.map +1 -0
- package/dist/commands/cache.js +56 -0
- package/dist/commands/cache.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +38 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +9 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +41 -15
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/integrations.js +2 -2
- package/dist/commands/integrations.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +17 -20
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/registry/install.d.ts.map +1 -1
- package/dist/commands/registry/install.js +11 -7
- package/dist/commands/registry/install.js.map +1 -1
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +4 -0
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +57 -20
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +77 -33
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/template/index.d.ts.map +1 -1
- package/dist/commands/template/index.js +1 -0
- package/dist/commands/template/index.js.map +1 -1
- package/dist/commands/templates.d.ts.map +1 -1
- package/dist/commands/templates.js +9 -21
- package/dist/commands/templates.js.map +1 -1
- package/dist/commands/tools.js +3 -3
- package/dist/commands/tools.js.map +1 -1
- package/dist/config-validation.d.ts +26 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/config-validation.js +82 -0
- package/dist/config-validation.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/generated/bundled-assets.d.ts +4 -0
- package/dist/generated/bundled-assets.d.ts.map +1 -0
- package/dist/generated/bundled-assets.js +11 -0
- package/dist/generated/bundled-assets.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -4
- package/dist/index.js.map +1 -1
- package/dist/output/formatter.d.ts +13 -1
- package/dist/output/formatter.d.ts.map +1 -1
- package/dist/output/formatter.js +79 -33
- package/dist/output/formatter.js.map +1 -1
- package/dist/preflight.d.ts +19 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +111 -0
- package/dist/preflight.js.map +1 -0
- package/dist/version-guard.d.ts +12 -0
- package/dist/version-guard.d.ts.map +1 -0
- package/dist/version-guard.js +23 -0
- package/dist/version-guard.js.map +1 -0
- package/package.json +23 -8
- package/templates/.studiorc.yaml +0 -16
- package/templates/projects/blank/metadata.json +0 -7
- package/templates/studio-config.yaml +0 -14
package/dist/config.js.map
CHANGED
|
@@ -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,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,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 @@
|
|
|
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.1";
|
|
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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
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
|
-
|
|
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(
|
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,oGAAoG;AACpG,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtD,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,OAAuB,EAAE,GAAG,IAAe,EAAE,EAAE;IACrE,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,mCAAmC,CAAC;QAAE,OAAO;IAC3E,WAA4C,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;AAClE,CAAC,CAA+B,CAAC;AAEjC,OAAO,eAAe,CAAC;AACvB,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,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,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,iDAAiD,CAAC;KAC9D,OAAO,CAAC,cAAc,CAAC,CAAC;AAE3B,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,QAAQ,CAAC;KACjB,WAAW,CAAC,0GAA0G,CAAC;KACvH,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,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,sBAAsB,CAAC,CAAC;AAE9E,QAAQ;KACL,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+LAA+L,CAAC;KAC5M,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,MAAM,CAAC,CAAC,IAA6C,EAAE,EAAE,GAAG,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhG,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,6 +1,18 @@
|
|
|
1
1
|
import type { PipelineRun } from '@studio-foundation/contracts';
|
|
2
|
-
|
|
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,
|
|
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"}
|
package/dist/output/formatter.js
CHANGED
|
@@ -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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,UAAU,YAAY,CAAC,GAAgB,EAAE,SAAuB;IACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,cAAc,CAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAC1E,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAClB,MAA6B,EAC7B,SAAkC,EAClC,MAAc;IAEd,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9B,sFAAsF;QACtF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC;QACpD,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvD,uEAAuE;QACvE,0EAA0E;QAC1E,oCAAoC;QACpC,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAErG,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,WAAW,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1G,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,YAAY,EAAE,CACjG,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,YAAY,EAAE,CAC1F,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,QAAQ,uBAAuB,YAAY,EAAE,CACzH,CAAC;YACF,sCAAsC;YACtC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CACnG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAC9E,CAAC;QACJ,CAAC;QAED,iEAAiE;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClF,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAChF,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IACtC,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,IAAI,EAAE,GAAG,MAAM;QAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAoC;IAC3D,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACzF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@studio-foundation/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"description": "CLI for Studio — declarative YAML runtime for AI agents with structured output validation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"studio": "./
|
|
9
|
+
"studio": "./bin/studio.mjs"
|
|
10
10
|
},
|
|
11
11
|
"files": [
|
|
12
|
-
"
|
|
13
|
-
"
|
|
12
|
+
"bin",
|
|
13
|
+
"dist"
|
|
14
14
|
],
|
|
15
15
|
"keywords": [
|
|
16
16
|
"studio",
|
|
@@ -18,6 +18,9 @@
|
|
|
18
18
|
],
|
|
19
19
|
"author": "Ariane Guay",
|
|
20
20
|
"license": "AGPL-3.0-only",
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=22.13"
|
|
23
|
+
},
|
|
21
24
|
"dependencies": {
|
|
22
25
|
"@inquirer/prompts": "^8.2.1",
|
|
23
26
|
"chalk": "^5.6.2",
|
|
@@ -25,18 +28,30 @@
|
|
|
25
28
|
"dotenv": "^17.3.1",
|
|
26
29
|
"js-yaml": "^4.1.1",
|
|
27
30
|
"ora": "^9.3.0",
|
|
28
|
-
"
|
|
29
|
-
"@studio-foundation/
|
|
30
|
-
"@studio-foundation/
|
|
31
|
-
"@studio-foundation/
|
|
31
|
+
"semver": "^7.7.2",
|
|
32
|
+
"@studio-foundation/api": "0.11.1",
|
|
33
|
+
"@studio-foundation/engine": "0.11.1",
|
|
34
|
+
"@studio-foundation/contracts": "0.11.1",
|
|
35
|
+
"@studio-foundation/runner": "0.11.1"
|
|
32
36
|
},
|
|
33
37
|
"devDependencies": {
|
|
34
38
|
"@types/js-yaml": "^4.0.9",
|
|
35
39
|
"@types/node": "^25.2.3",
|
|
40
|
+
"@types/semver": "^7.7.0",
|
|
36
41
|
"typescript": "^5.3.0",
|
|
37
42
|
"vitest": "^4.0.18"
|
|
38
43
|
},
|
|
44
|
+
"optionalDependencies": {
|
|
45
|
+
"@studio-foundation/cli-darwin-arm64": "0.11.1",
|
|
46
|
+
"@studio-foundation/cli-darwin-x64": "0.11.1",
|
|
47
|
+
"@studio-foundation/cli-linux-arm64": "0.11.1",
|
|
48
|
+
"@studio-foundation/cli-linux-arm64-musl": "0.11.1",
|
|
49
|
+
"@studio-foundation/cli-linux-x64": "0.11.1",
|
|
50
|
+
"@studio-foundation/cli-linux-x64-musl": "0.11.1",
|
|
51
|
+
"@studio-foundation/cli-win-x64": "0.11.1"
|
|
52
|
+
},
|
|
39
53
|
"scripts": {
|
|
54
|
+
"prebuild": "node ../scripts/gen-bundled-assets.mjs",
|
|
40
55
|
"build": "tsc",
|
|
41
56
|
"dev": "tsc --watch",
|
|
42
57
|
"clean": "rm -rf dist",
|
package/templates/.studiorc.yaml
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# Studio Configuration
|
|
2
|
-
|
|
3
|
-
providers:
|
|
4
|
-
anthropic:
|
|
5
|
-
apiKey: ${ANTHROPIC_API_KEY}
|
|
6
|
-
# openai:
|
|
7
|
-
# apiKey: ${OPENAI_API_KEY}
|
|
8
|
-
|
|
9
|
-
paths:
|
|
10
|
-
pipelines: ./pipelines
|
|
11
|
-
contracts: ./configs/contracts
|
|
12
|
-
agents: ./configs/agents
|
|
13
|
-
|
|
14
|
-
defaults:
|
|
15
|
-
provider: anthropic
|
|
16
|
-
model: claude-sonnet-4-20250514
|