@corvus-tools/skill-manager-core 0.1.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/LICENSE +21 -0
- package/dist/agents/AgentAdapter.d.ts +11 -0
- package/dist/agents/AgentAdapter.d.ts.map +1 -0
- package/dist/agents/AgentAdapter.js +2 -0
- package/dist/agents/AgentAdapter.js.map +1 -0
- package/dist/agents/adapters.d.ts +44 -0
- package/dist/agents/adapters.d.ts.map +1 -0
- package/dist/agents/adapters.js +56 -0
- package/dist/agents/adapters.js.map +1 -0
- package/dist/config/configSchema.d.ts +109 -0
- package/dist/config/configSchema.d.ts.map +1 -0
- package/dist/config/configSchema.js +46 -0
- package/dist/config/configSchema.js.map +1 -0
- package/dist/config/configStore.d.ts +24 -0
- package/dist/config/configStore.d.ts.map +1 -0
- package/dist/config/configStore.js +77 -0
- package/dist/config/configStore.js.map +1 -0
- package/dist/git/gitRunner.d.ts +10 -0
- package/dist/git/gitRunner.d.ts.map +1 -0
- package/dist/git/gitRunner.js +23 -0
- package/dist/git/gitRunner.js.map +1 -0
- package/dist/git/skillpackSetup.d.ts +37 -0
- package/dist/git/skillpackSetup.d.ts.map +1 -0
- package/dist/git/skillpackSetup.js +177 -0
- package/dist/git/skillpackSetup.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/links/applyEngine.d.ts +24 -0
- package/dist/links/applyEngine.d.ts.map +1 -0
- package/dist/links/applyEngine.js +230 -0
- package/dist/links/applyEngine.js.map +1 -0
- package/dist/links/linkPlan.d.ts +54 -0
- package/dist/links/linkPlan.d.ts.map +1 -0
- package/dist/links/linkPlan.js +121 -0
- package/dist/links/linkPlan.js.map +1 -0
- package/dist/lock/lockSchema.d.ts +84 -0
- package/dist/lock/lockSchema.d.ts.map +1 -0
- package/dist/lock/lockSchema.js +30 -0
- package/dist/lock/lockSchema.js.map +1 -0
- package/dist/lock/lockStore.d.ts +15 -0
- package/dist/lock/lockStore.d.ts.map +1 -0
- package/dist/lock/lockStore.js +56 -0
- package/dist/lock/lockStore.js.map +1 -0
- package/dist/manifest/manifestSchema.d.ts +86 -0
- package/dist/manifest/manifestSchema.d.ts.map +1 -0
- package/dist/manifest/manifestSchema.js +32 -0
- package/dist/manifest/manifestSchema.js.map +1 -0
- package/dist/manifest/manifestStore.d.ts +18 -0
- package/dist/manifest/manifestStore.d.ts.map +1 -0
- package/dist/manifest/manifestStore.js +47 -0
- package/dist/manifest/manifestStore.js.map +1 -0
- package/dist/paths.d.ts +14 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +43 -0
- package/dist/paths.js.map +1 -0
- package/dist/registry/registrySchema.d.ts +73 -0
- package/dist/registry/registrySchema.d.ts.map +1 -0
- package/dist/registry/registrySchema.js +30 -0
- package/dist/registry/registrySchema.js.map +1 -0
- package/dist/reports/doctorReport.d.ts +5 -0
- package/dist/reports/doctorReport.d.ts.map +1 -0
- package/dist/reports/doctorReport.js +297 -0
- package/dist/reports/doctorReport.js.map +1 -0
- package/dist/reports/reportInternals.d.ts +48 -0
- package/dist/reports/reportInternals.d.ts.map +1 -0
- package/dist/reports/reportInternals.js +220 -0
- package/dist/reports/reportInternals.js.map +1 -0
- package/dist/reports/reportTypes.d.ts +54 -0
- package/dist/reports/reportTypes.d.ts.map +1 -0
- package/dist/reports/reportTypes.js +2 -0
- package/dist/reports/reportTypes.js.map +1 -0
- package/dist/reports/statusReport.d.ts +6 -0
- package/dist/reports/statusReport.d.ts.map +1 -0
- package/dist/reports/statusReport.js +49 -0
- package/dist/reports/statusReport.js.map +1 -0
- package/dist/skillpackDefaults.d.ts +5 -0
- package/dist/skillpackDefaults.d.ts.map +1 -0
- package/dist/skillpackDefaults.js +5 -0
- package/dist/skillpackDefaults.js.map +1 -0
- package/dist/skills/skillDiscovery.d.ts +36 -0
- package/dist/skills/skillDiscovery.d.ts.map +1 -0
- package/dist/skills/skillDiscovery.js +441 -0
- package/dist/skills/skillDiscovery.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { resolveUserPath } from '../paths.js';
|
|
3
|
+
export function generateLinkPlan(input) {
|
|
4
|
+
const operations = [];
|
|
5
|
+
const conflicts = [];
|
|
6
|
+
const warnings = [];
|
|
7
|
+
const adaptersById = new Map(input.adapters.map((adapter) => [adapter.id, adapter]));
|
|
8
|
+
const skillsById = new Map(input.skills.map((skill) => [skill.id, skill]));
|
|
9
|
+
const targetStatesByPath = new Map((input.targetStates ?? []).map((targetState) => [resolveUserPath(targetState.path, input.homeDir), targetState]));
|
|
10
|
+
for (const selection of input.selections) {
|
|
11
|
+
if (!selection.enabled) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const adapter = adaptersById.get(selection.agentId);
|
|
15
|
+
if (adapter === undefined) {
|
|
16
|
+
warnings.push({
|
|
17
|
+
severity: 'warning',
|
|
18
|
+
code: 'unknown-agent',
|
|
19
|
+
message: `Unknown agent "${selection.agentId}" skipped.`,
|
|
20
|
+
agentId: selection.agentId
|
|
21
|
+
});
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (adapter.supportStatus === 'deferred' || adapter.supportStatus === 'unavailable') {
|
|
25
|
+
warnings.push({
|
|
26
|
+
severity: 'warning',
|
|
27
|
+
code: 'agent-not-supported',
|
|
28
|
+
message: `${adapter.displayName} is ${adapter.supportStatus} and will not be planned.`,
|
|
29
|
+
agentId: adapter.id
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const targetRoot = selection.targetPath ?? adapter.defaultTargetPath;
|
|
34
|
+
if (targetRoot === undefined || targetRoot.trim() === '') {
|
|
35
|
+
warnings.push({
|
|
36
|
+
severity: 'warning',
|
|
37
|
+
code: 'missing-target-path',
|
|
38
|
+
message: `${adapter.displayName} has no target path configured.`,
|
|
39
|
+
agentId: adapter.id
|
|
40
|
+
});
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const resolvedTargetRoot = resolveUserPath(targetRoot, input.homeDir);
|
|
44
|
+
const selectedSkillIds = uniqueSorted(selection.selectedSkillIds);
|
|
45
|
+
const previousSelectedSkillIds = uniqueSorted(selection.previousSelectedSkillIds ?? []);
|
|
46
|
+
const selectedSkillIdSet = new Set(selectedSkillIds);
|
|
47
|
+
for (const skillId of selectedSkillIds) {
|
|
48
|
+
const skill = skillsById.get(skillId);
|
|
49
|
+
if (skill === undefined) {
|
|
50
|
+
warnings.push({
|
|
51
|
+
severity: 'warning',
|
|
52
|
+
code: 'unknown-skill',
|
|
53
|
+
message: `Selected skill "${skillId}" is not discovered and will not be planned.`,
|
|
54
|
+
agentId: adapter.id,
|
|
55
|
+
skillId
|
|
56
|
+
});
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const targetPath = path.join(resolvedTargetRoot, skill.id);
|
|
60
|
+
const targetState = targetStatesByPath.get(targetPath);
|
|
61
|
+
if (targetState?.exists === true && !targetState.managed) {
|
|
62
|
+
conflicts.push({
|
|
63
|
+
severity: 'conflict',
|
|
64
|
+
code: 'unmanaged-target-exists',
|
|
65
|
+
message: `Target already exists and is not manager-owned: ${targetPath}`,
|
|
66
|
+
agentId: adapter.id,
|
|
67
|
+
skillId: skill.id,
|
|
68
|
+
path: targetPath
|
|
69
|
+
});
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (targetState?.exists === true && targetState.managed && targetState.sourcePath === skill.absolutePath) {
|
|
73
|
+
warnings.push({
|
|
74
|
+
severity: 'warning',
|
|
75
|
+
code: 'managed-link-already-present',
|
|
76
|
+
message: `Managed link already exists for ${adapter.displayName}/${skill.id}.`,
|
|
77
|
+
agentId: adapter.id,
|
|
78
|
+
skillId: skill.id,
|
|
79
|
+
path: targetPath
|
|
80
|
+
});
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
operations.push({
|
|
84
|
+
type: 'create-link',
|
|
85
|
+
agentId: adapter.id,
|
|
86
|
+
skillId: skill.id,
|
|
87
|
+
sourcePath: skill.absolutePath,
|
|
88
|
+
targetPath
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
for (const skillId of previousSelectedSkillIds) {
|
|
92
|
+
if (selectedSkillIdSet.has(skillId)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
operations.push({
|
|
96
|
+
type: 'remove-link',
|
|
97
|
+
agentId: adapter.id,
|
|
98
|
+
skillId,
|
|
99
|
+
targetPath: path.join(resolvedTargetRoot, skillId)
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
operations.sort(compareOperations);
|
|
104
|
+
conflicts.sort(compareIssues);
|
|
105
|
+
warnings.sort(compareIssues);
|
|
106
|
+
return { operations, conflicts, warnings };
|
|
107
|
+
}
|
|
108
|
+
function uniqueSorted(values) {
|
|
109
|
+
return [...new Set(values)].sort((left, right) => left.localeCompare(right));
|
|
110
|
+
}
|
|
111
|
+
function compareOperations(left, right) {
|
|
112
|
+
return (left.agentId.localeCompare(right.agentId) ||
|
|
113
|
+
left.skillId.localeCompare(right.skillId) ||
|
|
114
|
+
left.type.localeCompare(right.type));
|
|
115
|
+
}
|
|
116
|
+
function compareIssues(left, right) {
|
|
117
|
+
return ((left.agentId ?? '').localeCompare(right.agentId ?? '') ||
|
|
118
|
+
(left.skillId ?? '').localeCompare(right.skillId ?? '') ||
|
|
119
|
+
left.code.localeCompare(right.code));
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=linkPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkPlan.js","sourceRoot":"","sources":["../../src/links/linkPlan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const skillpackLockEntrySchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
repositoryUrl: z.ZodString;
|
|
5
|
+
branch: z.ZodString;
|
|
6
|
+
checkoutPath: z.ZodString;
|
|
7
|
+
commitHash: z.ZodString;
|
|
8
|
+
dirty: z.ZodBoolean;
|
|
9
|
+
recordedAt: z.ZodString;
|
|
10
|
+
}, "strict", z.ZodTypeAny, {
|
|
11
|
+
id: string;
|
|
12
|
+
repositoryUrl: string;
|
|
13
|
+
branch: string;
|
|
14
|
+
checkoutPath: string;
|
|
15
|
+
dirty: boolean;
|
|
16
|
+
commitHash: string;
|
|
17
|
+
recordedAt: string;
|
|
18
|
+
}, {
|
|
19
|
+
id: string;
|
|
20
|
+
repositoryUrl: string;
|
|
21
|
+
branch: string;
|
|
22
|
+
checkoutPath: string;
|
|
23
|
+
dirty: boolean;
|
|
24
|
+
commitHash: string;
|
|
25
|
+
recordedAt: string;
|
|
26
|
+
}>;
|
|
27
|
+
export declare const managerLockSchema: z.ZodObject<{
|
|
28
|
+
version: z.ZodLiteral<1>;
|
|
29
|
+
updatedAt: z.ZodString;
|
|
30
|
+
skillpacks: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
31
|
+
id: z.ZodString;
|
|
32
|
+
repositoryUrl: z.ZodString;
|
|
33
|
+
branch: z.ZodString;
|
|
34
|
+
checkoutPath: z.ZodString;
|
|
35
|
+
commitHash: z.ZodString;
|
|
36
|
+
dirty: z.ZodBoolean;
|
|
37
|
+
recordedAt: z.ZodString;
|
|
38
|
+
}, "strict", z.ZodTypeAny, {
|
|
39
|
+
id: string;
|
|
40
|
+
repositoryUrl: string;
|
|
41
|
+
branch: string;
|
|
42
|
+
checkoutPath: string;
|
|
43
|
+
dirty: boolean;
|
|
44
|
+
commitHash: string;
|
|
45
|
+
recordedAt: string;
|
|
46
|
+
}, {
|
|
47
|
+
id: string;
|
|
48
|
+
repositoryUrl: string;
|
|
49
|
+
branch: string;
|
|
50
|
+
checkoutPath: string;
|
|
51
|
+
dirty: boolean;
|
|
52
|
+
commitHash: string;
|
|
53
|
+
recordedAt: string;
|
|
54
|
+
}>>;
|
|
55
|
+
}, "strict", z.ZodTypeAny, {
|
|
56
|
+
skillpacks: Record<string, {
|
|
57
|
+
id: string;
|
|
58
|
+
repositoryUrl: string;
|
|
59
|
+
branch: string;
|
|
60
|
+
checkoutPath: string;
|
|
61
|
+
dirty: boolean;
|
|
62
|
+
commitHash: string;
|
|
63
|
+
recordedAt: string;
|
|
64
|
+
}>;
|
|
65
|
+
version: 1;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
}, {
|
|
68
|
+
skillpacks: Record<string, {
|
|
69
|
+
id: string;
|
|
70
|
+
repositoryUrl: string;
|
|
71
|
+
branch: string;
|
|
72
|
+
checkoutPath: string;
|
|
73
|
+
dirty: boolean;
|
|
74
|
+
commitHash: string;
|
|
75
|
+
recordedAt: string;
|
|
76
|
+
}>;
|
|
77
|
+
version: 1;
|
|
78
|
+
updatedAt: string;
|
|
79
|
+
}>;
|
|
80
|
+
export type SkillpackLockEntry = z.infer<typeof skillpackLockEntrySchema>;
|
|
81
|
+
export type ManagerLock = z.infer<typeof managerLockSchema>;
|
|
82
|
+
export declare function createEmptyManagerLock(now?: Date): ManagerLock;
|
|
83
|
+
export declare function parseManagerLock(value: unknown): ManagerLock;
|
|
84
|
+
//# sourceMappingURL=lockSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockSchema.d.ts","sourceRoot":"","sources":["../../src/lock/lockSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;EAU1B,CAAC;AAEZ,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMnB,CAAC;AAEZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,wBAAgB,sBAAsB,CAAC,GAAG,OAAa,GAAG,WAAW,CAMpE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAE5D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const skillpackLockEntrySchema = z
|
|
3
|
+
.object({
|
|
4
|
+
id: z.string().min(1),
|
|
5
|
+
repositoryUrl: z.string().min(1),
|
|
6
|
+
branch: z.string().min(1),
|
|
7
|
+
checkoutPath: z.string().min(1),
|
|
8
|
+
commitHash: z.string().min(1),
|
|
9
|
+
dirty: z.boolean(),
|
|
10
|
+
recordedAt: z.string().datetime()
|
|
11
|
+
})
|
|
12
|
+
.strict();
|
|
13
|
+
export const managerLockSchema = z
|
|
14
|
+
.object({
|
|
15
|
+
version: z.literal(1),
|
|
16
|
+
updatedAt: z.string().datetime(),
|
|
17
|
+
skillpacks: z.record(skillpackLockEntrySchema)
|
|
18
|
+
})
|
|
19
|
+
.strict();
|
|
20
|
+
export function createEmptyManagerLock(now = new Date()) {
|
|
21
|
+
return {
|
|
22
|
+
version: 1,
|
|
23
|
+
updatedAt: now.toISOString(),
|
|
24
|
+
skillpacks: {}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function parseManagerLock(value) {
|
|
28
|
+
return managerLockSchema.parse(value);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=lockSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockSchema.js","sourceRoot":"","sources":["../../src/lock/lockSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;IAClB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC;CAC/C,CAAC;KACD,MAAM,EAAE,CAAC;AAKZ,MAAM,UAAU,sBAAsB,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;IACrD,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ManagerLock, type SkillpackLockEntry } from './lockSchema.js';
|
|
2
|
+
export interface LockStoreOptions {
|
|
3
|
+
homeDir?: string;
|
|
4
|
+
managerStateDir?: string;
|
|
5
|
+
lockPath?: string;
|
|
6
|
+
now?: Date;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadLock(lockPath: string): Promise<ManagerLock>;
|
|
9
|
+
export declare function saveLock(lock: ManagerLock, options?: LockStoreOptions): Promise<string>;
|
|
10
|
+
export declare function upsertSkillpackLockEntry(entry: SkillpackLockEntry, options?: LockStoreOptions): Promise<{
|
|
11
|
+
lock: ManagerLock;
|
|
12
|
+
lockPath: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function getDefaultLockPath(homeDir?: string): string;
|
|
15
|
+
//# sourceMappingURL=lockStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockStore.d.ts","sourceRoot":"","sources":["../../src/lock/lockStore.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EAGxB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAkBD,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAGrE;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CASjG;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAAC,CA0BhD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { assertPathInside, defaultLockPath, defaultManagerStateDir, lockFileName, resolveUserPath } from '../paths.js';
|
|
4
|
+
import { createEmptyManagerLock, parseManagerLock } from './lockSchema.js';
|
|
5
|
+
function resolveLockPaths(options = {}) {
|
|
6
|
+
const homeDir = options.homeDir;
|
|
7
|
+
const managerStateDir = resolveUserPath(options.managerStateDir ?? (homeDir === undefined ? defaultManagerStateDir() : defaultManagerStateDir(homeDir)), homeDir);
|
|
8
|
+
const lockPath = resolveUserPath(options.lockPath ?? path.join(managerStateDir, lockFileName), homeDir);
|
|
9
|
+
assertPathInside(managerStateDir, lockPath);
|
|
10
|
+
return { managerStateDir, lockPath };
|
|
11
|
+
}
|
|
12
|
+
export async function loadLock(lockPath) {
|
|
13
|
+
const rawLock = await fs.readFile(lockPath, 'utf8');
|
|
14
|
+
return parseManagerLock(JSON.parse(rawLock));
|
|
15
|
+
}
|
|
16
|
+
export async function saveLock(lock, options = {}) {
|
|
17
|
+
const { managerStateDir, lockPath } = resolveLockPaths(options);
|
|
18
|
+
const parsedLock = parseManagerLock(lock);
|
|
19
|
+
assertPathInside(managerStateDir, lockPath);
|
|
20
|
+
await fs.mkdir(path.dirname(lockPath), { recursive: true });
|
|
21
|
+
await fs.writeFile(lockPath, `${JSON.stringify(parsedLock, null, 2)}\n`, 'utf8');
|
|
22
|
+
return lockPath;
|
|
23
|
+
}
|
|
24
|
+
export async function upsertSkillpackLockEntry(entry, options = {}) {
|
|
25
|
+
const { lockPath } = resolveLockPaths(options);
|
|
26
|
+
let lock;
|
|
27
|
+
try {
|
|
28
|
+
lock = await loadLock(lockPath);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (!isMissingFileError(error)) {
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
lock = createEmptyManagerLock(options.now);
|
|
35
|
+
}
|
|
36
|
+
const updatedAt = (options.now ?? new Date()).toISOString();
|
|
37
|
+
const updatedLock = {
|
|
38
|
+
...lock,
|
|
39
|
+
updatedAt,
|
|
40
|
+
skillpacks: {
|
|
41
|
+
...lock.skillpacks,
|
|
42
|
+
[entry.id]: entry
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
await saveLock(updatedLock, options);
|
|
46
|
+
return { lock: updatedLock, lockPath };
|
|
47
|
+
}
|
|
48
|
+
export function getDefaultLockPath(homeDir) {
|
|
49
|
+
return homeDir === undefined ? defaultLockPath() : defaultLockPath(homeDir);
|
|
50
|
+
}
|
|
51
|
+
function isMissingFileError(error) {
|
|
52
|
+
return (error instanceof Error &&
|
|
53
|
+
'code' in error &&
|
|
54
|
+
error.code === 'ENOENT');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=lockStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockStore.js","sourceRoot":"","sources":["../../src/lock/lockStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const managedLinkTypeSchema: z.ZodEnum<["symlink", "junction"]>;
|
|
3
|
+
export declare const managedLinkManifestEntrySchema: z.ZodObject<{
|
|
4
|
+
agentId: z.ZodEnum<["codex", "claude", "copilot", "opencode", "pi", "custom", "gemini"]>;
|
|
5
|
+
skillId: z.ZodString;
|
|
6
|
+
targetPath: z.ZodString;
|
|
7
|
+
sourcePath: z.ZodString;
|
|
8
|
+
linkType: z.ZodEnum<["symlink", "junction"]>;
|
|
9
|
+
createdAt: z.ZodString;
|
|
10
|
+
updatedAt: z.ZodString;
|
|
11
|
+
}, "strict", z.ZodTypeAny, {
|
|
12
|
+
agentId: "codex" | "claude" | "copilot" | "opencode" | "pi" | "custom" | "gemini";
|
|
13
|
+
skillId: string;
|
|
14
|
+
targetPath: string;
|
|
15
|
+
sourcePath: string;
|
|
16
|
+
linkType: "symlink" | "junction";
|
|
17
|
+
createdAt: string;
|
|
18
|
+
updatedAt: string;
|
|
19
|
+
}, {
|
|
20
|
+
agentId: "codex" | "claude" | "copilot" | "opencode" | "pi" | "custom" | "gemini";
|
|
21
|
+
skillId: string;
|
|
22
|
+
targetPath: string;
|
|
23
|
+
sourcePath: string;
|
|
24
|
+
linkType: "symlink" | "junction";
|
|
25
|
+
createdAt: string;
|
|
26
|
+
updatedAt: string;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const managerManifestSchema: z.ZodObject<{
|
|
29
|
+
version: z.ZodLiteral<1>;
|
|
30
|
+
updatedAt: z.ZodString;
|
|
31
|
+
links: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
32
|
+
agentId: z.ZodEnum<["codex", "claude", "copilot", "opencode", "pi", "custom", "gemini"]>;
|
|
33
|
+
skillId: z.ZodString;
|
|
34
|
+
targetPath: z.ZodString;
|
|
35
|
+
sourcePath: z.ZodString;
|
|
36
|
+
linkType: z.ZodEnum<["symlink", "junction"]>;
|
|
37
|
+
createdAt: z.ZodString;
|
|
38
|
+
updatedAt: z.ZodString;
|
|
39
|
+
}, "strict", z.ZodTypeAny, {
|
|
40
|
+
agentId: "codex" | "claude" | "copilot" | "opencode" | "pi" | "custom" | "gemini";
|
|
41
|
+
skillId: string;
|
|
42
|
+
targetPath: string;
|
|
43
|
+
sourcePath: string;
|
|
44
|
+
linkType: "symlink" | "junction";
|
|
45
|
+
createdAt: string;
|
|
46
|
+
updatedAt: string;
|
|
47
|
+
}, {
|
|
48
|
+
agentId: "codex" | "claude" | "copilot" | "opencode" | "pi" | "custom" | "gemini";
|
|
49
|
+
skillId: string;
|
|
50
|
+
targetPath: string;
|
|
51
|
+
sourcePath: string;
|
|
52
|
+
linkType: "symlink" | "junction";
|
|
53
|
+
createdAt: string;
|
|
54
|
+
updatedAt: string;
|
|
55
|
+
}>>;
|
|
56
|
+
}, "strict", z.ZodTypeAny, {
|
|
57
|
+
updatedAt: string;
|
|
58
|
+
version: 1;
|
|
59
|
+
links: Record<string, {
|
|
60
|
+
agentId: "codex" | "claude" | "copilot" | "opencode" | "pi" | "custom" | "gemini";
|
|
61
|
+
skillId: string;
|
|
62
|
+
targetPath: string;
|
|
63
|
+
sourcePath: string;
|
|
64
|
+
linkType: "symlink" | "junction";
|
|
65
|
+
createdAt: string;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
}>;
|
|
68
|
+
}, {
|
|
69
|
+
updatedAt: string;
|
|
70
|
+
version: 1;
|
|
71
|
+
links: Record<string, {
|
|
72
|
+
agentId: "codex" | "claude" | "copilot" | "opencode" | "pi" | "custom" | "gemini";
|
|
73
|
+
skillId: string;
|
|
74
|
+
targetPath: string;
|
|
75
|
+
sourcePath: string;
|
|
76
|
+
linkType: "symlink" | "junction";
|
|
77
|
+
createdAt: string;
|
|
78
|
+
updatedAt: string;
|
|
79
|
+
}>;
|
|
80
|
+
}>;
|
|
81
|
+
export type ManagedLinkType = z.infer<typeof managedLinkTypeSchema>;
|
|
82
|
+
export type ManagedLinkManifestEntry = z.infer<typeof managedLinkManifestEntrySchema>;
|
|
83
|
+
export type ManagerManifest = z.infer<typeof managerManifestSchema>;
|
|
84
|
+
export declare function createEmptyManagerManifest(now?: Date): ManagerManifest;
|
|
85
|
+
export declare function parseManagerManifest(value: unknown): ManagerManifest;
|
|
86
|
+
//# sourceMappingURL=manifestSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestSchema.d.ts","sourceRoot":"","sources":["../../src/manifest/manifestSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,qBAAqB,oCAAkC,CAAC;AAErE,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;EAUhC,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,wBAAgB,0BAA0B,CAAC,GAAG,OAAa,GAAG,eAAe,CAM5E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAEpE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { agentIdSchema } from '../config/configSchema.js';
|
|
3
|
+
export const managedLinkTypeSchema = z.enum(['symlink', 'junction']);
|
|
4
|
+
export const managedLinkManifestEntrySchema = z
|
|
5
|
+
.object({
|
|
6
|
+
agentId: agentIdSchema,
|
|
7
|
+
skillId: z.string().min(1),
|
|
8
|
+
targetPath: z.string().min(1),
|
|
9
|
+
sourcePath: z.string().min(1),
|
|
10
|
+
linkType: managedLinkTypeSchema,
|
|
11
|
+
createdAt: z.string().datetime(),
|
|
12
|
+
updatedAt: z.string().datetime()
|
|
13
|
+
})
|
|
14
|
+
.strict();
|
|
15
|
+
export const managerManifestSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
version: z.literal(1),
|
|
18
|
+
updatedAt: z.string().datetime(),
|
|
19
|
+
links: z.record(managedLinkManifestEntrySchema)
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
22
|
+
export function createEmptyManagerManifest(now = new Date()) {
|
|
23
|
+
return {
|
|
24
|
+
version: 1,
|
|
25
|
+
updatedAt: now.toISOString(),
|
|
26
|
+
links: {}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function parseManagerManifest(value) {
|
|
30
|
+
return managerManifestSchema.parse(value);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=manifestSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestSchema.js","sourceRoot":"","sources":["../../src/manifest/manifestSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,aAAa,EAAC,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC;KAC5C,MAAM,CAAC;IACN,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,QAAQ,EAAE,qBAAqB;IAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,8BAA8B,CAAC;CAChD,CAAC;KACD,MAAM,EAAE,CAAC;AAMZ,MAAM,UAAU,0BAA0B,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;IACzD,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;QAC5B,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ManagerManifest } from './manifestSchema.js';
|
|
2
|
+
export interface ManifestStoreOptions {
|
|
3
|
+
homeDir?: string;
|
|
4
|
+
managerStateDir?: string;
|
|
5
|
+
manifestPath?: string;
|
|
6
|
+
now?: Date;
|
|
7
|
+
}
|
|
8
|
+
export declare function resolveManifestPaths(options?: ManifestStoreOptions): {
|
|
9
|
+
managerStateDir: string;
|
|
10
|
+
manifestPath: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function loadManifest(manifestPath: string): Promise<ManagerManifest>;
|
|
13
|
+
export declare function loadManifestOrDefault(options?: ManifestStoreOptions): Promise<{
|
|
14
|
+
manifest: ManagerManifest;
|
|
15
|
+
manifestPath: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function saveManifest(manifest: ManagerManifest, options?: ManifestStoreOptions): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=manifestStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestStore.d.ts","sourceRoot":"","sources":["../../src/manifest/manifestStore.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,oBAAyB,GAAG;IACxE,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAWA;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAGjF;AAED,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC;IACvF,QAAQ,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAkBD;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CASjB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { assertPathInside, defaultManagerStateDir, manifestFileName, resolveUserPath } from '../paths.js';
|
|
4
|
+
import { createEmptyManagerManifest, parseManagerManifest } from './manifestSchema.js';
|
|
5
|
+
export function resolveManifestPaths(options = {}) {
|
|
6
|
+
const homeDir = options.homeDir;
|
|
7
|
+
const managerStateDir = resolveUserPath(options.managerStateDir ?? (homeDir === undefined ? defaultManagerStateDir() : defaultManagerStateDir(homeDir)), homeDir);
|
|
8
|
+
const manifestPath = resolveUserPath(options.manifestPath ?? path.join(managerStateDir, manifestFileName), homeDir);
|
|
9
|
+
assertPathInside(managerStateDir, manifestPath);
|
|
10
|
+
return { managerStateDir, manifestPath };
|
|
11
|
+
}
|
|
12
|
+
export async function loadManifest(manifestPath) {
|
|
13
|
+
const rawManifest = await fs.readFile(manifestPath, 'utf8');
|
|
14
|
+
return parseManagerManifest(JSON.parse(rawManifest));
|
|
15
|
+
}
|
|
16
|
+
export async function loadManifestOrDefault(options = {}) {
|
|
17
|
+
const { manifestPath } = resolveManifestPaths(options);
|
|
18
|
+
try {
|
|
19
|
+
return {
|
|
20
|
+
manifest: await loadManifest(manifestPath),
|
|
21
|
+
manifestPath
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (!isMissingFileError(error)) {
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
manifest: createEmptyManagerManifest(options.now),
|
|
30
|
+
manifestPath
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function saveManifest(manifest, options = {}) {
|
|
35
|
+
const { managerStateDir, manifestPath } = resolveManifestPaths(options);
|
|
36
|
+
const parsedManifest = parseManagerManifest(manifest);
|
|
37
|
+
assertPathInside(managerStateDir, manifestPath);
|
|
38
|
+
await fs.mkdir(path.dirname(manifestPath), { recursive: true });
|
|
39
|
+
await fs.writeFile(manifestPath, `${JSON.stringify(parsedManifest, null, 2)}\n`, 'utf8');
|
|
40
|
+
return manifestPath;
|
|
41
|
+
}
|
|
42
|
+
function isMissingFileError(error) {
|
|
43
|
+
return (error instanceof Error &&
|
|
44
|
+
'code' in error &&
|
|
45
|
+
error.code === 'ENOENT');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=manifestStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifestStore.js","sourceRoot":"","sources":["../../src/manifest/manifestStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,IAAI,EAAE,EAAC,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,0BAA0B,EAC1B,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAS7B,MAAM,UAAU,oBAAoB,CAAC,UAAgC,EAAE;IAIrE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,eAAe,GAAG,eAAe,CACrC,OAAO,CAAC,eAAe,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAC/G,OAAO,CACR,CAAC;IACF,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC;IAEpH,gBAAgB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAEhD,OAAO,EAAC,eAAe,EAAE,YAAY,EAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,YAAoB;IACrD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAgC,EAAE;IAI5E,MAAM,EAAC,YAAY,EAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,OAAO;YACL,QAAQ,EAAE,MAAM,YAAY,CAAC,YAAY,CAAC;YAC1C,YAAY;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC;YACjD,YAAY;SACb,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAyB,EACzB,UAAgC,EAAE;IAElC,MAAM,EAAC,eAAe,EAAE,YAAY,EAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAEtD,gBAAgB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEzF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,CACnD,CAAC;AACJ,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const managerStateDirSegments: readonly [".agents", "corvus-skill-manager"];
|
|
2
|
+
export declare const configFileName = "config.json";
|
|
3
|
+
export declare const lockFileName = "lock.json";
|
|
4
|
+
export declare const manifestFileName = "manifest.json";
|
|
5
|
+
export declare function expandTilde(inputPath: string, homeDir?: string): string;
|
|
6
|
+
export declare function resolveUserPath(inputPath: string, homeDir?: string): string;
|
|
7
|
+
export declare function defaultManagerStateDir(homeDir?: string): string;
|
|
8
|
+
export declare function defaultConfigPath(homeDir?: string): string;
|
|
9
|
+
export declare function defaultLockPath(homeDir?: string): string;
|
|
10
|
+
export declare function defaultManifestPath(homeDir?: string): string;
|
|
11
|
+
export declare function defaultSkillpackCheckoutPath(skillpackId: string, homeDir?: string): string;
|
|
12
|
+
export declare function isPathInside(parentPath: string, candidatePath: string): boolean;
|
|
13
|
+
export declare function assertPathInside(parentPath: string, candidatePath: string): void;
|
|
14
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,8CAA+C,CAAC;AACpF,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,eAAO,MAAM,YAAY,cAAc,CAAC;AACxC,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,SAAe,GAAG,MAAM,CAU7E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,SAAe,GAAG,MAAM,CAEjF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,SAAe,GAAG,MAAM,CAErE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,SAAe,GAAG,MAAM,CAEhE;AAED,wBAAgB,eAAe,CAAC,OAAO,SAAe,GAAG,MAAM,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,SAAe,GAAG,MAAM,CAElE;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,SAAe,GAAG,MAAM,CAEhG;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAG/E;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAIhF"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export const managerStateDirSegments = ['.agents', 'corvus-skill-manager'];
|
|
4
|
+
export const configFileName = 'config.json';
|
|
5
|
+
export const lockFileName = 'lock.json';
|
|
6
|
+
export const manifestFileName = 'manifest.json';
|
|
7
|
+
export function expandTilde(inputPath, homeDir = os.homedir()) {
|
|
8
|
+
if (inputPath === '~') {
|
|
9
|
+
return homeDir;
|
|
10
|
+
}
|
|
11
|
+
if (inputPath.startsWith('~/') || inputPath.startsWith('~\\')) {
|
|
12
|
+
return path.join(homeDir, inputPath.slice(2));
|
|
13
|
+
}
|
|
14
|
+
return inputPath;
|
|
15
|
+
}
|
|
16
|
+
export function resolveUserPath(inputPath, homeDir = os.homedir()) {
|
|
17
|
+
return path.resolve(expandTilde(inputPath, homeDir));
|
|
18
|
+
}
|
|
19
|
+
export function defaultManagerStateDir(homeDir = os.homedir()) {
|
|
20
|
+
return path.join(homeDir, ...managerStateDirSegments);
|
|
21
|
+
}
|
|
22
|
+
export function defaultConfigPath(homeDir = os.homedir()) {
|
|
23
|
+
return path.join(defaultManagerStateDir(homeDir), configFileName);
|
|
24
|
+
}
|
|
25
|
+
export function defaultLockPath(homeDir = os.homedir()) {
|
|
26
|
+
return path.join(defaultManagerStateDir(homeDir), lockFileName);
|
|
27
|
+
}
|
|
28
|
+
export function defaultManifestPath(homeDir = os.homedir()) {
|
|
29
|
+
return path.join(defaultManagerStateDir(homeDir), manifestFileName);
|
|
30
|
+
}
|
|
31
|
+
export function defaultSkillpackCheckoutPath(skillpackId, homeDir = os.homedir()) {
|
|
32
|
+
return path.join(homeDir, '.agents', 'skillpacks', skillpackId, 'repo');
|
|
33
|
+
}
|
|
34
|
+
export function isPathInside(parentPath, candidatePath) {
|
|
35
|
+
const relativePath = path.relative(path.resolve(parentPath), path.resolve(candidatePath));
|
|
36
|
+
return relativePath === '' || (!relativePath.startsWith('..') && !path.isAbsolute(relativePath));
|
|
37
|
+
}
|
|
38
|
+
export function assertPathInside(parentPath, candidatePath) {
|
|
39
|
+
if (!isPathInside(parentPath, candidatePath)) {
|
|
40
|
+
throw new Error(`Refusing to use path outside manager state directory: ${candidatePath}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,SAAS,EAAE,sBAAsB,CAAU,CAAC;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IACnE,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IACvE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,uBAAuB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,WAAmB,EAAE,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE;IACtF,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,aAAqB;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1F,OAAO,YAAY,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,aAAqB;IACxE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,yDAAyD,aAAa,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC"}
|