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.
Files changed (175) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +968 -92
  3. package/dist/commands/add.d.ts +5 -0
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +303 -7
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/convert.d.ts +8 -0
  8. package/dist/commands/convert.d.ts.map +1 -0
  9. package/dist/commands/convert.js +146 -0
  10. package/dist/commands/convert.js.map +1 -0
  11. package/dist/commands/info.d.ts +8 -0
  12. package/dist/commands/info.d.ts.map +1 -0
  13. package/dist/commands/info.js +66 -0
  14. package/dist/commands/info.js.map +1 -0
  15. package/dist/commands/init.d.ts +5 -0
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +9 -3
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/install.d.ts +5 -0
  20. package/dist/commands/install.d.ts.map +1 -1
  21. package/dist/commands/install.js +24 -4
  22. package/dist/commands/install.js.map +1 -1
  23. package/dist/commands/list.d.ts +5 -0
  24. package/dist/commands/list.d.ts.map +1 -1
  25. package/dist/commands/list.js +72 -7
  26. package/dist/commands/list.js.map +1 -1
  27. package/dist/commands/login.d.ts +8 -0
  28. package/dist/commands/login.d.ts.map +1 -0
  29. package/dist/commands/login.js +158 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/logout.d.ts +8 -0
  32. package/dist/commands/logout.d.ts.map +1 -0
  33. package/dist/commands/logout.js +51 -0
  34. package/dist/commands/logout.js.map +1 -0
  35. package/dist/commands/outdated.d.ts +23 -0
  36. package/dist/commands/outdated.d.ts.map +1 -0
  37. package/dist/commands/outdated.js +268 -0
  38. package/dist/commands/outdated.js.map +1 -0
  39. package/dist/commands/publish.d.ts +8 -0
  40. package/dist/commands/publish.d.ts.map +1 -0
  41. package/dist/commands/publish.js +198 -0
  42. package/dist/commands/publish.js.map +1 -0
  43. package/dist/commands/remove.d.ts +5 -0
  44. package/dist/commands/remove.d.ts.map +1 -1
  45. package/dist/commands/remove.js +52 -11
  46. package/dist/commands/remove.js.map +1 -1
  47. package/dist/commands/search.d.ts +8 -0
  48. package/dist/commands/search.d.ts.map +1 -0
  49. package/dist/commands/search.js +60 -0
  50. package/dist/commands/search.js.map +1 -0
  51. package/dist/commands/update.d.ts +8 -0
  52. package/dist/commands/update.d.ts.map +1 -0
  53. package/dist/commands/update.js +369 -0
  54. package/dist/commands/update.js.map +1 -0
  55. package/dist/commands/whoami.d.ts +8 -0
  56. package/dist/commands/whoami.d.ts.map +1 -0
  57. package/dist/commands/whoami.js +58 -0
  58. package/dist/commands/whoami.js.map +1 -0
  59. package/dist/converters/base-converter.d.ts +89 -0
  60. package/dist/converters/base-converter.d.ts.map +1 -0
  61. package/dist/converters/base-converter.js +249 -0
  62. package/dist/converters/base-converter.js.map +1 -0
  63. package/dist/converters/continue-converter.d.ts +53 -0
  64. package/dist/converters/continue-converter.d.ts.map +1 -0
  65. package/dist/converters/continue-converter.js +243 -0
  66. package/dist/converters/continue-converter.js.map +1 -0
  67. package/dist/converters/cursor-converter.d.ts +70 -0
  68. package/dist/converters/cursor-converter.d.ts.map +1 -0
  69. package/dist/converters/cursor-converter.js +272 -0
  70. package/dist/converters/cursor-converter.js.map +1 -0
  71. package/dist/index.js +35 -4
  72. package/dist/index.js.map +1 -1
  73. package/dist/services/config-manager.d.ts +128 -10
  74. package/dist/services/config-manager.d.ts.map +1 -1
  75. package/dist/services/config-manager.js +189 -18
  76. package/dist/services/config-manager.js.map +1 -1
  77. package/dist/services/converter.d.ts +53 -0
  78. package/dist/services/converter.d.ts.map +1 -0
  79. package/dist/services/converter.js +185 -0
  80. package/dist/services/converter.js.map +1 -0
  81. package/dist/services/craft-wrapper.d.ts +108 -0
  82. package/dist/services/craft-wrapper.d.ts.map +1 -0
  83. package/dist/services/craft-wrapper.js +268 -0
  84. package/dist/services/craft-wrapper.js.map +1 -0
  85. package/dist/services/git-resolver.d.ts +9 -3
  86. package/dist/services/git-resolver.d.ts.map +1 -1
  87. package/dist/services/git-resolver.js +35 -10
  88. package/dist/services/git-resolver.js.map +1 -1
  89. package/dist/services/installer.d.ts +51 -1
  90. package/dist/services/installer.d.ts.map +1 -1
  91. package/dist/services/installer.js +245 -14
  92. package/dist/services/installer.js.map +1 -1
  93. package/dist/services/plugin-resolver.d.ts +80 -0
  94. package/dist/services/plugin-resolver.d.ts.map +1 -0
  95. package/dist/services/plugin-resolver.js +182 -0
  96. package/dist/services/plugin-resolver.js.map +1 -0
  97. package/dist/services/registry-client.d.ts +132 -5
  98. package/dist/services/registry-client.d.ts.map +1 -1
  99. package/dist/services/registry-client.js +239 -34
  100. package/dist/services/registry-client.js.map +1 -1
  101. package/dist/services/settings-manager.d.ts +151 -0
  102. package/dist/services/settings-manager.d.ts.map +1 -0
  103. package/dist/services/settings-manager.js +333 -0
  104. package/dist/services/settings-manager.js.map +1 -0
  105. package/dist/types/claude-settings.d.ts +155 -0
  106. package/dist/types/claude-settings.d.ts.map +1 -0
  107. package/dist/types/claude-settings.js +20 -0
  108. package/dist/types/claude-settings.js.map +1 -0
  109. package/dist/types/converter.d.ts +98 -0
  110. package/dist/types/converter.d.ts.map +1 -0
  111. package/dist/types/converter.js +6 -0
  112. package/dist/types/converter.js.map +1 -0
  113. package/dist/types/craftdesk-json.d.ts +63 -3
  114. package/dist/types/craftdesk-json.d.ts.map +1 -1
  115. package/dist/types/craftdesk-lock.d.ts +62 -1
  116. package/dist/types/craftdesk-lock.d.ts.map +1 -1
  117. package/dist/utils/crypto.d.ts +23 -0
  118. package/dist/utils/crypto.d.ts.map +1 -0
  119. package/dist/utils/crypto.js +52 -0
  120. package/dist/utils/crypto.js.map +1 -0
  121. package/dist/utils/file-system.d.ts +43 -0
  122. package/dist/utils/file-system.d.ts.map +1 -1
  123. package/dist/utils/file-system.js +45 -2
  124. package/dist/utils/file-system.js.map +1 -1
  125. package/dist/utils/logger.d.ts +75 -0
  126. package/dist/utils/logger.d.ts.map +1 -1
  127. package/dist/utils/logger.js +76 -1
  128. package/dist/utils/logger.js.map +1 -1
  129. package/dist/utils/version-utils.d.ts +63 -0
  130. package/dist/utils/version-utils.d.ts.map +1 -0
  131. package/dist/utils/version-utils.js +130 -0
  132. package/dist/utils/version-utils.js.map +1 -0
  133. package/package.json +36 -9
  134. package/.claude/settings.local.json +0 -17
  135. package/.github/workflows/ci.yml +0 -94
  136. package/API.md +0 -414
  137. package/TESTING.md +0 -263
  138. package/dist/commands/config.d.ts +0 -3
  139. package/dist/commands/config.d.ts.map +0 -1
  140. package/dist/commands/config.js +0 -56
  141. package/dist/commands/config.js.map +0 -1
  142. package/dist/types/config.d.ts +0 -17
  143. package/dist/types/config.d.ts.map +0 -1
  144. package/dist/types/config.js +0 -3
  145. package/dist/types/config.js.map +0 -1
  146. package/docs/DEPENDENCY_RESOLUTION.md +0 -237
  147. package/examples/craftdesk-all-sources.json +0 -79
  148. package/examples/craftdesk-git-monorepo.json +0 -41
  149. package/examples/craftdesk-multi-registry.json +0 -40
  150. package/examples/craftdesk-with-registries.json +0 -49
  151. package/examples/simple-craftdesk.json +0 -10
  152. package/src/commands/add.ts +0 -314
  153. package/src/commands/init.ts +0 -55
  154. package/src/commands/install.ts +0 -126
  155. package/src/commands/list.ts +0 -126
  156. package/src/commands/remove.ts +0 -82
  157. package/src/index.ts +0 -56
  158. package/src/services/config-manager.ts +0 -150
  159. package/src/services/git-resolver.ts +0 -370
  160. package/src/services/installer.ts +0 -314
  161. package/src/services/registry-client.ts +0 -163
  162. package/src/types/craftdesk-json.ts +0 -53
  163. package/src/types/craftdesk-lock.ts +0 -38
  164. package/src/utils/file-system.ts +0 -55
  165. package/src/utils/logger.ts +0 -82
  166. package/tests/fixtures/craftdesk-git.json +0 -17
  167. package/tests/fixtures/craftdesk.json +0 -15
  168. package/tests/helpers/test-utils.ts +0 -60
  169. package/tests/integration/init-command.test.ts +0 -70
  170. package/tests/integration/list-command.test.ts +0 -77
  171. package/tests/unit/config-manager.test.ts +0 -228
  172. package/tests/unit/git-resolver.test.ts +0 -303
  173. package/tests/unit/installer.test.ts +0 -105
  174. package/tsconfig.json +0 -20
  175. package/vitest.config.ts +0 -29
@@ -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
- axiosInstance = null;
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 this.resolveRegistry(registryOverride)
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
- if (error.response?.status === 404) {
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: ${error.message}`);
67
+ logger_1.logger.error(`Failed to fetch craft info: ${message}`);
45
68
  }
46
69
  return null;
47
70
  }
48
71
  }
49
- async resolveRegistry(registry) {
50
- // If it's a URL, use it directly
51
- if (registry.startsWith('http://') || registry.startsWith('https://')) {
52
- return registry;
53
- }
54
- // Look it up in the craftdesk.json registries section
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
- logger_1.logger.error(`Failed to fetch versions: ${error.message}`);
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 or use fallback
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 || 'https://craftdesk.ai';
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
- logger_1.logger.error(`Failed to resolve dependencies: ${error.message}`);
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
- // TODO: Save to file and extract
96
- logger_1.logger.debug(`Downloaded craft from ${downloadUrl}`);
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
- throw new Error(`Failed to download craft: ${error.message}`);
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 or use fallback
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 || 'https://craftdesk.ai';
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
- logger_1.logger.error(`Failed to search crafts: ${error.message}`);
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
- if (parts.length === 2) {
124
- return [`@${parts[0]}`, parts[1]];
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
- // Assume author is 'anthropic' for unscoped crafts (default)
128
- // This should be configurable or determined by registry
129
- return ['anthropic', craftName];
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":"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"}
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"}