craftdesk 0.1.0 → 0.3.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/.claude/settings.local.json +19 -0
- package/.github/workflows/ci.yml +94 -0
- package/API.md +414 -0
- package/README.md +778 -0
- package/TESTING.md +263 -0
- package/bin/craftdesk.js +4 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +284 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +56 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +57 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +109 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +117 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +74 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/services/config-manager.d.ts +88 -0
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/services/config-manager.js +143 -0
- package/dist/services/config-manager.js.map +1 -0
- package/dist/services/git-resolver.d.ts +139 -0
- package/dist/services/git-resolver.d.ts.map +1 -0
- package/dist/services/git-resolver.js +340 -0
- package/dist/services/git-resolver.js.map +1 -0
- package/dist/services/installer.d.ts +98 -0
- package/dist/services/installer.d.ts.map +1 -0
- package/dist/services/installer.js +274 -0
- package/dist/services/installer.js.map +1 -0
- package/dist/services/registry-client.d.ts +27 -0
- package/dist/services/registry-client.d.ts.map +1 -0
- package/dist/services/registry-client.js +134 -0
- package/dist/services/registry-client.js.map +1 -0
- package/dist/types/config.d.ts +17 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/craftdesk-json.d.ts +42 -0
- package/dist/types/craftdesk-json.d.ts.map +1 -0
- package/dist/types/craftdesk-json.js +3 -0
- package/dist/types/craftdesk-json.js.map +1 -0
- package/dist/types/craftdesk-lock.d.ts +34 -0
- package/dist/types/craftdesk-lock.d.ts.map +1 -0
- package/dist/types/craftdesk-lock.js +3 -0
- package/dist/types/craftdesk-lock.js.map +1 -0
- package/dist/utils/file-system.d.ts +10 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +60 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/DEPENDENCY_RESOLUTION.md +237 -0
- package/examples/craftdesk-all-sources.json +79 -0
- package/examples/craftdesk-git-monorepo.json +41 -0
- package/examples/craftdesk-multi-registry.json +40 -0
- package/examples/craftdesk-with-registries.json +49 -0
- package/examples/simple-craftdesk.json +10 -0
- package/package.json +32 -25
- package/src/commands/add.ts +314 -0
- package/src/commands/init.ts +55 -0
- package/src/commands/install.ts +126 -0
- package/src/commands/list.ts +126 -0
- package/src/commands/remove.ts +82 -0
- package/src/index.ts +56 -0
- package/src/services/config-manager.ts +150 -0
- package/src/services/git-resolver.ts +373 -0
- package/src/services/installer.ts +314 -0
- package/src/services/registry-client.ts +163 -0
- package/src/types/craftdesk-json.ts +53 -0
- package/src/types/craftdesk-lock.ts +38 -0
- package/src/utils/file-system.ts +55 -0
- package/src/utils/logger.ts +82 -0
- package/tests/fixtures/craftdesk-git.json +17 -0
- package/tests/fixtures/craftdesk.json +15 -0
- package/tests/helpers/test-utils.ts +60 -0
- package/tests/integration/init-command.test.ts +70 -0
- package/tests/integration/list-command.test.ts +77 -0
- package/tests/unit/config-manager.test.ts +228 -0
- package/tests/unit/git-resolver.test.ts +303 -0
- package/tests/unit/installer.test.ts +105 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +29 -0
- package/LICENSE +0 -21
- package/index.js +0 -4
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface CraftDeskLock {
|
|
2
|
+
version: string;
|
|
3
|
+
lockfileVersion: number;
|
|
4
|
+
generatedAt: string;
|
|
5
|
+
crafts: Record<string, LockEntry>;
|
|
6
|
+
tree?: DependencyTree;
|
|
7
|
+
metadata?: {
|
|
8
|
+
totalCrafts: number;
|
|
9
|
+
totalSize: string;
|
|
10
|
+
installPath: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface LockEntry {
|
|
14
|
+
version: string;
|
|
15
|
+
resolved: string;
|
|
16
|
+
integrity: string;
|
|
17
|
+
type: 'skill' | 'agent' | 'command' | 'hook' | 'plugin';
|
|
18
|
+
author?: string;
|
|
19
|
+
registry?: string;
|
|
20
|
+
scope?: string;
|
|
21
|
+
dependencies?: Record<string, string>;
|
|
22
|
+
git?: string;
|
|
23
|
+
branch?: string;
|
|
24
|
+
tag?: string;
|
|
25
|
+
commit?: string;
|
|
26
|
+
path?: string;
|
|
27
|
+
file?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface DependencyTree {
|
|
30
|
+
[key: string]: {
|
|
31
|
+
dependencies?: DependencyTree;
|
|
32
|
+
} | string;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=craftdesk-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"craftdesk-lock.d.ts","sourceRoot":"","sources":["../../src/types/craftdesk-lock.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IAEpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,QAAQ,CAAC,EAAE;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,YAAY,CAAC,EAAE,cAAc,CAAC;KAC/B,GAAG,MAAM,CAAC;CACZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"craftdesk-lock.js","sourceRoot":"","sources":["../../src/types/craftdesk-lock.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CraftDeskJson } from '../types/craftdesk-json';
|
|
2
|
+
import { CraftDeskLock } from '../types/craftdesk-lock';
|
|
3
|
+
export declare function readCraftDeskJson(dir?: string): Promise<CraftDeskJson | null>;
|
|
4
|
+
export declare function writeCraftDeskJson(data: CraftDeskJson, dir?: string): Promise<void>;
|
|
5
|
+
export declare function readCraftDeskLock(dir?: string): Promise<CraftDeskLock | null>;
|
|
6
|
+
export declare function writeCraftDeskLock(data: CraftDeskLock, dir?: string): Promise<void>;
|
|
7
|
+
export declare function ensureDir(dirPath: string): Promise<void>;
|
|
8
|
+
export declare function removeDir(dirPath: string): Promise<void>;
|
|
9
|
+
export declare function exists(filePath: string): Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=file-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CASlG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxG;AAED,wBAAsB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CASlG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxG;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readCraftDeskJson = readCraftDeskJson;
|
|
7
|
+
exports.writeCraftDeskJson = writeCraftDeskJson;
|
|
8
|
+
exports.readCraftDeskLock = readCraftDeskLock;
|
|
9
|
+
exports.writeCraftDeskLock = writeCraftDeskLock;
|
|
10
|
+
exports.ensureDir = ensureDir;
|
|
11
|
+
exports.removeDir = removeDir;
|
|
12
|
+
exports.exists = exists;
|
|
13
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
async function readCraftDeskJson(dir = process.cwd()) {
|
|
16
|
+
const filePath = path_1.default.join(dir, 'craftdesk.json');
|
|
17
|
+
try {
|
|
18
|
+
const content = await fs_extra_1.default.readFile(filePath, 'utf-8');
|
|
19
|
+
return JSON.parse(content);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function writeCraftDeskJson(data, dir = process.cwd()) {
|
|
26
|
+
const filePath = path_1.default.join(dir, 'craftdesk.json');
|
|
27
|
+
const content = JSON.stringify(data, null, 2);
|
|
28
|
+
await fs_extra_1.default.writeFile(filePath, content, 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
async function readCraftDeskLock(dir = process.cwd()) {
|
|
31
|
+
const filePath = path_1.default.join(dir, 'craftdesk.lock');
|
|
32
|
+
try {
|
|
33
|
+
const content = await fs_extra_1.default.readFile(filePath, 'utf-8');
|
|
34
|
+
return JSON.parse(content);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function writeCraftDeskLock(data, dir = process.cwd()) {
|
|
41
|
+
const filePath = path_1.default.join(dir, 'craftdesk.lock');
|
|
42
|
+
const content = JSON.stringify(data, null, 2);
|
|
43
|
+
await fs_extra_1.default.writeFile(filePath, content, 'utf-8');
|
|
44
|
+
}
|
|
45
|
+
async function ensureDir(dirPath) {
|
|
46
|
+
await fs_extra_1.default.ensureDir(dirPath);
|
|
47
|
+
}
|
|
48
|
+
async function removeDir(dirPath) {
|
|
49
|
+
await fs_extra_1.default.remove(dirPath);
|
|
50
|
+
}
|
|
51
|
+
async function exists(filePath) {
|
|
52
|
+
try {
|
|
53
|
+
await fs_extra_1.default.access(filePath);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=file-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":";;;;;AAKA,8CASC;AAED,gDAIC;AAED,8CASC;AAED,gDAIC;AAED,8BAEC;AAED,8BAEC;AAED,wBAOC;AAtDD,wDAA0B;AAC1B,gDAAwB;AAIjB,KAAK,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAmB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACvF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAmB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACvF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,kBAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAEM,KAAK,UAAU,MAAM,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class Logger {
|
|
2
|
+
private spinnerText;
|
|
3
|
+
success(message: string): void;
|
|
4
|
+
error(message: string): void;
|
|
5
|
+
warn(message: string): void;
|
|
6
|
+
info(message: string): void;
|
|
7
|
+
debug(message: string): void;
|
|
8
|
+
startSpinner(text: string): void;
|
|
9
|
+
updateSpinner(text: string): void;
|
|
10
|
+
succeedSpinner(text?: string): void;
|
|
11
|
+
failSpinner(text?: string): void;
|
|
12
|
+
stopSpinner(): void;
|
|
13
|
+
log(message: string): void;
|
|
14
|
+
bold(text: string): string;
|
|
15
|
+
dim(text: string): string;
|
|
16
|
+
}
|
|
17
|
+
export declare const logger: Logger;
|
|
18
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAaA,qBAAa,MAAM;IACjB,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKhC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOjC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOnC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAOhC,WAAW,IAAI,IAAI;IAInB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAG1B;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.logger = exports.Logger = void 0;
|
|
4
|
+
// ANSI color codes
|
|
5
|
+
const colors = {
|
|
6
|
+
reset: '\x1b[0m',
|
|
7
|
+
green: '\x1b[32m',
|
|
8
|
+
red: '\x1b[31m',
|
|
9
|
+
yellow: '\x1b[33m',
|
|
10
|
+
blue: '\x1b[34m',
|
|
11
|
+
cyan: '\x1b[36m',
|
|
12
|
+
gray: '\x1b[90m',
|
|
13
|
+
bold: '\x1b[1m',
|
|
14
|
+
dim: '\x1b[2m',
|
|
15
|
+
};
|
|
16
|
+
class Logger {
|
|
17
|
+
spinnerText = null;
|
|
18
|
+
success(message) {
|
|
19
|
+
console.log(`${colors.green}✓${colors.reset}`, message);
|
|
20
|
+
}
|
|
21
|
+
error(message) {
|
|
22
|
+
console.error(`${colors.red}✗${colors.reset}`, message);
|
|
23
|
+
}
|
|
24
|
+
warn(message) {
|
|
25
|
+
console.log(`${colors.yellow}!${colors.reset}`, message);
|
|
26
|
+
}
|
|
27
|
+
info(message) {
|
|
28
|
+
console.log(`${colors.blue}→${colors.reset}`, message);
|
|
29
|
+
}
|
|
30
|
+
debug(message) {
|
|
31
|
+
if (process.env.DEBUG) {
|
|
32
|
+
console.log(`${colors.gray}[DEBUG]${colors.reset}`, message);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
startSpinner(text) {
|
|
36
|
+
this.spinnerText = text;
|
|
37
|
+
console.log(`${colors.cyan}⋯${colors.reset}`, text);
|
|
38
|
+
}
|
|
39
|
+
updateSpinner(text) {
|
|
40
|
+
if (this.spinnerText) {
|
|
41
|
+
this.spinnerText = text;
|
|
42
|
+
console.log(' ', text);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
succeedSpinner(text) {
|
|
46
|
+
if (this.spinnerText) {
|
|
47
|
+
console.log(`${colors.green}✓${colors.reset}`, text || this.spinnerText);
|
|
48
|
+
this.spinnerText = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
failSpinner(text) {
|
|
52
|
+
if (this.spinnerText) {
|
|
53
|
+
console.log(`${colors.red}✗${colors.reset}`, text || this.spinnerText);
|
|
54
|
+
this.spinnerText = null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
stopSpinner() {
|
|
58
|
+
this.spinnerText = null;
|
|
59
|
+
}
|
|
60
|
+
log(message) {
|
|
61
|
+
console.log(message);
|
|
62
|
+
}
|
|
63
|
+
bold(text) {
|
|
64
|
+
return `${colors.bold}${text}${colors.reset}`;
|
|
65
|
+
}
|
|
66
|
+
dim(text) {
|
|
67
|
+
return `${colors.dim}${text}${colors.reset}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.Logger = Logger;
|
|
71
|
+
exports.logger = new Logger();
|
|
72
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,237 @@
|
|
|
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
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
}
|