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.
- package/CHANGELOG.md +88 -0
- package/README.md +1609 -132
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +306 -8
- 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/detect-agents.d.ts +14 -0
- package/dist/commands/detect-agents.d.ts.map +1 -0
- package/dist/commands/detect-agents.js +86 -0
- package/dist/commands/detect-agents.js.map +1 -0
- package/dist/commands/embed.d.ts +14 -0
- package/dist/commands/embed.d.ts.map +1 -0
- package/dist/commands/embed.js +147 -0
- package/dist/commands/embed.js.map +1 -0
- package/dist/commands/info.d.ts +8 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +66 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +5 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -4
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +75 -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 +203 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +5 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +51 -10
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +60 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup-multi-agent.d.ts +17 -0
- package/dist/commands/setup-multi-agent.d.ts.map +1 -0
- package/dist/commands/setup-multi-agent.js +188 -0
- package/dist/commands/setup-multi-agent.js.map +1 -0
- package/dist/commands/sync.d.ts +14 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +144 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/unembed.d.ts +14 -0
- package/dist/commands/unembed.d.ts.map +1 -0
- package/dist/commands/unembed.js +96 -0
- package/dist/commands/unembed.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 +372 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +14 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +143 -0
- package/dist/commands/verify.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 +56 -3
- package/dist/index.js.map +1 -1
- package/dist/services/agent-detector.d.ts +57 -0
- package/dist/services/agent-detector.d.ts.map +1 -0
- package/dist/services/agent-detector.js +146 -0
- package/dist/services/agent-detector.js.map +1 -0
- 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 +190 -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 +44 -20
- package/dist/services/git-resolver.js.map +1 -1
- package/dist/services/gitignore-manager.d.ts +74 -0
- package/dist/services/gitignore-manager.d.ts.map +1 -0
- package/dist/services/gitignore-manager.js +188 -0
- package/dist/services/gitignore-manager.js.map +1 -0
- package/dist/services/installer.d.ts +60 -1
- package/dist/services/installer.d.ts.map +1 -1
- package/dist/services/installer.js +295 -20
- package/dist/services/installer.js.map +1 -1
- package/dist/services/multi-agent-sync.d.ts +88 -0
- package/dist/services/multi-agent-sync.d.ts.map +1 -0
- package/dist/services/multi-agent-sync.js +316 -0
- package/dist/services/multi-agent-sync.js.map +1 -0
- 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 +183 -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 +76 -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/types/multi-agent.d.ts +85 -0
- package/dist/types/multi-agent.d.ts.map +1 -0
- package/dist/types/multi-agent.js +6 -0
- package/dist/types/multi-agent.js.map +1 -0
- package/dist/utils/crypto.d.ts +23 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +52 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/file-system.d.ts +43 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +45 -2
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/logger.d.ts +75 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +76 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/version-utils.d.ts +63 -0
- package/dist/utils/version-utils.d.ts.map +1 -0
- package/dist/utils/version-utils.js +130 -0
- package/dist/utils/version-utils.js.map +1 -0
- package/package.json +36 -9
- package/.claude/settings.local.json +0 -19
- package/.github/workflows/ci.yml +0 -94
- package/API.md +0 -414
- package/TESTING.md +0 -263
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -56
- package/dist/commands/config.js.map +0 -1
- package/dist/types/config.d.ts +0 -17
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -3
- package/dist/types/config.js.map +0 -1
- package/docs/DEPENDENCY_RESOLUTION.md +0 -237
- package/examples/craftdesk-all-sources.json +0 -79
- package/examples/craftdesk-git-monorepo.json +0 -41
- package/examples/craftdesk-multi-registry.json +0 -40
- package/examples/craftdesk-with-registries.json +0 -49
- package/examples/simple-craftdesk.json +0 -10
- package/src/commands/add.ts +0 -314
- package/src/commands/init.ts +0 -55
- package/src/commands/install.ts +0 -126
- package/src/commands/list.ts +0 -126
- package/src/commands/remove.ts +0 -82
- package/src/index.ts +0 -56
- package/src/services/config-manager.ts +0 -150
- package/src/services/git-resolver.ts +0 -373
- package/src/services/installer.ts +0 -314
- package/src/services/registry-client.ts +0 -163
- package/src/types/craftdesk-json.ts +0 -53
- package/src/types/craftdesk-lock.ts +0 -38
- package/src/utils/file-system.ts +0 -55
- package/src/utils/logger.ts +0 -82
- package/tests/fixtures/craftdesk-git.json +0 -17
- package/tests/fixtures/craftdesk.json +0 -15
- package/tests/helpers/test-utils.ts +0 -60
- package/tests/integration/init-command.test.ts +0 -70
- package/tests/integration/list-command.test.ts +0 -77
- package/tests/unit/config-manager.test.ts +0 -228
- package/tests/unit/git-resolver.test.ts +0 -303
- package/tests/unit/installer.test.ts +0 -105
- package/tsconfig.json +0 -20
- package/vitest.config.ts +0 -29
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 +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"}
|
package/dist/commands/config.js
DELETED
|
@@ -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"}
|
package/dist/types/config.d.ts
DELETED
|
@@ -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"}
|
package/dist/types/config.js
DELETED
package/dist/types/config.js.map
DELETED
|
@@ -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
|
-
}
|