craftdesk 0.3.0 → 0.4.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 (175) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +943 -46
  3. package/dist/commands/add.d.ts +5 -0
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +302 -6
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/convert.d.ts +8 -0
  8. package/dist/commands/convert.d.ts.map +1 -0
  9. package/dist/commands/convert.js +146 -0
  10. package/dist/commands/convert.js.map +1 -0
  11. package/dist/commands/info.d.ts +8 -0
  12. package/dist/commands/info.d.ts.map +1 -0
  13. package/dist/commands/info.js +66 -0
  14. package/dist/commands/info.js.map +1 -0
  15. package/dist/commands/init.d.ts +5 -0
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +8 -2
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/install.d.ts +5 -0
  20. package/dist/commands/install.d.ts.map +1 -1
  21. package/dist/commands/install.js +24 -4
  22. package/dist/commands/install.js.map +1 -1
  23. package/dist/commands/list.d.ts +5 -0
  24. package/dist/commands/list.d.ts.map +1 -1
  25. package/dist/commands/list.js +72 -7
  26. package/dist/commands/list.js.map +1 -1
  27. package/dist/commands/login.d.ts +8 -0
  28. package/dist/commands/login.d.ts.map +1 -0
  29. package/dist/commands/login.js +158 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/logout.d.ts +8 -0
  32. package/dist/commands/logout.d.ts.map +1 -0
  33. package/dist/commands/logout.js +51 -0
  34. package/dist/commands/logout.js.map +1 -0
  35. package/dist/commands/outdated.d.ts +23 -0
  36. package/dist/commands/outdated.d.ts.map +1 -0
  37. package/dist/commands/outdated.js +268 -0
  38. package/dist/commands/outdated.js.map +1 -0
  39. package/dist/commands/publish.d.ts +8 -0
  40. package/dist/commands/publish.d.ts.map +1 -0
  41. package/dist/commands/publish.js +198 -0
  42. package/dist/commands/publish.js.map +1 -0
  43. package/dist/commands/remove.d.ts +5 -0
  44. package/dist/commands/remove.d.ts.map +1 -1
  45. package/dist/commands/remove.js +51 -10
  46. package/dist/commands/remove.js.map +1 -1
  47. package/dist/commands/search.d.ts +8 -0
  48. package/dist/commands/search.d.ts.map +1 -0
  49. package/dist/commands/search.js +60 -0
  50. package/dist/commands/search.js.map +1 -0
  51. package/dist/commands/update.d.ts +8 -0
  52. package/dist/commands/update.d.ts.map +1 -0
  53. package/dist/commands/update.js +369 -0
  54. package/dist/commands/update.js.map +1 -0
  55. package/dist/commands/whoami.d.ts +8 -0
  56. package/dist/commands/whoami.d.ts.map +1 -0
  57. package/dist/commands/whoami.js +58 -0
  58. package/dist/commands/whoami.js.map +1 -0
  59. package/dist/converters/base-converter.d.ts +89 -0
  60. package/dist/converters/base-converter.d.ts.map +1 -0
  61. package/dist/converters/base-converter.js +249 -0
  62. package/dist/converters/base-converter.js.map +1 -0
  63. package/dist/converters/continue-converter.d.ts +53 -0
  64. package/dist/converters/continue-converter.d.ts.map +1 -0
  65. package/dist/converters/continue-converter.js +243 -0
  66. package/dist/converters/continue-converter.js.map +1 -0
  67. package/dist/converters/cursor-converter.d.ts +70 -0
  68. package/dist/converters/cursor-converter.d.ts.map +1 -0
  69. package/dist/converters/cursor-converter.js +272 -0
  70. package/dist/converters/cursor-converter.js.map +1 -0
  71. package/dist/index.js +34 -3
  72. package/dist/index.js.map +1 -1
  73. package/dist/services/config-manager.d.ts +128 -10
  74. package/dist/services/config-manager.d.ts.map +1 -1
  75. package/dist/services/config-manager.js +189 -18
  76. package/dist/services/config-manager.js.map +1 -1
  77. package/dist/services/converter.d.ts +53 -0
  78. package/dist/services/converter.d.ts.map +1 -0
  79. package/dist/services/converter.js +185 -0
  80. package/dist/services/converter.js.map +1 -0
  81. package/dist/services/craft-wrapper.d.ts +108 -0
  82. package/dist/services/craft-wrapper.d.ts.map +1 -0
  83. package/dist/services/craft-wrapper.js +268 -0
  84. package/dist/services/craft-wrapper.js.map +1 -0
  85. package/dist/services/git-resolver.d.ts +9 -3
  86. package/dist/services/git-resolver.d.ts.map +1 -1
  87. package/dist/services/git-resolver.js +29 -10
  88. package/dist/services/git-resolver.js.map +1 -1
  89. package/dist/services/installer.d.ts +51 -1
  90. package/dist/services/installer.d.ts.map +1 -1
  91. package/dist/services/installer.js +245 -14
  92. package/dist/services/installer.js.map +1 -1
  93. package/dist/services/plugin-resolver.d.ts +80 -0
  94. package/dist/services/plugin-resolver.d.ts.map +1 -0
  95. package/dist/services/plugin-resolver.js +182 -0
  96. package/dist/services/plugin-resolver.js.map +1 -0
  97. package/dist/services/registry-client.d.ts +132 -5
  98. package/dist/services/registry-client.d.ts.map +1 -1
  99. package/dist/services/registry-client.js +239 -34
  100. package/dist/services/registry-client.js.map +1 -1
  101. package/dist/services/settings-manager.d.ts +151 -0
  102. package/dist/services/settings-manager.d.ts.map +1 -0
  103. package/dist/services/settings-manager.js +333 -0
  104. package/dist/services/settings-manager.js.map +1 -0
  105. package/dist/types/claude-settings.d.ts +155 -0
  106. package/dist/types/claude-settings.d.ts.map +1 -0
  107. package/dist/types/claude-settings.js +20 -0
  108. package/dist/types/claude-settings.js.map +1 -0
  109. package/dist/types/converter.d.ts +98 -0
  110. package/dist/types/converter.d.ts.map +1 -0
  111. package/dist/types/converter.js +6 -0
  112. package/dist/types/converter.js.map +1 -0
  113. package/dist/types/craftdesk-json.d.ts +63 -3
  114. package/dist/types/craftdesk-json.d.ts.map +1 -1
  115. package/dist/types/craftdesk-lock.d.ts +62 -1
  116. package/dist/types/craftdesk-lock.d.ts.map +1 -1
  117. package/dist/utils/crypto.d.ts +23 -0
  118. package/dist/utils/crypto.d.ts.map +1 -0
  119. package/dist/utils/crypto.js +52 -0
  120. package/dist/utils/crypto.js.map +1 -0
  121. package/dist/utils/file-system.d.ts +43 -0
  122. package/dist/utils/file-system.d.ts.map +1 -1
  123. package/dist/utils/file-system.js +45 -2
  124. package/dist/utils/file-system.js.map +1 -1
  125. package/dist/utils/logger.d.ts +75 -0
  126. package/dist/utils/logger.d.ts.map +1 -1
  127. package/dist/utils/logger.js +76 -1
  128. package/dist/utils/logger.js.map +1 -1
  129. package/dist/utils/version-utils.d.ts +63 -0
  130. package/dist/utils/version-utils.d.ts.map +1 -0
  131. package/dist/utils/version-utils.js +130 -0
  132. package/dist/utils/version-utils.js.map +1 -0
  133. package/package.json +36 -9
  134. package/.claude/settings.local.json +0 -19
  135. package/.github/workflows/ci.yml +0 -94
  136. package/API.md +0 -414
  137. package/TESTING.md +0 -263
  138. package/dist/commands/config.d.ts +0 -3
  139. package/dist/commands/config.d.ts.map +0 -1
  140. package/dist/commands/config.js +0 -56
  141. package/dist/commands/config.js.map +0 -1
  142. package/dist/types/config.d.ts +0 -17
  143. package/dist/types/config.d.ts.map +0 -1
  144. package/dist/types/config.js +0 -3
  145. package/dist/types/config.js.map +0 -1
  146. package/docs/DEPENDENCY_RESOLUTION.md +0 -237
  147. package/examples/craftdesk-all-sources.json +0 -79
  148. package/examples/craftdesk-git-monorepo.json +0 -41
  149. package/examples/craftdesk-multi-registry.json +0 -40
  150. package/examples/craftdesk-with-registries.json +0 -49
  151. package/examples/simple-craftdesk.json +0 -10
  152. package/src/commands/add.ts +0 -314
  153. package/src/commands/init.ts +0 -55
  154. package/src/commands/install.ts +0 -126
  155. package/src/commands/list.ts +0 -126
  156. package/src/commands/remove.ts +0 -82
  157. package/src/index.ts +0 -56
  158. package/src/services/config-manager.ts +0 -150
  159. package/src/services/git-resolver.ts +0 -373
  160. package/src/services/installer.ts +0 -314
  161. package/src/services/registry-client.ts +0 -163
  162. package/src/types/craftdesk-json.ts +0 -53
  163. package/src/types/craftdesk-lock.ts +0 -38
  164. package/src/utils/file-system.ts +0 -55
  165. package/src/utils/logger.ts +0 -82
  166. package/tests/fixtures/craftdesk-git.json +0 -17
  167. package/tests/fixtures/craftdesk.json +0 -15
  168. package/tests/helpers/test-utils.ts +0 -60
  169. package/tests/integration/init-command.test.ts +0 -70
  170. package/tests/integration/list-command.test.ts +0 -77
  171. package/tests/unit/config-manager.test.ts +0 -228
  172. package/tests/unit/git-resolver.test.ts +0 -303
  173. package/tests/unit/installer.test.ts +0 -105
  174. package/tsconfig.json +0 -20
  175. package/vitest.config.ts +0 -29
@@ -7,9 +7,13 @@ exports.installer = exports.Installer = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const fs_extra_1 = __importDefault(require("fs-extra"));
9
9
  const axios_1 = __importDefault(require("axios"));
10
+ const adm_zip_1 = __importDefault(require("adm-zip"));
11
+ const child_process_1 = require("child_process");
10
12
  const logger_1 = require("../utils/logger");
11
13
  const config_manager_1 = require("./config-manager");
14
+ const settings_manager_1 = require("./settings-manager");
12
15
  const file_system_1 = require("../utils/file-system");
16
+ const crypto_1 = require("../utils/crypto");
13
17
  /**
14
18
  * Handles installation of crafts from various sources
15
19
  *
@@ -72,7 +76,8 @@ class Installer {
72
76
  installed++;
73
77
  }
74
78
  catch (error) {
75
- logger_1.logger.failSpinner(`Failed to install ${name}: ${error.message}`);
79
+ const message = error instanceof Error ? error.message : String(error);
80
+ logger_1.logger.failSpinner(`Failed to install ${name}: ${message}`);
76
81
  throw error;
77
82
  }
78
83
  }
@@ -123,11 +128,25 @@ class Installer {
123
128
  await this.installFromGit(craftDir, entry);
124
129
  }
125
130
  else {
126
- // Download craft archive
127
- const archivePath = path_1.default.join(craftDir, 'archive.tar.gz');
131
+ // Download craft archive (ZIP format from CraftDesk registry)
132
+ const archivePath = path_1.default.join(craftDir, 'archive.zip');
128
133
  await this.downloadFile(entry.resolved, archivePath);
129
- // Verify integrity (TODO: implement SHA-256 check)
130
- // await this.verifyIntegrity(archivePath, entry.integrity);
134
+ // Verify integrity using SHA-256 checksum
135
+ if (entry.integrity) {
136
+ logger_1.logger.debug(`Verifying checksum for ${name}...`);
137
+ const isValid = await (0, crypto_1.verifyFileChecksum)(archivePath, entry.integrity);
138
+ if (!isValid) {
139
+ await fs_extra_1.default.remove(archivePath);
140
+ throw new Error(`Checksum verification failed for ${name}@${entry.version}. ` +
141
+ `Expected: ${(0, crypto_1.formatChecksum)(entry.integrity)}... ` +
142
+ `This may indicate a corrupted download or a security issue. ` +
143
+ `Try running 'craftdesk install --no-lockfile' to re-resolve dependencies.`);
144
+ }
145
+ logger_1.logger.debug(`Checksum verified: ${(0, crypto_1.formatChecksum)(entry.integrity)}...`);
146
+ }
147
+ else {
148
+ logger_1.logger.warn(`No checksum available for ${name}@${entry.version} - skipping verification`);
149
+ }
131
150
  // Extract archive
132
151
  await this.extractArchive(archivePath, craftDir);
133
152
  // Clean up archive
@@ -135,12 +154,15 @@ class Installer {
135
154
  }
136
155
  // Create metadata file
137
156
  await this.createMetadata(craftDir, name, entry);
157
+ // Register plugin in settings if this is a plugin type
158
+ if (entry.type === 'plugin') {
159
+ await this.registerPlugin(name, entry, craftDir);
160
+ }
138
161
  }
139
162
  async installFromGit(craftDir, entry) {
140
163
  const tempDir = path_1.default.join(craftDir, '.tmp-git');
141
164
  try {
142
165
  // Clone the repository
143
- const { execSync } = require('child_process');
144
166
  // Build clone command with appropriate ref
145
167
  let cloneCmd = `git clone --depth 1`;
146
168
  if (entry.branch) {
@@ -151,10 +173,15 @@ class Installer {
151
173
  }
152
174
  cloneCmd += ` ${entry.git} ${tempDir}`;
153
175
  logger_1.logger.debug(`Cloning git repository: ${cloneCmd}`);
154
- execSync(cloneCmd, { stdio: 'pipe' });
176
+ (0, child_process_1.execSync)(cloneCmd, { stdio: 'pipe' });
155
177
  // If specific commit, checkout that commit
156
178
  if (entry.commit) {
157
- execSync(`cd ${tempDir} && git fetch --unshallow && git checkout ${entry.commit}`, { stdio: 'pipe' });
179
+ // Check if repo is shallow before trying to unshallow
180
+ const isShallow = await fs_extra_1.default.pathExists(path_1.default.join(tempDir, '.git', 'shallow'));
181
+ if (isShallow) {
182
+ (0, child_process_1.execSync)(`cd ${tempDir} && git fetch --unshallow`, { stdio: 'pipe' });
183
+ }
184
+ (0, child_process_1.execSync)(`cd ${tempDir} && git checkout ${entry.commit}`, { stdio: 'pipe' });
158
185
  }
159
186
  // Handle direct file reference
160
187
  if (entry.file) {
@@ -184,6 +211,12 @@ class Installer {
184
211
  await fs_extra_1.default.remove(tempDir);
185
212
  }
186
213
  }
214
+ /**
215
+ * Get the type-specific directory for a craft type
216
+ *
217
+ * @param type - The craft type (skill, agent, command, hook, plugin, collection)
218
+ * @returns Directory name for the craft type
219
+ */
187
220
  getTypeDirectory(type) {
188
221
  switch (type) {
189
222
  case 'skill':
@@ -194,10 +227,22 @@ class Installer {
194
227
  return 'commands';
195
228
  case 'hook':
196
229
  return 'hooks';
230
+ case 'plugin':
231
+ return 'plugins';
232
+ case 'collection':
233
+ return 'collections';
197
234
  default:
198
235
  return 'crafts';
199
236
  }
200
237
  }
238
+ /**
239
+ * Get the install path (e.g., '.claude')
240
+ *
241
+ * @returns The installation directory path
242
+ */
243
+ getInstallPath() {
244
+ return this.installPath;
245
+ }
201
246
  async downloadFile(url, outputPath) {
202
247
  const response = await (0, axios_1.default)({
203
248
  method: 'GET',
@@ -212,11 +257,16 @@ class Installer {
212
257
  });
213
258
  }
214
259
  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');
260
+ try {
261
+ // CraftDesk web API returns ZIP archives
262
+ const zip = new adm_zip_1.default(archivePath);
263
+ zip.extractAllTo(outputDir, /* overwrite */ true);
264
+ logger_1.logger.debug(`Extracted ZIP archive to ${outputDir}`);
265
+ }
266
+ catch (error) {
267
+ const message = error instanceof Error ? error.message : String(error);
268
+ throw new Error(`Failed to extract archive: ${message}`);
269
+ }
220
270
  }
221
271
  async createMetadata(craftDir, name, entry) {
222
272
  const metadata = {
@@ -230,11 +280,186 @@ class Installer {
230
280
  };
231
281
  await fs_extra_1.default.writeFile(path_1.default.join(craftDir, '.craftdesk-metadata.json'), JSON.stringify(metadata, null, 2), 'utf-8');
232
282
  }
283
+ /**
284
+ * Register a plugin in .claude/settings.json
285
+ *
286
+ * @param name - The plugin name
287
+ * @param entry - The lock file entry for this plugin
288
+ * @param craftDir - The directory where the plugin is installed
289
+ * @returns Promise that resolves when registration is complete
290
+ */
291
+ async registerPlugin(name, entry, craftDir) {
292
+ try {
293
+ // Try to read plugin.json manifest
294
+ const manifest = await this.readPluginManifest(craftDir);
295
+ // Scan directory for actual components
296
+ const scannedComponents = await this.scanPluginComponents(craftDir);
297
+ // Merge manifest components (declared) with scanned components (actual)
298
+ // Manifest takes precedence if both exist (manifest is source of truth)
299
+ const components = {};
300
+ // Start with scanned components
301
+ if (scannedComponents.skills)
302
+ components.skills = scannedComponents.skills;
303
+ if (scannedComponents.agents)
304
+ components.agents = scannedComponents.agents;
305
+ if (scannedComponents.commands)
306
+ components.commands = scannedComponents.commands;
307
+ if (scannedComponents.hooks)
308
+ components.hooks = scannedComponents.hooks;
309
+ // Override with manifest if provided (manifest is source of truth)
310
+ if (manifest?.components) {
311
+ if (manifest.components.skills)
312
+ components.skills = manifest.components.skills;
313
+ if (manifest.components.agents)
314
+ components.agents = manifest.components.agents;
315
+ if (manifest.components.commands)
316
+ components.commands = manifest.components.commands;
317
+ if (manifest.components.hooks)
318
+ components.hooks = manifest.components.hooks;
319
+ }
320
+ // Build plugin config for settings
321
+ const pluginConfig = {
322
+ name,
323
+ version: entry.version,
324
+ type: 'plugin',
325
+ enabled: true,
326
+ installPath: path_1.default.relative(this.installPath, craftDir),
327
+ installedAt: new Date().toISOString(),
328
+ dependencies: entry.dependencies ? Object.keys(entry.dependencies) : [],
329
+ isDependency: entry.installedAs === 'dependency',
330
+ // Copy metadata from plugin.json manifest
331
+ ...(manifest?.description && { description: manifest.description }),
332
+ ...(manifest?.author && { author: manifest.author }),
333
+ ...(manifest?.license && { license: manifest.license }),
334
+ ...(manifest?.homepage && { homepage: manifest.homepage }),
335
+ ...(manifest?.repository && { repository: manifest.repository }),
336
+ ...(manifest?.keywords && { keywords: manifest.keywords }),
337
+ // Use merged components (scanned + manifest)
338
+ ...(Object.keys(components).length > 0 && { components }),
339
+ // CraftDesk-specific fields
340
+ ...(manifest?.scripts && { scripts: manifest.scripts })
341
+ };
342
+ await settings_manager_1.settingsManager.registerPlugin(pluginConfig);
343
+ logger_1.logger.debug(`Registered plugin ${name} in settings.json`);
344
+ // Register MCP servers if provided in manifest (official Claude Code field)
345
+ if (manifest?.mcpServers) {
346
+ if (typeof manifest.mcpServers === 'object' && !Array.isArray(manifest.mcpServers)) {
347
+ // Inline MCP server configuration
348
+ for (const [serverName, serverConfig] of Object.entries(manifest.mcpServers)) {
349
+ await settings_manager_1.settingsManager.registerMCPServer(serverName, serverConfig);
350
+ logger_1.logger.debug(`Registered MCP server: ${serverName}`);
351
+ }
352
+ }
353
+ else if (typeof manifest.mcpServers === 'string') {
354
+ // Path to .mcp.json file - would need to read and parse it
355
+ const mcpPath = path_1.default.join(craftDir, manifest.mcpServers);
356
+ if (await fs_extra_1.default.pathExists(mcpPath)) {
357
+ try {
358
+ const mcpConfig = await fs_extra_1.default.readJson(mcpPath);
359
+ for (const [serverName, serverConfig] of Object.entries(mcpConfig)) {
360
+ await settings_manager_1.settingsManager.registerMCPServer(serverName, serverConfig);
361
+ logger_1.logger.debug(`Registered MCP server from ${manifest.mcpServers}: ${serverName}`);
362
+ }
363
+ }
364
+ catch (error) {
365
+ const message = error instanceof Error ? error.message : String(error);
366
+ logger_1.logger.warn(`Failed to read MCP config from ${manifest.mcpServers}: ${message}`);
367
+ }
368
+ }
369
+ }
370
+ }
371
+ }
372
+ catch (error) {
373
+ const message = error instanceof Error ? error.message : String(error);
374
+ logger_1.logger.warn(`Failed to register plugin ${name}: ${message}`);
375
+ // Non-fatal - plugin is still installed, just not registered in settings
376
+ }
377
+ }
378
+ /**
379
+ * Read plugin.json manifest from plugin directory
380
+ * Plugin manifest is located at .claude-plugin/plugin.json
381
+ *
382
+ * @param pluginDir - Path to the plugin directory containing .claude-plugin/plugin.json
383
+ * @returns The parsed plugin manifest or null if not found or invalid
384
+ */
385
+ async readPluginManifest(pluginDir) {
386
+ const manifestPath = path_1.default.join(pluginDir, '.claude-plugin', 'plugin.json');
387
+ try {
388
+ if (await fs_extra_1.default.pathExists(manifestPath)) {
389
+ const content = await fs_extra_1.default.readFile(manifestPath, 'utf-8');
390
+ return JSON.parse(content);
391
+ }
392
+ return null;
393
+ }
394
+ catch (error) {
395
+ const message = error instanceof Error ? error.message : String(error);
396
+ logger_1.logger.debug(`Failed to read plugin manifest: ${message}`);
397
+ return null;
398
+ }
399
+ }
400
+ /**
401
+ * Scan plugin directory to discover components
402
+ * This ensures we find all skills/agents/commands/hooks even if not listed in plugin.json
403
+ *
404
+ * @param pluginDir - Path to the plugin directory to scan for components
405
+ * @returns Object containing arrays of discovered skills, agents, commands, and hooks
406
+ */
407
+ async scanPluginComponents(pluginDir) {
408
+ const components = {};
409
+ const componentTypes = ['skills', 'agents', 'commands', 'hooks'];
410
+ for (const type of componentTypes) {
411
+ const typeDir = path_1.default.join(pluginDir, type);
412
+ if (await fs_extra_1.default.pathExists(typeDir)) {
413
+ try {
414
+ const entries = await fs_extra_1.default.readdir(typeDir, { withFileTypes: true });
415
+ let items;
416
+ // Commands and hooks are files (*.md), not directories
417
+ if (type === 'commands' || type === 'hooks') {
418
+ items = entries
419
+ .filter(entry => entry.isFile() && entry.name.endsWith('.md'))
420
+ .map(entry => entry.name);
421
+ }
422
+ else {
423
+ // Skills and agents are directories
424
+ items = entries
425
+ .filter(entry => entry.isDirectory())
426
+ .map(entry => entry.name);
427
+ }
428
+ if (items.length > 0) {
429
+ components[type] = items;
430
+ }
431
+ }
432
+ catch (error) {
433
+ const message = error instanceof Error ? error.message : String(error);
434
+ logger_1.logger.debug(`Failed to scan ${type} directory: ${message}`);
435
+ }
436
+ }
437
+ }
438
+ return components;
439
+ }
440
+ /**
441
+ * Remove an installed craft from the project
442
+ * Unregisters plugins from settings and removes the craft directory
443
+ *
444
+ * @param name - Name of the craft to remove
445
+ * @param type - Type of craft (plugin, skill, agent, command, hook)
446
+ */
233
447
  async removeCraft(name, type) {
234
448
  const installDir = path_1.default.join(process.cwd(), this.installPath);
235
449
  const typeDir = this.getTypeDirectory(type);
236
450
  const craftDir = path_1.default.join(installDir, typeDir, name);
237
451
  if (await fs_extra_1.default.pathExists(craftDir)) {
452
+ // Unregister plugin from settings if this is a plugin
453
+ if (type === 'plugin') {
454
+ try {
455
+ await settings_manager_1.settingsManager.unregisterPlugin(name);
456
+ logger_1.logger.debug(`Unregistered plugin ${name} from settings`);
457
+ }
458
+ catch (error) {
459
+ const message = error instanceof Error ? error.message : String(error);
460
+ logger_1.logger.warn(`Failed to unregister plugin: ${message}`);
461
+ }
462
+ }
238
463
  await fs_extra_1.default.remove(craftDir);
239
464
  logger_1.logger.success(`Removed ${name}`);
240
465
  }
@@ -242,13 +467,19 @@ class Installer {
242
467
  logger_1.logger.warn(`${name} is not installed`);
243
468
  }
244
469
  }
470
+ /**
471
+ * List all installed crafts in the project
472
+ * Scans the installation directory for all craft types and reads their metadata
473
+ *
474
+ * @returns Array of installed crafts with name, version, and type information
475
+ */
245
476
  async listInstalled() {
246
477
  const installDir = path_1.default.join(process.cwd(), this.installPath);
247
478
  const installed = [];
248
479
  if (!await fs_extra_1.default.pathExists(installDir)) {
249
480
  return installed;
250
481
  }
251
- const typeDirs = ['skills', 'agents', 'commands', 'hooks', 'plugins'];
482
+ const typeDirs = ['skills', 'agents', 'commands', 'hooks', 'plugins', 'collections'];
252
483
  for (const typeDir of typeDirs) {
253
484
  const dir = path_1.default.join(installDir, typeDir);
254
485
  if (!await fs_extra_1.default.pathExists(dir))
@@ -1 +1 @@
1
- {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,wDAA0B;AAC1B,kDAA0B;AAC1B,sDAA6B;AAC7B,iDAAyC;AACzC,4CAAyC;AACzC,qDAAiD;AACjD,yDAAqD;AAErD,sDAAiD;AACjD,4CAAqE;AAGrE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAa,SAAS;IACZ,WAAW,CAAS;IAE5B;QACE,IAAI,CAAC,WAAW,GAAG,8BAAa,CAAC,cAAc,EAAE,CAAC;IACpD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAuB;QAC/C,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,IAAA,uBAAS,EAAC,UAAU,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,eAAM,CAAC,aAAa,CAAC,cAAc,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAChG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACrC,SAAS,EAAE,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,eAAM,CAAC,WAAW,CAAC,qBAAqB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;gBAC5D,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,eAAM,CAAC,cAAc,CAAC,aAAa,SAAS,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,KAAgB;QAC/C,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE9D,+CAA+C;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEtD,mBAAmB;QACnB,MAAM,IAAA,uBAAS,EAAC,QAAQ,CAAC,CAAC;QAE1B,oCAAoC;QACpC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,8DAA8D;YAC9D,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACvD,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAErD,0CAA0C;YAC1C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,eAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,KAAK,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAkB,EAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;gBAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,kBAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC7B,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI;wBAC7D,aAAa,IAAA,uBAAc,EAAC,KAAK,CAAC,SAAS,CAAC,MAAM;wBAClD,8DAA8D;wBAC9D,2EAA2E,CAC5E,CAAC;gBACJ,CAAC;gBAED,eAAM,CAAC,KAAK,CAAC,sBAAsB,IAAA,uBAAc,EAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,IAAI,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;YAC5F,CAAC;YAED,kBAAkB;YAClB,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAEjD,mBAAmB;YACnB,MAAM,kBAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,uBAAuB;QACvB,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAEjD,uDAAuD;QACvD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,KAAgB;QAC7D,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,uBAAuB;YAEvB,2CAA2C;YAC3C,IAAI,QAAQ,GAAG,qBAAqB,CAAC;YAErC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,QAAQ,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;YACpC,CAAC;iBAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACrB,QAAQ,IAAI,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;YACjC,CAAC;YAED,QAAQ,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;YAEvC,eAAM,CAAC,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACpD,IAAA,wBAAQ,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtC,2CAA2C;YAC3C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,sDAAsD;gBACtD,MAAM,SAAS,GAAG,MAAM,kBAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC7E,IAAI,SAAS,EAAE,CAAC;oBACd,IAAA,wBAAQ,EAAC,MAAM,OAAO,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxE,CAAC;gBACD,IAAA,wBAAQ,EAAC,MAAM,OAAO,oBAAoB,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,+BAA+B;YAC/B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAEhE,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpC,MAAM,kBAAE,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,kEAAkE;gBAClE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBAEzE,mCAAmC;gBACnC,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC3C,MAAM,kBAAE,CAAC,IAAI,CACX,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAC3B,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EACzB,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QAEH,CAAC;gBAAS,CAAC;YACT,0BAA0B;YAC1B,MAAM,kBAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,IAAY;QAC3B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,OAAO,QAAQ,CAAC;YAClB,KAAK,OAAO;gBACV,OAAO,QAAQ,CAAC;YAClB,KAAK,SAAS;gBACZ,OAAO,UAAU,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,SAAS,CAAC;YACnB,KAAK,YAAY;gBACf,OAAO,aAAa,CAAC;YACvB;gBACE,OAAO,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,UAAkB;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC;YAC3B,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,GAAG;YACR,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,kBAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,SAAiB;QACjE,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,GAAG,GAAG,IAAI,iBAAM,CAAC,WAAW,CAAC,CAAC;YACpC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;YAClD,eAAM,CAAC,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,IAAY,EAAE,KAAgB;QAC3E,MAAM,QAAQ,GAAG;YACf,IAAI;YACJ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY;SACjC,CAAC;QAEF,MAAM,kBAAE,CAAC,SAAS,CAChB,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,0BAA0B,CAAC,EAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,KAAgB,EAAE,QAAgB;QAC3E,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAEzD,uCAAuC;YACvC,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAEpE,wEAAwE;YACxE,wEAAwE;YACxE,MAAM,UAAU,GAKZ,EAAE,CAAC;YAEP,gCAAgC;YAChC,IAAI,iBAAiB,CAAC,MAAM;gBAAE,UAAU,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;YAC3E,IAAI,iBAAiB,CAAC,MAAM;gBAAE,UAAU,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;YAC3E,IAAI,iBAAiB,CAAC,QAAQ;gBAAE,UAAU,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YACjF,IAAI,iBAAiB,CAAC,KAAK;gBAAE,UAAU,CAAC,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC;YAExE,mEAAmE;YACnE,IAAI,QAAQ,EAAE,UAAU,EAAE,CAAC;gBACzB,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM;oBAAE,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/E,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM;oBAAE,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/E,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ;oBAAE,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACrF,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK;oBAAE,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;YAC9E,CAAC;YAED,mCAAmC;YACnC,MAAM,YAAY,GAAG;gBACnB,IAAI;gBACJ,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,QAAiB;gBACvB,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;gBACtD,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;gBACvE,YAAY,EAAE,KAAK,CAAC,WAAW,KAAK,YAAY;gBAChD,0CAA0C;gBAC1C,GAAG,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACnE,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpD,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACvD,GAAG,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC1D,GAAG,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAChE,GAAG,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC1D,6CAA6C;gBAC7C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;gBACzD,4BAA4B;gBAC5B,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;aACxD,CAAC;YAEF,MAAM,kCAAe,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACnD,eAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,mBAAmB,CAAC,CAAC;YAE3D,4EAA4E;YAC5E,IAAI,QAAQ,EAAE,UAAU,EAAE,CAAC;gBACzB,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBACnF,kCAAkC;oBAClC,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC7E,MAAM,kCAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;wBAClE,eAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;oBACnD,2DAA2D;oBAC3D,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACzD,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;wBACjC,IAAI,CAAC;4BACH,MAAM,SAAS,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;4BAC7C,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gCACnE,MAAM,kCAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,YAA+B,CAAC,CAAC;gCACrF,eAAM,CAAC,KAAK,CAAC,8BAA8B,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC,CAAC;4BACnF,CAAC;wBACH,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BACvE,eAAM,CAAC,IAAI,CAAC,kCAAkC,QAAQ,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;wBACnF,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,eAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;YAC7D,yEAAyE;QAC3E,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QAChD,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;YAC/C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,eAAM,CAAC,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,oBAAoB,CAAC,SAAiB;QAMlD,MAAM,UAAU,GAKZ,EAAE,CAAC;QAEP,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAU,CAAC;QAE1E,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAE3C,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBACnE,IAAI,KAAe,CAAC;oBAEpB,uDAAuD;oBACvD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;wBAC5C,KAAK,GAAG,OAAO;6BACZ,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;6BAC7D,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC9B,CAAC;yBAAM,CAAC;wBACN,oCAAoC;wBACpC,KAAK,GAAG,OAAO;6BACZ,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;6BACpC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC9B,CAAC;oBAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,eAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,eAAe,OAAO,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAAY;QAC1C,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEtD,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,sDAAsD;YACtD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,kCAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBAC7C,eAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,gBAAgB,CAAC,CAAC;gBAC5D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,eAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,MAAM,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,eAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,SAAS,GAA2D,EAAE,CAAC;QAE7E,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QAErF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAExC,MAAM,MAAM,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC/B,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;gBAC3E,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBACjD,SAAS,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AA5gBD,8BA4gBC;AAEY,QAAA,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * PluginResolver - Resolves plugin dependencies
3
+ *
4
+ * Handles:
5
+ * - Reading plugin craftdesk.json files
6
+ * - Flattening nested dependencies
7
+ * - Building plugin dependency tree
8
+ * - Detecting circular dependencies
9
+ */
10
+ import type { PluginDependencyTree } from '../types/craftdesk-lock';
11
+ /**
12
+ * Information about a resolved plugin dependency
13
+ */
14
+ export interface ResolvedPlugin {
15
+ name: string;
16
+ version: string;
17
+ dependencies: Record<string, string | import('../types/craftdesk-json').DependencyConfig>;
18
+ isDependency: boolean;
19
+ requiredBy: string[];
20
+ }
21
+ /**
22
+ * Service for resolving plugin dependencies and building dependency trees
23
+ *
24
+ * Handles recursive dependency resolution, circular dependency detection,
25
+ * and flattening nested plugin dependencies
26
+ */
27
+ export declare class PluginResolver {
28
+ private resolvedPlugins;
29
+ private resolutionStack;
30
+ /**
31
+ * Resolve plugin dependencies recursively
32
+ *
33
+ * @param pluginPath - Path to plugin directory
34
+ * @param parentName - Name of parent plugin (for tracking requiredBy)
35
+ * @returns Flattened dependency map
36
+ */
37
+ resolvePluginDependencies(pluginPath: string, parentName?: string): Promise<Record<string, ResolvedPlugin>>;
38
+ /**
39
+ * Build plugin dependency tree for lockfile
40
+ *
41
+ * @returns Plugin dependency tree structure
42
+ */
43
+ buildPluginTree(): PluginDependencyTree;
44
+ /**
45
+ * Get flattened dependencies
46
+ *
47
+ * This is what goes into craftdesk.json
48
+ *
49
+ * @returns Flattened dependency map
50
+ */
51
+ getFlattenedDependencies(): Record<string, string | import('../types/craftdesk-json').DependencyConfig>;
52
+ /**
53
+ * Get only directly installed plugins (not dependencies)
54
+ *
55
+ * @returns Array of directly installed plugins
56
+ */
57
+ getDirectPlugins(): ResolvedPlugin[];
58
+ /**
59
+ * Get only dependency plugins (not directly installed)
60
+ *
61
+ * @returns Array of dependency plugins
62
+ */
63
+ getDependencyPlugins(): ResolvedPlugin[];
64
+ /**
65
+ * Read plugin manifest (craftdesk.json)
66
+ *
67
+ * @param pluginPath - Path to plugin directory
68
+ * @returns Parsed manifest or null if not found
69
+ * @private
70
+ */
71
+ private readPluginManifest;
72
+ /**
73
+ * Reset resolver state
74
+ *
75
+ * Clears all resolved plugins and resolution stack
76
+ */
77
+ reset(): void;
78
+ }
79
+ export declare const pluginResolver: PluginResolver;
80
+ //# sourceMappingURL=plugin-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-resolver.d.ts","sourceRoot":"","sources":["../../src/services/plugin-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,yBAAyB,EAAE,gBAAgB,CAAC,CAAC;IAC1F,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,eAAe,CAAgB;IAEvC;;;;;;OAMG;IACG,yBAAyB,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAiE1C;;;;OAIG;IACH,eAAe,IAAI,oBAAoB;IAevC;;;;;;OAMG;IACH,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,yBAAyB,EAAE,gBAAgB,CAAC;IAoBvG;;;;OAIG;IACH,gBAAgB,IAAI,cAAc,EAAE;IAIpC;;;;OAIG;IACH,oBAAoB,IAAI,cAAc,EAAE;IAIxC;;;;;;OAMG;YACW,kBAAkB;IAgBhC;;;;OAIG;IACH,KAAK,IAAI,IAAI;CAId;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * PluginResolver - Resolves plugin dependencies
4
+ *
5
+ * Handles:
6
+ * - Reading plugin craftdesk.json files
7
+ * - Flattening nested dependencies
8
+ * - Building plugin dependency tree
9
+ * - Detecting circular dependencies
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.pluginResolver = exports.PluginResolver = void 0;
16
+ const fs_extra_1 = __importDefault(require("fs-extra"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const logger_1 = require("../utils/logger");
19
+ /**
20
+ * Service for resolving plugin dependencies and building dependency trees
21
+ *
22
+ * Handles recursive dependency resolution, circular dependency detection,
23
+ * and flattening nested plugin dependencies
24
+ */
25
+ class PluginResolver {
26
+ resolvedPlugins = new Map();
27
+ resolutionStack = [];
28
+ /**
29
+ * Resolve plugin dependencies recursively
30
+ *
31
+ * @param pluginPath - Path to plugin directory
32
+ * @param parentName - Name of parent plugin (for tracking requiredBy)
33
+ * @returns Flattened dependency map
34
+ */
35
+ async resolvePluginDependencies(pluginPath, parentName) {
36
+ // Read plugin's craftdesk.json
37
+ const manifest = await this.readPluginManifest(pluginPath);
38
+ if (!manifest) {
39
+ throw new Error(`No craftdesk.json found in plugin: ${pluginPath}`);
40
+ }
41
+ const pluginName = manifest.name;
42
+ // Check for circular dependencies
43
+ if (this.resolutionStack.includes(pluginName)) {
44
+ const cycle = [...this.resolutionStack, pluginName].join(' → ');
45
+ throw new Error(`Circular dependency detected: ${cycle}`);
46
+ }
47
+ // Add to resolution stack
48
+ this.resolutionStack.push(pluginName);
49
+ try {
50
+ // If already resolved, just add requiredBy
51
+ if (this.resolvedPlugins.has(pluginName)) {
52
+ const existing = this.resolvedPlugins.get(pluginName);
53
+ if (parentName && !existing.requiredBy.includes(parentName)) {
54
+ existing.requiredBy.push(parentName);
55
+ }
56
+ return Object.fromEntries(this.resolvedPlugins);
57
+ }
58
+ // Create resolved entry
59
+ const resolved = {
60
+ name: pluginName,
61
+ version: manifest.version,
62
+ dependencies: manifest.dependencies || {},
63
+ isDependency: !!parentName,
64
+ requiredBy: parentName ? [parentName] : []
65
+ };
66
+ this.resolvedPlugins.set(pluginName, resolved);
67
+ // Recursively resolve dependencies
68
+ if (manifest.dependencies) {
69
+ for (const [depName, depVersion] of Object.entries(manifest.dependencies)) {
70
+ // Skip if dependency is a string (version) - these are resolved by registry
71
+ if (typeof depVersion === 'string') {
72
+ logger_1.logger.debug(`Dependency ${depName} will be resolved by registry`);
73
+ continue;
74
+ }
75
+ // Handle git dependencies with subdirectories
76
+ if (depVersion.git && depVersion.path) {
77
+ // Dependency is in a subdirectory of git repo - we'll need to clone and resolve
78
+ logger_1.logger.debug(`Dependency ${depName} requires git clone for resolution`);
79
+ continue;
80
+ }
81
+ }
82
+ }
83
+ return Object.fromEntries(this.resolvedPlugins);
84
+ }
85
+ finally {
86
+ // Remove from resolution stack
87
+ this.resolutionStack.pop();
88
+ }
89
+ }
90
+ /**
91
+ * Build plugin dependency tree for lockfile
92
+ *
93
+ * @returns Plugin dependency tree structure
94
+ */
95
+ buildPluginTree() {
96
+ const tree = {};
97
+ for (const [name, plugin] of this.resolvedPlugins) {
98
+ tree[name] = {
99
+ version: plugin.version,
100
+ dependencies: Object.keys(plugin.dependencies),
101
+ isDependency: plugin.isDependency,
102
+ requiredBy: plugin.requiredBy
103
+ };
104
+ }
105
+ return tree;
106
+ }
107
+ /**
108
+ * Get flattened dependencies
109
+ *
110
+ * This is what goes into craftdesk.json
111
+ *
112
+ * @returns Flattened dependency map
113
+ */
114
+ getFlattenedDependencies() {
115
+ const flattened = {};
116
+ for (const [name, plugin] of this.resolvedPlugins) {
117
+ flattened[name] = plugin.version;
118
+ // Add plugin's dependencies
119
+ for (const [depName, depVersion] of Object.entries(plugin.dependencies)) {
120
+ if (typeof depVersion === 'string') {
121
+ flattened[depName] = depVersion;
122
+ }
123
+ else {
124
+ // Complex dependency config - we'll add it as-is
125
+ flattened[depName] = depVersion;
126
+ }
127
+ }
128
+ }
129
+ return flattened;
130
+ }
131
+ /**
132
+ * Get only directly installed plugins (not dependencies)
133
+ *
134
+ * @returns Array of directly installed plugins
135
+ */
136
+ getDirectPlugins() {
137
+ return Array.from(this.resolvedPlugins.values()).filter(p => !p.isDependency);
138
+ }
139
+ /**
140
+ * Get only dependency plugins (not directly installed)
141
+ *
142
+ * @returns Array of dependency plugins
143
+ */
144
+ getDependencyPlugins() {
145
+ return Array.from(this.resolvedPlugins.values()).filter(p => p.isDependency);
146
+ }
147
+ /**
148
+ * Read plugin manifest (craftdesk.json)
149
+ *
150
+ * @param pluginPath - Path to plugin directory
151
+ * @returns Parsed manifest or null if not found
152
+ * @private
153
+ */
154
+ async readPluginManifest(pluginPath) {
155
+ const manifestPath = path_1.default.join(pluginPath, 'craftdesk.json');
156
+ try {
157
+ if (await fs_extra_1.default.pathExists(manifestPath)) {
158
+ const content = await fs_extra_1.default.readFile(manifestPath, 'utf-8');
159
+ return JSON.parse(content);
160
+ }
161
+ return null;
162
+ }
163
+ catch (error) {
164
+ const message = error instanceof Error ? error.message : String(error);
165
+ logger_1.logger.debug(`Failed to read plugin manifest at ${manifestPath}: ${message}`);
166
+ return null;
167
+ }
168
+ }
169
+ /**
170
+ * Reset resolver state
171
+ *
172
+ * Clears all resolved plugins and resolution stack
173
+ */
174
+ reset() {
175
+ this.resolvedPlugins.clear();
176
+ this.resolutionStack = [];
177
+ }
178
+ }
179
+ exports.PluginResolver = PluginResolver;
180
+ // Export singleton instance
181
+ exports.pluginResolver = new PluginResolver();
182
+ //# sourceMappingURL=plugin-resolver.js.map