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.
- package/CHANGELOG.md +57 -0
- package/README.md +943 -46
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +302 -6
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/convert.d.ts +8 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +146 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/info.d.ts +8 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +66 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +5 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -4
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +72 -7
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +158 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +8 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +51 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/outdated.d.ts +23 -0
- package/dist/commands/outdated.d.ts.map +1 -0
- package/dist/commands/outdated.js +268 -0
- package/dist/commands/outdated.js.map +1 -0
- package/dist/commands/publish.d.ts +8 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +198 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +5 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +51 -10
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +60 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/update.d.ts +8 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +369 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/whoami.d.ts +8 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +58 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/converters/base-converter.d.ts +89 -0
- package/dist/converters/base-converter.d.ts.map +1 -0
- package/dist/converters/base-converter.js +249 -0
- package/dist/converters/base-converter.js.map +1 -0
- package/dist/converters/continue-converter.d.ts +53 -0
- package/dist/converters/continue-converter.d.ts.map +1 -0
- package/dist/converters/continue-converter.js +243 -0
- package/dist/converters/continue-converter.js.map +1 -0
- package/dist/converters/cursor-converter.d.ts +70 -0
- package/dist/converters/cursor-converter.d.ts.map +1 -0
- package/dist/converters/cursor-converter.js +272 -0
- package/dist/converters/cursor-converter.js.map +1 -0
- package/dist/index.js +34 -3
- package/dist/index.js.map +1 -1
- package/dist/services/config-manager.d.ts +128 -10
- package/dist/services/config-manager.d.ts.map +1 -1
- package/dist/services/config-manager.js +189 -18
- package/dist/services/config-manager.js.map +1 -1
- package/dist/services/converter.d.ts +53 -0
- package/dist/services/converter.d.ts.map +1 -0
- package/dist/services/converter.js +185 -0
- package/dist/services/converter.js.map +1 -0
- package/dist/services/craft-wrapper.d.ts +108 -0
- package/dist/services/craft-wrapper.d.ts.map +1 -0
- package/dist/services/craft-wrapper.js +268 -0
- package/dist/services/craft-wrapper.js.map +1 -0
- package/dist/services/git-resolver.d.ts +9 -3
- package/dist/services/git-resolver.d.ts.map +1 -1
- package/dist/services/git-resolver.js +29 -10
- package/dist/services/git-resolver.js.map +1 -1
- package/dist/services/installer.d.ts +51 -1
- package/dist/services/installer.d.ts.map +1 -1
- package/dist/services/installer.js +245 -14
- package/dist/services/installer.js.map +1 -1
- package/dist/services/plugin-resolver.d.ts +80 -0
- package/dist/services/plugin-resolver.d.ts.map +1 -0
- package/dist/services/plugin-resolver.js +182 -0
- package/dist/services/plugin-resolver.js.map +1 -0
- package/dist/services/registry-client.d.ts +132 -5
- package/dist/services/registry-client.d.ts.map +1 -1
- package/dist/services/registry-client.js +239 -34
- package/dist/services/registry-client.js.map +1 -1
- package/dist/services/settings-manager.d.ts +151 -0
- package/dist/services/settings-manager.d.ts.map +1 -0
- package/dist/services/settings-manager.js +333 -0
- package/dist/services/settings-manager.js.map +1 -0
- package/dist/types/claude-settings.d.ts +155 -0
- package/dist/types/claude-settings.d.ts.map +1 -0
- package/dist/types/claude-settings.js +20 -0
- package/dist/types/claude-settings.js.map +1 -0
- package/dist/types/converter.d.ts +98 -0
- package/dist/types/converter.d.ts.map +1 -0
- package/dist/types/converter.js +6 -0
- package/dist/types/converter.js.map +1 -0
- package/dist/types/craftdesk-json.d.ts +63 -3
- package/dist/types/craftdesk-json.d.ts.map +1 -1
- package/dist/types/craftdesk-lock.d.ts +62 -1
- package/dist/types/craftdesk-lock.d.ts.map +1 -1
- package/dist/utils/crypto.d.ts +23 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +52 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/file-system.d.ts +43 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +45 -2
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/logger.d.ts +75 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +76 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/version-utils.d.ts +63 -0
- package/dist/utils/version-utils.d.ts.map +1 -0
- package/dist/utils/version-utils.js +130 -0
- package/dist/utils/version-utils.js.map +1 -0
- package/package.json +36 -9
- package/.claude/settings.local.json +0 -19
- package/.github/workflows/ci.yml +0 -94
- package/API.md +0 -414
- package/TESTING.md +0 -263
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -56
- package/dist/commands/config.js.map +0 -1
- package/dist/types/config.d.ts +0 -17
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -3
- package/dist/types/config.js.map +0 -1
- package/docs/DEPENDENCY_RESOLUTION.md +0 -237
- package/examples/craftdesk-all-sources.json +0 -79
- package/examples/craftdesk-git-monorepo.json +0 -41
- package/examples/craftdesk-multi-registry.json +0 -40
- package/examples/craftdesk-with-registries.json +0 -49
- package/examples/simple-craftdesk.json +0 -10
- package/src/commands/add.ts +0 -314
- package/src/commands/init.ts +0 -55
- package/src/commands/install.ts +0 -126
- package/src/commands/list.ts +0 -126
- package/src/commands/remove.ts +0 -82
- package/src/index.ts +0 -56
- package/src/services/config-manager.ts +0 -150
- package/src/services/git-resolver.ts +0 -373
- package/src/services/installer.ts +0 -314
- package/src/services/registry-client.ts +0 -163
- package/src/types/craftdesk-json.ts +0 -53
- package/src/types/craftdesk-lock.ts +0 -38
- package/src/utils/file-system.ts +0 -55
- package/src/utils/logger.ts +0 -82
- package/tests/fixtures/craftdesk-git.json +0 -17
- package/tests/fixtures/craftdesk.json +0 -15
- package/tests/helpers/test-utils.ts +0 -60
- package/tests/integration/init-command.test.ts +0 -70
- package/tests/integration/list-command.test.ts +0 -77
- package/tests/unit/config-manager.test.ts +0 -228
- package/tests/unit/git-resolver.test.ts +0 -303
- package/tests/unit/installer.test.ts +0 -105
- package/tsconfig.json +0 -20
- 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
|
-
|
|
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.
|
|
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
|
|
130
|
-
|
|
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
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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":"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"}
|
|
@@ -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
|