craftdesk 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/.claude/settings.local.json +19 -0
  2. package/.github/workflows/ci.yml +94 -0
  3. package/API.md +414 -0
  4. package/README.md +778 -0
  5. package/TESTING.md +263 -0
  6. package/bin/craftdesk.js +4 -0
  7. package/dist/commands/add.d.ts +3 -0
  8. package/dist/commands/add.d.ts.map +1 -0
  9. package/dist/commands/add.js +284 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/config.d.ts +3 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +56 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/init.d.ts +3 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +57 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/install.d.ts +3 -0
  20. package/dist/commands/install.d.ts.map +1 -0
  21. package/dist/commands/install.js +109 -0
  22. package/dist/commands/install.js.map +1 -0
  23. package/dist/commands/list.d.ts +3 -0
  24. package/dist/commands/list.d.ts.map +1 -0
  25. package/dist/commands/list.js +117 -0
  26. package/dist/commands/list.js.map +1 -0
  27. package/dist/commands/remove.d.ts +3 -0
  28. package/dist/commands/remove.d.ts.map +1 -0
  29. package/dist/commands/remove.js +74 -0
  30. package/dist/commands/remove.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +51 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/services/config-manager.d.ts +88 -0
  36. package/dist/services/config-manager.d.ts.map +1 -0
  37. package/dist/services/config-manager.js +143 -0
  38. package/dist/services/config-manager.js.map +1 -0
  39. package/dist/services/git-resolver.d.ts +139 -0
  40. package/dist/services/git-resolver.d.ts.map +1 -0
  41. package/dist/services/git-resolver.js +340 -0
  42. package/dist/services/git-resolver.js.map +1 -0
  43. package/dist/services/installer.d.ts +98 -0
  44. package/dist/services/installer.d.ts.map +1 -0
  45. package/dist/services/installer.js +274 -0
  46. package/dist/services/installer.js.map +1 -0
  47. package/dist/services/registry-client.d.ts +27 -0
  48. package/dist/services/registry-client.d.ts.map +1 -0
  49. package/dist/services/registry-client.js +134 -0
  50. package/dist/services/registry-client.js.map +1 -0
  51. package/dist/types/config.d.ts +17 -0
  52. package/dist/types/config.d.ts.map +1 -0
  53. package/dist/types/config.js +3 -0
  54. package/dist/types/config.js.map +1 -0
  55. package/dist/types/craftdesk-json.d.ts +42 -0
  56. package/dist/types/craftdesk-json.d.ts.map +1 -0
  57. package/dist/types/craftdesk-json.js +3 -0
  58. package/dist/types/craftdesk-json.js.map +1 -0
  59. package/dist/types/craftdesk-lock.d.ts +34 -0
  60. package/dist/types/craftdesk-lock.d.ts.map +1 -0
  61. package/dist/types/craftdesk-lock.js +3 -0
  62. package/dist/types/craftdesk-lock.js.map +1 -0
  63. package/dist/utils/file-system.d.ts +10 -0
  64. package/dist/utils/file-system.d.ts.map +1 -0
  65. package/dist/utils/file-system.js +60 -0
  66. package/dist/utils/file-system.js.map +1 -0
  67. package/dist/utils/logger.d.ts +18 -0
  68. package/dist/utils/logger.d.ts.map +1 -0
  69. package/dist/utils/logger.js +72 -0
  70. package/dist/utils/logger.js.map +1 -0
  71. package/docs/DEPENDENCY_RESOLUTION.md +237 -0
  72. package/examples/craftdesk-all-sources.json +79 -0
  73. package/examples/craftdesk-git-monorepo.json +41 -0
  74. package/examples/craftdesk-multi-registry.json +40 -0
  75. package/examples/craftdesk-with-registries.json +49 -0
  76. package/examples/simple-craftdesk.json +10 -0
  77. package/package.json +32 -25
  78. package/src/commands/add.ts +314 -0
  79. package/src/commands/init.ts +55 -0
  80. package/src/commands/install.ts +126 -0
  81. package/src/commands/list.ts +126 -0
  82. package/src/commands/remove.ts +82 -0
  83. package/src/index.ts +56 -0
  84. package/src/services/config-manager.ts +150 -0
  85. package/src/services/git-resolver.ts +373 -0
  86. package/src/services/installer.ts +314 -0
  87. package/src/services/registry-client.ts +163 -0
  88. package/src/types/craftdesk-json.ts +53 -0
  89. package/src/types/craftdesk-lock.ts +38 -0
  90. package/src/utils/file-system.ts +55 -0
  91. package/src/utils/logger.ts +82 -0
  92. package/tests/fixtures/craftdesk-git.json +17 -0
  93. package/tests/fixtures/craftdesk.json +15 -0
  94. package/tests/helpers/test-utils.ts +60 -0
  95. package/tests/integration/init-command.test.ts +70 -0
  96. package/tests/integration/list-command.test.ts +77 -0
  97. package/tests/unit/config-manager.test.ts +228 -0
  98. package/tests/unit/git-resolver.test.ts +303 -0
  99. package/tests/unit/installer.test.ts +105 -0
  100. package/tsconfig.json +20 -0
  101. package/vitest.config.ts +29 -0
  102. package/LICENSE +0 -21
  103. package/index.js +0 -4
@@ -0,0 +1,98 @@
1
+ import { CraftDeskLock, LockEntry } from '../types/craftdesk-lock';
2
+ /**
3
+ * Handles installation of crafts from various sources
4
+ *
5
+ * Supports installing from:
6
+ * - Registry packages (via download URLs)
7
+ * - Git repositories (with monorepo support)
8
+ * - Local archives
9
+ *
10
+ * Organizes installations by craft type in the .claude directory.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const installer = new Installer();
15
+ *
16
+ * // Install from lockfile
17
+ * const lockfile = await readLockfile();
18
+ * await installer.installFromLockfile(lockfile);
19
+ *
20
+ * // Install single craft
21
+ * await installer.installCraft('ruby-on-rails', lockEntry);
22
+ * ```
23
+ */
24
+ export declare class Installer {
25
+ private installPath;
26
+ constructor();
27
+ /**
28
+ * Installs all crafts defined in a lockfile
29
+ *
30
+ * Processes each craft sequentially, updating progress as it goes.
31
+ * Fails fast if any installation errors occur.
32
+ *
33
+ * @param lockfile - The craftdesk.lock content with all dependencies
34
+ * @throws Error if any craft fails to install
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const lockfile = {
39
+ * version: '1.0.0',
40
+ * lockfileVersion: 1,
41
+ * crafts: {
42
+ * 'ruby-on-rails': { version: '7.1.0', ... },
43
+ * 'postgres-expert': { version: '1.2.0', ... }
44
+ * }
45
+ * };
46
+ *
47
+ * await installer.installFromLockfile(lockfile);
48
+ * ```
49
+ */
50
+ installFromLockfile(lockfile: CraftDeskLock): Promise<void>;
51
+ /**
52
+ * Installs a single craft from registry or git source
53
+ *
54
+ * Installation process:
55
+ * 1. Determines installation directory based on craft type
56
+ * 2. For git dependencies: clones and extracts subdirectory
57
+ * 3. For registry: downloads archive, verifies, and extracts
58
+ * 4. Creates metadata file for tracking installation
59
+ *
60
+ * @param name - The name of the craft to install
61
+ * @param entry - Lockfile entry containing installation details
62
+ * @throws Error if download or extraction fails
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * // Install from registry
67
+ * await installer.installCraft('ruby-on-rails', {
68
+ * version: '7.1.0',
69
+ * resolved: 'https://craftdesk.ai/download/...',
70
+ * type: 'skill',
71
+ * dependencies: {}
72
+ * });
73
+ *
74
+ * // Install from git
75
+ * await installer.installCraft('custom-auth', {
76
+ * version: '1.0.0',
77
+ * git: 'https://github.com/company/auth.git',
78
+ * branch: 'main',
79
+ * type: 'agent',
80
+ * dependencies: {}
81
+ * });
82
+ * ```
83
+ */
84
+ installCraft(name: string, entry: LockEntry): Promise<void>;
85
+ private installFromGit;
86
+ private getTypeDirectory;
87
+ private downloadFile;
88
+ private extractArchive;
89
+ private createMetadata;
90
+ removeCraft(name: string, type: string): Promise<void>;
91
+ listInstalled(): Promise<Array<{
92
+ name: string;
93
+ version: string;
94
+ type: string;
95
+ }>>;
96
+ }
97
+ export declare const installer: Installer;
98
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGnE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAS;;IAM5B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAgCnD,cAAc;IA2D5B,OAAO,CAAC,gBAAgB;YAeV,YAAY;YAgBZ,cAAc;YAcd,cAAc;IAkBtB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CA8BvF;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC"}
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.installer = exports.Installer = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const logger_1 = require("../utils/logger");
11
+ const config_manager_1 = require("./config-manager");
12
+ const file_system_1 = require("../utils/file-system");
13
+ /**
14
+ * Handles installation of crafts from various sources
15
+ *
16
+ * Supports installing from:
17
+ * - Registry packages (via download URLs)
18
+ * - Git repositories (with monorepo support)
19
+ * - Local archives
20
+ *
21
+ * Organizes installations by craft type in the .claude directory.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const installer = new Installer();
26
+ *
27
+ * // Install from lockfile
28
+ * const lockfile = await readLockfile();
29
+ * await installer.installFromLockfile(lockfile);
30
+ *
31
+ * // Install single craft
32
+ * await installer.installCraft('ruby-on-rails', lockEntry);
33
+ * ```
34
+ */
35
+ class Installer {
36
+ installPath;
37
+ constructor() {
38
+ this.installPath = config_manager_1.configManager.getInstallPath();
39
+ }
40
+ /**
41
+ * Installs all crafts defined in a lockfile
42
+ *
43
+ * Processes each craft sequentially, updating progress as it goes.
44
+ * Fails fast if any installation errors occur.
45
+ *
46
+ * @param lockfile - The craftdesk.lock content with all dependencies
47
+ * @throws Error if any craft fails to install
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const lockfile = {
52
+ * version: '1.0.0',
53
+ * lockfileVersion: 1,
54
+ * crafts: {
55
+ * 'ruby-on-rails': { version: '7.1.0', ... },
56
+ * 'postgres-expert': { version: '1.2.0', ... }
57
+ * }
58
+ * };
59
+ *
60
+ * await installer.installFromLockfile(lockfile);
61
+ * ```
62
+ */
63
+ async installFromLockfile(lockfile) {
64
+ const installDir = path_1.default.join(process.cwd(), this.installPath);
65
+ await (0, file_system_1.ensureDir)(installDir);
66
+ const crafts = Object.entries(lockfile.crafts);
67
+ let installed = 0;
68
+ for (const [name, entry] of crafts) {
69
+ try {
70
+ logger_1.logger.updateSpinner(`Installing ${name}@${entry.version} (${installed + 1}/${crafts.length})`);
71
+ await this.installCraft(name, entry);
72
+ installed++;
73
+ }
74
+ catch (error) {
75
+ logger_1.logger.failSpinner(`Failed to install ${name}: ${error.message}`);
76
+ throw error;
77
+ }
78
+ }
79
+ logger_1.logger.succeedSpinner(`Installed ${installed} crafts`);
80
+ }
81
+ /**
82
+ * Installs a single craft from registry or git source
83
+ *
84
+ * Installation process:
85
+ * 1. Determines installation directory based on craft type
86
+ * 2. For git dependencies: clones and extracts subdirectory
87
+ * 3. For registry: downloads archive, verifies, and extracts
88
+ * 4. Creates metadata file for tracking installation
89
+ *
90
+ * @param name - The name of the craft to install
91
+ * @param entry - Lockfile entry containing installation details
92
+ * @throws Error if download or extraction fails
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * // Install from registry
97
+ * await installer.installCraft('ruby-on-rails', {
98
+ * version: '7.1.0',
99
+ * resolved: 'https://craftdesk.ai/download/...',
100
+ * type: 'skill',
101
+ * dependencies: {}
102
+ * });
103
+ *
104
+ * // Install from git
105
+ * await installer.installCraft('custom-auth', {
106
+ * version: '1.0.0',
107
+ * git: 'https://github.com/company/auth.git',
108
+ * branch: 'main',
109
+ * type: 'agent',
110
+ * dependencies: {}
111
+ * });
112
+ * ```
113
+ */
114
+ async installCraft(name, entry) {
115
+ const installDir = path_1.default.join(process.cwd(), this.installPath);
116
+ // Determine install subdirectory based on type
117
+ const typeDir = this.getTypeDirectory(entry.type);
118
+ const craftDir = path_1.default.join(installDir, typeDir, name);
119
+ // Create directory
120
+ await (0, file_system_1.ensureDir)(craftDir);
121
+ // Check if this is a git dependency
122
+ if (entry.git) {
123
+ await this.installFromGit(craftDir, entry);
124
+ }
125
+ else {
126
+ // Download craft archive
127
+ const archivePath = path_1.default.join(craftDir, 'archive.tar.gz');
128
+ await this.downloadFile(entry.resolved, archivePath);
129
+ // Verify integrity (TODO: implement SHA-256 check)
130
+ // await this.verifyIntegrity(archivePath, entry.integrity);
131
+ // Extract archive
132
+ await this.extractArchive(archivePath, craftDir);
133
+ // Clean up archive
134
+ await fs_extra_1.default.remove(archivePath);
135
+ }
136
+ // Create metadata file
137
+ await this.createMetadata(craftDir, name, entry);
138
+ }
139
+ async installFromGit(craftDir, entry) {
140
+ const tempDir = path_1.default.join(craftDir, '.tmp-git');
141
+ try {
142
+ // Clone the repository
143
+ const { execSync } = require('child_process');
144
+ // Build clone command with appropriate ref
145
+ let cloneCmd = `git clone --depth 1`;
146
+ if (entry.branch) {
147
+ cloneCmd += ` -b ${entry.branch}`;
148
+ }
149
+ else if (entry.tag) {
150
+ cloneCmd += ` -b ${entry.tag}`;
151
+ }
152
+ cloneCmd += ` ${entry.git} ${tempDir}`;
153
+ logger_1.logger.debug(`Cloning git repository: ${cloneCmd}`);
154
+ execSync(cloneCmd, { stdio: 'pipe' });
155
+ // If specific commit, checkout that commit
156
+ if (entry.commit) {
157
+ execSync(`cd ${tempDir} && git fetch --unshallow && git checkout ${entry.commit}`, { stdio: 'pipe' });
158
+ }
159
+ // Handle direct file reference
160
+ if (entry.file) {
161
+ const sourceFile = path_1.default.join(tempDir, entry.file);
162
+ const destFile = path_1.default.join(craftDir, path_1.default.basename(entry.file));
163
+ if (await fs_extra_1.default.pathExists(sourceFile)) {
164
+ await fs_extra_1.default.copy(sourceFile, destFile, { overwrite: true });
165
+ }
166
+ else {
167
+ throw new Error(`File not found: ${entry.file} in ${entry.git}`);
168
+ }
169
+ }
170
+ else {
171
+ // Copy from subdirectory if specified, otherwise copy entire repo
172
+ const sourcePath = entry.path ? path_1.default.join(tempDir, entry.path) : tempDir;
173
+ // Copy contents to craft directory
174
+ const files = await fs_extra_1.default.readdir(sourcePath);
175
+ for (const file of files) {
176
+ if (file !== '.tmp-git' && file !== '.git') {
177
+ await fs_extra_1.default.copy(path_1.default.join(sourcePath, file), path_1.default.join(craftDir, file), { overwrite: true });
178
+ }
179
+ }
180
+ }
181
+ }
182
+ finally {
183
+ // Clean up temp directory
184
+ await fs_extra_1.default.remove(tempDir);
185
+ }
186
+ }
187
+ getTypeDirectory(type) {
188
+ switch (type) {
189
+ case 'skill':
190
+ return 'skills';
191
+ case 'agent':
192
+ return 'agents';
193
+ case 'command':
194
+ return 'commands';
195
+ case 'hook':
196
+ return 'hooks';
197
+ default:
198
+ return 'crafts';
199
+ }
200
+ }
201
+ async downloadFile(url, outputPath) {
202
+ const response = await (0, axios_1.default)({
203
+ method: 'GET',
204
+ url: url,
205
+ responseType: 'stream'
206
+ });
207
+ const writer = fs_extra_1.default.createWriteStream(outputPath);
208
+ response.data.pipe(writer);
209
+ return new Promise((resolve, reject) => {
210
+ writer.on('finish', resolve);
211
+ writer.on('error', reject);
212
+ });
213
+ }
214
+ async extractArchive(archivePath, outputDir) {
215
+ // For now, just copy some placeholder files
216
+ // In production, this would extract a tar.gz or zip archive
217
+ const type = path_1.default.basename(outputDir).includes('skill') ? 'SKILL' : 'AGENT';
218
+ const mainFile = `${type}.md`;
219
+ await fs_extra_1.default.writeFile(path_1.default.join(outputDir, mainFile), `# ${path_1.default.basename(outputDir)}\n\nThis is a placeholder for the ${type.toLowerCase()} content.\n`, 'utf-8');
220
+ }
221
+ async createMetadata(craftDir, name, entry) {
222
+ const metadata = {
223
+ name,
224
+ version: entry.version,
225
+ type: entry.type,
226
+ author: entry.author,
227
+ installedAt: new Date().toISOString(),
228
+ registry: entry.registry,
229
+ dependencies: entry.dependencies
230
+ };
231
+ await fs_extra_1.default.writeFile(path_1.default.join(craftDir, '.craftdesk-metadata.json'), JSON.stringify(metadata, null, 2), 'utf-8');
232
+ }
233
+ async removeCraft(name, type) {
234
+ const installDir = path_1.default.join(process.cwd(), this.installPath);
235
+ const typeDir = this.getTypeDirectory(type);
236
+ const craftDir = path_1.default.join(installDir, typeDir, name);
237
+ if (await fs_extra_1.default.pathExists(craftDir)) {
238
+ await fs_extra_1.default.remove(craftDir);
239
+ logger_1.logger.success(`Removed ${name}`);
240
+ }
241
+ else {
242
+ logger_1.logger.warn(`${name} is not installed`);
243
+ }
244
+ }
245
+ async listInstalled() {
246
+ const installDir = path_1.default.join(process.cwd(), this.installPath);
247
+ const installed = [];
248
+ if (!await fs_extra_1.default.pathExists(installDir)) {
249
+ return installed;
250
+ }
251
+ const typeDirs = ['skills', 'agents', 'commands', 'hooks', 'plugins'];
252
+ for (const typeDir of typeDirs) {
253
+ const dir = path_1.default.join(installDir, typeDir);
254
+ if (!await fs_extra_1.default.pathExists(dir))
255
+ continue;
256
+ const crafts = await fs_extra_1.default.readdir(dir);
257
+ for (const craftName of crafts) {
258
+ const metadataPath = path_1.default.join(dir, craftName, '.craftdesk-metadata.json');
259
+ if (await fs_extra_1.default.pathExists(metadataPath)) {
260
+ const metadata = await fs_extra_1.default.readJson(metadataPath);
261
+ installed.push({
262
+ name: craftName,
263
+ version: metadata.version,
264
+ type: metadata.type
265
+ });
266
+ }
267
+ }
268
+ }
269
+ return installed;
270
+ }
271
+ }
272
+ exports.Installer = Installer;
273
+ exports.installer = new Installer();
274
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface CraftInfo {
2
+ name: string;
3
+ author: string;
4
+ version: string;
5
+ type: 'skill' | 'agent' | 'command' | 'hook' | 'plugin';
6
+ description?: string;
7
+ dependencies?: Record<string, string>;
8
+ download_url?: string;
9
+ integrity?: string;
10
+ }
11
+ export interface ResolveResponse {
12
+ resolved: Record<string, any>;
13
+ lockfile: any;
14
+ }
15
+ export declare class RegistryClient {
16
+ private axiosInstance;
17
+ private getClient;
18
+ getCraftInfo(craftName: string, version?: string, registryOverride?: string): Promise<CraftInfo | null>;
19
+ private resolveRegistry;
20
+ listVersions(craftName: string): Promise<string[]>;
21
+ resolveDependencies(dependencies: Record<string, string>): Promise<ResolveResponse | null>;
22
+ downloadCraft(downloadUrl: string, outputPath: string): Promise<void>;
23
+ searchCrafts(query: string, type?: string): Promise<CraftInfo[]>;
24
+ private parseCraftName;
25
+ }
26
+ export declare const registryClient: RegistryClient;
27
+ //# sourceMappingURL=registry-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,QAAQ,EAAE,GAAG,CAAC;CACf;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAA8B;YAErC,SAAS;IAajB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YA8B/F,eAAe;IAgBvB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAelD,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAiB1F,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAarE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBtE,OAAO,CAAC,cAAc;CAavB;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registryClient = exports.RegistryClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const config_manager_1 = require("./config-manager");
9
+ const logger_1 = require("../utils/logger");
10
+ class RegistryClient {
11
+ axiosInstance = null;
12
+ async getClient(registryUrl) {
13
+ const token = await config_manager_1.configManager.getAuthToken(registryUrl);
14
+ return axios_1.default.create({
15
+ baseURL: registryUrl,
16
+ headers: {
17
+ 'Content-Type': 'application/json',
18
+ ...(token ? { 'Authorization': `Bearer ${token}` } : {})
19
+ },
20
+ timeout: 30000
21
+ });
22
+ }
23
+ async getCraftInfo(craftName, version, registryOverride) {
24
+ // Get registry URL - can be overridden by dependency-specific registry
25
+ const registryUrl = registryOverride
26
+ ? await this.resolveRegistry(registryOverride)
27
+ : await config_manager_1.configManager.getRegistryForCraft(craftName);
28
+ const client = await this.getClient(registryUrl);
29
+ // Parse craft name (could be @scope/name or just name)
30
+ const [author, name] = this.parseCraftName(craftName);
31
+ try {
32
+ const endpoint = version
33
+ ? `/api/v1/crafts/${author}/${name}/versions/${version}`
34
+ : `/api/v1/crafts/${author}/${name}`;
35
+ logger_1.logger.debug(`Fetching craft info from ${registryUrl}${endpoint}`);
36
+ const response = await client.get(endpoint);
37
+ return response.data.craft || response.data;
38
+ }
39
+ catch (error) {
40
+ if (error.response?.status === 404) {
41
+ logger_1.logger.error(`Craft '${craftName}' not found in registry`);
42
+ }
43
+ else {
44
+ logger_1.logger.error(`Failed to fetch craft info: ${error.message}`);
45
+ }
46
+ return null;
47
+ }
48
+ }
49
+ async resolveRegistry(registry) {
50
+ // If it's a URL, use it directly
51
+ if (registry.startsWith('http://') || registry.startsWith('https://')) {
52
+ return registry;
53
+ }
54
+ // Look it up in the craftdesk.json registries section
55
+ const craftDeskJson = await config_manager_1.configManager.getCraftDeskJson();
56
+ if (craftDeskJson?.registries?.[registry]) {
57
+ return craftDeskJson.registries[registry].url;
58
+ }
59
+ // If not found, assume it's a URL without protocol
60
+ return `https://${registry}`;
61
+ }
62
+ async listVersions(craftName) {
63
+ const registryUrl = await config_manager_1.configManager.getRegistryForCraft(craftName);
64
+ const client = await this.getClient(registryUrl);
65
+ const [author, name] = this.parseCraftName(craftName);
66
+ try {
67
+ const response = await client.get(`/api/v1/crafts/${author}/${name}/versions`);
68
+ return response.data.versions || [];
69
+ }
70
+ catch (error) {
71
+ logger_1.logger.error(`Failed to fetch versions: ${error.message}`);
72
+ return [];
73
+ }
74
+ }
75
+ async resolveDependencies(dependencies) {
76
+ // Get the default registry from craftdesk.json or use fallback
77
+ const craftDesk = await config_manager_1.configManager.getCraftDeskJson();
78
+ const registryUrl = craftDesk?.registries?.default?.url || 'https://craftdesk.ai';
79
+ const client = await this.getClient(registryUrl);
80
+ try {
81
+ logger_1.logger.debug('Resolving dependencies via API...');
82
+ const response = await client.post('/api/v1/resolve', { dependencies });
83
+ return response.data;
84
+ }
85
+ catch (error) {
86
+ logger_1.logger.error(`Failed to resolve dependencies: ${error.message}`);
87
+ return null;
88
+ }
89
+ }
90
+ async downloadCraft(downloadUrl, outputPath) {
91
+ try {
92
+ const response = await axios_1.default.get(downloadUrl, {
93
+ responseType: 'stream'
94
+ });
95
+ // TODO: Save to file and extract
96
+ logger_1.logger.debug(`Downloaded craft from ${downloadUrl}`);
97
+ }
98
+ catch (error) {
99
+ throw new Error(`Failed to download craft: ${error.message}`);
100
+ }
101
+ }
102
+ async searchCrafts(query, type) {
103
+ // Get the default registry from craftdesk.json or use fallback
104
+ const craftDesk = await config_manager_1.configManager.getCraftDeskJson();
105
+ const registryUrl = craftDesk?.registries?.default?.url || 'https://craftdesk.ai';
106
+ const client = await this.getClient(registryUrl);
107
+ try {
108
+ const params = { q: query };
109
+ if (type)
110
+ params.type = type;
111
+ const response = await client.get('/api/v1/crafts', { params });
112
+ return response.data.crafts || [];
113
+ }
114
+ catch (error) {
115
+ logger_1.logger.error(`Failed to search crafts: ${error.message}`);
116
+ return [];
117
+ }
118
+ }
119
+ parseCraftName(craftName) {
120
+ if (craftName.startsWith('@')) {
121
+ // Scoped craft: @acme/skill-name
122
+ const parts = craftName.substring(1).split('/');
123
+ if (parts.length === 2) {
124
+ return [`@${parts[0]}`, parts[1]];
125
+ }
126
+ }
127
+ // Assume author is 'anthropic' for unscoped crafts (default)
128
+ // This should be configurable or determined by registry
129
+ return ['anthropic', craftName];
130
+ }
131
+ }
132
+ exports.RegistryClient = RegistryClient;
133
+ exports.registryClient = new RegistryClient();
134
+ //# sourceMappingURL=registry-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface CraftDeskConfig {
2
+ registries?: {
3
+ default?: string;
4
+ [key: string]: string | undefined;
5
+ };
6
+ scopes?: {
7
+ [scope: string]: string;
8
+ };
9
+ auth?: {
10
+ [host: string]: {
11
+ token: string;
12
+ };
13
+ };
14
+ installPath?: string;
15
+ cache?: string;
16
+ }
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;KACzB,CAAC;IAEF,IAAI,CAAC,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IAEF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ export interface CraftDeskJson {
2
+ name: string;
3
+ version: string;
4
+ type?: 'skill' | 'agent' | 'command' | 'hook' | 'plugin';
5
+ description?: string;
6
+ author?: string;
7
+ license?: string;
8
+ homepage?: string;
9
+ repository?: {
10
+ type: string;
11
+ url: string;
12
+ };
13
+ keywords?: string[];
14
+ dependencies?: Record<string, string | DependencyConfig>;
15
+ devDependencies?: Record<string, string | DependencyConfig>;
16
+ peerDependencies?: Record<string, string | DependencyConfig>;
17
+ optionalDependencies?: Record<string, string | DependencyConfig>;
18
+ registries?: Record<string, RegistryConfig>;
19
+ commands?: Record<string, string | CommandConfig>;
20
+ hooks?: Record<string, string[]>;
21
+ [key: string]: any;
22
+ }
23
+ export interface DependencyConfig {
24
+ version?: string;
25
+ registry?: string;
26
+ git?: string;
27
+ branch?: string;
28
+ tag?: string;
29
+ commit?: string;
30
+ path?: string;
31
+ file?: string;
32
+ }
33
+ export interface RegistryConfig {
34
+ url: string;
35
+ scope?: string;
36
+ auth?: string;
37
+ }
38
+ export interface CommandConfig {
39
+ version: string;
40
+ config?: Record<string, any>;
41
+ }
42
+ //# sourceMappingURL=craftdesk-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craftdesk-json.d.ts","sourceRoot":"","sources":["../../src/types/craftdesk-json.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAIpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;IAC7D,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;IAGjE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAG5C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAGjC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=craftdesk-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craftdesk-json.js","sourceRoot":"","sources":["../../src/types/craftdesk-json.ts"],"names":[],"mappings":""}