@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,17 @@
|
|
|
1
|
+
import type { PackageMetadata } from '../../registry/types.js';
|
|
2
|
+
interface InstallOptions {
|
|
3
|
+
studioDir?: string;
|
|
4
|
+
force?: boolean;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
requiredBy?: string;
|
|
7
|
+
/** Skip interactive prompts (auto-accept). Use when called under a spinner. */
|
|
8
|
+
interactive?: boolean;
|
|
9
|
+
_depth?: number;
|
|
10
|
+
_metaCache?: Map<string, PackageMetadata>;
|
|
11
|
+
}
|
|
12
|
+
export declare function installPackage(nameAtVersion: string, options?: InstallOptions): Promise<void>;
|
|
13
|
+
export declare function installCommand(nameAtVersion: string, options?: {
|
|
14
|
+
force?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/install.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAwC,MAAM,yBAAyB,CAAC;AAarG,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAuJD,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BvG;AAED,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5G"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { mkdir, readFile } from 'node:fs/promises';
|
|
4
|
+
import { RegistryClient } from '../../registry/client.js';
|
|
5
|
+
import { RegistryLockfile } from '../../registry/lockfile.js';
|
|
6
|
+
import { RegistryCache } from '../../registry/cache.js';
|
|
7
|
+
import { syncRegistry } from './sync.js';
|
|
8
|
+
import { findStudioDir } from '../../studio-dir.js';
|
|
9
|
+
import { resolveDependencies } from '../../registry/resolver.js';
|
|
10
|
+
import { INSTALL_DIRS } from '../../registry/types.js';
|
|
11
|
+
const SINGLE_FILE_EXTENSIONS = {
|
|
12
|
+
tool: '.tool.yaml',
|
|
13
|
+
pipeline: '.pipeline.yaml',
|
|
14
|
+
integration: '.integration.yaml',
|
|
15
|
+
agent: '.agent.yaml',
|
|
16
|
+
skill: '.skill.md',
|
|
17
|
+
};
|
|
18
|
+
const SHELL_EXEC_PATTERN = /execute:\s*\n\s+type:\s*shell/;
|
|
19
|
+
async function doInstallPackage(nameAtVersion, options, client, lockfile, index, lockfileData, metaCache) {
|
|
20
|
+
const [name, requestedVersion] = nameAtVersion.split('@');
|
|
21
|
+
const studioDir = options.studioDir;
|
|
22
|
+
const depth = options._depth ?? 0;
|
|
23
|
+
const indent = ' '.repeat(depth);
|
|
24
|
+
// Check already installed
|
|
25
|
+
const existing = await lockfile.get(name);
|
|
26
|
+
if (existing && !options.force) {
|
|
27
|
+
if (options.requiredBy) {
|
|
28
|
+
await lockfile.addRequiredBy(name, options.requiredBy);
|
|
29
|
+
}
|
|
30
|
+
if (depth === 0) {
|
|
31
|
+
console.log(chalk.yellow(`${name} v${existing.version} is already installed. Use --force to reinstall.`));
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const indexEntry = index.packages.find(p => p.name === name);
|
|
36
|
+
if (!indexEntry)
|
|
37
|
+
throw new Error(`Package '${name}' not found in registry`);
|
|
38
|
+
const type = indexEntry.type;
|
|
39
|
+
// Use cached metadata if available (populated by resolver's fetcher)
|
|
40
|
+
let meta = metaCache.get(name);
|
|
41
|
+
if (!meta) {
|
|
42
|
+
meta = await client.fetchMetadata(type, name);
|
|
43
|
+
metaCache.set(name, meta);
|
|
44
|
+
}
|
|
45
|
+
const version = requestedVersion ?? meta.version;
|
|
46
|
+
console.log(`${indent}Installing ${depth > 0 ? 'dependency: ' : ''}${chalk.bold(name)} v${version} [${type}]...`);
|
|
47
|
+
let sha256;
|
|
48
|
+
const destBaseDir = resolve(studioDir, INSTALL_DIRS[type]);
|
|
49
|
+
await mkdir(destBaseDir, { recursive: true });
|
|
50
|
+
if (type === 'template' || type === 'plugin') {
|
|
51
|
+
const destDir = resolve(destBaseDir, name);
|
|
52
|
+
await mkdir(destDir, { recursive: true });
|
|
53
|
+
sha256 = await client.downloadDirectory(type, name, 'project', destDir);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const ext = SINGLE_FILE_EXTENSIONS[type] ?? '.yaml';
|
|
57
|
+
const filename = `${name}${ext}`;
|
|
58
|
+
const result = await client.downloadFile(type, name, filename, destBaseDir);
|
|
59
|
+
sha256 = result.sha256;
|
|
60
|
+
const content = await readFile(result.destPath, 'utf8');
|
|
61
|
+
if (SHELL_EXEC_PATTERN.test(content) && options.interactive !== false) {
|
|
62
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
63
|
+
const proceed = await confirm({
|
|
64
|
+
message: chalk.yellow(`⚠ This package executes shell commands. Review ${result.destPath} before use. Install anyway?`),
|
|
65
|
+
default: false,
|
|
66
|
+
});
|
|
67
|
+
if (!proceed) {
|
|
68
|
+
const { unlink } = await import('node:fs/promises');
|
|
69
|
+
await unlink(result.destPath);
|
|
70
|
+
console.log('Installation cancelled.');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (meta.requires_binaries?.length) {
|
|
76
|
+
const { spawnSync } = await import('node:child_process');
|
|
77
|
+
for (const bin of meta.requires_binaries) {
|
|
78
|
+
const check = spawnSync('which', [bin], { encoding: 'utf8' });
|
|
79
|
+
if (check.status !== 0) {
|
|
80
|
+
console.log(chalk.yellow(`⚠ Warning: required binary '${bin}' not found in PATH`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
await lockfile.add(name, {
|
|
85
|
+
version,
|
|
86
|
+
type,
|
|
87
|
+
installed_at: new Date().toISOString().split('T')[0],
|
|
88
|
+
sha256,
|
|
89
|
+
required_by: options.requiredBy ? [options.requiredBy] : [],
|
|
90
|
+
});
|
|
91
|
+
console.log(`${indent}${chalk.green(`✓ Installed ${name} v${version}`)}`);
|
|
92
|
+
// Resolve and install dependencies
|
|
93
|
+
if (meta.dependencies) {
|
|
94
|
+
const graph = await resolveDependencies(name, meta, index, lockfileData, (depName) => {
|
|
95
|
+
const depEntry = index.packages.find(p => p.name === depName);
|
|
96
|
+
const depType = (depEntry?.type ?? 'tool');
|
|
97
|
+
const cached = metaCache.get(depName);
|
|
98
|
+
if (cached)
|
|
99
|
+
return Promise.resolve(cached);
|
|
100
|
+
return client.fetchMetadata(depType, depName).then(m => {
|
|
101
|
+
metaCache.set(depName, m);
|
|
102
|
+
return m;
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
for (const dep of graph.required) {
|
|
106
|
+
await doInstallPackage(dep.name, { studioDir, requiredBy: name, interactive: options.interactive, _depth: depth + 1 }, client, lockfile, index, lockfileData, metaCache);
|
|
107
|
+
}
|
|
108
|
+
if (depth === 0 && graph.recommended.length > 0) {
|
|
109
|
+
let install = options.interactive !== false;
|
|
110
|
+
if (options.interactive !== false) {
|
|
111
|
+
const names = graph.recommended.map(d => d.name).join(', ');
|
|
112
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
113
|
+
install = await confirm({
|
|
114
|
+
message: `Install recommended packages? [${names}]`,
|
|
115
|
+
default: true,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (install) {
|
|
119
|
+
for (const dep of graph.recommended) {
|
|
120
|
+
await doInstallPackage(dep.name, { studioDir, interactive: options.interactive, _depth: depth + 1 }, client, lockfile, index, lockfileData, metaCache);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export async function installPackage(nameAtVersion, options = {}) {
|
|
127
|
+
const [name] = nameAtVersion.split('@');
|
|
128
|
+
const studioDir = options.studioDir ??
|
|
129
|
+
(await findStudioDir(options.cwd ?? process.cwd()) ?? resolve(process.cwd(), '.studio'));
|
|
130
|
+
const resolvedOptions = { ...options, studioDir };
|
|
131
|
+
const lockfile = new RegistryLockfile(studioDir);
|
|
132
|
+
// Sync cache and resolve package type
|
|
133
|
+
await syncRegistry({ force: false, silent: true });
|
|
134
|
+
const cache = new RegistryCache();
|
|
135
|
+
const index = await cache.read();
|
|
136
|
+
if (!index?.packages.find(p => p.name === name)) {
|
|
137
|
+
throw new Error(`Package '${name}' not found in registry`);
|
|
138
|
+
}
|
|
139
|
+
const client = new RegistryClient();
|
|
140
|
+
const lockfileData = await lockfile.read();
|
|
141
|
+
const metaCache = options._metaCache ?? new Map();
|
|
142
|
+
await doInstallPackage(nameAtVersion, resolvedOptions, client, lockfile, index, lockfileData, metaCache);
|
|
143
|
+
}
|
|
144
|
+
export async function installCommand(nameAtVersion, options = {}) {
|
|
145
|
+
try {
|
|
146
|
+
await installPackage(nameAtVersion, options);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
console.error(chalk.red(`Install failed: ${err instanceof Error ? err.message : err}`));
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/registry/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PackageMetadata } from '../../registry/types.js';
|
|
2
|
+
export declare function validatePublishPayload(packagePath: string): Promise<PackageMetadata>;
|
|
3
|
+
interface PublishOptions {
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function publishCommand(packagePath: string, options?: PublishOptions): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/publish.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAK/D,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqB1F;AAED,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ErG"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
import { REGISTRY_REPO } from '../../registry/types.js';
|
|
7
|
+
const REQUIRED_METADATA_FIELDS = ['name', 'version', 'description', 'author', 'license', 'type'];
|
|
8
|
+
export async function validatePublishPayload(packagePath) {
|
|
9
|
+
const absPath = resolve(packagePath);
|
|
10
|
+
if (!existsSync(absPath)) {
|
|
11
|
+
throw new Error(`Path does not exist: ${absPath}`);
|
|
12
|
+
}
|
|
13
|
+
const packageDir = dirname(absPath);
|
|
14
|
+
const metadataPath = resolve(packageDir, 'metadata.json');
|
|
15
|
+
if (!existsSync(metadataPath)) {
|
|
16
|
+
throw new Error(`metadata.json not found in ${packageDir}`);
|
|
17
|
+
}
|
|
18
|
+
const meta = JSON.parse(await readFile(metadataPath, 'utf8'));
|
|
19
|
+
const missing = REQUIRED_METADATA_FIELDS.filter(f => !(f in meta));
|
|
20
|
+
if (missing.length > 0) {
|
|
21
|
+
throw new Error(`Missing required metadata fields: ${missing.join(', ')}`);
|
|
22
|
+
}
|
|
23
|
+
return meta;
|
|
24
|
+
}
|
|
25
|
+
export async function publishCommand(packagePath, options = {}) {
|
|
26
|
+
try {
|
|
27
|
+
console.log('Validating package...');
|
|
28
|
+
const meta = await validatePublishPayload(packagePath);
|
|
29
|
+
console.log(chalk.green(`✓ ${meta.name} v${meta.version} [${meta.type}]`));
|
|
30
|
+
if (options.dryRun) {
|
|
31
|
+
console.log(chalk.gray('Dry run — skipping GitHub PR'));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Check gh CLI is available and authenticated
|
|
35
|
+
const ghCheck = spawnSync('gh', ['auth', 'status'], { encoding: 'utf8' });
|
|
36
|
+
if (ghCheck.status !== 0) {
|
|
37
|
+
throw new Error('GitHub CLI not authenticated. Run: gh auth login');
|
|
38
|
+
}
|
|
39
|
+
const packageDir = dirname(resolve(packagePath));
|
|
40
|
+
const branchName = `${meta.type}-${meta.name}-v${meta.version}`;
|
|
41
|
+
const registryPath = `${meta.type}s/${meta.name}`;
|
|
42
|
+
console.log('Creating GitHub PR...');
|
|
43
|
+
// Fork the registry (idempotent)
|
|
44
|
+
spawnSync('gh', ['repo', 'fork', REGISTRY_REPO, '--clone=false'], {
|
|
45
|
+
encoding: 'utf8',
|
|
46
|
+
});
|
|
47
|
+
// Get the authenticated user's login for the fork URL
|
|
48
|
+
const userResult = spawnSync('gh', ['api', 'user', '--jq', '.login'], { encoding: 'utf8' });
|
|
49
|
+
const userLogin = userResult.stdout.trim();
|
|
50
|
+
if (!userLogin)
|
|
51
|
+
throw new Error('Failed to get GitHub username');
|
|
52
|
+
// Clone fork to temp dir
|
|
53
|
+
const tmp = `/tmp/studio-registry-publish-${Date.now()}`;
|
|
54
|
+
const cloneResult = spawnSync('git', ['clone', `https://github.com/${userLogin}/registry.git`, tmp], {
|
|
55
|
+
encoding: 'utf8',
|
|
56
|
+
});
|
|
57
|
+
if (cloneResult.status !== 0)
|
|
58
|
+
throw new Error(`Failed to clone fork: ${cloneResult.stderr}`);
|
|
59
|
+
// Create branch, copy files, push
|
|
60
|
+
spawnSync('git', ['-C', tmp, 'checkout', '-b', branchName], { encoding: 'utf8' });
|
|
61
|
+
spawnSync('cp', ['-r', packageDir, resolve(tmp, registryPath)], { encoding: 'utf8' });
|
|
62
|
+
spawnSync('git', ['-C', tmp, 'add', registryPath], { encoding: 'utf8' });
|
|
63
|
+
spawnSync('git', ['-C', tmp, 'commit', '-m', `[${meta.type}] ${meta.name} v${meta.version}`], {
|
|
64
|
+
encoding: 'utf8',
|
|
65
|
+
});
|
|
66
|
+
const pushResult = spawnSync('git', ['-C', tmp, 'push', '-u', 'origin', branchName], {
|
|
67
|
+
encoding: 'utf8',
|
|
68
|
+
});
|
|
69
|
+
if (pushResult.status !== 0)
|
|
70
|
+
throw new Error(`Failed to push branch: ${pushResult.stderr}`);
|
|
71
|
+
// Open PR
|
|
72
|
+
const prResult = spawnSync('gh', [
|
|
73
|
+
'pr', 'create',
|
|
74
|
+
'--repo', REGISTRY_REPO,
|
|
75
|
+
'--title', `[${meta.type}] ${meta.name} v${meta.version}`,
|
|
76
|
+
'--body', `## ${meta.name}\n\n${meta.description}\n\n**Author:** ${meta.author}\n**License:** ${meta.license}\n**Version:** ${meta.version}`,
|
|
77
|
+
'--head', `${userLogin}:${branchName}`,
|
|
78
|
+
], { encoding: 'utf8', cwd: tmp });
|
|
79
|
+
// Cleanup
|
|
80
|
+
spawnSync('rm', ['-rf', tmp]);
|
|
81
|
+
if (prResult.status === 0) {
|
|
82
|
+
const prUrl = prResult.stdout.trim();
|
|
83
|
+
console.log(chalk.green(`✓ PR opened: ${prUrl}`));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
throw new Error(`Failed to create PR: ${prResult.stderr}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
console.error(chalk.red(`Publish failed: ${err instanceof Error ? err.message : err}`));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/registry/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface RemoveOptions {
|
|
2
|
+
studioDir?: string;
|
|
3
|
+
cwd?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function removePackage(name: string, options?: RemoveOptions): Promise<void>;
|
|
6
|
+
export declare function removeCommand(name: string): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=remove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/remove.ts"],"names":[],"mappings":"AASA,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAsBD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C5F;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { rm } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { RegistryLockfile } from '../../registry/lockfile.js';
|
|
6
|
+
import { findStudioDir } from '../../studio-dir.js';
|
|
7
|
+
import { INSTALL_DIRS } from '../../registry/types.js';
|
|
8
|
+
const FILE_EXTENSIONS = {
|
|
9
|
+
tool: '.tool.yaml',
|
|
10
|
+
pipeline: '.pipeline.yaml',
|
|
11
|
+
integration: '.integration.yaml',
|
|
12
|
+
agent: '.agent.yaml',
|
|
13
|
+
skill: '.skill.md',
|
|
14
|
+
};
|
|
15
|
+
async function deletePackageFiles(studioDir, name, type) {
|
|
16
|
+
const destDir = resolve(studioDir, INSTALL_DIRS[type]);
|
|
17
|
+
if (type === 'template' || type === 'plugin') {
|
|
18
|
+
const dirPath = resolve(destDir, name);
|
|
19
|
+
if (existsSync(dirPath))
|
|
20
|
+
await rm(dirPath, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const ext = FILE_EXTENSIONS[type] ?? '.yaml';
|
|
24
|
+
const filePath = resolve(destDir, `${name}${ext}`);
|
|
25
|
+
if (existsSync(filePath))
|
|
26
|
+
await rm(filePath);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function removePackage(name, options = {}) {
|
|
30
|
+
const studioDir = options.studioDir ??
|
|
31
|
+
(await findStudioDir(options.cwd ?? process.cwd()) ?? resolve(process.cwd(), '.studio'));
|
|
32
|
+
const lockfile = new RegistryLockfile(studioDir);
|
|
33
|
+
const entry = await lockfile.get(name);
|
|
34
|
+
if (!entry)
|
|
35
|
+
throw new Error(`'${name}' is not installed`);
|
|
36
|
+
// Block removal if another package depends on this one
|
|
37
|
+
const dependents = (entry.required_by ?? []).filter(d => d !== '');
|
|
38
|
+
if (dependents.length > 0) {
|
|
39
|
+
throw new Error(`'${name}' is required by: ${dependents.join(', ')}. Remove them first.`);
|
|
40
|
+
}
|
|
41
|
+
const type = entry.type;
|
|
42
|
+
await deletePackageFiles(studioDir, name, type);
|
|
43
|
+
await lockfile.remove(name);
|
|
44
|
+
console.log(chalk.green(`✓ Removed ${name}`));
|
|
45
|
+
// Find orphans: packages whose required_by only contained 'name'
|
|
46
|
+
const data = await lockfile.read();
|
|
47
|
+
const orphans = [];
|
|
48
|
+
for (const [pkgName, pkgEntry] of Object.entries(data.installed)) {
|
|
49
|
+
const wasRequired = pkgEntry.required_by?.includes(name);
|
|
50
|
+
const otherRequirers = (pkgEntry.required_by ?? []).filter(r => r !== name);
|
|
51
|
+
if (wasRequired && otherRequirers.length === 0) {
|
|
52
|
+
orphans.push(pkgName);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (orphans.length > 0) {
|
|
56
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
57
|
+
const cleanup = await confirm({
|
|
58
|
+
message: `These packages are no longer needed: [${orphans.join(', ')}]. Remove them?`,
|
|
59
|
+
default: true,
|
|
60
|
+
});
|
|
61
|
+
if (cleanup) {
|
|
62
|
+
for (const orphan of orphans) {
|
|
63
|
+
// Strip the requirer reference so the protection check passes
|
|
64
|
+
await lockfile.removeRequiredBy(orphan, name);
|
|
65
|
+
await removePackage(orphan, { studioDir });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(chalk.yellow(`Packages left installed: [${orphans.join(', ')}]`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function removeCommand(name) {
|
|
74
|
+
try {
|
|
75
|
+
await removePackage(name);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/registry/remove.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PackageEntry, PackageType } from '../../registry/types.js';
|
|
2
|
+
export declare function searchPackages(packages: PackageEntry[], query?: string, type?: PackageType | string): PackageEntry[];
|
|
3
|
+
interface SearchOptions {
|
|
4
|
+
type?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function searchCommand(query: string, options?: SearchOptions): Promise<void>;
|
|
7
|
+
export declare function browseCommand(): Promise<void>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/search.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEzE,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,YAAY,EAAE,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,GAC1B,YAAY,EAAE,CAiBhB;AAYD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB7F;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BnD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { RegistryCache } from '../../registry/cache.js';
|
|
3
|
+
import { syncRegistry } from './sync.js';
|
|
4
|
+
export function searchPackages(packages, query, type) {
|
|
5
|
+
let results = packages;
|
|
6
|
+
if (type) {
|
|
7
|
+
results = results.filter(p => p.type === type);
|
|
8
|
+
}
|
|
9
|
+
if (query) {
|
|
10
|
+
const q = query.toLowerCase();
|
|
11
|
+
results = results.filter(p => p.name.toLowerCase().includes(q) ||
|
|
12
|
+
p.description.toLowerCase().includes(q) ||
|
|
13
|
+
p.tags.some(t => t.toLowerCase().includes(q)));
|
|
14
|
+
}
|
|
15
|
+
return results;
|
|
16
|
+
}
|
|
17
|
+
function renderPackage(pkg) {
|
|
18
|
+
console.log(` ${chalk.bold(pkg.name)} ${chalk.gray(`v${pkg.version}`)} ${chalk.cyan(`[${pkg.type}]`)}`);
|
|
19
|
+
console.log(` ${pkg.description}`);
|
|
20
|
+
if (pkg.tags.length > 0) {
|
|
21
|
+
console.log(` ${chalk.gray(pkg.tags.join(', '))}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function searchCommand(query, options = {}) {
|
|
25
|
+
await syncRegistry({ force: false, silent: true });
|
|
26
|
+
const cache = new RegistryCache();
|
|
27
|
+
const index = await cache.read();
|
|
28
|
+
if (!index) {
|
|
29
|
+
console.error(chalk.red('Failed to load registry. Run: studio registry sync'));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const results = searchPackages(index.packages, query, options.type);
|
|
33
|
+
if (results.length === 0) {
|
|
34
|
+
console.log(chalk.yellow(`No packages found for "${query}"`));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
console.log(chalk.bold(`\n${results.length} package${results.length > 1 ? 's' : ''} found:\n`));
|
|
38
|
+
for (const pkg of results) {
|
|
39
|
+
renderPackage(pkg);
|
|
40
|
+
console.log();
|
|
41
|
+
}
|
|
42
|
+
console.log(chalk.gray(`Install: studio registry install <name>`));
|
|
43
|
+
}
|
|
44
|
+
export async function browseCommand() {
|
|
45
|
+
await syncRegistry({ force: false, silent: true });
|
|
46
|
+
const cache = new RegistryCache();
|
|
47
|
+
const index = await cache.read();
|
|
48
|
+
if (!index) {
|
|
49
|
+
console.error(chalk.red('Failed to load registry. Run: studio registry sync'));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const sorted = [...index.packages].sort((a, b) => b.downloads - a.downloads);
|
|
53
|
+
console.log(chalk.bold(`\nStudio Community Registry — ${sorted.length} packages\n`));
|
|
54
|
+
const byType = {};
|
|
55
|
+
for (const pkg of sorted) {
|
|
56
|
+
if (!byType[pkg.type])
|
|
57
|
+
byType[pkg.type] = [];
|
|
58
|
+
byType[pkg.type].push(pkg);
|
|
59
|
+
}
|
|
60
|
+
for (const [type, pkgs] of Object.entries(byType)) {
|
|
61
|
+
console.log(chalk.bold.underline(`${type}s`));
|
|
62
|
+
for (const pkg of pkgs) {
|
|
63
|
+
renderPackage(pkg);
|
|
64
|
+
console.log();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/registry/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,UAAU,cAAc,CAC5B,QAAwB,EACxB,KAAc,EACd,IAA2B;IAE3B,IAAI,OAAO,GAAG,QAAQ,CAAC;IAEvB,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,GAAiB;IACtC,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAC5F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,UAAyB,EAAE;IAC5E,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,IAA+B,CAAC,CAAC;IAE/F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAChG,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,aAAa,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;IAErF,MAAM,MAAM,GAAmC,EAAE,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,aAAa,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/sync.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { RegistryCache } from '../../registry/cache.js';
|
|
3
|
+
import { RegistryClient } from '../../registry/client.js';
|
|
4
|
+
export async function syncRegistry(options = {}) {
|
|
5
|
+
const cache = new RegistryCache(options.cacheDir);
|
|
6
|
+
if (!options.force && await cache.isFresh()) {
|
|
7
|
+
if (!options.silent)
|
|
8
|
+
console.log(chalk.gray('Registry index is up to date.'));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!options.silent)
|
|
12
|
+
process.stdout.write('Syncing registry... ');
|
|
13
|
+
const client = new RegistryClient();
|
|
14
|
+
const index = await client.fetchIndex();
|
|
15
|
+
await cache.write(index);
|
|
16
|
+
if (!options.silent)
|
|
17
|
+
console.log(chalk.green(`✓ ${index.packages.length} packages`));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/commands/registry/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ1D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAuB,EAAE;IAC1D,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IACxC,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface OutdatedEntry {
|
|
2
|
+
name: string;
|
|
3
|
+
installed: string;
|
|
4
|
+
latest: string;
|
|
5
|
+
type: string;
|
|
6
|
+
}
|
|
7
|
+
interface UpdateOptions {
|
|
8
|
+
studioDir?: string;
|
|
9
|
+
cwd?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function outdatedPackages(options?: UpdateOptions): Promise<OutdatedEntry[]>;
|
|
12
|
+
export declare function outdatedCommand(options?: UpdateOptions): Promise<void>;
|
|
13
|
+
export declare function updateCommand(name: string): Promise<void>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/registry/update.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAoB5F;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhF;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { RegistryLockfile } from '../../registry/lockfile.js';
|
|
3
|
+
import { RegistryCache } from '../../registry/cache.js';
|
|
4
|
+
import { syncRegistry } from './sync.js';
|
|
5
|
+
import { installPackage } from './install.js';
|
|
6
|
+
import { findStudioDir } from '../../studio-dir.js';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
export async function outdatedPackages(options = {}) {
|
|
9
|
+
const studioDir = options.studioDir ??
|
|
10
|
+
(await findStudioDir(options.cwd ?? process.cwd()) ?? resolve(process.cwd(), '.studio'));
|
|
11
|
+
await syncRegistry({ force: false, silent: true });
|
|
12
|
+
const cache = new RegistryCache();
|
|
13
|
+
const index = await cache.read();
|
|
14
|
+
if (!index)
|
|
15
|
+
return [];
|
|
16
|
+
const lockfile = new RegistryLockfile(studioDir);
|
|
17
|
+
const installed = await lockfile.list();
|
|
18
|
+
const results = [];
|
|
19
|
+
for (const entry of installed) {
|
|
20
|
+
const latest = index.packages.find(p => p.name === entry.name);
|
|
21
|
+
if (latest && latest.version !== entry.version) {
|
|
22
|
+
results.push({ name: entry.name, installed: entry.version, latest: latest.version, type: entry.type });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return results;
|
|
26
|
+
}
|
|
27
|
+
export async function outdatedCommand(options = {}) {
|
|
28
|
+
const outdated = await outdatedPackages(options);
|
|
29
|
+
if (outdated.length === 0) {
|
|
30
|
+
console.log(chalk.green('All packages are up to date.'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(chalk.bold('\nOutdated packages:\n'));
|
|
34
|
+
for (const pkg of outdated) {
|
|
35
|
+
console.log(` ${chalk.bold(pkg.name)} ${chalk.red(pkg.installed)} → ${chalk.green(pkg.latest)} [${pkg.type}]`);
|
|
36
|
+
}
|
|
37
|
+
console.log(`\nRun: studio registry update <name>`);
|
|
38
|
+
}
|
|
39
|
+
export async function updateCommand(name) {
|
|
40
|
+
try {
|
|
41
|
+
await installPackage(name, { force: true });
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/registry/update.ts"],"names":[],"mappings":"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"}
|