craftdesk 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -0
- package/README.md +943 -46
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +302 -6
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/convert.d.ts +8 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +146 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/info.d.ts +8 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +66 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +5 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -4
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +72 -7
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +158 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +8 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +51 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/outdated.d.ts +23 -0
- package/dist/commands/outdated.d.ts.map +1 -0
- package/dist/commands/outdated.js +268 -0
- package/dist/commands/outdated.js.map +1 -0
- package/dist/commands/publish.d.ts +8 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +198 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +5 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +51 -10
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +60 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/update.d.ts +8 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +369 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/whoami.d.ts +8 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +58 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/converters/base-converter.d.ts +89 -0
- package/dist/converters/base-converter.d.ts.map +1 -0
- package/dist/converters/base-converter.js +249 -0
- package/dist/converters/base-converter.js.map +1 -0
- package/dist/converters/continue-converter.d.ts +53 -0
- package/dist/converters/continue-converter.d.ts.map +1 -0
- package/dist/converters/continue-converter.js +243 -0
- package/dist/converters/continue-converter.js.map +1 -0
- package/dist/converters/cursor-converter.d.ts +70 -0
- package/dist/converters/cursor-converter.d.ts.map +1 -0
- package/dist/converters/cursor-converter.js +272 -0
- package/dist/converters/cursor-converter.js.map +1 -0
- package/dist/index.js +34 -3
- package/dist/index.js.map +1 -1
- package/dist/services/config-manager.d.ts +128 -10
- package/dist/services/config-manager.d.ts.map +1 -1
- package/dist/services/config-manager.js +189 -18
- package/dist/services/config-manager.js.map +1 -1
- package/dist/services/converter.d.ts +53 -0
- package/dist/services/converter.d.ts.map +1 -0
- package/dist/services/converter.js +185 -0
- package/dist/services/converter.js.map +1 -0
- package/dist/services/craft-wrapper.d.ts +108 -0
- package/dist/services/craft-wrapper.d.ts.map +1 -0
- package/dist/services/craft-wrapper.js +268 -0
- package/dist/services/craft-wrapper.js.map +1 -0
- package/dist/services/git-resolver.d.ts +9 -3
- package/dist/services/git-resolver.d.ts.map +1 -1
- package/dist/services/git-resolver.js +29 -10
- package/dist/services/git-resolver.js.map +1 -1
- package/dist/services/installer.d.ts +51 -1
- package/dist/services/installer.d.ts.map +1 -1
- package/dist/services/installer.js +245 -14
- package/dist/services/installer.js.map +1 -1
- package/dist/services/plugin-resolver.d.ts +80 -0
- package/dist/services/plugin-resolver.d.ts.map +1 -0
- package/dist/services/plugin-resolver.js +182 -0
- package/dist/services/plugin-resolver.js.map +1 -0
- package/dist/services/registry-client.d.ts +132 -5
- package/dist/services/registry-client.d.ts.map +1 -1
- package/dist/services/registry-client.js +239 -34
- package/dist/services/registry-client.js.map +1 -1
- package/dist/services/settings-manager.d.ts +151 -0
- package/dist/services/settings-manager.d.ts.map +1 -0
- package/dist/services/settings-manager.js +333 -0
- package/dist/services/settings-manager.js.map +1 -0
- package/dist/types/claude-settings.d.ts +155 -0
- package/dist/types/claude-settings.d.ts.map +1 -0
- package/dist/types/claude-settings.js +20 -0
- package/dist/types/claude-settings.js.map +1 -0
- package/dist/types/converter.d.ts +98 -0
- package/dist/types/converter.d.ts.map +1 -0
- package/dist/types/converter.js +6 -0
- package/dist/types/converter.js.map +1 -0
- package/dist/types/craftdesk-json.d.ts +63 -3
- package/dist/types/craftdesk-json.d.ts.map +1 -1
- package/dist/types/craftdesk-lock.d.ts +62 -1
- package/dist/types/craftdesk-lock.d.ts.map +1 -1
- package/dist/utils/crypto.d.ts +23 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +52 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/file-system.d.ts +43 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +45 -2
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/logger.d.ts +75 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +76 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/version-utils.d.ts +63 -0
- package/dist/utils/version-utils.d.ts.map +1 -0
- package/dist/utils/version-utils.js +130 -0
- package/dist/utils/version-utils.js.map +1 -0
- package/package.json +36 -9
- package/.claude/settings.local.json +0 -19
- package/.github/workflows/ci.yml +0 -94
- package/API.md +0 -414
- package/TESTING.md +0 -263
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -56
- package/dist/commands/config.js.map +0 -1
- package/dist/types/config.d.ts +0 -17
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -3
- package/dist/types/config.js.map +0 -1
- package/docs/DEPENDENCY_RESOLUTION.md +0 -237
- package/examples/craftdesk-all-sources.json +0 -79
- package/examples/craftdesk-git-monorepo.json +0 -41
- package/examples/craftdesk-multi-registry.json +0 -40
- package/examples/craftdesk-with-registries.json +0 -49
- package/examples/simple-craftdesk.json +0 -10
- package/src/commands/add.ts +0 -314
- package/src/commands/init.ts +0 -55
- package/src/commands/install.ts +0 -126
- package/src/commands/list.ts +0 -126
- package/src/commands/remove.ts +0 -82
- package/src/index.ts +0 -56
- package/src/services/config-manager.ts +0 -150
- package/src/services/git-resolver.ts +0 -373
- package/src/services/installer.ts +0 -314
- package/src/services/registry-client.ts +0 -163
- package/src/types/craftdesk-json.ts +0 -53
- package/src/types/craftdesk-lock.ts +0 -38
- package/src/utils/file-system.ts +0 -55
- package/src/utils/logger.ts +0 -82
- package/tests/fixtures/craftdesk-git.json +0 -17
- package/tests/fixtures/craftdesk.json +0 -15
- package/tests/helpers/test-utils.ts +0 -60
- package/tests/integration/init-command.test.ts +0 -70
- package/tests/integration/list-command.test.ts +0 -77
- package/tests/unit/config-manager.test.ts +0 -228
- package/tests/unit/git-resolver.test.ts +0 -303
- package/tests/unit/installer.test.ts +0 -105
- package/tsconfig.json +0 -20
- package/vitest.config.ts +0 -29
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
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "monorepo-example",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"type": "skill",
|
|
5
|
-
"description": "Example using git monorepo with multiple crafts",
|
|
6
|
-
|
|
7
|
-
"dependencies": {
|
|
8
|
-
"auth-handler": {
|
|
9
|
-
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
10
|
-
"tag": "v3.2.0",
|
|
11
|
-
"path": "skills/auth"
|
|
12
|
-
},
|
|
13
|
-
"data-processor": {
|
|
14
|
-
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
15
|
-
"tag": "v3.2.0",
|
|
16
|
-
"path": "agents/data-processor"
|
|
17
|
-
},
|
|
18
|
-
"report-generator": {
|
|
19
|
-
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
20
|
-
"tag": "v3.2.0",
|
|
21
|
-
"path": "skills/reporting"
|
|
22
|
-
},
|
|
23
|
-
"test-runner": {
|
|
24
|
-
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
25
|
-
"tag": "v3.2.0",
|
|
26
|
-
"path": "commands/test"
|
|
27
|
-
},
|
|
28
|
-
"pre-commit-hook": {
|
|
29
|
-
"git": "https://github.com/company/ai-crafts-monorepo.git",
|
|
30
|
-
"tag": "v3.2.0",
|
|
31
|
-
"path": "hooks/pre-commit"
|
|
32
|
-
},
|
|
33
|
-
"ruby-on-rails": "^7.0.0"
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
"registries": {
|
|
37
|
-
"default": {
|
|
38
|
-
"url": "https://craftdesk.ai"
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "my-enterprise-project",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"type": "skill",
|
|
5
|
-
"description": "Enterprise project with multiple registries",
|
|
6
|
-
"author": "Your Company",
|
|
7
|
-
|
|
8
|
-
"dependencies": {
|
|
9
|
-
"ruby-on-rails": "^7.0.0",
|
|
10
|
-
"postgres-expert": "~1.2.0",
|
|
11
|
-
"@company/auth-handler": {
|
|
12
|
-
"version": "^3.0.0",
|
|
13
|
-
"registry": "company-private"
|
|
14
|
-
},
|
|
15
|
-
"special-tool": {
|
|
16
|
-
"version": "^2.0.0",
|
|
17
|
-
"registry": "https://tools.example.com"
|
|
18
|
-
},
|
|
19
|
-
"@partner/analytics": "^1.5.0"
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
"devDependencies": {
|
|
23
|
-
"code-reviewer": "^2.0.0",
|
|
24
|
-
"@company/test-suite": {
|
|
25
|
-
"version": "^1.0.0",
|
|
26
|
-
"registry": "company-private"
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
"registries": {
|
|
31
|
-
"company-private": {
|
|
32
|
-
"url": "https://registry.internal.mycompany.com",
|
|
33
|
-
"scope": "@company"
|
|
34
|
-
},
|
|
35
|
-
"partner": {
|
|
36
|
-
"url": "https://api.partner.com/registry",
|
|
37
|
-
"scope": "@partner"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "my-enterprise-project",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"type": "skill",
|
|
5
|
-
"description": "Enterprise project with multiple registries",
|
|
6
|
-
"author": "Your Company",
|
|
7
|
-
|
|
8
|
-
"dependencies": {
|
|
9
|
-
// Simple dependencies use default registry or scope-based routing
|
|
10
|
-
"ruby-on-rails": "^7.0.0",
|
|
11
|
-
"postgres-expert": "~1.2.0",
|
|
12
|
-
|
|
13
|
-
// Dependency with inline registry specification
|
|
14
|
-
"@company/auth-handler": {
|
|
15
|
-
"version": "^3.0.0",
|
|
16
|
-
"registry": "company-private" // References registry defined below
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
// Direct URL registry specification
|
|
20
|
-
"special-tool": {
|
|
21
|
-
"version": "^2.0.0",
|
|
22
|
-
"registry": "https://tools.example.com"
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
// Scoped packages automatically use their scope's registry if configured
|
|
26
|
-
"@partner/analytics": "^1.5.0" // Will use partner registry defined below
|
|
27
|
-
},
|
|
28
|
-
|
|
29
|
-
"devDependencies": {
|
|
30
|
-
"code-reviewer": "^2.0.0",
|
|
31
|
-
"@company/test-suite": {
|
|
32
|
-
"version": "^1.0.0",
|
|
33
|
-
"registry": "company-private"
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
// Registry configuration (all in one file!)
|
|
38
|
-
"registries": {
|
|
39
|
-
// Named registries
|
|
40
|
-
"company-private": {
|
|
41
|
-
"url": "https://registry.internal.mycompany.com",
|
|
42
|
-
"scope": "@company" // All @company/* packages will use this registry
|
|
43
|
-
},
|
|
44
|
-
"partner": {
|
|
45
|
-
"url": "https://api.partner.com/registry",
|
|
46
|
-
"scope": "@partner" // All @partner/* packages will use this registry
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|