craftdesk 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +1609 -132
  3. package/dist/commands/add.d.ts +5 -0
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +306 -8
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/convert.d.ts +8 -0
  8. package/dist/commands/convert.d.ts.map +1 -0
  9. package/dist/commands/convert.js +146 -0
  10. package/dist/commands/convert.js.map +1 -0
  11. package/dist/commands/detect-agents.d.ts +14 -0
  12. package/dist/commands/detect-agents.d.ts.map +1 -0
  13. package/dist/commands/detect-agents.js +86 -0
  14. package/dist/commands/detect-agents.js.map +1 -0
  15. package/dist/commands/embed.d.ts +14 -0
  16. package/dist/commands/embed.d.ts.map +1 -0
  17. package/dist/commands/embed.js +147 -0
  18. package/dist/commands/embed.js.map +1 -0
  19. package/dist/commands/info.d.ts +8 -0
  20. package/dist/commands/info.d.ts.map +1 -0
  21. package/dist/commands/info.js +66 -0
  22. package/dist/commands/info.js.map +1 -0
  23. package/dist/commands/init.d.ts +5 -0
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +8 -2
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/install.d.ts +5 -0
  28. package/dist/commands/install.d.ts.map +1 -1
  29. package/dist/commands/install.js +24 -4
  30. package/dist/commands/install.js.map +1 -1
  31. package/dist/commands/list.d.ts +5 -0
  32. package/dist/commands/list.d.ts.map +1 -1
  33. package/dist/commands/list.js +75 -7
  34. package/dist/commands/list.js.map +1 -1
  35. package/dist/commands/login.d.ts +8 -0
  36. package/dist/commands/login.d.ts.map +1 -0
  37. package/dist/commands/login.js +158 -0
  38. package/dist/commands/login.js.map +1 -0
  39. package/dist/commands/logout.d.ts +8 -0
  40. package/dist/commands/logout.d.ts.map +1 -0
  41. package/dist/commands/logout.js +51 -0
  42. package/dist/commands/logout.js.map +1 -0
  43. package/dist/commands/outdated.d.ts +23 -0
  44. package/dist/commands/outdated.d.ts.map +1 -0
  45. package/dist/commands/outdated.js +268 -0
  46. package/dist/commands/outdated.js.map +1 -0
  47. package/dist/commands/publish.d.ts +8 -0
  48. package/dist/commands/publish.d.ts.map +1 -0
  49. package/dist/commands/publish.js +203 -0
  50. package/dist/commands/publish.js.map +1 -0
  51. package/dist/commands/remove.d.ts +5 -0
  52. package/dist/commands/remove.d.ts.map +1 -1
  53. package/dist/commands/remove.js +51 -10
  54. package/dist/commands/remove.js.map +1 -1
  55. package/dist/commands/search.d.ts +8 -0
  56. package/dist/commands/search.d.ts.map +1 -0
  57. package/dist/commands/search.js +60 -0
  58. package/dist/commands/search.js.map +1 -0
  59. package/dist/commands/setup-multi-agent.d.ts +17 -0
  60. package/dist/commands/setup-multi-agent.d.ts.map +1 -0
  61. package/dist/commands/setup-multi-agent.js +188 -0
  62. package/dist/commands/setup-multi-agent.js.map +1 -0
  63. package/dist/commands/sync.d.ts +14 -0
  64. package/dist/commands/sync.d.ts.map +1 -0
  65. package/dist/commands/sync.js +144 -0
  66. package/dist/commands/sync.js.map +1 -0
  67. package/dist/commands/unembed.d.ts +14 -0
  68. package/dist/commands/unembed.d.ts.map +1 -0
  69. package/dist/commands/unembed.js +96 -0
  70. package/dist/commands/unembed.js.map +1 -0
  71. package/dist/commands/update.d.ts +8 -0
  72. package/dist/commands/update.d.ts.map +1 -0
  73. package/dist/commands/update.js +372 -0
  74. package/dist/commands/update.js.map +1 -0
  75. package/dist/commands/verify.d.ts +14 -0
  76. package/dist/commands/verify.d.ts.map +1 -0
  77. package/dist/commands/verify.js +143 -0
  78. package/dist/commands/verify.js.map +1 -0
  79. package/dist/commands/whoami.d.ts +8 -0
  80. package/dist/commands/whoami.d.ts.map +1 -0
  81. package/dist/commands/whoami.js +58 -0
  82. package/dist/commands/whoami.js.map +1 -0
  83. package/dist/converters/base-converter.d.ts +89 -0
  84. package/dist/converters/base-converter.d.ts.map +1 -0
  85. package/dist/converters/base-converter.js +249 -0
  86. package/dist/converters/base-converter.js.map +1 -0
  87. package/dist/converters/continue-converter.d.ts +53 -0
  88. package/dist/converters/continue-converter.d.ts.map +1 -0
  89. package/dist/converters/continue-converter.js +243 -0
  90. package/dist/converters/continue-converter.js.map +1 -0
  91. package/dist/converters/cursor-converter.d.ts +70 -0
  92. package/dist/converters/cursor-converter.d.ts.map +1 -0
  93. package/dist/converters/cursor-converter.js +272 -0
  94. package/dist/converters/cursor-converter.js.map +1 -0
  95. package/dist/index.js +56 -3
  96. package/dist/index.js.map +1 -1
  97. package/dist/services/agent-detector.d.ts +57 -0
  98. package/dist/services/agent-detector.d.ts.map +1 -0
  99. package/dist/services/agent-detector.js +146 -0
  100. package/dist/services/agent-detector.js.map +1 -0
  101. package/dist/services/config-manager.d.ts +128 -10
  102. package/dist/services/config-manager.d.ts.map +1 -1
  103. package/dist/services/config-manager.js +190 -18
  104. package/dist/services/config-manager.js.map +1 -1
  105. package/dist/services/converter.d.ts +53 -0
  106. package/dist/services/converter.d.ts.map +1 -0
  107. package/dist/services/converter.js +185 -0
  108. package/dist/services/converter.js.map +1 -0
  109. package/dist/services/craft-wrapper.d.ts +108 -0
  110. package/dist/services/craft-wrapper.d.ts.map +1 -0
  111. package/dist/services/craft-wrapper.js +268 -0
  112. package/dist/services/craft-wrapper.js.map +1 -0
  113. package/dist/services/git-resolver.d.ts +9 -3
  114. package/dist/services/git-resolver.d.ts.map +1 -1
  115. package/dist/services/git-resolver.js +44 -20
  116. package/dist/services/git-resolver.js.map +1 -1
  117. package/dist/services/gitignore-manager.d.ts +74 -0
  118. package/dist/services/gitignore-manager.d.ts.map +1 -0
  119. package/dist/services/gitignore-manager.js +188 -0
  120. package/dist/services/gitignore-manager.js.map +1 -0
  121. package/dist/services/installer.d.ts +60 -1
  122. package/dist/services/installer.d.ts.map +1 -1
  123. package/dist/services/installer.js +295 -20
  124. package/dist/services/installer.js.map +1 -1
  125. package/dist/services/multi-agent-sync.d.ts +88 -0
  126. package/dist/services/multi-agent-sync.d.ts.map +1 -0
  127. package/dist/services/multi-agent-sync.js +316 -0
  128. package/dist/services/multi-agent-sync.js.map +1 -0
  129. package/dist/services/plugin-resolver.d.ts +80 -0
  130. package/dist/services/plugin-resolver.d.ts.map +1 -0
  131. package/dist/services/plugin-resolver.js +183 -0
  132. package/dist/services/plugin-resolver.js.map +1 -0
  133. package/dist/services/registry-client.d.ts +132 -5
  134. package/dist/services/registry-client.d.ts.map +1 -1
  135. package/dist/services/registry-client.js +239 -34
  136. package/dist/services/registry-client.js.map +1 -1
  137. package/dist/services/settings-manager.d.ts +151 -0
  138. package/dist/services/settings-manager.d.ts.map +1 -0
  139. package/dist/services/settings-manager.js +333 -0
  140. package/dist/services/settings-manager.js.map +1 -0
  141. package/dist/types/claude-settings.d.ts +155 -0
  142. package/dist/types/claude-settings.d.ts.map +1 -0
  143. package/dist/types/claude-settings.js +20 -0
  144. package/dist/types/claude-settings.js.map +1 -0
  145. package/dist/types/converter.d.ts +98 -0
  146. package/dist/types/converter.d.ts.map +1 -0
  147. package/dist/types/converter.js +6 -0
  148. package/dist/types/converter.js.map +1 -0
  149. package/dist/types/craftdesk-json.d.ts +76 -3
  150. package/dist/types/craftdesk-json.d.ts.map +1 -1
  151. package/dist/types/craftdesk-lock.d.ts +62 -1
  152. package/dist/types/craftdesk-lock.d.ts.map +1 -1
  153. package/dist/types/multi-agent.d.ts +85 -0
  154. package/dist/types/multi-agent.d.ts.map +1 -0
  155. package/dist/types/multi-agent.js +6 -0
  156. package/dist/types/multi-agent.js.map +1 -0
  157. package/dist/utils/crypto.d.ts +23 -0
  158. package/dist/utils/crypto.d.ts.map +1 -0
  159. package/dist/utils/crypto.js +52 -0
  160. package/dist/utils/crypto.js.map +1 -0
  161. package/dist/utils/file-system.d.ts +43 -0
  162. package/dist/utils/file-system.d.ts.map +1 -1
  163. package/dist/utils/file-system.js +45 -2
  164. package/dist/utils/file-system.js.map +1 -1
  165. package/dist/utils/logger.d.ts +75 -0
  166. package/dist/utils/logger.d.ts.map +1 -1
  167. package/dist/utils/logger.js +76 -1
  168. package/dist/utils/logger.js.map +1 -1
  169. package/dist/utils/version-utils.d.ts +63 -0
  170. package/dist/utils/version-utils.d.ts.map +1 -0
  171. package/dist/utils/version-utils.js +130 -0
  172. package/dist/utils/version-utils.js.map +1 -0
  173. package/package.json +36 -9
  174. package/.claude/settings.local.json +0 -19
  175. package/.github/workflows/ci.yml +0 -94
  176. package/API.md +0 -414
  177. package/TESTING.md +0 -263
  178. package/dist/commands/config.d.ts +0 -3
  179. package/dist/commands/config.d.ts.map +0 -1
  180. package/dist/commands/config.js +0 -56
  181. package/dist/commands/config.js.map +0 -1
  182. package/dist/types/config.d.ts +0 -17
  183. package/dist/types/config.d.ts.map +0 -1
  184. package/dist/types/config.js +0 -3
  185. package/dist/types/config.js.map +0 -1
  186. package/docs/DEPENDENCY_RESOLUTION.md +0 -237
  187. package/examples/craftdesk-all-sources.json +0 -79
  188. package/examples/craftdesk-git-monorepo.json +0 -41
  189. package/examples/craftdesk-multi-registry.json +0 -40
  190. package/examples/craftdesk-with-registries.json +0 -49
  191. package/examples/simple-craftdesk.json +0 -10
  192. package/src/commands/add.ts +0 -314
  193. package/src/commands/init.ts +0 -55
  194. package/src/commands/install.ts +0 -126
  195. package/src/commands/list.ts +0 -126
  196. package/src/commands/remove.ts +0 -82
  197. package/src/index.ts +0 -56
  198. package/src/services/config-manager.ts +0 -150
  199. package/src/services/git-resolver.ts +0 -373
  200. package/src/services/installer.ts +0 -314
  201. package/src/services/registry-client.ts +0 -163
  202. package/src/types/craftdesk-json.ts +0 -53
  203. package/src/types/craftdesk-lock.ts +0 -38
  204. package/src/utils/file-system.ts +0 -55
  205. package/src/utils/logger.ts +0 -82
  206. package/tests/fixtures/craftdesk-git.json +0 -17
  207. package/tests/fixtures/craftdesk.json +0 -15
  208. package/tests/helpers/test-utils.ts +0 -60
  209. package/tests/integration/init-command.test.ts +0 -70
  210. package/tests/integration/list-command.test.ts +0 -77
  211. package/tests/unit/config-manager.test.ts +0 -228
  212. package/tests/unit/git-resolver.test.ts +0 -303
  213. package/tests/unit/installer.test.ts +0 -105
  214. package/tsconfig.json +0 -20
  215. package/vitest.config.ts +0 -29
package/TESTING.md DELETED
@@ -1,263 +0,0 @@
1
- # Testing Guide
2
-
3
- ## Overview
4
-
5
- The CraftDesk CLI uses **Vitest** as its testing framework, providing fast and modern testing capabilities with TypeScript support.
6
-
7
- ## Test Structure
8
-
9
- ```
10
- tests/
11
- ├── unit/ # Unit tests for individual modules
12
- │ ├── config-manager.test.ts
13
- │ ├── git-resolver.test.ts
14
- │ └── installer.test.ts
15
- ├── integration/ # Integration tests for CLI commands
16
- │ ├── init-command.test.ts
17
- │ └── list-command.test.ts
18
- ├── fixtures/ # Test fixtures and mock data
19
- │ ├── craftdesk.json
20
- │ └── craftdesk-git.json
21
- └── helpers/ # Test utilities
22
- └── test-utils.ts
23
- ```
24
-
25
- ## Running Tests
26
-
27
- ### Run all tests
28
- ```bash
29
- npm test
30
- ```
31
-
32
- ### Run tests in watch mode
33
- ```bash
34
- npm run test:watch
35
- ```
36
-
37
- ### Run tests with coverage
38
- ```bash
39
- npm run test:coverage
40
- ```
41
-
42
- ### Run tests with UI
43
- ```bash
44
- npm run test:ui
45
- ```
46
-
47
- ## Test Coverage
48
-
49
- Coverage reports are generated using Vitest's built-in coverage tool (v8 provider).
50
-
51
- ### Viewing Coverage
52
-
53
- After running `npm run test:coverage`, view the report:
54
-
55
- ```bash
56
- # Terminal summary is displayed automatically
57
-
58
- # Open HTML report in browser
59
- open coverage/index.html
60
- ```
61
-
62
- ### Coverage Thresholds
63
-
64
- Current coverage configuration in `vitest.config.ts`:
65
- - Excludes: `node_modules/`, `dist/`, `bin/`, test files
66
-
67
- ## Writing Tests
68
-
69
- ### Unit Tests
70
-
71
- Unit tests focus on testing individual functions and classes in isolation.
72
-
73
- **Example: Testing ConfigManager**
74
-
75
- ```typescript
76
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
77
- import { ConfigManager } from '../../src/services/config-manager';
78
- import { createTempDir, cleanupTempDir } from '../helpers/test-utils';
79
-
80
- describe('ConfigManager', () => {
81
- let configManager: ConfigManager;
82
- let tempDir: string;
83
-
84
- beforeEach(async () => {
85
- configManager = new ConfigManager();
86
- tempDir = await createTempDir('config-test-');
87
- process.chdir(tempDir);
88
- });
89
-
90
- afterEach(async () => {
91
- await cleanupTempDir(tempDir);
92
- });
93
-
94
- it('should return default registry when no craftdesk.json exists', async () => {
95
- const registry = await configManager.getRegistryForPackage('test-package');
96
- expect(registry).toBe('https://craftdesk.ai');
97
- });
98
- });
99
- ```
100
-
101
- ### Integration Tests
102
-
103
- Integration tests verify that CLI commands work correctly end-to-end.
104
-
105
- **Example: Testing CLI Commands**
106
-
107
- ```typescript
108
- import { execSync } from 'child_process';
109
- import path from 'path';
110
-
111
- describe('craftdesk init command', () => {
112
- const cliPath = path.join(__dirname, '../../dist/index.js');
113
-
114
- it('should create a new craftdesk.json file', () => {
115
- execSync(`node ${cliPath} init --name test --version 1.0.0 --type skill`);
116
-
117
- const exists = await fs.pathExists('craftdesk.json');
118
- expect(exists).toBe(true);
119
- });
120
- });
121
- ```
122
-
123
- ### Test Utilities
124
-
125
- The `tests/helpers/test-utils.ts` file provides helper functions:
126
-
127
- - `createTempDir(prefix)` - Creates a temporary test directory
128
- - `cleanupTempDir(dirPath)` - Removes a temporary directory
129
- - `copyFixture(name, targetDir)` - Copies a fixture file
130
- - `readJsonFile(path)` - Reads and parses JSON file
131
- - `writeJsonFile(path, data)` - Writes JSON to file
132
- - `createMockCraftInfo(name, version)` - Creates mock craft metadata
133
-
134
- ### Mocking
135
-
136
- Use Vitest's built-in mocking for external dependencies:
137
-
138
- ```typescript
139
- import { vi } from 'vitest';
140
- import { execSync } from 'child_process';
141
-
142
- vi.mock('child_process', () => ({
143
- execSync: vi.fn()
144
- }));
145
-
146
- // In your test
147
- const mockExecSync = vi.mocked(execSync);
148
- mockExecSync.mockReturnValue(Buffer.from('output'));
149
- ```
150
-
151
- ## CI/CD Integration
152
-
153
- ### GitHub Actions
154
-
155
- The `.github/workflows/ci.yml` file runs tests automatically on:
156
- - Push to main/master/develop branches
157
- - Pull requests to main/master/develop branches
158
-
159
- The workflow:
160
- 1. Tests on Node.js 16.x, 18.x, and 20.x
161
- 2. Generates coverage report (Node 20.x only)
162
- 3. Uploads coverage to Codecov
163
- 4. Verifies TypeScript compilation
164
- 5. Builds the project
165
-
166
- ### Local CI Simulation
167
-
168
- Run the same checks locally before pushing:
169
-
170
- ```bash
171
- # Run tests
172
- npm test
173
-
174
- # Generate coverage
175
- npm run test:coverage
176
-
177
- # Type check
178
- npx tsc --noEmit
179
-
180
- # Build
181
- npm run build
182
- ```
183
-
184
- ## Test Best Practices
185
-
186
- ### 1. Isolation
187
- - Each test should be independent
188
- - Use `beforeEach` and `afterEach` for setup/teardown
189
- - Clean up temporary files and directories
190
-
191
- ### 2. Descriptive Names
192
- ```typescript
193
- // Good
194
- it('should return scoped registry for scoped package')
195
-
196
- // Bad
197
- it('test1')
198
- ```
199
-
200
- ### 3. Arrange-Act-Assert Pattern
201
- ```typescript
202
- it('should parse git URL with branch', () => {
203
- // Arrange
204
- const url = 'https://github.com/user/repo.git#main';
205
-
206
- // Act
207
- const result = parseGitUrl(url);
208
-
209
- // Assert
210
- expect(result.branch).toBe('main');
211
- expect(result.url).toBe('https://github.com/user/repo.git');
212
- });
213
- ```
214
-
215
- ### 4. Test Edge Cases
216
- - Empty inputs
217
- - Invalid data
218
- - Error conditions
219
- - Boundary values
220
-
221
- ### 5. Mock External Dependencies
222
- - File system operations (when appropriate)
223
- - Network requests
224
- - Child processes
225
- - Environment variables
226
-
227
- ## Debugging Tests
228
-
229
- ### Run specific test file
230
- ```bash
231
- npm test tests/unit/config-manager.test.ts
232
- ```
233
-
234
- ### Run tests matching pattern
235
- ```bash
236
- npm test -- --grep "git dependency"
237
- ```
238
-
239
- ### Debug with breakpoints
240
- ```bash
241
- node --inspect-brk ./node_modules/.bin/vitest run
242
- ```
243
-
244
- Then attach your debugger (VS Code, Chrome DevTools, etc.)
245
-
246
- ## Continuous Improvement
247
-
248
- ### Coverage Goals
249
- - Maintain >80% code coverage
250
- - Focus on critical paths first
251
- - Add tests when fixing bugs
252
-
253
- ### Test Maintenance
254
- - Update tests when changing functionality
255
- - Remove obsolete tests
256
- - Keep test data fixtures up to date
257
- - Review test failures in CI promptly
258
-
259
- ## Resources
260
-
261
- - [Vitest Documentation](https://vitest.dev/)
262
- - [Testing Library Best Practices](https://kentcdodds.com/blog/common-mistakes-with-react-testing-library)
263
- - [Effective Testing Strategies](https://martinfowler.com/articles/practical-test-pyramid.html)
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function createConfigCommand(): Command;
3
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,mBAAmB,IAAI,OAAO,CAiD7C"}
@@ -1,56 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createConfigCommand = createConfigCommand;
4
- const commander_1 = require("commander");
5
- const config_manager_1 = require("../services/config-manager");
6
- const logger_1 = require("../utils/logger");
7
- function createConfigCommand() {
8
- const config = new commander_1.Command('config')
9
- .description('Manage CraftDesk CLI configuration');
10
- config
11
- .command('list')
12
- .description('List all configuration values')
13
- .action(async () => {
14
- await config_manager_1.configManager.list();
15
- });
16
- config
17
- .command('get <key>')
18
- .description('Get a configuration value')
19
- .action(async (key) => {
20
- const value = await config_manager_1.configManager.get(key);
21
- if (value !== undefined) {
22
- logger_1.logger.log(value);
23
- }
24
- else {
25
- logger_1.logger.error(`Configuration key '${key}' not found`);
26
- process.exit(1);
27
- }
28
- });
29
- config
30
- .command('set <key> <value>')
31
- .description('Set a configuration value')
32
- .action(async (key, value) => {
33
- // Handle special cases
34
- if (key.includes(':registry')) {
35
- // Setting a scoped registry
36
- // e.g., @acme:registry -> scopes.@acme
37
- const scope = key.split(':')[0];
38
- await config_manager_1.configManager.set(`scopes.${scope}`, value);
39
- logger_1.logger.success(`Set registry for ${scope} to ${value}`);
40
- }
41
- else if (key.startsWith('//') && key.includes('/:token')) {
42
- // Setting auth token
43
- // e.g., //crafts.acme.com/:token -> auth.crafts.acme.com.token
44
- const host = key.substring(2, key.indexOf('/:'));
45
- await config_manager_1.configManager.set(`auth.${host}.token`, value);
46
- logger_1.logger.success(`Set auth token for ${host}`);
47
- }
48
- else {
49
- // Normal key-value
50
- await config_manager_1.configManager.set(key, value);
51
- logger_1.logger.success(`Set ${key} to ${value}`);
52
- }
53
- });
54
- return config;
55
- }
56
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;AAIA,kDAiDC;AArDD,yCAAoC;AACpC,+DAA2D;AAC3D,4CAAyC;AAEzC,SAAgB,mBAAmB;IACjC,MAAM,MAAM,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;SACjC,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAErD,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,8BAAa,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,MAAM,8BAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,eAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,aAAa,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;QAC3C,uBAAuB;QACvB,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,4BAA4B;YAC5B,uCAAuC;YACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,8BAAa,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YAClD,eAAM,CAAC,OAAO,CAAC,oBAAoB,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,qBAAqB;YACrB,+DAA+D;YAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,MAAM,8BAAa,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,CAAC;YACrD,eAAM,CAAC,OAAO,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,mBAAmB;YACnB,MAAM,8BAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACpC,eAAM,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,17 +0,0 @@
1
- export interface CraftDeskConfig {
2
- registries?: {
3
- default?: string;
4
- [key: string]: string | undefined;
5
- };
6
- scopes?: {
7
- [scope: string]: string;
8
- };
9
- auth?: {
10
- [host: string]: {
11
- token: string;
12
- };
13
- };
14
- installPath?: string;
15
- cache?: string;
16
- }
17
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IAEF,MAAM,CAAC,EAAE;QACP,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;KACzB,CAAC;IAEF,IAAI,CAAC,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IAEF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
@@ -1,237 +0,0 @@
1
- # CraftDesk Dependency Resolution
2
-
3
- ## Overview
4
-
5
- CraftDesk supports multiple dependency sources and resolves them intelligently, including transitive dependencies.
6
-
7
- ## Dependency Sources
8
-
9
- ### 1. Registry Dependencies (Default)
10
-
11
- Standard dependencies are fetched from registries:
12
-
13
- ```json
14
- {
15
- "dependencies": {
16
- "ruby-on-rails": "^7.0.0"
17
- }
18
- }
19
- ```
20
-
21
- **Resolution Process:**
22
- 1. Query the registry API for package metadata
23
- 2. Resolve version constraints
24
- 3. Fetch transitive dependencies
25
- 4. Generate lockfile with exact versions
26
-
27
- ### 2. Git Dependencies
28
-
29
- Dependencies can be fetched directly from git repositories:
30
-
31
- ```json
32
- {
33
- "dependencies": {
34
- "my-skill": {
35
- "git": "https://github.com/user/repo.git",
36
- "branch": "main"
37
- }
38
- }
39
- }
40
- ```
41
-
42
- **Resolution Process:**
43
- 1. Clone the repository (shallow clone for efficiency)
44
- 2. Check out specified branch/tag/commit
45
- 3. Look for `craftdesk.json` in the repository
46
- 4. Extract metadata and dependencies
47
- 5. Recursively resolve any dependencies found
48
-
49
- ## Handling Missing craftdesk.json
50
-
51
- When a git dependency doesn't have a `craftdesk.json` file, the CLI:
52
-
53
- ### 1. Generates Minimal Metadata
54
-
55
- ```json
56
- {
57
- "name": "repository-name",
58
- "version": "branch-or-tag-or-commit",
59
- "type": "skill", // Inferred from structure
60
- "description": "Git dependency from <url>",
61
- "dependencies": {}
62
- }
63
- ```
64
-
65
- ### 2. Type Inference
66
-
67
- The system tries to infer the craft type by looking for:
68
-
69
- 1. **Marker Files:**
70
- - `SKILL.md` → type: "skill"
71
- - `AGENT.md` → type: "agent"
72
- - `COMMAND.md` → type: "command"
73
- - `HOOK.md` → type: "hook"
74
-
75
- 2. **Directory Name Patterns:**
76
- - Contains "skill" → type: "skill"
77
- - Contains "agent" → type: "agent"
78
- - Contains "command" → type: "command"
79
- - Contains "hook" → type: "hook"
80
-
81
- 3. **Default:** type: "skill"
82
-
83
- ## Monorepo Support
84
-
85
- For git repositories containing multiple crafts:
86
-
87
- ```json
88
- {
89
- "dependencies": {
90
- "auth-handler": {
91
- "git": "https://github.com/company/monorepo.git",
92
- "tag": "v3.0.0",
93
- "path": "packages/auth"
94
- },
95
- "data-processor": {
96
- "git": "https://github.com/company/monorepo.git",
97
- "tag": "v3.0.0",
98
- "path": "agents/processor"
99
- }
100
- }
101
- }
102
- ```
103
-
104
- The CLI:
105
- 1. Clones the repository once
106
- 2. Looks for `craftdesk.json` in each specified `path`
107
- 3. Installs only the contents of the specified subdirectory
108
-
109
- ## Transitive Dependencies
110
-
111
- ### From Registry Packages
112
-
113
- Registry packages include their dependencies in metadata:
114
- ```json
115
- {
116
- "name": "ruby-on-rails",
117
- "version": "7.1.0",
118
- "dependencies": {
119
- "activerecord": "^7.1.0",
120
- "actionpack": "^7.1.0"
121
- }
122
- }
123
- ```
124
-
125
- ### From Git Packages
126
-
127
- Git packages' dependencies are discovered by reading their `craftdesk.json`:
128
- ```json
129
- // In https://github.com/user/my-skill.git/craftdesk.json
130
- {
131
- "name": "my-skill",
132
- "version": "2.0.0",
133
- "dependencies": {
134
- "postgres-expert": "^1.0.0", // Will be resolved from registry
135
- "helper-lib": {
136
- "git": "https://github.com/user/helper.git" // Will be resolved from git
137
- }
138
- }
139
- }
140
- ```
141
-
142
- ## Resolution Algorithm
143
-
144
- ```typescript
145
- 1. Start with direct dependencies from craftdesk.json
146
- 2. For each dependency:
147
- a. If registry: Query API for metadata
148
- b. If git: Clone and extract craftdesk.json
149
- 3. Add discovered dependencies to resolution queue
150
- 4. Repeat until all dependencies resolved
151
- 5. Check for version conflicts
152
- 6. Generate lockfile with exact versions
153
- ```
154
-
155
- ## Lockfile Structure
156
-
157
- The lockfile captures the complete resolution:
158
-
159
- ```json
160
- {
161
- "version": "1.0.0",
162
- "lockfileVersion": 1,
163
- "crafts": {
164
- "my-skill": {
165
- "version": "2.0.0",
166
- "resolved": "https://github.com/user/my-skill.git",
167
- "integrity": "abc123def456", // Git commit hash
168
- "type": "skill",
169
- "git": "https://github.com/user/my-skill.git",
170
- "branch": "main",
171
- "commit": "abc123def456789012345678901234567890abcd",
172
- "dependencies": {
173
- "postgres-expert": "^1.0.0"
174
- }
175
- },
176
- "postgres-expert": {
177
- "version": "1.2.3",
178
- "resolved": "https://craftdesk.ai/api/v1/crafts/anthropic/postgres-expert/versions/1.2.3/download",
179
- "integrity": "sha256-xyz789...",
180
- "type": "agent",
181
- "registry": "https://craftdesk.ai",
182
- "dependencies": {}
183
- }
184
- }
185
- }
186
- ```
187
-
188
- ## Error Handling
189
-
190
- ### Missing Dependencies
191
- - Git repos without craftdesk.json: Generate minimal metadata
192
- - Unreachable git repos: Fail with clear error message
193
- - Registry packages not found: Fail with suggestions
194
-
195
- ### Version Conflicts
196
- - Currently: Last-write-wins
197
- - Future: Interactive conflict resolution
198
-
199
- ### Circular Dependencies
200
- - Detected during resolution
201
- - Fails with error showing the circular chain
202
-
203
- ## Performance Optimizations
204
-
205
- 1. **Shallow Clones:** Git repos cloned with `--depth 1`
206
- 2. **Parallel Resolution:** Registry queries run in parallel
207
- 3. **Caching:** Git repos cached for 15 minutes during resolution
208
- 4. **Minimal Transfers:** Only specified subdirectories copied for monorepos
209
-
210
- ## Example: Mixed Resolution
211
-
212
- Given this `craftdesk.json`:
213
- ```json
214
- {
215
- "dependencies": {
216
- "ruby-on-rails": "^7.0.0",
217
- "custom-auth": {
218
- "git": "https://github.com/company/auth.git",
219
- "branch": "main"
220
- }
221
- }
222
- }
223
- ```
224
-
225
- Resolution steps:
226
- 1. Query registry for ruby-on-rails@^7.0.0
227
- - Resolves to 7.1.2
228
- - Has dependencies: activerecord@^7.1.0, actionpack@^7.1.0
229
- 2. Clone https://github.com/company/auth.git
230
- - Check out main branch
231
- - Read craftdesk.json
232
- - Has dependency: jwt-helper@^2.0.0
233
- 3. Resolve transitive dependencies:
234
- - activerecord@^7.1.0 → 7.1.0
235
- - actionpack@^7.1.0 → 7.1.0
236
- - jwt-helper@^2.0.0 → 2.1.0
237
- 4. Generate complete lockfile with all 5 packages
@@ -1,79 +0,0 @@
1
- {
2
- "name": "full-example-project",
3
- "version": "1.0.0",
4
- "type": "skill",
5
- "description": "Example showing all dependency source types",
6
-
7
- "dependencies": {
8
- // Registry dependencies (default)
9
- "ruby-on-rails": "^7.0.0",
10
- "postgres-expert": "~1.2.0",
11
-
12
- // Registry with custom registry
13
- "@company/private-skill": {
14
- "version": "^3.0.0",
15
- "registry": "company-private"
16
- },
17
-
18
- // Direct registry URL
19
- "special-tool": {
20
- "version": "^2.0.0",
21
- "registry": "https://tools.example.com"
22
- },
23
-
24
- // Git dependencies with branch
25
- "experimental-agent": {
26
- "git": "https://github.com/user/agent-repo.git",
27
- "branch": "develop"
28
- },
29
-
30
- // Git with specific tag
31
- "stable-skill": {
32
- "git": "https://github.com/org/skills.git",
33
- "tag": "v2.1.0"
34
- },
35
-
36
- // Git with subdirectory (monorepo)
37
- "auth-handler": {
38
- "git": "https://github.com/company/monorepo.git",
39
- "branch": "main",
40
- "path": "packages/auth"
41
- },
42
-
43
- // Git with commit hash
44
- "specific-version": {
45
- "git": "https://github.com/user/repo.git",
46
- "commit": "a1b2c3d4e5f6789012345678901234567890abcd"
47
- },
48
-
49
- // Multiple skills from same git repo
50
- "data-processor": {
51
- "git": "https://github.com/company/monorepo.git",
52
- "tag": "v1.0.0",
53
- "path": "skills/data-processor"
54
- },
55
- "report-generator": {
56
- "git": "https://github.com/company/monorepo.git",
57
- "tag": "v1.0.0",
58
- "path": "skills/report-generator"
59
- }
60
- },
61
-
62
- "devDependencies": {
63
- "test-runner": "^1.0.0",
64
- "code-reviewer": {
65
- "git": "https://github.com/tools/reviewer.git",
66
- "branch": "latest"
67
- }
68
- },
69
-
70
- "registries": {
71
- "default": {
72
- "url": "https://craftdesk.ai"
73
- },
74
- "company-private": {
75
- "url": "https://registry.company.com",
76
- "scope": "@company"
77
- }
78
- }
79
- }