@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.
Files changed (277) hide show
  1. package/ARCHITECTURE.md +40 -0
  2. package/LICENSE +663 -0
  3. package/README.md +165 -0
  4. package/dist/commands/api.d.ts +16 -0
  5. package/dist/commands/api.d.ts.map +1 -0
  6. package/dist/commands/api.js +118 -0
  7. package/dist/commands/api.js.map +1 -0
  8. package/dist/commands/config.d.ts +32 -0
  9. package/dist/commands/config.d.ts.map +1 -0
  10. package/dist/commands/config.js +390 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/init.d.ts +93 -0
  13. package/dist/commands/init.d.ts.map +1 -0
  14. package/dist/commands/init.js +728 -0
  15. package/dist/commands/init.js.map +1 -0
  16. package/dist/commands/install.d.ts +2 -0
  17. package/dist/commands/install.d.ts.map +1 -0
  18. package/dist/commands/install.js +22 -0
  19. package/dist/commands/install.js.map +1 -0
  20. package/dist/commands/integrations.d.ts +14 -0
  21. package/dist/commands/integrations.d.ts.map +1 -0
  22. package/dist/commands/integrations.js +282 -0
  23. package/dist/commands/integrations.js.map +1 -0
  24. package/dist/commands/list.d.ts +9 -0
  25. package/dist/commands/list.d.ts.map +1 -0
  26. package/dist/commands/list.js +161 -0
  27. package/dist/commands/list.js.map +1 -0
  28. package/dist/commands/logs.d.ts +7 -0
  29. package/dist/commands/logs.d.ts.map +1 -0
  30. package/dist/commands/logs.js +98 -0
  31. package/dist/commands/logs.js.map +1 -0
  32. package/dist/commands/ollama.d.ts +6 -0
  33. package/dist/commands/ollama.d.ts.map +1 -0
  34. package/dist/commands/ollama.js +161 -0
  35. package/dist/commands/ollama.js.map +1 -0
  36. package/dist/commands/project.d.ts +38 -0
  37. package/dist/commands/project.d.ts.map +1 -0
  38. package/dist/commands/project.js +137 -0
  39. package/dist/commands/project.js.map +1 -0
  40. package/dist/commands/registry/audit.d.ts +13 -0
  41. package/dist/commands/registry/audit.d.ts.map +1 -0
  42. package/dist/commands/registry/audit.js +65 -0
  43. package/dist/commands/registry/audit.js.map +1 -0
  44. package/dist/commands/registry/index.d.ts +3 -0
  45. package/dist/commands/registry/index.d.ts.map +1 -0
  46. package/dist/commands/registry/index.js +53 -0
  47. package/dist/commands/registry/index.js.map +1 -0
  48. package/dist/commands/registry/install.d.ts +17 -0
  49. package/dist/commands/registry/install.d.ts.map +1 -0
  50. package/dist/commands/registry/install.js +153 -0
  51. package/dist/commands/registry/install.js.map +1 -0
  52. package/dist/commands/registry/publish.d.ts +8 -0
  53. package/dist/commands/registry/publish.d.ts.map +1 -0
  54. package/dist/commands/registry/publish.js +94 -0
  55. package/dist/commands/registry/publish.js.map +1 -0
  56. package/dist/commands/registry/remove.d.ts +8 -0
  57. package/dist/commands/registry/remove.d.ts.map +1 -0
  58. package/dist/commands/registry/remove.js +82 -0
  59. package/dist/commands/registry/remove.js.map +1 -0
  60. package/dist/commands/registry/search.d.ts +9 -0
  61. package/dist/commands/registry/search.d.ts.map +1 -0
  62. package/dist/commands/registry/search.js +68 -0
  63. package/dist/commands/registry/search.js.map +1 -0
  64. package/dist/commands/registry/sync.d.ts +8 -0
  65. package/dist/commands/registry/sync.d.ts.map +1 -0
  66. package/dist/commands/registry/sync.js +19 -0
  67. package/dist/commands/registry/sync.js.map +1 -0
  68. package/dist/commands/registry/update.d.ts +15 -0
  69. package/dist/commands/registry/update.d.ts.map +1 -0
  70. package/dist/commands/registry/update.js +48 -0
  71. package/dist/commands/registry/update.js.map +1 -0
  72. package/dist/commands/replay.d.ts +36 -0
  73. package/dist/commands/replay.d.ts.map +1 -0
  74. package/dist/commands/replay.js +453 -0
  75. package/dist/commands/replay.js.map +1 -0
  76. package/dist/commands/run.d.ts +18 -0
  77. package/dist/commands/run.d.ts.map +1 -0
  78. package/dist/commands/run.js +406 -0
  79. package/dist/commands/run.js.map +1 -0
  80. package/dist/commands/status.d.ts +6 -0
  81. package/dist/commands/status.d.ts.map +1 -0
  82. package/dist/commands/status.js +144 -0
  83. package/dist/commands/status.js.map +1 -0
  84. package/dist/commands/template/index.d.ts +2 -0
  85. package/dist/commands/template/index.d.ts.map +1 -0
  86. package/dist/commands/template/index.js +57 -0
  87. package/dist/commands/template/index.js.map +1 -0
  88. package/dist/commands/template/validate.d.ts +8 -0
  89. package/dist/commands/template/validate.d.ts.map +1 -0
  90. package/dist/commands/template/validate.js +135 -0
  91. package/dist/commands/template/validate.js.map +1 -0
  92. package/dist/commands/templates.d.ts +14 -0
  93. package/dist/commands/templates.d.ts.map +1 -0
  94. package/dist/commands/templates.js +86 -0
  95. package/dist/commands/templates.js.map +1 -0
  96. package/dist/commands/tools.d.ts +12 -0
  97. package/dist/commands/tools.d.ts.map +1 -0
  98. package/dist/commands/tools.js +200 -0
  99. package/dist/commands/tools.js.map +1 -0
  100. package/dist/commands/users.d.ts +4 -0
  101. package/dist/commands/users.d.ts.map +1 -0
  102. package/dist/commands/users.js +123 -0
  103. package/dist/commands/users.js.map +1 -0
  104. package/dist/commands/validate.d.ts +2 -0
  105. package/dist/commands/validate.d.ts.map +1 -0
  106. package/dist/commands/validate.js +39 -0
  107. package/dist/commands/validate.js.map +1 -0
  108. package/dist/config.d.ts +36 -0
  109. package/dist/config.d.ts.map +1 -0
  110. package/dist/config.js +64 -0
  111. package/dist/config.js.map +1 -0
  112. package/dist/index.d.ts +3 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +178 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/models-cache.d.ts +13 -0
  117. package/dist/models-cache.d.ts.map +1 -0
  118. package/dist/models-cache.js +106 -0
  119. package/dist/models-cache.js.map +1 -0
  120. package/dist/output/file-changes.d.ts +15 -0
  121. package/dist/output/file-changes.d.ts.map +1 -0
  122. package/dist/output/file-changes.js +77 -0
  123. package/dist/output/file-changes.js.map +1 -0
  124. package/dist/output/formatter.d.ts +6 -0
  125. package/dist/output/formatter.d.ts.map +1 -0
  126. package/dist/output/formatter.js +70 -0
  127. package/dist/output/formatter.js.map +1 -0
  128. package/dist/output/formatters.d.ts +42 -0
  129. package/dist/output/formatters.d.ts.map +1 -0
  130. package/dist/output/formatters.js +280 -0
  131. package/dist/output/formatters.js.map +1 -0
  132. package/dist/output/logger.d.ts +3 -0
  133. package/dist/output/logger.d.ts.map +1 -0
  134. package/dist/output/logger.js +15 -0
  135. package/dist/output/logger.js.map +1 -0
  136. package/dist/output/parallel-progress.d.ts +33 -0
  137. package/dist/output/parallel-progress.d.ts.map +1 -0
  138. package/dist/output/parallel-progress.js +85 -0
  139. package/dist/output/parallel-progress.js.map +1 -0
  140. package/dist/output/progress.d.ts +32 -0
  141. package/dist/output/progress.d.ts.map +1 -0
  142. package/dist/output/progress.js +393 -0
  143. package/dist/output/progress.js.map +1 -0
  144. package/dist/provider-validator.d.ts +15 -0
  145. package/dist/provider-validator.d.ts.map +1 -0
  146. package/dist/provider-validator.js +85 -0
  147. package/dist/provider-validator.js.map +1 -0
  148. package/dist/registry/cache.d.ts +10 -0
  149. package/dist/registry/cache.d.ts.map +1 -0
  150. package/dist/registry/cache.js +36 -0
  151. package/dist/registry/cache.js.map +1 -0
  152. package/dist/registry/client.d.ts +19 -0
  153. package/dist/registry/client.d.ts.map +1 -0
  154. package/dist/registry/client.js +63 -0
  155. package/dist/registry/client.js.map +1 -0
  156. package/dist/registry/lockfile.d.ts +17 -0
  157. package/dist/registry/lockfile.d.ts.map +1 -0
  158. package/dist/registry/lockfile.js +61 -0
  159. package/dist/registry/lockfile.js.map +1 -0
  160. package/dist/registry/resolver.d.ts +13 -0
  161. package/dist/registry/resolver.d.ts.map +1 -0
  162. package/dist/registry/resolver.js +79 -0
  163. package/dist/registry/resolver.js.map +1 -0
  164. package/dist/registry/types.d.ts +59 -0
  165. package/dist/registry/types.d.ts.map +1 -0
  166. package/dist/registry/types.js +14 -0
  167. package/dist/registry/types.js.map +1 -0
  168. package/dist/run-logger.d.ts +8 -0
  169. package/dist/run-logger.d.ts.map +1 -0
  170. package/dist/run-logger.js +53 -0
  171. package/dist/run-logger.js.map +1 -0
  172. package/dist/run-store-factory.d.ts +9 -0
  173. package/dist/run-store-factory.d.ts.map +1 -0
  174. package/dist/run-store-factory.js +26 -0
  175. package/dist/run-store-factory.js.map +1 -0
  176. package/dist/studio-dir.d.ts +7 -0
  177. package/dist/studio-dir.d.ts.map +1 -0
  178. package/dist/studio-dir.js +27 -0
  179. package/dist/studio-dir.js.map +1 -0
  180. package/dist/utils/input-wizard.d.ts +4 -0
  181. package/dist/utils/input-wizard.d.ts.map +1 -0
  182. package/dist/utils/input-wizard.js +56 -0
  183. package/dist/utils/input-wizard.js.map +1 -0
  184. package/dist/utils/placeholders.d.ts +6 -0
  185. package/dist/utils/placeholders.d.ts.map +1 -0
  186. package/dist/utils/placeholders.js +12 -0
  187. package/dist/utils/placeholders.js.map +1 -0
  188. package/package.json +43 -0
  189. package/src/commands/api.ts +126 -0
  190. package/src/commands/config.ts +433 -0
  191. package/src/commands/init.ts +879 -0
  192. package/src/commands/install.ts +23 -0
  193. package/src/commands/integrations.ts +332 -0
  194. package/src/commands/list.ts +197 -0
  195. package/src/commands/logs.ts +119 -0
  196. package/src/commands/ollama.ts +168 -0
  197. package/src/commands/project.ts +167 -0
  198. package/src/commands/registry/audit.ts +87 -0
  199. package/src/commands/registry/index.ts +63 -0
  200. package/src/commands/registry/install.ts +222 -0
  201. package/src/commands/registry/publish.ts +112 -0
  202. package/src/commands/registry/remove.ts +89 -0
  203. package/src/commands/registry/search.ts +93 -0
  204. package/src/commands/registry/sync.ts +24 -0
  205. package/src/commands/registry/update.ts +63 -0
  206. package/src/commands/replay.ts +559 -0
  207. package/src/commands/run.ts +454 -0
  208. package/src/commands/status.ts +163 -0
  209. package/src/commands/template/index.ts +59 -0
  210. package/src/commands/template/validate.ts +175 -0
  211. package/src/commands/templates.ts +99 -0
  212. package/src/commands/tools.ts +227 -0
  213. package/src/commands/users.ts +127 -0
  214. package/src/commands/validate.ts +46 -0
  215. package/src/config.ts +101 -0
  216. package/src/index.ts +201 -0
  217. package/src/models-cache.ts +127 -0
  218. package/src/output/file-changes.ts +97 -0
  219. package/src/output/formatter.ts +85 -0
  220. package/src/output/formatters.ts +303 -0
  221. package/src/output/logger.ts +18 -0
  222. package/src/output/parallel-progress.ts +103 -0
  223. package/src/output/progress.ts +414 -0
  224. package/src/provider-validator.ts +109 -0
  225. package/src/registry/cache.ts +46 -0
  226. package/src/registry/client.ts +84 -0
  227. package/src/registry/lockfile.ts +68 -0
  228. package/src/registry/resolver.ts +113 -0
  229. package/src/registry/types.ts +66 -0
  230. package/src/run-logger.ts +66 -0
  231. package/src/run-store-factory.ts +30 -0
  232. package/src/studio-dir.ts +28 -0
  233. package/src/utils/input-wizard.ts +73 -0
  234. package/src/utils/placeholders.ts +10 -0
  235. package/templates/.studiorc.yaml +16 -0
  236. package/templates/projects/blank/metadata.json +7 -0
  237. package/templates/studio-config.yaml +14 -0
  238. package/tests/__stubs__/studio-runner.ts +104 -0
  239. package/tests/commands/api.test.ts +110 -0
  240. package/tests/commands/config.test.ts +221 -0
  241. package/tests/commands/init.test.ts +919 -0
  242. package/tests/commands/install.test.ts +52 -0
  243. package/tests/commands/integrations.test.ts +158 -0
  244. package/tests/commands/ollama.test.ts +139 -0
  245. package/tests/commands/project.test.ts +179 -0
  246. package/tests/commands/registry/audit.test.ts +56 -0
  247. package/tests/commands/registry/install.test.ts +200 -0
  248. package/tests/commands/registry/publish.test.ts +56 -0
  249. package/tests/commands/registry/remove.test.ts +103 -0
  250. package/tests/commands/registry/search.test.ts +44 -0
  251. package/tests/commands/registry/sync.test.ts +37 -0
  252. package/tests/commands/registry/update.test.ts +62 -0
  253. package/tests/commands/replay.test.ts +283 -0
  254. package/tests/commands/template/validate.test.ts +150 -0
  255. package/tests/commands/templates.test.ts +42 -0
  256. package/tests/commands/tools.test.ts +106 -0
  257. package/tests/config.test.ts +142 -0
  258. package/tests/formatter.test.ts +158 -0
  259. package/tests/integration/sigint.test.ts +188 -0
  260. package/tests/models-cache.test.ts +250 -0
  261. package/tests/output/file-changes.test.ts +178 -0
  262. package/tests/output/formatters.test.ts +448 -0
  263. package/tests/output/progress-spinner.test.ts +232 -0
  264. package/tests/output/progress-timer.test.ts +230 -0
  265. package/tests/provider-validator.test.ts +182 -0
  266. package/tests/registry/cache.test.ts +66 -0
  267. package/tests/registry/client.test.ts +70 -0
  268. package/tests/registry/lockfile.test.ts +87 -0
  269. package/tests/registry/resolver.test.ts +122 -0
  270. package/tests/run-logger-events.test.ts +326 -0
  271. package/tests/run-logger.test.ts +64 -0
  272. package/tests/run-store-factory.test.ts +51 -0
  273. package/tests/studio-dir.test.ts +31 -0
  274. package/tests/utils/input-wizard.test.ts +153 -0
  275. package/tests/utils/placeholders.test.ts +36 -0
  276. package/tsconfig.json +24 -0
  277. 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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,sBAAsB,GAAyC;IACnE,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,gBAAgB;IAC1B,WAAW,EAAE,mBAAmB;IAChC,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAa3D,KAAK,UAAU,gBAAgB,CAC7B,aAAqB,EACrB,OAAuB,EACvB,MAAsB,EACtB,QAA0B,EAC1B,KAAoB,EACpB,YAAsB,EACtB,SAAuC;IAEvC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAU,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAElC,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,OAAO,kDAAkD,CAAC,CAAC,CAAC;QAC5G,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;IAE5E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAmB,CAAC;IAE5C,qEAAqE;IACrE,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAoB,CAAC;QACjE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,KAAK,IAAI,MAAM,CAAC,CAAC;IAElH,IAAI,MAAc,CAAC;IACnB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;QACpD,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC5E,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAEvB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YACtE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;gBAC5B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,kDAAkD,MAAM,CAAC,QAAQ,8BAA8B,CAAC;gBACtH,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACpD,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QACnC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,GAAG,qBAAqB,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE;QACvB,OAAO;QACP,IAAI;QACJ,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM;QACN,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;KAC5D,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,IAAI,KAAK,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAE1E,mCAAmC;IACnC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,mBAAmB,CACrC,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,CAAC,OAAO,EAAE,EAAE;YACV,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAgB,CAAC;YAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,MAAM;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACrD,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAoB,CAAC,CAAC;gBAC7C,OAAO,CAAoB,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,gBAAgB,CACpB,GAAG,CAAC,IAAI,EACR,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,EACpF,MAAM,EACN,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,SAAS,CACV,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,OAAO,GAAG,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC;YAC5C,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBACtD,OAAO,GAAG,MAAM,OAAO,CAAC;oBACtB,OAAO,EAAE,kCAAkC,KAAK,GAAG;oBACnD,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBACpC,MAAM,gBAAgB,CACpB,GAAG,CAAC,IAAI,EACR,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,EAClE,MAAM,EACN,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,SAAS,CACV,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAqB,EAAE,UAA0B,EAAE;IACtF,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;QACjC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3F,MAAM,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAEjD,sCAAsC;IACtC,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,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,GAAG,EAA2B,CAAC;IAE3E,MAAM,gBAAgB,CACpB,aAAa,EACb,eAAe,EACf,MAAM,EACN,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,SAAS,CACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAqB,EAAE,UAA+B,EAAE;IAC3F,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -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":"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"}
@@ -0,0 +1,8 @@
1
+ interface SyncOptions {
2
+ cacheDir?: string;
3
+ force?: boolean;
4
+ silent?: boolean;
5
+ }
6
+ export declare function syncRegistry(options?: SyncOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=sync.d.ts.map
@@ -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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"}