@studio-foundation/cli 0.13.0 → 0.15.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 (69) hide show
  1. package/README.md +0 -3
  2. package/dist/commands/api.js +2 -2
  3. package/dist/commands/api.js.map +1 -1
  4. package/dist/commands/registry/index.d.ts.map +1 -1
  5. package/dist/commands/registry/index.js +6 -1
  6. package/dist/commands/registry/index.js.map +1 -1
  7. package/dist/commands/registry/info.d.ts +34 -0
  8. package/dist/commands/registry/info.d.ts.map +1 -0
  9. package/dist/commands/registry/info.js +117 -0
  10. package/dist/commands/registry/info.js.map +1 -0
  11. package/dist/commands/registry/install.d.ts.map +1 -1
  12. package/dist/commands/registry/install.js +5 -3
  13. package/dist/commands/registry/install.js.map +1 -1
  14. package/dist/commands/replay.d.ts.map +1 -1
  15. package/dist/commands/replay.js +5 -11
  16. package/dist/commands/replay.js.map +1 -1
  17. package/dist/commands/run.d.ts.map +1 -1
  18. package/dist/commands/run.js +51 -8
  19. package/dist/commands/run.js.map +1 -1
  20. package/dist/commands/status.d.ts.map +1 -1
  21. package/dist/commands/status.js +3 -0
  22. package/dist/commands/status.js.map +1 -1
  23. package/dist/config.d.ts +5 -1
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js.map +1 -1
  26. package/dist/contract-warnings.d.ts +31 -0
  27. package/dist/contract-warnings.d.ts.map +1 -0
  28. package/dist/contract-warnings.js +60 -0
  29. package/dist/contract-warnings.js.map +1 -0
  30. package/dist/generated/bundled-assets.d.ts +1 -1
  31. package/dist/generated/bundled-assets.d.ts.map +1 -1
  32. package/dist/generated/bundled-assets.js +5 -9
  33. package/dist/generated/bundled-assets.js.map +1 -1
  34. package/dist/index.js +0 -7
  35. package/dist/index.js.map +1 -1
  36. package/dist/output/formatter.d.ts.map +1 -1
  37. package/dist/output/formatter.js +32 -4
  38. package/dist/output/formatter.js.map +1 -1
  39. package/dist/output/formatters.d.ts +7 -3
  40. package/dist/output/formatters.d.ts.map +1 -1
  41. package/dist/output/formatters.js +7 -17
  42. package/dist/output/formatters.js.map +1 -1
  43. package/dist/output/map-progress.d.ts +11 -1
  44. package/dist/output/map-progress.d.ts.map +1 -1
  45. package/dist/output/map-progress.js +30 -3
  46. package/dist/output/map-progress.js.map +1 -1
  47. package/dist/output/progress.d.ts.map +1 -1
  48. package/dist/output/progress.js +24 -3
  49. package/dist/output/progress.js.map +1 -1
  50. package/dist/output/token-usage.d.ts +14 -0
  51. package/dist/output/token-usage.d.ts.map +1 -0
  52. package/dist/output/token-usage.js +57 -0
  53. package/dist/output/token-usage.js.map +1 -0
  54. package/dist/preflight.d.ts.map +1 -1
  55. package/dist/preflight.js +42 -0
  56. package/dist/preflight.js.map +1 -1
  57. package/dist/registry/resolver.d.ts +7 -1
  58. package/dist/registry/resolver.d.ts.map +1 -1
  59. package/dist/registry/resolver.js +1 -1
  60. package/dist/registry/resolver.js.map +1 -1
  61. package/dist/registry/types.d.ts +7 -2
  62. package/dist/registry/types.d.ts.map +1 -1
  63. package/dist/registry/types.js +2 -2
  64. package/dist/registry/types.js.map +1 -1
  65. package/package.json +12 -12
  66. package/dist/commands/integrations.d.ts +0 -14
  67. package/dist/commands/integrations.d.ts.map +0 -1
  68. package/dist/commands/integrations.js +0 -274
  69. package/dist/commands/integrations.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ // Reading and rendering the token counts a run recorded.
2
+ //
3
+ // Two JSONL shapes exist in the wild. Runs written before per-call usage landed
4
+ // carry `tokens: { prompt, completion, total }`; runs written since carry the
5
+ // full `TokenUsage` (cache split + per-model breakdown). `studio status` and
6
+ // `studio replay` both read historical run files, so both shapes are accepted —
7
+ // a run log does not become unreadable because Studio was upgraded.
8
+ function isLegacy(value) {
9
+ return typeof value.total === 'number' && value.total_tokens === undefined;
10
+ }
11
+ /** Parse a `tokens` field off a run JSONL line, in either recorded shape. */
12
+ export function parseLoggedUsage(value) {
13
+ if (!value || typeof value !== 'object')
14
+ return undefined;
15
+ const raw = value;
16
+ if (isLegacy(raw)) {
17
+ const legacy = raw;
18
+ return {
19
+ prompt_tokens: legacy.prompt ?? 0,
20
+ completion_tokens: legacy.completion ?? 0,
21
+ total_tokens: legacy.total ?? 0,
22
+ };
23
+ }
24
+ if (typeof raw.total_tokens !== 'number')
25
+ return undefined;
26
+ return raw;
27
+ }
28
+ /** 947 → "947", 13512 → "13.5k", 1_240_000 → "1.24M". */
29
+ export function formatTokenCount(n) {
30
+ if (!Number.isFinite(n))
31
+ return '0';
32
+ if (Math.abs(n) < 1000)
33
+ return String(Math.round(n));
34
+ if (Math.abs(n) < 1_000_000)
35
+ return `${(n / 1000).toFixed(1)}k`;
36
+ return `${(n / 1_000_000).toFixed(2)}M`;
37
+ }
38
+ /**
39
+ * "145.2k tokens (12.1k in · 3.4k out · 128k cached · 1.7k cache-write)" —
40
+ * the components are listed because they are billed at different rates, so the
41
+ * total alone does not tell you what a run cost.
42
+ */
43
+ export function formatUsageSummary(usage) {
44
+ const parts = [`${formatTokenCount(usage.prompt_tokens)} in`, `${formatTokenCount(usage.completion_tokens)} out`];
45
+ if (usage.cached_input_tokens)
46
+ parts.push(`${formatTokenCount(usage.cached_input_tokens)} cached`);
47
+ if (usage.cache_creation_tokens)
48
+ parts.push(`${formatTokenCount(usage.cache_creation_tokens)} cache-write`);
49
+ return `${formatTokenCount(usage.total_tokens)} tokens (${parts.join(' · ')})`;
50
+ }
51
+ /** Per-model rows, heaviest first — the breakdown a cost review starts from. */
52
+ export function usageByModel(usage) {
53
+ if (!usage.by_model)
54
+ return [];
55
+ return Object.entries(usage.by_model).sort((a, b) => b[1].total_tokens - a[1].total_tokens);
56
+ }
57
+ //# sourceMappingURL=token-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage.js","sourceRoot":"","sources":["../../src/output/token-usage.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,6EAA6E;AAC7E,gFAAgF;AAChF,oEAAoE;AAUpE,SAAS,QAAQ,CAAC,KAA8B;IAC9C,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC;AAC7E,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,OAAO;YACL,aAAa,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;YACjC,iBAAiB,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YACzC,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,GAA4B,CAAC;AACtC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACvD,MAAM,KAAK,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClH,IAAI,KAAK,CAAC,mBAAmB;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACnG,IAAI,KAAK,CAAC,qBAAqB;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAC5G,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACjF,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC9F,CAAC"}
@@ -1 +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"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBhD,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;AA0ID,6FAA6F;AAC7F,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CAQ3B"}
package/dist/preflight.js CHANGED
@@ -4,6 +4,7 @@ import { loadProjectTools } from '@studio-foundation/runner';
4
4
  import { CONFIG_FILE, CONFIG_EXAMPLE_FILE, checkConfig, formatConfigCheckError, } from './config-validation.js';
5
5
  import { STUDIO_VERSION, checkStudioVersion } from './version-guard.js';
6
6
  import { checkBinaries, formatBinaryPreflightError, parseRequirement } from './binary-preflight.js';
7
+ import { SUPPRESS_HINT, formatCoverageEntry, missingContractWarningsEnabled, resolvePipelinesDir, scanPipelineContracts, } from './contract-warnings.js';
7
8
  /**
8
9
  * `${VAR}` references in a raw config that resolve to nothing: no `:-` fallback
9
10
  * and no value in the environment. `resolveEnvVars` turns those into an empty
@@ -99,6 +100,46 @@ async function envCheck(studioDir) {
99
100
  `\n Export ${unset.length > 1 ? 'them' : 'it'}, or declare a fallback: \${VAR:-default}`,
100
101
  };
101
102
  }
103
+ /**
104
+ * Contract coverage across the pipelines this project ships. A stage with no
105
+ * `contract:` runs unvalidated, which is legitimate but silent at run time —
106
+ * this is where it becomes catchable before the run (STU-703). Never a `fail`:
107
+ * the run is not in danger, only unguarded.
108
+ */
109
+ async function contractCheck(studioDir, config) {
110
+ const coverage = await scanPipelineContracts(resolvePipelinesDir(studioDir, config));
111
+ const unreadable = coverage.unreadable.length
112
+ ? ` (${coverage.unreadable.length} unreadable: ${coverage.unreadable.join(', ')})`
113
+ : '';
114
+ if (coverage.scanned === 0) {
115
+ return { name: 'Contracts', status: 'ok', detail: `no pipelines found${unreadable}` };
116
+ }
117
+ const count = coverage.stages.length;
118
+ const pipelines = `${coverage.scanned} pipeline${coverage.scanned > 1 ? 's' : ''}`;
119
+ if (count === 0) {
120
+ return {
121
+ name: 'Contracts',
122
+ status: 'ok',
123
+ detail: `every stage validates its output (${pipelines})${unreadable}`,
124
+ };
125
+ }
126
+ const summary = `${count} stage${count > 1 ? 's' : ''} of ${pipelines} run${count > 1 ? '' : 's'} unvalidated`;
127
+ if (!missingContractWarningsEnabled(config)) {
128
+ return {
129
+ name: 'Contracts',
130
+ status: 'ok',
131
+ detail: `${summary} — warnings suppressed${unreadable}`,
132
+ };
133
+ }
134
+ return {
135
+ name: 'Contracts',
136
+ status: 'warn',
137
+ detail: `${summary}${unreadable}`,
138
+ fix: 'Warning: stages with no `contract:` run unvalidated — no schema check, no tool_calls floor, no rejection detection:\n' +
139
+ coverage.stages.map((s) => ` - ${formatCoverageEntry(s)}`).join('\n') +
140
+ `\n ${SUPPRESS_HINT}`,
141
+ };
142
+ }
102
143
  /** Every preflight check, in display order. Never throws — a broken check reports itself. */
103
144
  export async function collectChecks(studioDir, config) {
104
145
  return [
@@ -106,6 +147,7 @@ export async function collectChecks(studioDir, config) {
106
147
  await configCheck(studioDir),
107
148
  binaryCheck(await binaryRequirements(studioDir, config)),
108
149
  await envCheck(studioDir),
150
+ await contractCheck(studioDir, config),
109
151
  ];
110
152
  }
111
153
  //# sourceMappingURL=preflight.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import type { PackageMetadata, PackageType, Lockfile } from './types.js';
1
+ import type { PackageMetadata, PackageType, Lockfile, PackageDependencies } from './types.js';
2
+ import { type DependencySpec } from './dependency-spec.js';
2
3
  import { type Constraint } from './constraints.js';
3
4
  import { type IndexedPackage } from './registry-index.js';
4
5
  export interface DependencyNode {
@@ -20,6 +21,11 @@ export interface ResolveOptions {
20
21
  /** Names of every registered marketplace. A dependency may name no other. */
21
22
  registered: string[];
22
23
  }
24
+ /** Parsed dependency entries of one kind, tagged with the category they came from. */
25
+ export declare function specsOf(deps: PackageDependencies, kind: 'required' | 'recommended'): Array<{
26
+ spec: DependencySpec;
27
+ category: string;
28
+ }>;
23
29
  export declare function resolveDependencies(rootPackageName: string, meta: PackageMetadata, packages: IndexedPackage[], _lockfile: Lockfile, fetchMeta: MetadataFetcher, options: ResolveOptions): Promise<ResolvedGraph>;
24
30
  export {};
25
31
  //# sourceMappingURL=resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/registry/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAuB,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAkCD,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAwExB"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/registry/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,sFAAsF;AACtF,wBAAgB,OAAO,CACrB,IAAI,EAAE,mBAAmB,EACzB,IAAI,EAAE,UAAU,GAAG,aAAa,GAC/B,KAAK,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CASnD;AAmBD,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAwExB"}
@@ -2,7 +2,7 @@ import { parseDependencySpec } from './dependency-spec.js';
2
2
  import { selectVersion } from './constraints.js';
3
3
  import { candidatesFor } from './registry-index.js';
4
4
  /** Parsed dependency entries of one kind, tagged with the category they came from. */
5
- function specsOf(deps, kind) {
5
+ export function specsOf(deps, kind) {
6
6
  const out = [];
7
7
  for (const [category, entry] of Object.entries(deps)) {
8
8
  const names = entry[kind] ?? [];
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/registry/resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/registry/resolver.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  export type PackageType = 'template' | 'plugin';
6
6
  /** What a plugin delivers into `.studio/`. */
7
- export type ContentKind = 'tool' | 'agent' | 'skill' | 'integration' | 'pipeline' | 'contract' | 'input';
7
+ export type ContentKind = 'tool' | 'agent' | 'skill' | 'trigger' | 'pipeline' | 'contract' | 'input';
8
8
  /** A plugin's declared contents, by kind. Search reads it; install verifies nothing against it. */
9
9
  export type PackageProvides = Partial<Record<`${ContentKind}s`, string[]>>;
10
10
  /**
@@ -41,6 +41,12 @@ export interface PackageEntry {
41
41
  studio_version: string | null;
42
42
  downloads: number;
43
43
  provides?: PackageProvides;
44
+ /**
45
+ * Declared alongside the entry, not only in the package's `metadata.json`, so
46
+ * `registry info` can answer "what does this drag in?" from the index alone.
47
+ * Resolution still reads the metadata — this is the published copy.
48
+ */
49
+ dependencies?: PackageDependencies;
44
50
  source: PackageSource;
45
51
  }
46
52
  export interface RegistryIndex {
@@ -81,7 +87,6 @@ export interface PackageDependencies {
81
87
  }
82
88
  export interface PackageMetadata extends Omit<PackageEntry, 'source'> {
83
89
  requires_binaries?: string[];
84
- dependencies?: PackageDependencies;
85
90
  }
86
91
  export interface LockfileEntry {
87
92
  /** `template` or `plugin`, or one of the pre-migration types on an older lockfile. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ export const CONTENT_DIRS = {
3
3
  tool: 'tools',
4
4
  agent: 'agents',
5
5
  skill: 'skills',
6
- integration: 'integrations',
6
+ trigger: 'triggers',
7
7
  pipeline: 'pipelines',
8
8
  contract: 'contracts',
9
9
  input: 'inputs',
@@ -16,7 +16,7 @@ export const CONTENT_EXTENSIONS = {
16
16
  '.tool.yaml': 'tool',
17
17
  '.agent.yaml': 'agent',
18
18
  '.skill.md': 'skill',
19
- '.integration.yaml': 'integration',
19
+ '.trigger.yaml': 'trigger',
20
20
  '.pipeline.yaml': 'pipeline',
21
21
  '.contract.yaml': 'contract',
22
22
  '.input.yaml': 'input',
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAoGA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAAgC;IACvD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,cAAc;IAC3B,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgC;IAC7D,YAAY,EAAE,MAAM;IACpB,aAAa,EAAE,OAAO;IACtB,WAAW,EAAE,OAAO;IACpB,mBAAmB,EAAE,aAAa;IAClC,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,OAAO;CACvB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7D,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,oCAAoC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAyGA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAAgC;IACvD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgC;IAC7D,YAAY,EAAE,MAAM;IACpB,aAAa,EAAE,OAAO;IACtB,WAAW,EAAE,OAAO;IACpB,eAAe,EAAE,SAAS;IAC1B,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,OAAO;CACvB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7D,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,oCAAoC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studio-foundation/cli",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
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",
@@ -29,10 +29,10 @@
29
29
  "js-yaml": "^4.1.1",
30
30
  "ora": "^9.3.0",
31
31
  "semver": "^7.7.2",
32
- "@studio-foundation/api": "0.13.0",
33
- "@studio-foundation/contracts": "0.13.0",
34
- "@studio-foundation/engine": "0.13.0",
35
- "@studio-foundation/runner": "0.13.0"
32
+ "@studio-foundation/api": "0.15.0",
33
+ "@studio-foundation/engine": "0.15.0",
34
+ "@studio-foundation/runner": "0.15.0",
35
+ "@studio-foundation/contracts": "0.15.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/js-yaml": "^4.0.9",
@@ -42,13 +42,13 @@
42
42
  "vitest": "^4.0.18"
43
43
  },
44
44
  "optionalDependencies": {
45
- "@studio-foundation/cli-darwin-arm64": "0.13.0",
46
- "@studio-foundation/cli-darwin-x64": "0.13.0",
47
- "@studio-foundation/cli-linux-arm64": "0.13.0",
48
- "@studio-foundation/cli-linux-arm64-musl": "0.13.0",
49
- "@studio-foundation/cli-linux-x64": "0.13.0",
50
- "@studio-foundation/cli-linux-x64-musl": "0.13.0",
51
- "@studio-foundation/cli-win-x64": "0.13.0"
45
+ "@studio-foundation/cli-darwin-arm64": "0.15.0",
46
+ "@studio-foundation/cli-darwin-x64": "0.15.0",
47
+ "@studio-foundation/cli-linux-arm64": "0.15.0",
48
+ "@studio-foundation/cli-linux-arm64-musl": "0.15.0",
49
+ "@studio-foundation/cli-linux-x64": "0.15.0",
50
+ "@studio-foundation/cli-linux-x64-musl": "0.15.0",
51
+ "@studio-foundation/cli-win-x64": "0.15.0"
52
52
  },
53
53
  "scripts": {
54
54
  "prebuild": "node ../scripts/gen-bundled-assets.mjs",
@@ -1,14 +0,0 @@
1
- import type { IntegrationPluginDef } from '@studio-foundation/contracts';
2
- export declare function getIntegrationsDir(studioDir: string): string;
3
- export declare function getIntegrationStatus(plugin: IntegrationPluginDef, config: Record<string, unknown>): 'configured' | 'not-configured';
4
- export declare function installIntegration(source: string, integrationsDir: string): Promise<string>;
5
- export declare function removeIntegration(name: string, integrationsDir: string): Promise<void>;
6
- export interface IntegrationTestResult {
7
- success: boolean;
8
- statusCode?: number;
9
- body?: string;
10
- error?: string;
11
- }
12
- export declare function runIntegrationTest(plugin: IntegrationPluginDef, config: Record<string, unknown>, fetcher?: typeof fetch): Promise<IntegrationTestResult>;
13
- export declare function integrationsCommand(action: string, _args: string[], _options: Record<string, string | boolean | undefined>): Promise<void>;
14
- //# sourceMappingURL=integrations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../src/commands/integrations.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,YAAY,GAAG,gBAAgB,CAIjC;AAiCD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BjG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5F;AAiBD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAwChC;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACrD,OAAO,CAAC,IAAI,CAAC,CA4Jf"}
@@ -1,274 +0,0 @@
1
- import { readFile, writeFile, mkdir, access, unlink } from 'node:fs/promises';
2
- import { resolve, join, dirname } from 'node:path';
3
- import chalk from 'chalk';
4
- import ora from 'ora';
5
- import * as yaml from 'js-yaml';
6
- import { loadProjectIntegrations } from '@studio-foundation/runner';
7
- import { loadConfig, resolveEnvVars } from '../config.js';
8
- import { setConfigValue } from './config.js';
9
- import { installPackage } from './registry/install.js';
10
- export function getIntegrationsDir(studioDir) {
11
- return resolve(studioDir, 'integrations');
12
- }
13
- export function getIntegrationStatus(plugin, config) {
14
- const required = plugin.config?.required ?? [];
15
- const allSet = required.every(key => key in config && config[key] !== '');
16
- return allSet ? 'configured' : 'not-configured';
17
- }
18
- async function loadRawIntegrationsConfig(studioDir) {
19
- const configFile = join(studioDir, 'config.yaml');
20
- try {
21
- const raw = await readFile(configFile, 'utf-8');
22
- const parsed = yaml.load(resolveEnvVars(raw));
23
- return (parsed?.['integrations'] ?? {});
24
- }
25
- catch {
26
- return {};
27
- }
28
- }
29
- /** The plugin's optional settings that carry a value, for the list view. */
30
- function formatExtras(plugin, config) {
31
- const optional = plugin.config?.optional ?? {};
32
- return Object.keys(optional)
33
- .map(key => [key, config[key] ?? optional[key]])
34
- .filter(([, value]) => value !== '' && value !== undefined && value !== null)
35
- .map(([key, value]) => `${key}: ${String(value)}`)
36
- .join(', ');
37
- }
38
- async function resolveStudioDir() {
39
- const config = await loadConfig();
40
- const studioDir = config.resolvedStudioDir;
41
- if (!studioDir) {
42
- console.error("Error: No .studio/ directory found. Run 'studio init' first.");
43
- process.exit(1);
44
- }
45
- return studioDir;
46
- }
47
- export async function installIntegration(source, integrationsDir) {
48
- // Integrations are ordinary marketplace plugins; only a local file is installed
49
- // by hand, and then it is the caller's own YAML.
50
- if (!source.includes('/') && !source.endsWith('.yaml')) {
51
- await installPackage(source, { studioDir: dirname(integrationsDir) });
52
- return source;
53
- }
54
- await mkdir(integrationsDir, { recursive: true });
55
- let content;
56
- try {
57
- content = await readFile(source, 'utf-8');
58
- }
59
- catch {
60
- throw new Error(`File not found: ${source}`);
61
- }
62
- const name = yaml.load(content).name;
63
- const destPath = join(integrationsDir, `${name}.integration.yaml`);
64
- const alreadyExists = await access(destPath).then(() => true).catch(() => false);
65
- if (alreadyExists) {
66
- throw new Error(`'${name}' already installed. Run: studio integrations remove ${name}`);
67
- }
68
- await writeFile(destPath, content, 'utf-8');
69
- return name;
70
- }
71
- export async function removeIntegration(name, integrationsDir) {
72
- const filePath = join(integrationsDir, `${name}.integration.yaml`);
73
- try {
74
- await unlink(filePath);
75
- }
76
- catch {
77
- throw new Error(`Integration '${name}' not found`);
78
- }
79
- }
80
- async function loadRawFullConfig(configFile) {
81
- try {
82
- const raw = await readFile(configFile, 'utf-8');
83
- const parsed = yaml.load(resolveEnvVars(raw));
84
- return (parsed && typeof parsed === 'object' ? parsed : {});
85
- }
86
- catch {
87
- return {};
88
- }
89
- }
90
- async function saveIntegrationConfig(configFile, config) {
91
- await mkdir(dirname(configFile), { recursive: true });
92
- await writeFile(configFile, yaml.dump(config), 'utf-8');
93
- }
94
- export async function runIntegrationTest(plugin, config, fetcher = fetch) {
95
- const testDef = plugin.test;
96
- if (!testDef) {
97
- throw new Error(`Integration '${plugin.name}' has no test: configuration`);
98
- }
99
- const resolveVar = (str) => str.replace(/\$\{([^}]+)\}/g, (_, key) => String(config[key.trim()] ?? ''));
100
- const headers = {
101
- 'Content-Type': 'application/json',
102
- };
103
- if (testDef.auth) {
104
- const resolvedAuth = resolveVar(testDef.auth);
105
- const colonIdx = resolvedAuth.indexOf(':');
106
- if (colonIdx !== -1) {
107
- const scheme = resolvedAuth.slice(0, colonIdx);
108
- const token = resolvedAuth.slice(colonIdx + 1);
109
- headers['Authorization'] = `${scheme.charAt(0).toUpperCase()}${scheme.slice(1)} ${token}`;
110
- }
111
- }
112
- try {
113
- const response = await fetcher(testDef.endpoint, {
114
- method: testDef.method ?? 'GET',
115
- headers,
116
- ...(testDef.body ? { body: testDef.body } : {}),
117
- });
118
- const body = await response.text().catch(() => '');
119
- const expectedStatus = testDef.expect?.status ?? 200;
120
- if (response.status !== expectedStatus) {
121
- return { success: false, statusCode: response.status, body };
122
- }
123
- return { success: true, statusCode: response.status, body };
124
- }
125
- catch (err) {
126
- return { success: false, error: err instanceof Error ? err.message : String(err) };
127
- }
128
- }
129
- export async function integrationsCommand(action, _args, _options) {
130
- try {
131
- switch (action) {
132
- case 'install': {
133
- const source = _args[0];
134
- if (!source) {
135
- console.error('Usage: studio integrations install <source>');
136
- console.error(' <source> can be @studio/integration-<name> or a local file path');
137
- process.exit(1);
138
- }
139
- const studioDir = await resolveStudioDir();
140
- const intDir = getIntegrationsDir(studioDir);
141
- const spinner = ora(`Installing ${source}...`).start();
142
- try {
143
- const name = await installIntegration(source, intDir);
144
- spinner.succeed(chalk.green(`✓ Integration '${name}' installed`));
145
- console.log(`\n Configure with: ${chalk.cyan(`studio integrations set ${name}.<key> <value>`)}`);
146
- console.log(` Test with: ${chalk.cyan(`studio integrations test ${name}`)}\n`);
147
- }
148
- catch (err) {
149
- spinner.fail(err instanceof Error ? err.message : String(err));
150
- process.exit(1);
151
- }
152
- break;
153
- }
154
- case 'list': {
155
- const studioDir = await resolveStudioDir();
156
- const intDir = getIntegrationsDir(studioDir);
157
- const plugins = await loadProjectIntegrations(intDir);
158
- if (plugins.length === 0) {
159
- console.log(chalk.yellow('\nNo integrations installed.'));
160
- console.log(` Run: ${chalk.cyan('studio integrations install @studio/integration-<name>')}\n`);
161
- break;
162
- }
163
- const config = await loadRawIntegrationsConfig(studioDir);
164
- console.log('');
165
- for (const plugin of plugins) {
166
- const pluginConfig = (config[plugin.name] ?? {});
167
- const status = getIntegrationStatus(plugin, pluginConfig);
168
- const dot = status === 'configured' ? chalk.green('●') : chalk.gray('○');
169
- const statusLabel = status === 'configured'
170
- ? chalk.green('configured')
171
- : chalk.gray('not configured');
172
- const extras = formatExtras(plugin, pluginConfig);
173
- const version = `v${plugin.version}`;
174
- console.log(`${plugin.name.padEnd(12)} ${dot} ${statusLabel.padEnd(20)} ${extras.padEnd(20)} ${chalk.gray(version)}`);
175
- }
176
- console.log('');
177
- break;
178
- }
179
- case 'remove': {
180
- const name = _args[0];
181
- if (!name) {
182
- console.error('Usage: studio integrations remove <name>');
183
- process.exit(1);
184
- }
185
- const studioDir = await resolveStudioDir();
186
- await removeIntegration(name, getIntegrationsDir(studioDir));
187
- console.log(chalk.green(`✓ Integration '${name}' removed`));
188
- break;
189
- }
190
- case 'test': {
191
- const name = _args[0];
192
- if (!name) {
193
- console.error('Usage: studio integrations test <name>');
194
- process.exit(1);
195
- }
196
- const studioDir = await resolveStudioDir();
197
- const intDir = getIntegrationsDir(studioDir);
198
- const plugins = await loadProjectIntegrations(intDir);
199
- const plugin = plugins.find(p => p.name === name);
200
- if (!plugin) {
201
- console.error(`Error: '${name}' not installed. Run: studio integrations install @studio/integration-${name}`);
202
- process.exit(1);
203
- }
204
- if (!plugin.test) {
205
- console.error(`Error: Integration '${name}' has no test: configuration in its .integration.yaml`);
206
- process.exit(1);
207
- }
208
- const intConfig = await loadRawIntegrationsConfig(studioDir);
209
- const pluginConfig = intConfig[name] ?? {};
210
- const required = plugin.config?.required ?? [];
211
- const missing = required.filter(key => !pluginConfig[key] && !process.env[key]);
212
- if (missing.length > 0) {
213
- for (const key of missing) {
214
- console.error(`Error: ${key} not set. Run: studio integrations set ${name}.${key} <value>`);
215
- }
216
- process.exit(1);
217
- }
218
- const spinner = ora(`Testing ${name} connection...`).start();
219
- const result = await runIntegrationTest(plugin, pluginConfig);
220
- if (result.success) {
221
- spinner.succeed(chalk.green(`✓ ${name} connected`));
222
- }
223
- else {
224
- const detail = result.error ?? `HTTP ${result.statusCode}`;
225
- spinner.fail(chalk.red(`✗ ${name} error — ${detail}`));
226
- process.exit(1);
227
- }
228
- break;
229
- }
230
- case 'set': {
231
- const dotPath = _args[0];
232
- const value = _args[1];
233
- if (!dotPath || value === undefined) {
234
- console.error('Usage: studio integrations set <name>.<key> <value>');
235
- process.exit(1);
236
- }
237
- const dotIndex = dotPath.indexOf('.');
238
- if (dotIndex === -1) {
239
- console.error('Error: path must be <integration-name>.<key> (e.g. linear.autoTrigger)');
240
- process.exit(1);
241
- }
242
- const integrationName = dotPath.slice(0, dotIndex);
243
- const key = dotPath.slice(dotIndex + 1);
244
- const studioDir = await resolveStudioDir();
245
- const intDir = getIntegrationsDir(studioDir);
246
- const pluginPath = join(intDir, `${integrationName}.integration.yaml`);
247
- const isInstalled = await access(pluginPath).then(() => true).catch(() => false);
248
- if (!isInstalled) {
249
- console.error(`Error: Integration '${integrationName}' not installed. ` +
250
- `Run: studio integrations install @studio/integration-${integrationName}`);
251
- process.exit(1);
252
- }
253
- const configFile = join(studioDir, 'config.yaml');
254
- const rawConfig = await loadRawFullConfig(configFile);
255
- setConfigValue(rawConfig, `integrations.${integrationName}.${key}`, value);
256
- await saveIntegrationConfig(configFile, rawConfig);
257
- console.log(chalk.green(`✓ Set integrations.${integrationName}.${key} = ${value}`));
258
- break;
259
- }
260
- default:
261
- console.error(`Unknown integrations action: ${action}. Available: install, list, remove, test, set`);
262
- process.exit(1);
263
- }
264
- }
265
- catch (error) {
266
- if (error instanceof Error && error.name === 'ExitPromptError') {
267
- console.log('\nAborted.');
268
- process.exit(0);
269
- }
270
- console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
271
- process.exit(1);
272
- }
273
- }
274
- //# sourceMappingURL=integrations.js.map