craftdesk 0.3.0 → 0.5.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 (215) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +1609 -132
  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 +306 -8
  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/detect-agents.d.ts +14 -0
  12. package/dist/commands/detect-agents.d.ts.map +1 -0
  13. package/dist/commands/detect-agents.js +86 -0
  14. package/dist/commands/detect-agents.js.map +1 -0
  15. package/dist/commands/embed.d.ts +14 -0
  16. package/dist/commands/embed.d.ts.map +1 -0
  17. package/dist/commands/embed.js +147 -0
  18. package/dist/commands/embed.js.map +1 -0
  19. package/dist/commands/info.d.ts +8 -0
  20. package/dist/commands/info.d.ts.map +1 -0
  21. package/dist/commands/info.js +66 -0
  22. package/dist/commands/info.js.map +1 -0
  23. package/dist/commands/init.d.ts +5 -0
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +8 -2
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/install.d.ts +5 -0
  28. package/dist/commands/install.d.ts.map +1 -1
  29. package/dist/commands/install.js +24 -4
  30. package/dist/commands/install.js.map +1 -1
  31. package/dist/commands/list.d.ts +5 -0
  32. package/dist/commands/list.d.ts.map +1 -1
  33. package/dist/commands/list.js +75 -7
  34. package/dist/commands/list.js.map +1 -1
  35. package/dist/commands/login.d.ts +8 -0
  36. package/dist/commands/login.d.ts.map +1 -0
  37. package/dist/commands/login.js +158 -0
  38. package/dist/commands/login.js.map +1 -0
  39. package/dist/commands/logout.d.ts +8 -0
  40. package/dist/commands/logout.d.ts.map +1 -0
  41. package/dist/commands/logout.js +51 -0
  42. package/dist/commands/logout.js.map +1 -0
  43. package/dist/commands/outdated.d.ts +23 -0
  44. package/dist/commands/outdated.d.ts.map +1 -0
  45. package/dist/commands/outdated.js +268 -0
  46. package/dist/commands/outdated.js.map +1 -0
  47. package/dist/commands/publish.d.ts +8 -0
  48. package/dist/commands/publish.d.ts.map +1 -0
  49. package/dist/commands/publish.js +203 -0
  50. package/dist/commands/publish.js.map +1 -0
  51. package/dist/commands/remove.d.ts +5 -0
  52. package/dist/commands/remove.d.ts.map +1 -1
  53. package/dist/commands/remove.js +51 -10
  54. package/dist/commands/remove.js.map +1 -1
  55. package/dist/commands/search.d.ts +8 -0
  56. package/dist/commands/search.d.ts.map +1 -0
  57. package/dist/commands/search.js +60 -0
  58. package/dist/commands/search.js.map +1 -0
  59. package/dist/commands/setup-multi-agent.d.ts +17 -0
  60. package/dist/commands/setup-multi-agent.d.ts.map +1 -0
  61. package/dist/commands/setup-multi-agent.js +188 -0
  62. package/dist/commands/setup-multi-agent.js.map +1 -0
  63. package/dist/commands/sync.d.ts +14 -0
  64. package/dist/commands/sync.d.ts.map +1 -0
  65. package/dist/commands/sync.js +144 -0
  66. package/dist/commands/sync.js.map +1 -0
  67. package/dist/commands/unembed.d.ts +14 -0
  68. package/dist/commands/unembed.d.ts.map +1 -0
  69. package/dist/commands/unembed.js +96 -0
  70. package/dist/commands/unembed.js.map +1 -0
  71. package/dist/commands/update.d.ts +8 -0
  72. package/dist/commands/update.d.ts.map +1 -0
  73. package/dist/commands/update.js +372 -0
  74. package/dist/commands/update.js.map +1 -0
  75. package/dist/commands/verify.d.ts +14 -0
  76. package/dist/commands/verify.d.ts.map +1 -0
  77. package/dist/commands/verify.js +143 -0
  78. package/dist/commands/verify.js.map +1 -0
  79. package/dist/commands/whoami.d.ts +8 -0
  80. package/dist/commands/whoami.d.ts.map +1 -0
  81. package/dist/commands/whoami.js +58 -0
  82. package/dist/commands/whoami.js.map +1 -0
  83. package/dist/converters/base-converter.d.ts +89 -0
  84. package/dist/converters/base-converter.d.ts.map +1 -0
  85. package/dist/converters/base-converter.js +249 -0
  86. package/dist/converters/base-converter.js.map +1 -0
  87. package/dist/converters/continue-converter.d.ts +53 -0
  88. package/dist/converters/continue-converter.d.ts.map +1 -0
  89. package/dist/converters/continue-converter.js +243 -0
  90. package/dist/converters/continue-converter.js.map +1 -0
  91. package/dist/converters/cursor-converter.d.ts +70 -0
  92. package/dist/converters/cursor-converter.d.ts.map +1 -0
  93. package/dist/converters/cursor-converter.js +272 -0
  94. package/dist/converters/cursor-converter.js.map +1 -0
  95. package/dist/index.js +56 -3
  96. package/dist/index.js.map +1 -1
  97. package/dist/services/agent-detector.d.ts +57 -0
  98. package/dist/services/agent-detector.d.ts.map +1 -0
  99. package/dist/services/agent-detector.js +146 -0
  100. package/dist/services/agent-detector.js.map +1 -0
  101. package/dist/services/config-manager.d.ts +128 -10
  102. package/dist/services/config-manager.d.ts.map +1 -1
  103. package/dist/services/config-manager.js +190 -18
  104. package/dist/services/config-manager.js.map +1 -1
  105. package/dist/services/converter.d.ts +53 -0
  106. package/dist/services/converter.d.ts.map +1 -0
  107. package/dist/services/converter.js +185 -0
  108. package/dist/services/converter.js.map +1 -0
  109. package/dist/services/craft-wrapper.d.ts +108 -0
  110. package/dist/services/craft-wrapper.d.ts.map +1 -0
  111. package/dist/services/craft-wrapper.js +268 -0
  112. package/dist/services/craft-wrapper.js.map +1 -0
  113. package/dist/services/git-resolver.d.ts +9 -3
  114. package/dist/services/git-resolver.d.ts.map +1 -1
  115. package/dist/services/git-resolver.js +44 -20
  116. package/dist/services/git-resolver.js.map +1 -1
  117. package/dist/services/gitignore-manager.d.ts +74 -0
  118. package/dist/services/gitignore-manager.d.ts.map +1 -0
  119. package/dist/services/gitignore-manager.js +188 -0
  120. package/dist/services/gitignore-manager.js.map +1 -0
  121. package/dist/services/installer.d.ts +60 -1
  122. package/dist/services/installer.d.ts.map +1 -1
  123. package/dist/services/installer.js +295 -20
  124. package/dist/services/installer.js.map +1 -1
  125. package/dist/services/multi-agent-sync.d.ts +88 -0
  126. package/dist/services/multi-agent-sync.d.ts.map +1 -0
  127. package/dist/services/multi-agent-sync.js +316 -0
  128. package/dist/services/multi-agent-sync.js.map +1 -0
  129. package/dist/services/plugin-resolver.d.ts +80 -0
  130. package/dist/services/plugin-resolver.d.ts.map +1 -0
  131. package/dist/services/plugin-resolver.js +183 -0
  132. package/dist/services/plugin-resolver.js.map +1 -0
  133. package/dist/services/registry-client.d.ts +132 -5
  134. package/dist/services/registry-client.d.ts.map +1 -1
  135. package/dist/services/registry-client.js +239 -34
  136. package/dist/services/registry-client.js.map +1 -1
  137. package/dist/services/settings-manager.d.ts +151 -0
  138. package/dist/services/settings-manager.d.ts.map +1 -0
  139. package/dist/services/settings-manager.js +333 -0
  140. package/dist/services/settings-manager.js.map +1 -0
  141. package/dist/types/claude-settings.d.ts +155 -0
  142. package/dist/types/claude-settings.d.ts.map +1 -0
  143. package/dist/types/claude-settings.js +20 -0
  144. package/dist/types/claude-settings.js.map +1 -0
  145. package/dist/types/converter.d.ts +98 -0
  146. package/dist/types/converter.d.ts.map +1 -0
  147. package/dist/types/converter.js +6 -0
  148. package/dist/types/converter.js.map +1 -0
  149. package/dist/types/craftdesk-json.d.ts +76 -3
  150. package/dist/types/craftdesk-json.d.ts.map +1 -1
  151. package/dist/types/craftdesk-lock.d.ts +62 -1
  152. package/dist/types/craftdesk-lock.d.ts.map +1 -1
  153. package/dist/types/multi-agent.d.ts +85 -0
  154. package/dist/types/multi-agent.d.ts.map +1 -0
  155. package/dist/types/multi-agent.js +6 -0
  156. package/dist/types/multi-agent.js.map +1 -0
  157. package/dist/utils/crypto.d.ts +23 -0
  158. package/dist/utils/crypto.d.ts.map +1 -0
  159. package/dist/utils/crypto.js +52 -0
  160. package/dist/utils/crypto.js.map +1 -0
  161. package/dist/utils/file-system.d.ts +43 -0
  162. package/dist/utils/file-system.d.ts.map +1 -1
  163. package/dist/utils/file-system.js +45 -2
  164. package/dist/utils/file-system.js.map +1 -1
  165. package/dist/utils/logger.d.ts +75 -0
  166. package/dist/utils/logger.d.ts.map +1 -1
  167. package/dist/utils/logger.js +76 -1
  168. package/dist/utils/logger.js.map +1 -1
  169. package/dist/utils/version-utils.d.ts +63 -0
  170. package/dist/utils/version-utils.d.ts.map +1 -0
  171. package/dist/utils/version-utils.js +130 -0
  172. package/dist/utils/version-utils.js.map +1 -0
  173. package/package.json +36 -9
  174. package/.claude/settings.local.json +0 -19
  175. package/.github/workflows/ci.yml +0 -94
  176. package/API.md +0 -414
  177. package/TESTING.md +0 -263
  178. package/dist/commands/config.d.ts +0 -3
  179. package/dist/commands/config.d.ts.map +0 -1
  180. package/dist/commands/config.js +0 -56
  181. package/dist/commands/config.js.map +0 -1
  182. package/dist/types/config.d.ts +0 -17
  183. package/dist/types/config.d.ts.map +0 -1
  184. package/dist/types/config.js +0 -3
  185. package/dist/types/config.js.map +0 -1
  186. package/docs/DEPENDENCY_RESOLUTION.md +0 -237
  187. package/examples/craftdesk-all-sources.json +0 -79
  188. package/examples/craftdesk-git-monorepo.json +0 -41
  189. package/examples/craftdesk-multi-registry.json +0 -40
  190. package/examples/craftdesk-with-registries.json +0 -49
  191. package/examples/simple-craftdesk.json +0 -10
  192. package/src/commands/add.ts +0 -314
  193. package/src/commands/init.ts +0 -55
  194. package/src/commands/install.ts +0 -126
  195. package/src/commands/list.ts +0 -126
  196. package/src/commands/remove.ts +0 -82
  197. package/src/index.ts +0 -56
  198. package/src/services/config-manager.ts +0 -150
  199. package/src/services/git-resolver.ts +0 -373
  200. package/src/services/installer.ts +0 -314
  201. package/src/services/registry-client.ts +0 -163
  202. package/src/types/craftdesk-json.ts +0 -53
  203. package/src/types/craftdesk-lock.ts +0 -38
  204. package/src/utils/file-system.ts +0 -55
  205. package/src/utils/logger.ts +0 -82
  206. package/tests/fixtures/craftdesk-git.json +0 -17
  207. package/tests/fixtures/craftdesk.json +0 -15
  208. package/tests/helpers/test-utils.ts +0 -60
  209. package/tests/integration/init-command.test.ts +0 -70
  210. package/tests/integration/list-command.test.ts +0 -77
  211. package/tests/unit/config-manager.test.ts +0 -228
  212. package/tests/unit/git-resolver.test.ts +0 -303
  213. package/tests/unit/installer.test.ts +0 -105
  214. package/tsconfig.json +0 -20
  215. package/vitest.config.ts +0 -29
@@ -7,9 +7,15 @@ 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");
15
+ const multi_agent_sync_1 = require("./multi-agent-sync");
16
+ const gitignore_manager_1 = require("./gitignore-manager");
12
17
  const file_system_1 = require("../utils/file-system");
18
+ const crypto_1 = require("../utils/crypto");
13
19
  /**
14
20
  * Handles installation of crafts from various sources
15
21
  *
@@ -72,11 +78,21 @@ class Installer {
72
78
  installed++;
73
79
  }
74
80
  catch (error) {
75
- logger_1.logger.failSpinner(`Failed to install ${name}: ${error.message}`);
81
+ const message = error instanceof Error ? error.message : String(error);
82
+ logger_1.logger.failSpinner(`Failed to install ${name}: ${message}`);
76
83
  throw error;
77
84
  }
78
85
  }
79
86
  logger_1.logger.succeedSpinner(`Installed ${installed} crafts`);
87
+ // Update .gitignore to ignore managed skills but allow embedded ones
88
+ try {
89
+ await gitignore_manager_1.gitIgnoreManager.autoUpdate();
90
+ logger_1.logger.debug('Updated .claude/skills/.gitignore');
91
+ }
92
+ catch {
93
+ // Don't fail installation if .gitignore update fails
94
+ logger_1.logger.warn('Failed to update .gitignore');
95
+ }
80
96
  }
81
97
  /**
82
98
  * Installs a single craft from registry or git source
@@ -123,11 +139,25 @@ class Installer {
123
139
  await this.installFromGit(craftDir, entry);
124
140
  }
125
141
  else {
126
- // Download craft archive
127
- const archivePath = path_1.default.join(craftDir, 'archive.tar.gz');
142
+ // Download craft archive (ZIP format from CraftDesk registry)
143
+ const archivePath = path_1.default.join(craftDir, 'archive.zip');
128
144
  await this.downloadFile(entry.resolved, archivePath);
129
- // Verify integrity (TODO: implement SHA-256 check)
130
- // await this.verifyIntegrity(archivePath, entry.integrity);
145
+ // Verify integrity using SHA-256 checksum
146
+ if (entry.integrity) {
147
+ logger_1.logger.debug(`Verifying checksum for ${name}...`);
148
+ const isValid = await (0, crypto_1.verifyFileChecksum)(archivePath, entry.integrity);
149
+ if (!isValid) {
150
+ await fs_extra_1.default.remove(archivePath);
151
+ throw new Error(`Checksum verification failed for ${name}@${entry.version}. ` +
152
+ `Expected: ${(0, crypto_1.formatChecksum)(entry.integrity)}... ` +
153
+ `This may indicate a corrupted download or a security issue. ` +
154
+ `Try running 'craftdesk install --no-lockfile' to re-resolve dependencies.`);
155
+ }
156
+ logger_1.logger.debug(`Checksum verified: ${(0, crypto_1.formatChecksum)(entry.integrity)}...`);
157
+ }
158
+ else {
159
+ logger_1.logger.warn(`No checksum available for ${name}@${entry.version} - skipping verification`);
160
+ }
131
161
  // Extract archive
132
162
  await this.extractArchive(archivePath, craftDir);
133
163
  // Clean up archive
@@ -135,26 +165,67 @@ class Installer {
135
165
  }
136
166
  // Create metadata file
137
167
  await this.createMetadata(craftDir, name, entry);
168
+ // Register plugin in settings if this is a plugin type
169
+ if (entry.type === 'plugin') {
170
+ await this.registerPlugin(name, entry, craftDir);
171
+ }
172
+ // Sync to other agents if multi-agent sync is enabled and auto-sync is on
173
+ await this.syncCraftIfEnabled(name, craftDir, entry.type);
174
+ }
175
+ /**
176
+ * Sync craft to other agent directories if multi-agent auto-sync is enabled
177
+ *
178
+ * @param name - Craft name
179
+ * @param craftDir - Path to craft directory
180
+ * @param type - Craft type
181
+ * @private
182
+ */
183
+ async syncCraftIfEnabled(name, craftDir, type) {
184
+ const config = await config_manager_1.configManager.getCraftDeskJson();
185
+ // Only sync skills for now (other types could be added later)
186
+ if (type !== 'skill') {
187
+ return;
188
+ }
189
+ // Check if multi-agent sync is enabled and auto-sync is on
190
+ if (!config?.multiAgent?.enabled || !config?.multiAgent?.autoSync) {
191
+ return;
192
+ }
193
+ logger_1.logger.debug(`Auto-syncing ${name} to other agents...`);
194
+ try {
195
+ await multi_agent_sync_1.multiAgentSync.syncCraft(name, craftDir);
196
+ }
197
+ catch (error) {
198
+ // Don't fail installation if sync fails, just log a warning
199
+ const message = error instanceof Error ? error.message : String(error);
200
+ logger_1.logger.warn(`Failed to auto-sync ${name}: ${message}`);
201
+ }
138
202
  }
139
203
  async installFromGit(craftDir, entry) {
140
204
  const tempDir = path_1.default.join(craftDir, '.tmp-git');
205
+ if (!entry.git) {
206
+ throw new Error('Git URL is required for git-based installation');
207
+ }
141
208
  try {
142
209
  // Clone the repository
143
- const { execSync } = require('child_process');
144
- // Build clone command with appropriate ref
145
- let cloneCmd = `git clone --depth 1`;
210
+ // Build clone command args — use array form to prevent shell injection
211
+ const cloneArgs = ['clone', '--depth', '1'];
146
212
  if (entry.branch) {
147
- cloneCmd += ` -b ${entry.branch}`;
213
+ cloneArgs.push('-b', entry.branch);
148
214
  }
149
215
  else if (entry.tag) {
150
- cloneCmd += ` -b ${entry.tag}`;
216
+ cloneArgs.push('-b', entry.tag);
151
217
  }
152
- cloneCmd += ` ${entry.git} ${tempDir}`;
153
- logger_1.logger.debug(`Cloning git repository: ${cloneCmd}`);
154
- execSync(cloneCmd, { stdio: 'pipe' });
218
+ cloneArgs.push(entry.git, tempDir);
219
+ logger_1.logger.debug(`Cloning git repository: git ${cloneArgs.join(' ')}`);
220
+ (0, child_process_1.execFileSync)('git', cloneArgs, { stdio: 'pipe' });
155
221
  // If specific commit, checkout that commit
156
222
  if (entry.commit) {
157
- execSync(`cd ${tempDir} && git fetch --unshallow && git checkout ${entry.commit}`, { stdio: 'pipe' });
223
+ // Check if repo is shallow before trying to unshallow
224
+ const isShallow = await fs_extra_1.default.pathExists(path_1.default.join(tempDir, '.git', 'shallow'));
225
+ if (isShallow) {
226
+ (0, child_process_1.execFileSync)('git', ['fetch', '--unshallow'], { cwd: tempDir, stdio: 'pipe' });
227
+ }
228
+ (0, child_process_1.execFileSync)('git', ['checkout', entry.commit], { cwd: tempDir, stdio: 'pipe' });
158
229
  }
159
230
  // Handle direct file reference
160
231
  if (entry.file) {
@@ -184,6 +255,12 @@ class Installer {
184
255
  await fs_extra_1.default.remove(tempDir);
185
256
  }
186
257
  }
258
+ /**
259
+ * Get the type-specific directory for a craft type
260
+ *
261
+ * @param type - The craft type (skill, agent, command, hook, plugin, collection)
262
+ * @returns Directory name for the craft type
263
+ */
187
264
  getTypeDirectory(type) {
188
265
  switch (type) {
189
266
  case 'skill':
@@ -194,10 +271,22 @@ class Installer {
194
271
  return 'commands';
195
272
  case 'hook':
196
273
  return 'hooks';
274
+ case 'plugin':
275
+ return 'plugins';
276
+ case 'collection':
277
+ return 'collections';
197
278
  default:
198
279
  return 'crafts';
199
280
  }
200
281
  }
282
+ /**
283
+ * Get the install path (e.g., '.claude')
284
+ *
285
+ * @returns The installation directory path
286
+ */
287
+ getInstallPath() {
288
+ return this.installPath;
289
+ }
201
290
  async downloadFile(url, outputPath) {
202
291
  const response = await (0, axios_1.default)({
203
292
  method: 'GET',
@@ -212,11 +301,16 @@ class Installer {
212
301
  });
213
302
  }
214
303
  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');
304
+ try {
305
+ // CraftDesk web API returns ZIP archives
306
+ const zip = new adm_zip_1.default(archivePath);
307
+ zip.extractAllTo(outputDir, /* overwrite */ true);
308
+ logger_1.logger.debug(`Extracted ZIP archive to ${outputDir}`);
309
+ }
310
+ catch (error) {
311
+ const message = error instanceof Error ? error.message : String(error);
312
+ throw new Error(`Failed to extract archive: ${message}`);
313
+ }
220
314
  }
221
315
  async createMetadata(craftDir, name, entry) {
222
316
  const metadata = {
@@ -230,11 +324,186 @@ class Installer {
230
324
  };
231
325
  await fs_extra_1.default.writeFile(path_1.default.join(craftDir, '.craftdesk-metadata.json'), JSON.stringify(metadata, null, 2), 'utf-8');
232
326
  }
327
+ /**
328
+ * Register a plugin in .claude/settings.json
329
+ *
330
+ * @param name - The plugin name
331
+ * @param entry - The lock file entry for this plugin
332
+ * @param craftDir - The directory where the plugin is installed
333
+ * @returns Promise that resolves when registration is complete
334
+ */
335
+ async registerPlugin(name, entry, craftDir) {
336
+ try {
337
+ // Try to read plugin.json manifest
338
+ const manifest = await this.readPluginManifest(craftDir);
339
+ // Scan directory for actual components
340
+ const scannedComponents = await this.scanPluginComponents(craftDir);
341
+ // Merge manifest components (declared) with scanned components (actual)
342
+ // Manifest takes precedence if both exist (manifest is source of truth)
343
+ const components = {};
344
+ // Start with scanned components
345
+ if (scannedComponents.skills)
346
+ components.skills = scannedComponents.skills;
347
+ if (scannedComponents.agents)
348
+ components.agents = scannedComponents.agents;
349
+ if (scannedComponents.commands)
350
+ components.commands = scannedComponents.commands;
351
+ if (scannedComponents.hooks)
352
+ components.hooks = scannedComponents.hooks;
353
+ // Override with manifest if provided (manifest is source of truth)
354
+ if (manifest?.components) {
355
+ if (manifest.components.skills)
356
+ components.skills = manifest.components.skills;
357
+ if (manifest.components.agents)
358
+ components.agents = manifest.components.agents;
359
+ if (manifest.components.commands)
360
+ components.commands = manifest.components.commands;
361
+ if (manifest.components.hooks)
362
+ components.hooks = manifest.components.hooks;
363
+ }
364
+ // Build plugin config for settings
365
+ const pluginConfig = {
366
+ name,
367
+ version: entry.version,
368
+ type: 'plugin',
369
+ enabled: true,
370
+ installPath: path_1.default.relative(this.installPath, craftDir),
371
+ installedAt: new Date().toISOString(),
372
+ dependencies: entry.dependencies ? Object.keys(entry.dependencies) : [],
373
+ isDependency: entry.installedAs === 'dependency',
374
+ // Copy metadata from plugin.json manifest
375
+ ...(manifest?.description && { description: manifest.description }),
376
+ ...(manifest?.author && { author: manifest.author }),
377
+ ...(manifest?.license && { license: manifest.license }),
378
+ ...(manifest?.homepage && { homepage: manifest.homepage }),
379
+ ...(manifest?.repository && { repository: manifest.repository }),
380
+ ...(manifest?.keywords && { keywords: manifest.keywords }),
381
+ // Use merged components (scanned + manifest)
382
+ ...(Object.keys(components).length > 0 && { components }),
383
+ // CraftDesk-specific fields
384
+ ...(manifest?.scripts && { scripts: manifest.scripts })
385
+ };
386
+ await settings_manager_1.settingsManager.registerPlugin(pluginConfig);
387
+ logger_1.logger.debug(`Registered plugin ${name} in settings.json`);
388
+ // Register MCP servers if provided in manifest (official Claude Code field)
389
+ if (manifest?.mcpServers) {
390
+ if (typeof manifest.mcpServers === 'object' && !Array.isArray(manifest.mcpServers)) {
391
+ // Inline MCP server configuration
392
+ for (const [serverName, serverConfig] of Object.entries(manifest.mcpServers)) {
393
+ await settings_manager_1.settingsManager.registerMCPServer(serverName, serverConfig);
394
+ logger_1.logger.debug(`Registered MCP server: ${serverName}`);
395
+ }
396
+ }
397
+ else if (typeof manifest.mcpServers === 'string') {
398
+ // Path to .mcp.json file - would need to read and parse it
399
+ const mcpPath = path_1.default.join(craftDir, manifest.mcpServers);
400
+ if (await fs_extra_1.default.pathExists(mcpPath)) {
401
+ try {
402
+ const mcpConfig = await fs_extra_1.default.readJson(mcpPath);
403
+ for (const [serverName, serverConfig] of Object.entries(mcpConfig)) {
404
+ await settings_manager_1.settingsManager.registerMCPServer(serverName, serverConfig);
405
+ logger_1.logger.debug(`Registered MCP server from ${manifest.mcpServers}: ${serverName}`);
406
+ }
407
+ }
408
+ catch (error) {
409
+ const message = error instanceof Error ? error.message : String(error);
410
+ logger_1.logger.warn(`Failed to read MCP config from ${manifest.mcpServers}: ${message}`);
411
+ }
412
+ }
413
+ }
414
+ }
415
+ }
416
+ catch (error) {
417
+ const message = error instanceof Error ? error.message : String(error);
418
+ logger_1.logger.warn(`Failed to register plugin ${name}: ${message}`);
419
+ // Non-fatal - plugin is still installed, just not registered in settings
420
+ }
421
+ }
422
+ /**
423
+ * Read plugin.json manifest from plugin directory
424
+ * Plugin manifest is located at .claude-plugin/plugin.json
425
+ *
426
+ * @param pluginDir - Path to the plugin directory containing .claude-plugin/plugin.json
427
+ * @returns The parsed plugin manifest or null if not found or invalid
428
+ */
429
+ async readPluginManifest(pluginDir) {
430
+ const manifestPath = path_1.default.join(pluginDir, '.claude-plugin', 'plugin.json');
431
+ try {
432
+ if (await fs_extra_1.default.pathExists(manifestPath)) {
433
+ const content = await fs_extra_1.default.readFile(manifestPath, 'utf-8');
434
+ return JSON.parse(content);
435
+ }
436
+ return null;
437
+ }
438
+ catch (error) {
439
+ const message = error instanceof Error ? error.message : String(error);
440
+ logger_1.logger.debug(`Failed to read plugin manifest: ${message}`);
441
+ return null;
442
+ }
443
+ }
444
+ /**
445
+ * Scan plugin directory to discover components
446
+ * This ensures we find all skills/agents/commands/hooks even if not listed in plugin.json
447
+ *
448
+ * @param pluginDir - Path to the plugin directory to scan for components
449
+ * @returns Object containing arrays of discovered skills, agents, commands, and hooks
450
+ */
451
+ async scanPluginComponents(pluginDir) {
452
+ const components = {};
453
+ const componentTypes = ['skills', 'agents', 'commands', 'hooks'];
454
+ for (const type of componentTypes) {
455
+ const typeDir = path_1.default.join(pluginDir, type);
456
+ if (await fs_extra_1.default.pathExists(typeDir)) {
457
+ try {
458
+ const entries = await fs_extra_1.default.readdir(typeDir, { withFileTypes: true });
459
+ let items;
460
+ // Commands and hooks are files (*.md), not directories
461
+ if (type === 'commands' || type === 'hooks') {
462
+ items = entries
463
+ .filter(entry => entry.isFile() && entry.name.endsWith('.md'))
464
+ .map(entry => entry.name);
465
+ }
466
+ else {
467
+ // Skills and agents are directories
468
+ items = entries
469
+ .filter(entry => entry.isDirectory())
470
+ .map(entry => entry.name);
471
+ }
472
+ if (items.length > 0) {
473
+ components[type] = items;
474
+ }
475
+ }
476
+ catch (error) {
477
+ const message = error instanceof Error ? error.message : String(error);
478
+ logger_1.logger.debug(`Failed to scan ${type} directory: ${message}`);
479
+ }
480
+ }
481
+ }
482
+ return components;
483
+ }
484
+ /**
485
+ * Remove an installed craft from the project
486
+ * Unregisters plugins from settings and removes the craft directory
487
+ *
488
+ * @param name - Name of the craft to remove
489
+ * @param type - Type of craft (plugin, skill, agent, command, hook)
490
+ */
233
491
  async removeCraft(name, type) {
234
492
  const installDir = path_1.default.join(process.cwd(), this.installPath);
235
493
  const typeDir = this.getTypeDirectory(type);
236
494
  const craftDir = path_1.default.join(installDir, typeDir, name);
237
495
  if (await fs_extra_1.default.pathExists(craftDir)) {
496
+ // Unregister plugin from settings if this is a plugin
497
+ if (type === 'plugin') {
498
+ try {
499
+ await settings_manager_1.settingsManager.unregisterPlugin(name);
500
+ logger_1.logger.debug(`Unregistered plugin ${name} from settings`);
501
+ }
502
+ catch (error) {
503
+ const message = error instanceof Error ? error.message : String(error);
504
+ logger_1.logger.warn(`Failed to unregister plugin: ${message}`);
505
+ }
506
+ }
238
507
  await fs_extra_1.default.remove(craftDir);
239
508
  logger_1.logger.success(`Removed ${name}`);
240
509
  }
@@ -242,13 +511,19 @@ class Installer {
242
511
  logger_1.logger.warn(`${name} is not installed`);
243
512
  }
244
513
  }
514
+ /**
515
+ * List all installed crafts in the project
516
+ * Scans the installation directory for all craft types and reads their metadata
517
+ *
518
+ * @returns Array of installed crafts with name, version, and type information
519
+ */
245
520
  async listInstalled() {
246
521
  const installDir = path_1.default.join(process.cwd(), this.installPath);
247
522
  const installed = [];
248
523
  if (!await fs_extra_1.default.pathExists(installDir)) {
249
524
  return installed;
250
525
  }
251
- const typeDirs = ['skills', 'agents', 'commands', 'hooks', 'plugins'];
526
+ const typeDirs = ['skills', 'agents', 'commands', 'hooks', 'plugins', 'collections'];
252
527
  for (const typeDir of typeDirs) {
253
528
  const dir = path_1.default.join(installDir, typeDir);
254
529
  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":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Multi-Agent Sync - Sync crafts across multiple AI agents
3
+ *
4
+ * Handles:
5
+ * - Installing crafts to multiple agent directories
6
+ * - Verifying sync status with checksums
7
+ * - Detecting and fixing drift between copies
8
+ */
9
+ import type { SyncStatus, SyncResult } from '../types/multi-agent';
10
+ /**
11
+ * Service for syncing crafts across multiple AI agent directories
12
+ */
13
+ export declare class MultiAgentSync {
14
+ /**
15
+ * Install craft to all configured agent directories
16
+ *
17
+ * @param craftName - Name of the craft to sync
18
+ * @param sourceDir - Source directory containing the craft files
19
+ * @param cwd - Current working directory (defaults to process.cwd())
20
+ * @returns Sync result with success/failure details
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const sync = new MultiAgentSync();
25
+ * const result = await sync.syncCraft('ruby-expert', '/tmp/ruby-expert-source');
26
+ *
27
+ * console.log(`Synced to: ${result.synced.join(', ')}`);
28
+ * if (result.failed.length > 0) {
29
+ * console.error(`Failed: ${result.failed.map(f => f.path).join(', ')}`);
30
+ * }
31
+ * ```
32
+ */
33
+ syncCraft(craftName: string, sourceDir: string, cwd?: string): Promise<SyncResult>;
34
+ /**
35
+ * Verify sync status for a craft
36
+ *
37
+ * Checks if all copies match the canonical version using checksums
38
+ *
39
+ * @param craftName - Name of the craft to verify
40
+ * @param cwd - Current working directory (defaults to process.cwd())
41
+ * @returns Sync status with details about each location
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const sync = new MultiAgentSync();
46
+ * const status = await sync.verifySync('ruby-expert');
47
+ *
48
+ * if (!status.inSync) {
49
+ * console.log(`Out of sync: ${status.outOfSync.map(l => l.path).join(', ')}`);
50
+ * }
51
+ * ```
52
+ */
53
+ verifySync(craftName: string, cwd?: string): Promise<SyncStatus>;
54
+ /**
55
+ * Sync all installed crafts to configured targets
56
+ *
57
+ * @param cwd - Current working directory (defaults to process.cwd())
58
+ * @returns Array of sync results for each craft
59
+ */
60
+ syncAllCrafts(cwd?: string): Promise<SyncResult[]>;
61
+ /**
62
+ * Verify sync status for all installed crafts
63
+ *
64
+ * @param cwd - Current working directory (defaults to process.cwd())
65
+ * @returns Array of sync statuses for each craft
66
+ */
67
+ verifyAllCrafts(cwd?: string): Promise<SyncStatus[]>;
68
+ /**
69
+ * Calculate checksum for entire directory
70
+ *
71
+ * Creates a consistent hash of all files in a directory (excluding metadata)
72
+ *
73
+ * @param dirPath - Directory to checksum
74
+ * @returns SHA256 checksum hex string
75
+ * @private
76
+ */
77
+ calculateDirChecksum(dirPath: string): Promise<string>;
78
+ /**
79
+ * Recursively get all files in a directory
80
+ *
81
+ * @param dirPath - Directory to scan
82
+ * @returns Array of absolute file paths
83
+ * @private
84
+ */
85
+ private getAllFiles;
86
+ }
87
+ export declare const multiAgentSync: MultiAgentSync;
88
+ //# sourceMappingURL=multi-agent-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-agent-sync.d.ts","sourceRoot":"","sources":["../../src/services/multi-agent-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAgB,MAAM,sBAAsB,CAAC;AAEjF;;GAEG;AACH,qBAAa,cAAc;IACzB;;;;;;;;;;;;;;;;;;OAkBG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,UAAU,CAAC;IA6EtB;;;;;;;;;;;;;;;;;;OAkBG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6ErF;;;;;OAKG;IACG,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAyCvE;;;;;OAKG;IACG,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA6BzE;;;;;;;;OAQG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B5D;;;;;;OAMG;YACW,WAAW;CAsB1B;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}