@studio-foundation/cli 0.3.0-beta.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/ARCHITECTURE.md +40 -0
- package/LICENSE +663 -0
- package/README.md +165 -0
- package/dist/commands/api.d.ts +16 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +118 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/config.d.ts +32 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +390 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +93 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +728 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +2 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +22 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/integrations.d.ts +14 -0
- package/dist/commands/integrations.d.ts.map +1 -0
- package/dist/commands/integrations.js +282 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +161 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +7 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +98 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/ollama.d.ts +6 -0
- package/dist/commands/ollama.d.ts.map +1 -0
- package/dist/commands/ollama.js +161 -0
- package/dist/commands/ollama.js.map +1 -0
- package/dist/commands/project.d.ts +38 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +137 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/registry/audit.d.ts +13 -0
- package/dist/commands/registry/audit.d.ts.map +1 -0
- package/dist/commands/registry/audit.js +65 -0
- package/dist/commands/registry/audit.js.map +1 -0
- package/dist/commands/registry/index.d.ts +3 -0
- package/dist/commands/registry/index.d.ts.map +1 -0
- package/dist/commands/registry/index.js +53 -0
- package/dist/commands/registry/index.js.map +1 -0
- package/dist/commands/registry/install.d.ts +17 -0
- package/dist/commands/registry/install.d.ts.map +1 -0
- package/dist/commands/registry/install.js +153 -0
- package/dist/commands/registry/install.js.map +1 -0
- package/dist/commands/registry/publish.d.ts +8 -0
- package/dist/commands/registry/publish.d.ts.map +1 -0
- package/dist/commands/registry/publish.js +94 -0
- package/dist/commands/registry/publish.js.map +1 -0
- package/dist/commands/registry/remove.d.ts +8 -0
- package/dist/commands/registry/remove.d.ts.map +1 -0
- package/dist/commands/registry/remove.js +82 -0
- package/dist/commands/registry/remove.js.map +1 -0
- package/dist/commands/registry/search.d.ts +9 -0
- package/dist/commands/registry/search.d.ts.map +1 -0
- package/dist/commands/registry/search.js +68 -0
- package/dist/commands/registry/search.js.map +1 -0
- package/dist/commands/registry/sync.d.ts +8 -0
- package/dist/commands/registry/sync.d.ts.map +1 -0
- package/dist/commands/registry/sync.js +19 -0
- package/dist/commands/registry/sync.js.map +1 -0
- package/dist/commands/registry/update.d.ts +15 -0
- package/dist/commands/registry/update.d.ts.map +1 -0
- package/dist/commands/registry/update.js +48 -0
- package/dist/commands/registry/update.js.map +1 -0
- package/dist/commands/replay.d.ts +36 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +453 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/run.d.ts +18 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +406 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +144 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/template/index.d.ts +2 -0
- package/dist/commands/template/index.d.ts.map +1 -0
- package/dist/commands/template/index.js +57 -0
- package/dist/commands/template/index.js.map +1 -0
- package/dist/commands/template/validate.d.ts +8 -0
- package/dist/commands/template/validate.d.ts.map +1 -0
- package/dist/commands/template/validate.js +135 -0
- package/dist/commands/template/validate.js.map +1 -0
- package/dist/commands/templates.d.ts +14 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +86 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/tools.d.ts +12 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +200 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/users.d.ts +4 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +123 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +39 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +178 -0
- package/dist/index.js.map +1 -0
- package/dist/models-cache.d.ts +13 -0
- package/dist/models-cache.d.ts.map +1 -0
- package/dist/models-cache.js +106 -0
- package/dist/models-cache.js.map +1 -0
- package/dist/output/file-changes.d.ts +15 -0
- package/dist/output/file-changes.d.ts.map +1 -0
- package/dist/output/file-changes.js +77 -0
- package/dist/output/file-changes.js.map +1 -0
- package/dist/output/formatter.d.ts +6 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +70 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/formatters.d.ts +42 -0
- package/dist/output/formatters.d.ts.map +1 -0
- package/dist/output/formatters.js +280 -0
- package/dist/output/formatters.js.map +1 -0
- package/dist/output/logger.d.ts +3 -0
- package/dist/output/logger.d.ts.map +1 -0
- package/dist/output/logger.js +15 -0
- package/dist/output/logger.js.map +1 -0
- package/dist/output/parallel-progress.d.ts +33 -0
- package/dist/output/parallel-progress.d.ts.map +1 -0
- package/dist/output/parallel-progress.js +85 -0
- package/dist/output/parallel-progress.js.map +1 -0
- package/dist/output/progress.d.ts +32 -0
- package/dist/output/progress.d.ts.map +1 -0
- package/dist/output/progress.js +393 -0
- package/dist/output/progress.js.map +1 -0
- package/dist/provider-validator.d.ts +15 -0
- package/dist/provider-validator.d.ts.map +1 -0
- package/dist/provider-validator.js +85 -0
- package/dist/provider-validator.js.map +1 -0
- package/dist/registry/cache.d.ts +10 -0
- package/dist/registry/cache.d.ts.map +1 -0
- package/dist/registry/cache.js +36 -0
- package/dist/registry/cache.js.map +1 -0
- package/dist/registry/client.d.ts +19 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +63 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/lockfile.d.ts +17 -0
- package/dist/registry/lockfile.d.ts.map +1 -0
- package/dist/registry/lockfile.js +61 -0
- package/dist/registry/lockfile.js.map +1 -0
- package/dist/registry/resolver.d.ts +13 -0
- package/dist/registry/resolver.d.ts.map +1 -0
- package/dist/registry/resolver.js +79 -0
- package/dist/registry/resolver.js.map +1 -0
- package/dist/registry/types.d.ts +59 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +14 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/run-logger.d.ts +8 -0
- package/dist/run-logger.d.ts.map +1 -0
- package/dist/run-logger.js +53 -0
- package/dist/run-logger.js.map +1 -0
- package/dist/run-store-factory.d.ts +9 -0
- package/dist/run-store-factory.d.ts.map +1 -0
- package/dist/run-store-factory.js +26 -0
- package/dist/run-store-factory.js.map +1 -0
- package/dist/studio-dir.d.ts +7 -0
- package/dist/studio-dir.d.ts.map +1 -0
- package/dist/studio-dir.js +27 -0
- package/dist/studio-dir.js.map +1 -0
- package/dist/utils/input-wizard.d.ts +4 -0
- package/dist/utils/input-wizard.d.ts.map +1 -0
- package/dist/utils/input-wizard.js +56 -0
- package/dist/utils/input-wizard.js.map +1 -0
- package/dist/utils/placeholders.d.ts +6 -0
- package/dist/utils/placeholders.d.ts.map +1 -0
- package/dist/utils/placeholders.js +12 -0
- package/dist/utils/placeholders.js.map +1 -0
- package/package.json +43 -0
- package/src/commands/api.ts +126 -0
- package/src/commands/config.ts +433 -0
- package/src/commands/init.ts +879 -0
- package/src/commands/install.ts +23 -0
- package/src/commands/integrations.ts +332 -0
- package/src/commands/list.ts +197 -0
- package/src/commands/logs.ts +119 -0
- package/src/commands/ollama.ts +168 -0
- package/src/commands/project.ts +167 -0
- package/src/commands/registry/audit.ts +87 -0
- package/src/commands/registry/index.ts +63 -0
- package/src/commands/registry/install.ts +222 -0
- package/src/commands/registry/publish.ts +112 -0
- package/src/commands/registry/remove.ts +89 -0
- package/src/commands/registry/search.ts +93 -0
- package/src/commands/registry/sync.ts +24 -0
- package/src/commands/registry/update.ts +63 -0
- package/src/commands/replay.ts +559 -0
- package/src/commands/run.ts +454 -0
- package/src/commands/status.ts +163 -0
- package/src/commands/template/index.ts +59 -0
- package/src/commands/template/validate.ts +175 -0
- package/src/commands/templates.ts +99 -0
- package/src/commands/tools.ts +227 -0
- package/src/commands/users.ts +127 -0
- package/src/commands/validate.ts +46 -0
- package/src/config.ts +101 -0
- package/src/index.ts +201 -0
- package/src/models-cache.ts +127 -0
- package/src/output/file-changes.ts +97 -0
- package/src/output/formatter.ts +85 -0
- package/src/output/formatters.ts +303 -0
- package/src/output/logger.ts +18 -0
- package/src/output/parallel-progress.ts +103 -0
- package/src/output/progress.ts +414 -0
- package/src/provider-validator.ts +109 -0
- package/src/registry/cache.ts +46 -0
- package/src/registry/client.ts +84 -0
- package/src/registry/lockfile.ts +68 -0
- package/src/registry/resolver.ts +113 -0
- package/src/registry/types.ts +66 -0
- package/src/run-logger.ts +66 -0
- package/src/run-store-factory.ts +30 -0
- package/src/studio-dir.ts +28 -0
- package/src/utils/input-wizard.ts +73 -0
- package/src/utils/placeholders.ts +10 -0
- package/templates/.studiorc.yaml +16 -0
- package/templates/projects/blank/metadata.json +7 -0
- package/templates/studio-config.yaml +14 -0
- package/tests/__stubs__/studio-runner.ts +104 -0
- package/tests/commands/api.test.ts +110 -0
- package/tests/commands/config.test.ts +221 -0
- package/tests/commands/init.test.ts +919 -0
- package/tests/commands/install.test.ts +52 -0
- package/tests/commands/integrations.test.ts +158 -0
- package/tests/commands/ollama.test.ts +139 -0
- package/tests/commands/project.test.ts +179 -0
- package/tests/commands/registry/audit.test.ts +56 -0
- package/tests/commands/registry/install.test.ts +200 -0
- package/tests/commands/registry/publish.test.ts +56 -0
- package/tests/commands/registry/remove.test.ts +103 -0
- package/tests/commands/registry/search.test.ts +44 -0
- package/tests/commands/registry/sync.test.ts +37 -0
- package/tests/commands/registry/update.test.ts +62 -0
- package/tests/commands/replay.test.ts +283 -0
- package/tests/commands/template/validate.test.ts +150 -0
- package/tests/commands/templates.test.ts +42 -0
- package/tests/commands/tools.test.ts +106 -0
- package/tests/config.test.ts +142 -0
- package/tests/formatter.test.ts +158 -0
- package/tests/integration/sigint.test.ts +188 -0
- package/tests/models-cache.test.ts +250 -0
- package/tests/output/file-changes.test.ts +178 -0
- package/tests/output/formatters.test.ts +448 -0
- package/tests/output/progress-spinner.test.ts +232 -0
- package/tests/output/progress-timer.test.ts +230 -0
- package/tests/provider-validator.test.ts +182 -0
- package/tests/registry/cache.test.ts +66 -0
- package/tests/registry/client.test.ts +70 -0
- package/tests/registry/lockfile.test.ts +87 -0
- package/tests/registry/resolver.test.ts +122 -0
- package/tests/run-logger-events.test.ts +326 -0
- package/tests/run-logger.test.ts +64 -0
- package/tests/run-store-factory.test.ts +51 -0
- package/tests/studio-dir.test.ts +31 -0
- package/tests/utils/input-wizard.test.ts +153 -0
- package/tests/utils/placeholders.test.ts +36 -0
- package/tsconfig.json +24 -0
- package/vitest.config.ts +20 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
const RUNS_DIR = '.studio/runs';
|
|
5
|
+
function runIdShort(runId) {
|
|
6
|
+
return runId.replace(/-/g, '').slice(0, 8);
|
|
7
|
+
}
|
|
8
|
+
function formatEventLine(record) {
|
|
9
|
+
const event = record.event;
|
|
10
|
+
const ts = record.ts;
|
|
11
|
+
const time = ts ? new Date(ts).toISOString().slice(11, 19) : '';
|
|
12
|
+
switch (event) {
|
|
13
|
+
case 'pipeline_start':
|
|
14
|
+
return chalk.blue(`${time} Pipeline started: ${record.project}/${record.pipeline} (run ${record.run_id})`);
|
|
15
|
+
case 'pipeline_complete':
|
|
16
|
+
return chalk.blue(`${time} Pipeline complete: ${record.status} (${record.duration_ms}ms, ${record.total_tokens ?? 0} tokens)`);
|
|
17
|
+
case 'stage_start':
|
|
18
|
+
return chalk.gray(` ${time} [${record.stage_index + 1}/${record.total_stages}] ${record.stage} ...`);
|
|
19
|
+
case 'stage_complete': {
|
|
20
|
+
const status = record.status;
|
|
21
|
+
const icon = status === 'success' ? chalk.green('✓') : chalk.red('✗');
|
|
22
|
+
const attempts = record.attempts !== undefined ? ` (${record.attempts} attempt(s))` : '';
|
|
23
|
+
const duration = record.duration_ms !== undefined ? ` ${record.duration_ms}ms` : '';
|
|
24
|
+
return chalk.gray(` ${time} ${icon} ${record.stage} ${status}${attempts}${duration}`);
|
|
25
|
+
}
|
|
26
|
+
case 'stage_retry':
|
|
27
|
+
return chalk.yellow(` ${time} ↻ Retry #${record.attempt}: ${record.failure_reason ?? 'unknown'}`);
|
|
28
|
+
case 'group_start':
|
|
29
|
+
return chalk.gray(` ${time} Group ${record.group} (max ${record.max_iterations} iterations)`);
|
|
30
|
+
case 'group_iteration':
|
|
31
|
+
return chalk.yellow(` ${time} ↻ Iteration ${record.iteration}/${record.max_iterations}`);
|
|
32
|
+
case 'group_feedback':
|
|
33
|
+
return chalk.yellow(` ${time} Rejected: ${record.rejection_reason}`);
|
|
34
|
+
case 'group_complete':
|
|
35
|
+
return chalk.gray(` ${time} Group complete: ${record.status} (${record.iterations} iterations)`);
|
|
36
|
+
default:
|
|
37
|
+
return chalk.gray(`${time} ${event} ${JSON.stringify(record)}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function logsCommand(runId, options) {
|
|
41
|
+
try {
|
|
42
|
+
const runsPath = resolve(process.cwd(), RUNS_DIR);
|
|
43
|
+
let entries;
|
|
44
|
+
try {
|
|
45
|
+
entries = await readdir(runsPath, { withFileTypes: true });
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
console.error(chalk.yellow(`No runs directory found at ${runsPath}`));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const shortId = runIdShort(runId);
|
|
52
|
+
const jsonlFiles = entries
|
|
53
|
+
.filter((e) => e.isFile() && e.name.endsWith('.jsonl'))
|
|
54
|
+
.map((e) => e.name);
|
|
55
|
+
const matching = jsonlFiles.filter((name) => name.endsWith(`-${shortId}.jsonl`));
|
|
56
|
+
if (matching.length === 0) {
|
|
57
|
+
console.error(chalk.yellow(`No run log found for run id: ${runId}`));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
const mostRecent = matching.sort().reverse()[0];
|
|
61
|
+
const filePath = resolve(runsPath, mostRecent);
|
|
62
|
+
const content = await readFile(filePath, 'utf-8');
|
|
63
|
+
const lines = content
|
|
64
|
+
.split('\n')
|
|
65
|
+
.filter((line) => line.trim().length > 0)
|
|
66
|
+
.map((line) => {
|
|
67
|
+
try {
|
|
68
|
+
return JSON.parse(line);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.filter((r) => r !== null);
|
|
75
|
+
const forRun = lines.filter((r) => r.run_id === shortId || r.run_id?.startsWith(shortId));
|
|
76
|
+
const records = forRun.length > 0 ? forRun : lines;
|
|
77
|
+
if (options.raw) {
|
|
78
|
+
for (const r of records) {
|
|
79
|
+
console.log(JSON.stringify(r));
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (options.json) {
|
|
84
|
+
console.log(JSON.stringify(records, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log(chalk.bold(`\nRun ${shortId} — ${mostRecent}\n`));
|
|
88
|
+
for (const record of records) {
|
|
89
|
+
console.log(formatEventLine(record));
|
|
90
|
+
}
|
|
91
|
+
console.log('');
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function ollamaStatusCommand(baseUrl: string): Promise<void>;
|
|
2
|
+
export declare function ollamaStartCommand(baseUrl: string): Promise<void>;
|
|
3
|
+
export declare function ollamaStopCommand(): Promise<void>;
|
|
4
|
+
export declare function ollamaPullCommand(model: string, baseUrl: string): Promise<void>;
|
|
5
|
+
export declare function ollamaCommand(action: string, modelArg: string | undefined, baseUrl: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/commands/ollama.ts"],"names":[],"mappings":"AAqBA,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBxE;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BvE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKvD;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgErF;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhH"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
const OLLAMA_DOCKER_IMAGE = 'ollama/ollama';
|
|
4
|
+
function formatBytes(bytes) {
|
|
5
|
+
const gb = bytes / (1024 ** 3);
|
|
6
|
+
return gb >= 1 ? `${gb.toFixed(1)} GB` : `${(bytes / (1024 ** 2)).toFixed(0)} MB`;
|
|
7
|
+
}
|
|
8
|
+
async function isOllamaRunning(baseUrl) {
|
|
9
|
+
try {
|
|
10
|
+
const res = await fetch(`${baseUrl}/api/tags`);
|
|
11
|
+
if (!res.ok)
|
|
12
|
+
return false;
|
|
13
|
+
const data = await res.json();
|
|
14
|
+
return { models: data.models ?? [] };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function ollamaStatusCommand(baseUrl) {
|
|
21
|
+
const result = await isOllamaRunning(baseUrl);
|
|
22
|
+
if (!result) {
|
|
23
|
+
console.log(chalk.red(' ✗ Ollama not running'));
|
|
24
|
+
console.log('');
|
|
25
|
+
console.log('To start Ollama:');
|
|
26
|
+
console.log(` ${chalk.cyan('ollama serve')} # native`);
|
|
27
|
+
console.log(` ${chalk.cyan(`docker run -d -p 11434:11434 ${OLLAMA_DOCKER_IMAGE}`)} # Docker`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk.green(` ✓ Ollama running at ${baseUrl}`));
|
|
31
|
+
if (result.models.length === 0) {
|
|
32
|
+
console.log(' No models pulled yet. Run: studio ollama pull llama3.3');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(' Pulled models:');
|
|
37
|
+
for (const model of result.models) {
|
|
38
|
+
console.log(` ${chalk.bold(model.name.padEnd(30))} ${formatBytes(model.size)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function ollamaStartCommand(baseUrl) {
|
|
43
|
+
const running = await isOllamaRunning(baseUrl);
|
|
44
|
+
if (running) {
|
|
45
|
+
console.log(chalk.green(` ✓ Ollama already running at ${baseUrl}`));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const hasNative = spawnSync('ollama', ['--version'], { stdio: 'ignore' }).status === 0;
|
|
49
|
+
if (hasNative) {
|
|
50
|
+
console.log('Ollama is installed but not running. Start it with:');
|
|
51
|
+
console.log('');
|
|
52
|
+
console.log(` ${chalk.cyan('ollama serve')}`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const hasDocker = spawnSync('docker', ['--version'], { stdio: 'ignore' }).status === 0;
|
|
56
|
+
if (hasDocker) {
|
|
57
|
+
console.log('Docker is available. Start Ollama with:');
|
|
58
|
+
console.log('');
|
|
59
|
+
console.log(` ${chalk.cyan(`docker run -d -p 11434:11434 --name ollama ${OLLAMA_DOCKER_IMAGE}`)}`);
|
|
60
|
+
console.log('');
|
|
61
|
+
console.log('Then pull a model:');
|
|
62
|
+
console.log(` ${chalk.cyan('studio ollama pull llama3.3')}`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
console.log(chalk.yellow(' Neither Ollama nor Docker found.'));
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log('Options:');
|
|
68
|
+
console.log(` Install Ollama natively: ${chalk.cyan('https://ollama.com')}`);
|
|
69
|
+
console.log(` Install Docker: ${chalk.cyan('https://docker.com')}`);
|
|
70
|
+
}
|
|
71
|
+
export async function ollamaStopCommand() {
|
|
72
|
+
console.log('To stop Ollama:');
|
|
73
|
+
console.log('');
|
|
74
|
+
console.log(` Native: ${chalk.cyan('Ctrl+C')} in the terminal running ${chalk.cyan('ollama serve')}`);
|
|
75
|
+
console.log(` Docker: ${chalk.cyan('docker stop ollama')}`);
|
|
76
|
+
}
|
|
77
|
+
export async function ollamaPullCommand(model, baseUrl) {
|
|
78
|
+
const running = await isOllamaRunning(baseUrl);
|
|
79
|
+
if (!running) {
|
|
80
|
+
console.error(chalk.red(` ✗ Ollama not running at ${baseUrl}`));
|
|
81
|
+
console.error(` Run: ${chalk.cyan('studio ollama start')}`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
process.stdout.write(`Pulling ${chalk.bold(model)}...`);
|
|
85
|
+
try {
|
|
86
|
+
const res = await fetch(`${baseUrl}/api/pull`, {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
headers: { 'Content-Type': 'application/json' },
|
|
89
|
+
body: JSON.stringify({ model, stream: true }),
|
|
90
|
+
});
|
|
91
|
+
if (!res.ok || !res.body) {
|
|
92
|
+
process.stdout.write('\n');
|
|
93
|
+
console.error(`Pull failed: HTTP ${res.status}`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
const reader = res.body.getReader();
|
|
97
|
+
const decoder = new TextDecoder();
|
|
98
|
+
let lastStatus = '';
|
|
99
|
+
let buffer = '';
|
|
100
|
+
while (true) {
|
|
101
|
+
const { done, value } = await reader.read();
|
|
102
|
+
if (done)
|
|
103
|
+
break;
|
|
104
|
+
buffer += decoder.decode(value, { stream: true });
|
|
105
|
+
const lines = buffer.split('\n');
|
|
106
|
+
buffer = lines.pop() ?? '';
|
|
107
|
+
for (const line of lines) {
|
|
108
|
+
const trimmed = line.trim();
|
|
109
|
+
if (!trimmed)
|
|
110
|
+
continue;
|
|
111
|
+
try {
|
|
112
|
+
const event = JSON.parse(trimmed);
|
|
113
|
+
if (event.error) {
|
|
114
|
+
process.stdout.write('\n');
|
|
115
|
+
console.error(chalk.red(` ✗ ${event.error}`));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
if (event.status && event.status !== lastStatus) {
|
|
119
|
+
process.stdout.write(`\r${event.status.padEnd(60)}`);
|
|
120
|
+
lastStatus = event.status;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// ignore non-JSON lines
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
process.stdout.write('\n');
|
|
129
|
+
console.log(chalk.green(` ✓ Pulled ${model}`));
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
process.stdout.write('\n');
|
|
133
|
+
console.error(chalk.red(` ✗ Pull failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
134
|
+
console.error(` You can retry with: ${chalk.cyan(`studio ollama pull ${model}`)}`);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function ollamaCommand(action, modelArg, baseUrl) {
|
|
139
|
+
if (action === 'status') {
|
|
140
|
+
await ollamaStatusCommand(baseUrl);
|
|
141
|
+
}
|
|
142
|
+
else if (action === 'start') {
|
|
143
|
+
await ollamaStartCommand(baseUrl);
|
|
144
|
+
}
|
|
145
|
+
else if (action === 'stop') {
|
|
146
|
+
await ollamaStopCommand();
|
|
147
|
+
}
|
|
148
|
+
else if (action === 'pull') {
|
|
149
|
+
if (!modelArg) {
|
|
150
|
+
console.error('Usage: studio ollama pull <model>');
|
|
151
|
+
console.error('Example: studio ollama pull llama3.3');
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
await ollamaPullCommand(modelArg, baseUrl);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.error(`Unknown ollama action: ${action}. Use: studio ollama start|stop|status|pull <model>`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/commands/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const PROJECT_SUBDIRS: string[];
|
|
2
|
+
/**
|
|
3
|
+
* Create a project directory under .studio/projects/.
|
|
4
|
+
* Throws if the project already exists or the template is not found.
|
|
5
|
+
*
|
|
6
|
+
* @deprecated The flat .studio/ structure no longer uses projects/ subdirs.
|
|
7
|
+
* This function is kept for backward compatibility but will be removed.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createProjectDir(projectsDir: string, projectName: string, templateName?: string, options?: {
|
|
10
|
+
withTools?: boolean;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Validate a project name: lowercase alphanumeric + hyphens, no leading/trailing hyphens.
|
|
14
|
+
* Returns true if valid, or an error string if not.
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateProjectName(name: string): true | string;
|
|
17
|
+
/**
|
|
18
|
+
* Non-interactive project creation.
|
|
19
|
+
* Validates name, then delegates to createProjectDir.
|
|
20
|
+
*
|
|
21
|
+
* @deprecated Use studio init in a new directory instead.
|
|
22
|
+
*/
|
|
23
|
+
export declare function projectAddDirect(studioDir: string, projectName: string, templateName?: string, _description?: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Interactive wizard for adding a project to an existing workspace.
|
|
26
|
+
*
|
|
27
|
+
* @deprecated Use studio init in a new directory instead.
|
|
28
|
+
*/
|
|
29
|
+
export declare function projectAddWizard(studioDir: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* CLI dispatcher for `studio project <action> [args...]`.
|
|
32
|
+
* This command is deprecated — the flat .studio/ structure no longer uses projects/ subdirs.
|
|
33
|
+
*/
|
|
34
|
+
export declare function projectCommand(_action: string, _args: string[], _options: {
|
|
35
|
+
template?: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,eAAe,UAA0D,CAAC;AAEvF;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAK/D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CvE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { mkdir, access, cp } from 'node:fs/promises';
|
|
2
|
+
import { resolve, join, relative, sep } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { input, select } from '@inquirer/prompts';
|
|
5
|
+
import { listTemplates } from './templates.js';
|
|
6
|
+
const TEMPLATES_DIR = resolve(import.meta.dirname, '../../templates');
|
|
7
|
+
export const PROJECT_SUBDIRS = ['pipelines', 'agents', 'contracts', 'tools', 'inputs'];
|
|
8
|
+
/**
|
|
9
|
+
* Create a project directory under .studio/projects/.
|
|
10
|
+
* Throws if the project already exists or the template is not found.
|
|
11
|
+
*
|
|
12
|
+
* @deprecated The flat .studio/ structure no longer uses projects/ subdirs.
|
|
13
|
+
* This function is kept for backward compatibility but will be removed.
|
|
14
|
+
*/
|
|
15
|
+
export async function createProjectDir(projectsDir, projectName, templateName, options) {
|
|
16
|
+
const withTools = options?.withTools ?? true;
|
|
17
|
+
const projectDir = join(projectsDir, projectName);
|
|
18
|
+
// Check if already exists
|
|
19
|
+
const alreadyExists = await access(projectDir).then(() => true).catch(() => false);
|
|
20
|
+
if (alreadyExists) {
|
|
21
|
+
throw new Error(`Project '${projectName}' already exists in ${projectsDir}`);
|
|
22
|
+
}
|
|
23
|
+
if (templateName) {
|
|
24
|
+
const templateDir = resolve(TEMPLATES_DIR, 'projects', templateName);
|
|
25
|
+
const templateExists = await access(templateDir).then(() => true).catch(() => false);
|
|
26
|
+
if (!templateExists) {
|
|
27
|
+
throw new Error(`Template '${templateName}' not found. Run 'studio templates list' to see available templates.`);
|
|
28
|
+
}
|
|
29
|
+
await mkdir(projectDir, { recursive: true });
|
|
30
|
+
if (withTools) {
|
|
31
|
+
await cp(templateDir, projectDir, {
|
|
32
|
+
recursive: true,
|
|
33
|
+
filter: (src) => !src.endsWith('metadata.json'),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
await cp(templateDir, projectDir, {
|
|
38
|
+
recursive: true,
|
|
39
|
+
filter: (src) => {
|
|
40
|
+
const rel = relative(templateDir, src);
|
|
41
|
+
return !rel.endsWith('metadata.json') && rel !== 'tools' && !rel.startsWith('tools' + sep);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
await mkdir(join(projectDir, 'tools'), { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
for (const sub of PROJECT_SUBDIRS) {
|
|
49
|
+
await mkdir(join(projectDir, sub), { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validate a project name: lowercase alphanumeric + hyphens, no leading/trailing hyphens.
|
|
55
|
+
* Returns true if valid, or an error string if not.
|
|
56
|
+
*/
|
|
57
|
+
export function validateProjectName(name) {
|
|
58
|
+
if (/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(name)) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return 'Project name must be lowercase alphanumeric with hyphens (e.g. my-project)';
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Non-interactive project creation.
|
|
65
|
+
* Validates name, then delegates to createProjectDir.
|
|
66
|
+
*
|
|
67
|
+
* @deprecated Use studio init in a new directory instead.
|
|
68
|
+
*/
|
|
69
|
+
export async function projectAddDirect(studioDir, projectName, templateName, _description) {
|
|
70
|
+
const validation = validateProjectName(projectName);
|
|
71
|
+
if (validation !== true) {
|
|
72
|
+
throw new Error(validation);
|
|
73
|
+
}
|
|
74
|
+
const projectsDir = join(studioDir, 'projects');
|
|
75
|
+
await createProjectDir(projectsDir, projectName, templateName);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Interactive wizard for adding a project to an existing workspace.
|
|
79
|
+
*
|
|
80
|
+
* @deprecated Use studio init in a new directory instead.
|
|
81
|
+
*/
|
|
82
|
+
export async function projectAddWizard(studioDir) {
|
|
83
|
+
// Step 1: Project name
|
|
84
|
+
const rawName = await input({
|
|
85
|
+
message: 'Project name:',
|
|
86
|
+
validate: (value) => {
|
|
87
|
+
const trimmed = value.trim();
|
|
88
|
+
if (!trimmed)
|
|
89
|
+
return 'Project name is required';
|
|
90
|
+
const v = validateProjectName(trimmed);
|
|
91
|
+
return v === true ? true : v;
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
const projectName = rawName.trim();
|
|
95
|
+
// Step 2: Description (optional, not persisted)
|
|
96
|
+
await input({
|
|
97
|
+
message: 'Description (optional, press Enter to skip):',
|
|
98
|
+
});
|
|
99
|
+
// Step 3: Template
|
|
100
|
+
const templates = await listTemplates();
|
|
101
|
+
const templateChoices = templates.map((t) => ({
|
|
102
|
+
value: t.name,
|
|
103
|
+
name: `${t.name} — ${t.description}`,
|
|
104
|
+
}));
|
|
105
|
+
const templateName = await select({
|
|
106
|
+
message: 'Choose a template:',
|
|
107
|
+
choices: templateChoices,
|
|
108
|
+
});
|
|
109
|
+
// Step 4: Create
|
|
110
|
+
console.log('');
|
|
111
|
+
const projectsDir = join(studioDir, 'projects');
|
|
112
|
+
await projectAddDirect(studioDir, projectName, templateName);
|
|
113
|
+
// Step 5: Success output
|
|
114
|
+
for (const sub of PROJECT_SUBDIRS) {
|
|
115
|
+
console.log(chalk.green(` ✓ ${join(projectsDir, projectName, sub).replace(process.cwd() + '/', '')}/`));
|
|
116
|
+
}
|
|
117
|
+
console.log('');
|
|
118
|
+
// Step 6: Next steps
|
|
119
|
+
const selectedTemplate = templates.find((t) => t.name === templateName);
|
|
120
|
+
const firstPipeline = selectedTemplate?.pipelines?.[0] ?? 'your-pipeline';
|
|
121
|
+
console.log(chalk.bold('Done! Run your first pipeline:'));
|
|
122
|
+
console.log(` ${chalk.cyan(`studio run ${projectName}/${firstPipeline} --input "..."`)}`);
|
|
123
|
+
console.log('');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* CLI dispatcher for `studio project <action> [args...]`.
|
|
127
|
+
* This command is deprecated — the flat .studio/ structure no longer uses projects/ subdirs.
|
|
128
|
+
*/
|
|
129
|
+
export async function projectCommand(_action, _args, _options) {
|
|
130
|
+
console.error(chalk.red(' ✗ `studio project add` is no longer supported.'));
|
|
131
|
+
console.log('');
|
|
132
|
+
console.log('Each workspace now has one flat .studio/ structure.');
|
|
133
|
+
console.log(`To start a new project, create a new directory and run ${chalk.cyan('studio init')}.`);
|
|
134
|
+
console.log('');
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface AuditResult {
|
|
2
|
+
name: string;
|
|
3
|
+
ok: boolean;
|
|
4
|
+
status: 'ok' | 'tampered' | 'missing';
|
|
5
|
+
}
|
|
6
|
+
interface AuditOptions {
|
|
7
|
+
studioDir?: string;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function auditPackages(options?: AuditOptions): Promise<AuditResult[]>;
|
|
11
|
+
export declare function auditCommand(): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/audit.ts"],"names":[],"mappings":"AAUA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS,CAAC;CACvC;AAUD,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgCtF;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBlD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { RegistryLockfile } from '../../registry/lockfile.js';
|
|
7
|
+
import { findStudioDir } from '../../studio-dir.js';
|
|
8
|
+
import { INSTALL_DIRS } from '../../registry/types.js';
|
|
9
|
+
const FILE_EXTENSIONS = {
|
|
10
|
+
tool: '.tool.yaml',
|
|
11
|
+
pipeline: '.pipeline.yaml',
|
|
12
|
+
integration: '.integration.yaml',
|
|
13
|
+
agent: '.agent.yaml',
|
|
14
|
+
skill: '.skill.md',
|
|
15
|
+
};
|
|
16
|
+
export async function auditPackages(options = {}) {
|
|
17
|
+
const studioDir = options.studioDir ??
|
|
18
|
+
(await findStudioDir(options.cwd ?? process.cwd()) ?? resolve(process.cwd(), '.studio'));
|
|
19
|
+
const lockfile = new RegistryLockfile(studioDir);
|
|
20
|
+
const installed = await lockfile.list();
|
|
21
|
+
const results = [];
|
|
22
|
+
for (const entry of installed) {
|
|
23
|
+
const type = entry.type;
|
|
24
|
+
const destDir = resolve(studioDir, INSTALL_DIRS[type]);
|
|
25
|
+
if (type === 'template' || type === 'plugin') {
|
|
26
|
+
// Directory packages: skip SHA check (would need to hash the full tree)
|
|
27
|
+
results.push({ name: entry.name, ok: true, status: 'ok' });
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const ext = FILE_EXTENSIONS[type] ?? '.yaml';
|
|
31
|
+
const filePath = resolve(destDir, `${entry.name}${ext}`);
|
|
32
|
+
if (!existsSync(filePath)) {
|
|
33
|
+
results.push({ name: entry.name, ok: false, status: 'missing' });
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const content = await readFile(filePath, 'utf8');
|
|
37
|
+
const actual = createHash('sha256').update(content).digest('hex');
|
|
38
|
+
const ok = actual === entry.sha256;
|
|
39
|
+
results.push({ name: entry.name, ok, status: ok ? 'ok' : 'tampered' });
|
|
40
|
+
}
|
|
41
|
+
return results;
|
|
42
|
+
}
|
|
43
|
+
export async function auditCommand() {
|
|
44
|
+
const results = await auditPackages();
|
|
45
|
+
if (results.length === 0) {
|
|
46
|
+
console.log(chalk.gray('No packages installed.'));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
let hasIssues = false;
|
|
50
|
+
for (const r of results) {
|
|
51
|
+
if (r.ok) {
|
|
52
|
+
console.log(chalk.green(` ✓ ${r.name}`));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
hasIssues = true;
|
|
56
|
+
const label = r.status === 'missing' ? chalk.red('MISSING') : chalk.red('TAMPERED');
|
|
57
|
+
console.log(` ✗ ${r.name} — ${label}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (hasIssues) {
|
|
61
|
+
console.log(chalk.yellow('\nRun: studio registry update <name> to reinstall affected packages'));
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/commands/registry/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,qBAAqB,IAAI,OAAO,CAqD/C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { searchCommand, browseCommand } from './search.js';
|
|
3
|
+
import { installCommand } from './install.js';
|
|
4
|
+
import { removeCommand } from './remove.js';
|
|
5
|
+
import { updateCommand, outdatedCommand } from './update.js';
|
|
6
|
+
import { publishCommand } from './publish.js';
|
|
7
|
+
import { auditCommand } from './audit.js';
|
|
8
|
+
import { syncRegistry } from './sync.js';
|
|
9
|
+
export function createRegistryCommand() {
|
|
10
|
+
const registry = new Command('registry')
|
|
11
|
+
.description('Manage community registry packages');
|
|
12
|
+
registry
|
|
13
|
+
.command('search <query>')
|
|
14
|
+
.description('Search packages in the registry')
|
|
15
|
+
.option('--type <type>', 'Filter by type: tool, template, pipeline, integration, agent, plugin, skill')
|
|
16
|
+
.action((query, options) => searchCommand(query, options));
|
|
17
|
+
registry
|
|
18
|
+
.command('browse')
|
|
19
|
+
.description('Browse most popular packages')
|
|
20
|
+
.action(() => browseCommand());
|
|
21
|
+
registry
|
|
22
|
+
.command('install <name>')
|
|
23
|
+
.description('Install a package (use name@version for a specific version)')
|
|
24
|
+
.option('--force', 'Reinstall even if already installed')
|
|
25
|
+
.action((name, options) => installCommand(name, options));
|
|
26
|
+
registry
|
|
27
|
+
.command('remove <name>')
|
|
28
|
+
.description('Uninstall a package')
|
|
29
|
+
.action((name) => removeCommand(name));
|
|
30
|
+
registry
|
|
31
|
+
.command('update <name>')
|
|
32
|
+
.description('Update an installed package to latest')
|
|
33
|
+
.action((name) => updateCommand(name));
|
|
34
|
+
registry
|
|
35
|
+
.command('outdated')
|
|
36
|
+
.description('List packages with available updates')
|
|
37
|
+
.action(() => outdatedCommand());
|
|
38
|
+
registry
|
|
39
|
+
.command('publish <path>')
|
|
40
|
+
.description('Publish a package to the community registry via GitHub PR')
|
|
41
|
+
.option('--dry-run', 'Validate only, do not create PR')
|
|
42
|
+
.action((path, options) => publishCommand(path, options));
|
|
43
|
+
registry
|
|
44
|
+
.command('audit')
|
|
45
|
+
.description('Verify SHA256 integrity of installed packages')
|
|
46
|
+
.action(() => auditCommand());
|
|
47
|
+
registry
|
|
48
|
+
.command('sync')
|
|
49
|
+
.description('Force refresh the registry index cache')
|
|
50
|
+
.action(() => syncRegistry({ force: true }));
|
|
51
|
+
return registry;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;SACrC,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAErD,QAAQ;SACL,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,eAAe,EAAE,6EAA6E,CAAC;SACtG,MAAM,CAAC,CAAC,KAAa,EAAE,OAA0B,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAExF,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAEjC,QAAQ;SACL,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,SAAS,EAAE,qCAAqC,CAAC;SACxD,MAAM,CAAC,CAAC,IAAY,EAAE,OAA4B,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzF,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjD,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjD,QAAQ;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEnC,QAAQ;SACL,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,2DAA2D,CAAC;SACxE,MAAM,CAAC,WAAW,EAAE,iCAAiC,CAAC;SACtD,MAAM,CAAC,CAAC,IAAY,EAAE,OAA6B,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1F,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAEhC,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|