craftdesk 0.2.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 +968 -92
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +303 -7
- 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 +9 -3
- 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 +52 -11
- 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 +35 -4
- 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 +35 -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 -17
- 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 -370
- 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
|
@@ -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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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SettingsManager - Manages .claude/settings.json file
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Reading and writing Claude Code settings
|
|
6
|
+
* - Plugin registration and lifecycle
|
|
7
|
+
* - MCP server configuration
|
|
8
|
+
* - Wrapped craft tracking
|
|
9
|
+
*/
|
|
10
|
+
import type { ClaudeSettings, PluginConfig, MCPServerConfig, WrappedCraftConfig } from '../types/claude-settings';
|
|
11
|
+
/**
|
|
12
|
+
* Service for managing Claude Code settings.json file
|
|
13
|
+
*
|
|
14
|
+
* Handles plugin registration, MCP server configuration, and settings validation
|
|
15
|
+
*/
|
|
16
|
+
export declare class SettingsManager {
|
|
17
|
+
private installDir;
|
|
18
|
+
private settingsPath;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new SettingsManager instance
|
|
21
|
+
*
|
|
22
|
+
* @param installDir - Installation directory (default: '.claude')
|
|
23
|
+
*/
|
|
24
|
+
constructor(installDir?: string);
|
|
25
|
+
/**
|
|
26
|
+
* Read the settings file
|
|
27
|
+
*
|
|
28
|
+
* Returns default settings if file doesn't exist
|
|
29
|
+
*
|
|
30
|
+
* @returns The Claude settings object
|
|
31
|
+
*/
|
|
32
|
+
readSettings(): Promise<ClaudeSettings>;
|
|
33
|
+
/**
|
|
34
|
+
* Write settings to file
|
|
35
|
+
*
|
|
36
|
+
* @param settings - The settings object to write
|
|
37
|
+
*/
|
|
38
|
+
writeSettings(settings: ClaudeSettings): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Register a plugin in settings
|
|
41
|
+
*
|
|
42
|
+
* @param config - Plugin configuration to register
|
|
43
|
+
*/
|
|
44
|
+
registerPlugin(config: PluginConfig): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Unregister a plugin from settings
|
|
47
|
+
*
|
|
48
|
+
* @param pluginName - Name of the plugin to unregister
|
|
49
|
+
*/
|
|
50
|
+
unregisterPlugin(pluginName: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Get plugin configuration
|
|
53
|
+
*
|
|
54
|
+
* @param pluginName - Name of the plugin
|
|
55
|
+
* @returns Plugin configuration or null if not found
|
|
56
|
+
*/
|
|
57
|
+
getPlugin(pluginName: string): Promise<PluginConfig | null>;
|
|
58
|
+
/**
|
|
59
|
+
* List all registered plugins
|
|
60
|
+
*
|
|
61
|
+
* @returns Array of plugin configurations
|
|
62
|
+
*/
|
|
63
|
+
listPlugins(): Promise<PluginConfig[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Enable a plugin
|
|
66
|
+
*
|
|
67
|
+
* @param pluginName - Name of the plugin to enable
|
|
68
|
+
* @throws Error if plugin not found
|
|
69
|
+
*/
|
|
70
|
+
enablePlugin(pluginName: string): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Disable a plugin
|
|
73
|
+
*
|
|
74
|
+
* @param pluginName - Name of the plugin to disable
|
|
75
|
+
* @throws Error if plugin not found
|
|
76
|
+
*/
|
|
77
|
+
disablePlugin(pluginName: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Register an MCP server
|
|
80
|
+
*
|
|
81
|
+
* @param serverName - Name of the MCP server
|
|
82
|
+
* @param config - MCP server configuration
|
|
83
|
+
*/
|
|
84
|
+
registerMCPServer(serverName: string, config: MCPServerConfig): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Unregister an MCP server
|
|
87
|
+
*
|
|
88
|
+
* @param serverName - Name of the MCP server to unregister
|
|
89
|
+
*/
|
|
90
|
+
unregisterMCPServer(serverName: string): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Track a wrapped craft
|
|
93
|
+
*
|
|
94
|
+
* @param pluginName - Name of the plugin
|
|
95
|
+
* @param wrappedConfig - Wrapped craft configuration
|
|
96
|
+
* @throws Error if plugin not found
|
|
97
|
+
*/
|
|
98
|
+
registerWrappedCraft(pluginName: string, wrappedConfig: WrappedCraftConfig): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Update plugin dependencies tracking
|
|
101
|
+
*
|
|
102
|
+
* @param pluginName - Name of the plugin
|
|
103
|
+
* @param dependencies - Array of dependency names
|
|
104
|
+
* @throws Error if plugin not found
|
|
105
|
+
*/
|
|
106
|
+
updatePluginDependencies(pluginName: string, dependencies: string[]): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Mark plugin as dependency of another plugin
|
|
109
|
+
*
|
|
110
|
+
* @param pluginName - Name of the plugin
|
|
111
|
+
* @param isDependency - Whether to mark as dependency (default: true)
|
|
112
|
+
* @throws Error if plugin not found
|
|
113
|
+
*/
|
|
114
|
+
markAsDependency(pluginName: string, isDependency?: boolean): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Get all plugins that are dependencies (not directly installed)
|
|
117
|
+
*
|
|
118
|
+
* @returns Array of dependency plugin configurations
|
|
119
|
+
*/
|
|
120
|
+
getDependencyPlugins(): Promise<PluginConfig[]>;
|
|
121
|
+
/**
|
|
122
|
+
* Get all directly installed plugins (not dependencies)
|
|
123
|
+
*
|
|
124
|
+
* @returns Array of directly installed plugin configurations
|
|
125
|
+
*/
|
|
126
|
+
getDirectPlugins(): Promise<PluginConfig[]>;
|
|
127
|
+
/**
|
|
128
|
+
* Check if settings file exists
|
|
129
|
+
*
|
|
130
|
+
* @returns True if settings file exists
|
|
131
|
+
*/
|
|
132
|
+
exists(): Promise<boolean>;
|
|
133
|
+
/**
|
|
134
|
+
* Create default settings structure
|
|
135
|
+
*
|
|
136
|
+
* @returns Default Claude settings object
|
|
137
|
+
* @private
|
|
138
|
+
*/
|
|
139
|
+
private createDefaultSettings;
|
|
140
|
+
/**
|
|
141
|
+
* Validate settings structure
|
|
142
|
+
*
|
|
143
|
+
* @returns Validation result with valid flag and error messages
|
|
144
|
+
*/
|
|
145
|
+
validateSettings(): Promise<{
|
|
146
|
+
valid: boolean;
|
|
147
|
+
errors: string[];
|
|
148
|
+
}>;
|
|
149
|
+
}
|
|
150
|
+
export declare const settingsManager: SettingsManager;
|
|
151
|
+
//# sourceMappingURL=settings-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-manager.d.ts","sourceRoot":"","sources":["../../src/services/settings-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAGlC;;;;GAIG;AACH,qBAAa,eAAe;IAQd,OAAO,CAAC,UAAU;IAP9B,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;OAIG;gBACiB,UAAU,GAAE,MAAkB;IAIlD;;;;;;OAMG;IACG,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAkB7C;;;;OAIG;IACG,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB5D;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD;;;;OAIG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD;;;;;OAKG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKjE;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAK5C;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrD;;;;;OAKG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD;;;;;OAKG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;OAIG;IACG,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D;;;;;;OAMG;IACG,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,kBAAkB,GAChC,OAAO,CAAC,IAAI,CAAC;IAgBhB;;;;;;OAMG;IACG,wBAAwB,CAC5B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;;OAMG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvF;;;;OAIG;IACG,oBAAoB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrD;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKjD;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAgDxE;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|