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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-resolver.js","sourceRoot":"","sources":["../../src/services/plugin-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,153 @@
|
|
|
1
|
+
import type { CraftDeskLock, LockEntry } from '../types/craftdesk-lock';
|
|
2
|
+
/**
|
|
3
|
+
* Information about a craft from the registry
|
|
4
|
+
*/
|
|
1
5
|
export interface CraftInfo {
|
|
2
6
|
name: string;
|
|
3
7
|
author: string;
|
|
4
8
|
version: string;
|
|
5
|
-
type: 'skill' | 'agent' | 'command' | 'hook' | 'plugin';
|
|
9
|
+
type: 'skill' | 'agent' | 'command' | 'hook' | 'plugin' | 'collection';
|
|
6
10
|
description?: string;
|
|
7
11
|
dependencies?: Record<string, string>;
|
|
8
12
|
download_url?: string;
|
|
9
13
|
integrity?: string;
|
|
10
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Information about a registry user
|
|
17
|
+
*/
|
|
18
|
+
export interface UserInfo {
|
|
19
|
+
username: string;
|
|
20
|
+
email: string;
|
|
21
|
+
organization?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Response from dependency resolution API
|
|
25
|
+
*/
|
|
11
26
|
export interface ResolveResponse {
|
|
12
|
-
resolved: Record<string,
|
|
13
|
-
lockfile:
|
|
27
|
+
resolved: Record<string, LockEntry>;
|
|
28
|
+
lockfile: CraftDeskLock;
|
|
14
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Client for interacting with CraftDesk registry APIs
|
|
32
|
+
*
|
|
33
|
+
* Handles authentication, craft metadata retrieval, dependency resolution,
|
|
34
|
+
* and publishing operations with the CraftDesk registry server.
|
|
35
|
+
*/
|
|
15
36
|
export declare class RegistryClient {
|
|
16
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Get an authenticated HTTP client for a registry
|
|
39
|
+
*
|
|
40
|
+
* @param registryUrl - The registry URL to connect to
|
|
41
|
+
* @returns Configured axios instance
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
17
44
|
private getClient;
|
|
45
|
+
/**
|
|
46
|
+
* Get information about a craft from the registry
|
|
47
|
+
*
|
|
48
|
+
* @param craftName - Name of the craft (e.g., 'author/name')
|
|
49
|
+
* @param version - Optional specific version to fetch
|
|
50
|
+
* @param registryOverride - Optional registry URL to use instead of default
|
|
51
|
+
* @returns Craft information or null if not found
|
|
52
|
+
*/
|
|
18
53
|
getCraftInfo(craftName: string, version?: string, registryOverride?: string): Promise<CraftInfo | null>;
|
|
19
|
-
|
|
54
|
+
/**
|
|
55
|
+
* List all available versions of a craft
|
|
56
|
+
*
|
|
57
|
+
* @param craftName - Name of the craft to list versions for
|
|
58
|
+
* @returns Array of version strings
|
|
59
|
+
*/
|
|
20
60
|
listVersions(craftName: string): Promise<string[]>;
|
|
61
|
+
/**
|
|
62
|
+
* Resolve dependencies via the registry API
|
|
63
|
+
*
|
|
64
|
+
* @param dependencies - Map of craft names to version constraints
|
|
65
|
+
* @returns Resolved dependencies and lockfile or null on error
|
|
66
|
+
* @throws Error if no registry is configured
|
|
67
|
+
*/
|
|
21
68
|
resolveDependencies(dependencies: Record<string, string>): Promise<ResolveResponse | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Download a craft archive from a URL
|
|
71
|
+
*
|
|
72
|
+
* @param downloadUrl - URL to download the craft from
|
|
73
|
+
* @param outputPath - Local path to save the downloaded file
|
|
74
|
+
* @throws Error if download fails
|
|
75
|
+
*/
|
|
22
76
|
downloadCraft(downloadUrl: string, outputPath: string): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Search for crafts in the registry
|
|
79
|
+
*
|
|
80
|
+
* @param query - Search query string
|
|
81
|
+
* @param type - Optional filter by craft type
|
|
82
|
+
* @returns Array of matching crafts
|
|
83
|
+
* @throws Error if no registry is configured
|
|
84
|
+
*/
|
|
23
85
|
searchCrafts(query: string, type?: string): Promise<CraftInfo[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Create a new version for a craft
|
|
88
|
+
*
|
|
89
|
+
* @param author - Craft author
|
|
90
|
+
* @param name - Craft name
|
|
91
|
+
* @param data - Version data including files and metadata
|
|
92
|
+
* @param data.version - Semantic version string (e.g., "1.0.0")
|
|
93
|
+
* @param data.type - Type of craft (skill, agent, command, hook, plugin)
|
|
94
|
+
* @param data.description - Human-readable description of the craft
|
|
95
|
+
* @param data.main_file - Path to the main file (e.g., "SKILL.md")
|
|
96
|
+
* @param data.changelog - Markdown formatted changelog for this version
|
|
97
|
+
* @param data.files - Array of file objects with path and content properties
|
|
98
|
+
* @returns Response from the API
|
|
99
|
+
* @throws Error if authentication fails or craft creation fails
|
|
100
|
+
*/
|
|
101
|
+
createVersion(author: string, name: string, data: {
|
|
102
|
+
version: string;
|
|
103
|
+
type?: string;
|
|
104
|
+
description?: string;
|
|
105
|
+
main_file?: string;
|
|
106
|
+
changelog?: string;
|
|
107
|
+
files: Array<{
|
|
108
|
+
path: string;
|
|
109
|
+
content: string;
|
|
110
|
+
}>;
|
|
111
|
+
}): Promise<{
|
|
112
|
+
success: boolean;
|
|
113
|
+
download_url?: string;
|
|
114
|
+
[key: string]: unknown;
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* Publish a craft (change status to published)
|
|
118
|
+
*
|
|
119
|
+
* @param author - Craft author
|
|
120
|
+
* @param name - Craft name
|
|
121
|
+
* @param options - Publishing options (visibility)
|
|
122
|
+
* @param options.visibility - Visibility level: "public", "private", or "organization"
|
|
123
|
+
* @returns Response from the API
|
|
124
|
+
* @throws Error if authentication fails or craft not found
|
|
125
|
+
*/
|
|
126
|
+
publishCraft(author: string, name: string, options: {
|
|
127
|
+
visibility?: 'public' | 'private' | 'organization';
|
|
128
|
+
}): Promise<{
|
|
129
|
+
success: boolean;
|
|
130
|
+
[key: string]: unknown;
|
|
131
|
+
}>;
|
|
132
|
+
/**
|
|
133
|
+
* Verify an API token with a registry
|
|
134
|
+
*
|
|
135
|
+
* Calls GET /api/v1/me to validate the token and get user info
|
|
136
|
+
*
|
|
137
|
+
* @param registryUrl - The URL of the registry
|
|
138
|
+
* @param token - The API token to verify
|
|
139
|
+
* @returns User info if token is valid
|
|
140
|
+
* @throws Error if token is invalid or network error occurs
|
|
141
|
+
*/
|
|
142
|
+
verifyToken(registryUrl: string, token: string): Promise<UserInfo>;
|
|
143
|
+
/**
|
|
144
|
+
* Parse a craft name into author and name components
|
|
145
|
+
*
|
|
146
|
+
* @param craftName - Craft name in 'author/name' or '@author/name' format
|
|
147
|
+
* @returns Tuple of [author, name]
|
|
148
|
+
* @throws Error if craft name format is invalid
|
|
149
|
+
* @private
|
|
150
|
+
*/
|
|
24
151
|
private parseCraftName;
|
|
25
152
|
}
|
|
26
153
|
export declare const registryClient: RegistryClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,10 +5,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.registryClient = exports.RegistryClient = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
8
10
|
const config_manager_1 = require("./config-manager");
|
|
9
11
|
const logger_1 = require("../utils/logger");
|
|
12
|
+
/**
|
|
13
|
+
* Client for interacting with CraftDesk registry APIs
|
|
14
|
+
*
|
|
15
|
+
* Handles authentication, craft metadata retrieval, dependency resolution,
|
|
16
|
+
* and publishing operations with the CraftDesk registry server.
|
|
17
|
+
*/
|
|
10
18
|
class RegistryClient {
|
|
11
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Get an authenticated HTTP client for a registry
|
|
21
|
+
*
|
|
22
|
+
* @param registryUrl - The registry URL to connect to
|
|
23
|
+
* @returns Configured axios instance
|
|
24
|
+
* @private
|
|
25
|
+
*/
|
|
12
26
|
async getClient(registryUrl) {
|
|
13
27
|
const token = await config_manager_1.configManager.getAuthToken(registryUrl);
|
|
14
28
|
return axios_1.default.create({
|
|
@@ -20,10 +34,18 @@ class RegistryClient {
|
|
|
20
34
|
timeout: 30000
|
|
21
35
|
});
|
|
22
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Get information about a craft from the registry
|
|
39
|
+
*
|
|
40
|
+
* @param craftName - Name of the craft (e.g., 'author/name')
|
|
41
|
+
* @param version - Optional specific version to fetch
|
|
42
|
+
* @param registryOverride - Optional registry URL to use instead of default
|
|
43
|
+
* @returns Craft information or null if not found
|
|
44
|
+
*/
|
|
23
45
|
async getCraftInfo(craftName, version, registryOverride) {
|
|
24
46
|
// Get registry URL - can be overridden by dependency-specific registry
|
|
25
47
|
const registryUrl = registryOverride
|
|
26
|
-
? await
|
|
48
|
+
? await config_manager_1.configManager.resolveRegistryUrl(registryOverride)
|
|
27
49
|
: await config_manager_1.configManager.getRegistryForCraft(craftName);
|
|
28
50
|
const client = await this.getClient(registryUrl);
|
|
29
51
|
// Parse craft name (could be @scope/name or just name)
|
|
@@ -37,28 +59,22 @@ class RegistryClient {
|
|
|
37
59
|
return response.data.craft || response.data;
|
|
38
60
|
}
|
|
39
61
|
catch (error) {
|
|
40
|
-
|
|
62
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
63
|
+
if (axios_1.default.isAxiosError(error) && error.response?.status === 404) {
|
|
41
64
|
logger_1.logger.error(`Craft '${craftName}' not found in registry`);
|
|
42
65
|
}
|
|
43
66
|
else {
|
|
44
|
-
logger_1.logger.error(`Failed to fetch craft info: ${
|
|
67
|
+
logger_1.logger.error(`Failed to fetch craft info: ${message}`);
|
|
45
68
|
}
|
|
46
69
|
return null;
|
|
47
70
|
}
|
|
48
71
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const craftDeskJson = await config_manager_1.configManager.getCraftDeskJson();
|
|
56
|
-
if (craftDeskJson?.registries?.[registry]) {
|
|
57
|
-
return craftDeskJson.registries[registry].url;
|
|
58
|
-
}
|
|
59
|
-
// If not found, assume it's a URL without protocol
|
|
60
|
-
return `https://${registry}`;
|
|
61
|
-
}
|
|
72
|
+
/**
|
|
73
|
+
* List all available versions of a craft
|
|
74
|
+
*
|
|
75
|
+
* @param craftName - Name of the craft to list versions for
|
|
76
|
+
* @returns Array of version strings
|
|
77
|
+
*/
|
|
62
78
|
async listVersions(craftName) {
|
|
63
79
|
const registryUrl = await config_manager_1.configManager.getRegistryForCraft(craftName);
|
|
64
80
|
const client = await this.getClient(registryUrl);
|
|
@@ -68,14 +84,32 @@ class RegistryClient {
|
|
|
68
84
|
return response.data.versions || [];
|
|
69
85
|
}
|
|
70
86
|
catch (error) {
|
|
71
|
-
|
|
87
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
88
|
+
logger_1.logger.error(`Failed to fetch versions: ${message}`);
|
|
72
89
|
return [];
|
|
73
90
|
}
|
|
74
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolve dependencies via the registry API
|
|
94
|
+
*
|
|
95
|
+
* @param dependencies - Map of craft names to version constraints
|
|
96
|
+
* @returns Resolved dependencies and lockfile or null on error
|
|
97
|
+
* @throws Error if no registry is configured
|
|
98
|
+
*/
|
|
75
99
|
async resolveDependencies(dependencies) {
|
|
76
|
-
// Get the default registry from craftdesk.json
|
|
100
|
+
// Get the default registry from craftdesk.json
|
|
77
101
|
const craftDesk = await config_manager_1.configManager.getCraftDeskJson();
|
|
78
|
-
const registryUrl = craftDesk?.registries?.default?.url
|
|
102
|
+
const registryUrl = craftDesk?.registries?.default?.url;
|
|
103
|
+
// Registry is required only when trying to use registry features
|
|
104
|
+
if (!registryUrl) {
|
|
105
|
+
throw new Error('No registry configured. To use registry-based crafts, add a registry to your craftdesk.json:\n' +
|
|
106
|
+
'{\n' +
|
|
107
|
+
' "registries": {\n' +
|
|
108
|
+
' "default": { "url": "https://your-registry.com" }\n' +
|
|
109
|
+
' }\n' +
|
|
110
|
+
'}\n\n' +
|
|
111
|
+
'Note: Git-based dependencies (GitHub URLs) do not require a registry.');
|
|
112
|
+
}
|
|
79
113
|
const client = await this.getClient(registryUrl);
|
|
80
114
|
try {
|
|
81
115
|
logger_1.logger.debug('Resolving dependencies via API...');
|
|
@@ -83,26 +117,67 @@ class RegistryClient {
|
|
|
83
117
|
return response.data;
|
|
84
118
|
}
|
|
85
119
|
catch (error) {
|
|
86
|
-
|
|
120
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
121
|
+
logger_1.logger.error(`Failed to resolve dependencies: ${message}`);
|
|
87
122
|
return null;
|
|
88
123
|
}
|
|
89
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Download a craft archive from a URL
|
|
127
|
+
*
|
|
128
|
+
* @param downloadUrl - URL to download the craft from
|
|
129
|
+
* @param outputPath - Local path to save the downloaded file
|
|
130
|
+
* @throws Error if download fails
|
|
131
|
+
*/
|
|
90
132
|
async downloadCraft(downloadUrl, outputPath) {
|
|
91
133
|
try {
|
|
134
|
+
// Ensure output directory exists
|
|
135
|
+
const outputDir = path_1.default.dirname(outputPath);
|
|
136
|
+
await fs_1.default.promises.mkdir(outputDir, { recursive: true });
|
|
92
137
|
const response = await axios_1.default.get(downloadUrl, {
|
|
93
|
-
responseType: 'stream'
|
|
138
|
+
responseType: 'stream',
|
|
139
|
+
maxRedirects: 5
|
|
94
140
|
});
|
|
95
|
-
//
|
|
96
|
-
|
|
141
|
+
// Create write stream and pipe response data
|
|
142
|
+
const writer = fs_1.default.createWriteStream(outputPath);
|
|
143
|
+
// Wait for download to complete
|
|
144
|
+
await new Promise((resolve, reject) => {
|
|
145
|
+
// Handle errors from both the response stream and the write stream
|
|
146
|
+
response.data.on('error', (err) => reject(err));
|
|
147
|
+
writer.on('error', (err) => reject(err));
|
|
148
|
+
writer.on('finish', () => resolve());
|
|
149
|
+
// Start piping after handlers are set
|
|
150
|
+
response.data.pipe(writer);
|
|
151
|
+
});
|
|
152
|
+
logger_1.logger.debug(`Downloaded craft archive to ${outputPath}`);
|
|
97
153
|
}
|
|
98
154
|
catch (error) {
|
|
99
|
-
|
|
155
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
156
|
+
throw new Error(`Failed to download craft: ${message}`);
|
|
100
157
|
}
|
|
101
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* Search for crafts in the registry
|
|
161
|
+
*
|
|
162
|
+
* @param query - Search query string
|
|
163
|
+
* @param type - Optional filter by craft type
|
|
164
|
+
* @returns Array of matching crafts
|
|
165
|
+
* @throws Error if no registry is configured
|
|
166
|
+
*/
|
|
102
167
|
async searchCrafts(query, type) {
|
|
103
|
-
// Get the default registry from craftdesk.json
|
|
168
|
+
// Get the default registry from craftdesk.json
|
|
104
169
|
const craftDesk = await config_manager_1.configManager.getCraftDeskJson();
|
|
105
|
-
const registryUrl = craftDesk?.registries?.default?.url
|
|
170
|
+
const registryUrl = craftDesk?.registries?.default?.url;
|
|
171
|
+
// Registry is required for search
|
|
172
|
+
if (!registryUrl) {
|
|
173
|
+
throw new Error('No registry configured. To search for crafts, add a registry to your craftdesk.json:\n' +
|
|
174
|
+
'{\n' +
|
|
175
|
+
' "registries": {\n' +
|
|
176
|
+
' "default": { "url": "https://your-registry.com" }\n' +
|
|
177
|
+
' }\n' +
|
|
178
|
+
'}\n\n' +
|
|
179
|
+
'Note: You can still add Git-based dependencies without a registry using GitHub URLs.');
|
|
180
|
+
}
|
|
106
181
|
const client = await this.getClient(registryUrl);
|
|
107
182
|
try {
|
|
108
183
|
const params = { q: query };
|
|
@@ -112,21 +187,151 @@ class RegistryClient {
|
|
|
112
187
|
return response.data.crafts || [];
|
|
113
188
|
}
|
|
114
189
|
catch (error) {
|
|
115
|
-
|
|
190
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
191
|
+
logger_1.logger.error(`Failed to search crafts: ${message}`);
|
|
116
192
|
return [];
|
|
117
193
|
}
|
|
118
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a new version for a craft
|
|
197
|
+
*
|
|
198
|
+
* @param author - Craft author
|
|
199
|
+
* @param name - Craft name
|
|
200
|
+
* @param data - Version data including files and metadata
|
|
201
|
+
* @param data.version - Semantic version string (e.g., "1.0.0")
|
|
202
|
+
* @param data.type - Type of craft (skill, agent, command, hook, plugin)
|
|
203
|
+
* @param data.description - Human-readable description of the craft
|
|
204
|
+
* @param data.main_file - Path to the main file (e.g., "SKILL.md")
|
|
205
|
+
* @param data.changelog - Markdown formatted changelog for this version
|
|
206
|
+
* @param data.files - Array of file objects with path and content properties
|
|
207
|
+
* @returns Response from the API
|
|
208
|
+
* @throws Error if authentication fails or craft creation fails
|
|
209
|
+
*/
|
|
210
|
+
async createVersion(author, name, data) {
|
|
211
|
+
const registryUrl = await config_manager_1.configManager.getDefaultRegistry();
|
|
212
|
+
if (!registryUrl) {
|
|
213
|
+
throw new Error('No registry configured. Add a registry to craftdesk.json first.');
|
|
214
|
+
}
|
|
215
|
+
const client = await this.getClient(registryUrl);
|
|
216
|
+
try {
|
|
217
|
+
logger_1.logger.debug(`Creating version ${data.version} for ${author}/${name}`);
|
|
218
|
+
const response = await client.post(`/api/v1/crafts/${author}/${name}/versions`, data);
|
|
219
|
+
return response.data;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
223
|
+
if (error.response?.status === 401) {
|
|
224
|
+
throw new Error('Authentication required. Run "craftdesk login" first.');
|
|
225
|
+
}
|
|
226
|
+
else if (error.response?.status === 403) {
|
|
227
|
+
throw new Error('Not authorized to publish to this craft.');
|
|
228
|
+
}
|
|
229
|
+
else if (error.response?.data?.error) {
|
|
230
|
+
throw new Error(error.response.data.error);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
234
|
+
throw new Error(`Failed to create version: ${message}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Publish a craft (change status to published)
|
|
239
|
+
*
|
|
240
|
+
* @param author - Craft author
|
|
241
|
+
* @param name - Craft name
|
|
242
|
+
* @param options - Publishing options (visibility)
|
|
243
|
+
* @param options.visibility - Visibility level: "public", "private", or "organization"
|
|
244
|
+
* @returns Response from the API
|
|
245
|
+
* @throws Error if authentication fails or craft not found
|
|
246
|
+
*/
|
|
247
|
+
async publishCraft(author, name, options) {
|
|
248
|
+
const registryUrl = await config_manager_1.configManager.getDefaultRegistry();
|
|
249
|
+
if (!registryUrl) {
|
|
250
|
+
throw new Error('No registry configured. Add a registry to craftdesk.json first.');
|
|
251
|
+
}
|
|
252
|
+
const client = await this.getClient(registryUrl);
|
|
253
|
+
try {
|
|
254
|
+
logger_1.logger.debug(`Publishing ${author}/${name} with visibility: ${options.visibility || 'public'}`);
|
|
255
|
+
const response = await client.patch(`/api/v1/crafts/${author}/${name}/publish`, options);
|
|
256
|
+
return response.data;
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
260
|
+
if (error.response?.status === 401) {
|
|
261
|
+
throw new Error('Authentication required. Run "craftdesk login" first.');
|
|
262
|
+
}
|
|
263
|
+
else if (error.response?.status === 403) {
|
|
264
|
+
throw new Error('Not authorized to publish this craft.');
|
|
265
|
+
}
|
|
266
|
+
else if (error.response?.status === 404) {
|
|
267
|
+
throw new Error('Craft not found.');
|
|
268
|
+
}
|
|
269
|
+
else if (error.response?.data?.error) {
|
|
270
|
+
throw new Error(error.response.data.error);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
274
|
+
throw new Error(`Failed to publish craft: ${message}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Verify an API token with a registry
|
|
279
|
+
*
|
|
280
|
+
* Calls GET /api/v1/me to validate the token and get user info
|
|
281
|
+
*
|
|
282
|
+
* @param registryUrl - The URL of the registry
|
|
283
|
+
* @param token - The API token to verify
|
|
284
|
+
* @returns User info if token is valid
|
|
285
|
+
* @throws Error if token is invalid or network error occurs
|
|
286
|
+
*/
|
|
287
|
+
async verifyToken(registryUrl, token) {
|
|
288
|
+
try {
|
|
289
|
+
const response = await axios_1.default.get(`${registryUrl}/api/v1/me`, {
|
|
290
|
+
headers: {
|
|
291
|
+
'Authorization': `Bearer ${token}`,
|
|
292
|
+
'Content-Type': 'application/json'
|
|
293
|
+
},
|
|
294
|
+
timeout: 10000
|
|
295
|
+
});
|
|
296
|
+
return response.data;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
if (axios_1.default.isAxiosError(error) && error.response?.status === 401) {
|
|
300
|
+
throw new Error('Invalid or expired token');
|
|
301
|
+
}
|
|
302
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
303
|
+
throw new Error(`Failed to verify token: ${message}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Parse a craft name into author and name components
|
|
308
|
+
*
|
|
309
|
+
* @param craftName - Craft name in 'author/name' or '@author/name' format
|
|
310
|
+
* @returns Tuple of [author, name]
|
|
311
|
+
* @throws Error if craft name format is invalid
|
|
312
|
+
* @private
|
|
313
|
+
*/
|
|
119
314
|
parseCraftName(craftName) {
|
|
315
|
+
// Handle author/name format (e.g., "john/rails-api")
|
|
316
|
+
if (craftName.includes('/') && !craftName.startsWith('@')) {
|
|
317
|
+
const parts = craftName.split('/');
|
|
318
|
+
// Validate exactly 2 non-empty parts
|
|
319
|
+
if (parts.length === 2 && parts[0] && parts[1]) {
|
|
320
|
+
return [parts[0], parts[1]];
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Handle scoped format: @author/name
|
|
120
324
|
if (craftName.startsWith('@')) {
|
|
121
|
-
// Scoped craft: @acme/skill-name
|
|
122
325
|
const parts = craftName.substring(1).split('/');
|
|
123
|
-
|
|
124
|
-
|
|
326
|
+
// Validate exactly 2 non-empty parts
|
|
327
|
+
if (parts.length === 2 && parts[0] && parts[1]) {
|
|
328
|
+
return [parts[0], parts[1]];
|
|
125
329
|
}
|
|
126
330
|
}
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
|
|
331
|
+
// For unscoped names without author, throw error
|
|
332
|
+
// Users must specify author/name format for registry crafts
|
|
333
|
+
throw new Error(`Invalid craft name format: "${craftName}". ` +
|
|
334
|
+
`Registry crafts must use "author/name" format with non-empty author and name (e.g., "john/rails-api")`);
|
|
130
335
|
}
|
|
131
336
|
}
|
|
132
337
|
exports.RegistryClient = RegistryClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,qDAAiD;AACjD,4CAAyC;
|
|
1
|
+
{"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../src/services/registry-client.ts"],"names":[],"mappings":"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"}
|