skillpkg-core 0.2.1 → 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/dist/config/config-manager.d.ts +83 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +220 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/index.d.ts +23 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +23 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schemas/skillpkg.schema.json +103 -0
- package/dist/config/types.d.ts +69 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +29 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts +33 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +33 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/installer.d.ts +54 -0
- package/dist/installer/installer.d.ts.map +1 -0
- package/dist/installer/installer.js +371 -0
- package/dist/installer/installer.js.map +1 -0
- package/dist/installer/types.d.ts +138 -0
- package/dist/installer/types.d.ts.map +1 -0
- package/dist/installer/types.js +2 -0
- package/dist/installer/types.js.map +1 -0
- package/dist/parser/schema.d.ts +26 -5
- package/dist/parser/schema.d.ts.map +1 -1
- package/dist/parser/schema.js +25 -3
- package/dist/parser/schema.js.map +1 -1
- package/dist/resolver/dependency-resolver.d.ts +59 -0
- package/dist/resolver/dependency-resolver.d.ts.map +1 -0
- package/dist/resolver/dependency-resolver.js +217 -0
- package/dist/resolver/dependency-resolver.js.map +1 -0
- package/dist/resolver/index.d.ts +35 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +34 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/install-plan.d.ts +107 -0
- package/dist/resolver/install-plan.d.ts.map +1 -0
- package/dist/resolver/install-plan.js +137 -0
- package/dist/resolver/install-plan.js.map +1 -0
- package/dist/resolver/types.d.ts +76 -0
- package/dist/resolver/types.d.ts.map +1 -0
- package/dist/resolver/types.js +5 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/state/index.d.ts +30 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +30 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/state-manager.d.ts +105 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +242 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/state/types.d.ts +86 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +21 -0
- package/dist/state/types.js.map +1 -0
- package/dist/syncer/index.d.ts +28 -0
- package/dist/syncer/index.d.ts.map +1 -0
- package/dist/syncer/index.js +28 -0
- package/dist/syncer/index.js.map +1 -0
- package/dist/syncer/syncer.d.ts +74 -0
- package/dist/syncer/syncer.d.ts.map +1 -0
- package/dist/syncer/syncer.js +405 -0
- package/dist/syncer/syncer.js.map +1 -0
- package/dist/syncer/types.d.ts +143 -0
- package/dist/syncer/types.d.ts.map +1 -0
- package/dist/syncer/types.js +84 -0
- package/dist/syncer/types.js.map +1 -0
- package/dist/types.d.ts +27 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":""}
|
package/dist/parser/schema.d.ts
CHANGED
|
@@ -138,11 +138,32 @@ export declare const skillSchema: {
|
|
|
138
138
|
readonly description: "Platform-specific configurations";
|
|
139
139
|
};
|
|
140
140
|
readonly dependencies: {
|
|
141
|
-
readonly
|
|
142
|
-
|
|
143
|
-
readonly
|
|
144
|
-
|
|
145
|
-
|
|
141
|
+
readonly oneOf: readonly [{
|
|
142
|
+
readonly type: "object";
|
|
143
|
+
readonly additionalProperties: {
|
|
144
|
+
readonly type: "string";
|
|
145
|
+
};
|
|
146
|
+
}, {
|
|
147
|
+
readonly type: "object";
|
|
148
|
+
readonly properties: {
|
|
149
|
+
readonly skills: {
|
|
150
|
+
readonly type: "array";
|
|
151
|
+
readonly items: {
|
|
152
|
+
readonly type: "string";
|
|
153
|
+
};
|
|
154
|
+
readonly description: "Skill dependencies (names or sources)";
|
|
155
|
+
};
|
|
156
|
+
readonly mcp: {
|
|
157
|
+
readonly type: "array";
|
|
158
|
+
readonly items: {
|
|
159
|
+
readonly type: "string";
|
|
160
|
+
};
|
|
161
|
+
readonly description: "MCP server dependencies";
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
readonly additionalProperties: false;
|
|
165
|
+
}];
|
|
166
|
+
readonly description: "Skill and MCP dependencies";
|
|
146
167
|
};
|
|
147
168
|
};
|
|
148
169
|
readonly required: readonly ["schema", "name", "version", "description", "instructions"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/parser/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/parser/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Id,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAcpD,CAAC"}
|
package/dist/parser/schema.js
CHANGED
|
@@ -118,9 +118,31 @@ export const skillSchema = {
|
|
|
118
118
|
description: 'Platform-specific configurations',
|
|
119
119
|
},
|
|
120
120
|
dependencies: {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
oneOf: [
|
|
122
|
+
{
|
|
123
|
+
// Legacy format: Record<string, string> (name -> version)
|
|
124
|
+
type: 'object',
|
|
125
|
+
additionalProperties: { type: 'string' },
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
// New format: { skills?: string[], mcp?: string[] }
|
|
129
|
+
type: 'object',
|
|
130
|
+
properties: {
|
|
131
|
+
skills: {
|
|
132
|
+
type: 'array',
|
|
133
|
+
items: { type: 'string' },
|
|
134
|
+
description: 'Skill dependencies (names or sources)',
|
|
135
|
+
},
|
|
136
|
+
mcp: {
|
|
137
|
+
type: 'array',
|
|
138
|
+
items: { type: 'string' },
|
|
139
|
+
description: 'MCP server dependencies',
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
additionalProperties: false,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
description: 'Skill and MCP dependencies',
|
|
124
146
|
},
|
|
125
147
|
},
|
|
126
148
|
required: ['schema', 'name', 'version', 'description', 'instructions'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/parser/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/parser/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DependencyResolver - Resolve skill and MCP dependencies
|
|
3
|
+
*/
|
|
4
|
+
import type { DependencyNode, ResolutionResult, SkillFetcher, SkillMetadata } from './types.js';
|
|
5
|
+
import { type SkillDependencies } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* DependencyResolver class
|
|
8
|
+
*/
|
|
9
|
+
export declare class DependencyResolver {
|
|
10
|
+
private fetcher;
|
|
11
|
+
constructor(fetcher: SkillFetcher);
|
|
12
|
+
/**
|
|
13
|
+
* Resolve all dependencies for a skill source
|
|
14
|
+
* Returns dependencies in topological order (dependencies first)
|
|
15
|
+
*/
|
|
16
|
+
resolveDependencies(skillSource: string, installed?: Set<string>): Promise<ResolutionResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Recursive dependency resolution with circular detection
|
|
19
|
+
*/
|
|
20
|
+
private resolveRecursive;
|
|
21
|
+
/**
|
|
22
|
+
* Build a dependency tree for visualization
|
|
23
|
+
*/
|
|
24
|
+
buildDependencyTree(skillSource: string, installed?: Set<string>): Promise<DependencyNode | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Recursive tree building
|
|
27
|
+
*/
|
|
28
|
+
private buildTreeRecursive;
|
|
29
|
+
/**
|
|
30
|
+
* Detect circular dependencies
|
|
31
|
+
* Returns the circular chain if found, null otherwise
|
|
32
|
+
*/
|
|
33
|
+
detectCircular(skillSource: string): Promise<string[] | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Get direct dependencies (not transitive)
|
|
36
|
+
*/
|
|
37
|
+
getDirectDependencies(skillSource: string): Promise<SkillDependencies>;
|
|
38
|
+
/**
|
|
39
|
+
* Extract skill name from source
|
|
40
|
+
* e.g., "github:user/skill-name" -> "skill-name"
|
|
41
|
+
*/
|
|
42
|
+
private extractSkillName;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Circular dependency error
|
|
46
|
+
*/
|
|
47
|
+
export declare class CircularDependencyError extends Error {
|
|
48
|
+
readonly chain: string[];
|
|
49
|
+
constructor(chain: string[]);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a DependencyResolver instance
|
|
53
|
+
*/
|
|
54
|
+
export declare function createDependencyResolver(fetcher: SkillFetcher): DependencyResolver;
|
|
55
|
+
/**
|
|
56
|
+
* Create a mock fetcher for testing
|
|
57
|
+
*/
|
|
58
|
+
export declare function createMockFetcher(skills: Map<string, SkillMetadata>): SkillFetcher;
|
|
59
|
+
//# sourceMappingURL=dependency-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../src/resolver/dependency-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAEV,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE5E;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,YAAY;IAIjC;;;OAGG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,GAAG,CAAC,MAAM,CAAa,GACjC,OAAO,CAAC,gBAAgB,CAAC;IAwC5B;;OAEG;YACW,gBAAgB;IA+E9B;;OAEG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,GAAG,CAAC,MAAM,CAAa,GACjC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKjC;;OAEG;YACW,kBAAkB;IAuChC;;;OAGG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAKnE;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ5E;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAqBzB;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBAEb,KAAK,EAAE,MAAM,EAAE;CAK5B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,YAAY,GAAG,kBAAkB,CAElF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACjC,YAAY,CAkBd"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { normalizeDependencies } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* DependencyResolver class
|
|
4
|
+
*/
|
|
5
|
+
export class DependencyResolver {
|
|
6
|
+
fetcher;
|
|
7
|
+
constructor(fetcher) {
|
|
8
|
+
this.fetcher = fetcher;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve all dependencies for a skill source
|
|
12
|
+
* Returns dependencies in topological order (dependencies first)
|
|
13
|
+
*/
|
|
14
|
+
async resolveDependencies(skillSource, installed = new Set()) {
|
|
15
|
+
const result = {
|
|
16
|
+
dependencies: [],
|
|
17
|
+
mcpToInstall: [],
|
|
18
|
+
errors: [],
|
|
19
|
+
};
|
|
20
|
+
const visited = new Set();
|
|
21
|
+
const inProgress = new Set(); // For circular detection
|
|
22
|
+
const resolved = [];
|
|
23
|
+
try {
|
|
24
|
+
await this.resolveRecursive(skillSource, installed, visited, inProgress, resolved, result, null);
|
|
25
|
+
// resolved is already in topological order (dependencies first)
|
|
26
|
+
// because we push after processing all children (post-order traversal)
|
|
27
|
+
result.dependencies = resolved;
|
|
28
|
+
// Deduplicate MCP dependencies
|
|
29
|
+
result.mcpToInstall = [...new Set(result.mcpToInstall)];
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof CircularDependencyError) {
|
|
33
|
+
result.circularChain = error.chain;
|
|
34
|
+
result.errors.push(`Circular dependency detected: ${error.chain.join(' → ')}`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
result.errors.push(String(error));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Recursive dependency resolution with circular detection
|
|
44
|
+
*/
|
|
45
|
+
async resolveRecursive(source, installed, visited, inProgress, resolved, result, requiredBy) {
|
|
46
|
+
// Normalize source to skill name for deduplication
|
|
47
|
+
const skillName = this.extractSkillName(source);
|
|
48
|
+
// Skip if already installed
|
|
49
|
+
if (installed.has(skillName)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Skip if already resolved
|
|
53
|
+
if (visited.has(skillName)) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Check for circular dependency
|
|
57
|
+
if (inProgress.has(skillName)) {
|
|
58
|
+
const chain = [...inProgress, skillName];
|
|
59
|
+
throw new CircularDependencyError(chain);
|
|
60
|
+
}
|
|
61
|
+
// Mark as in progress
|
|
62
|
+
inProgress.add(skillName);
|
|
63
|
+
try {
|
|
64
|
+
// Fetch skill metadata
|
|
65
|
+
const metadata = await this.fetcher.fetchMetadata(source);
|
|
66
|
+
if (!metadata) {
|
|
67
|
+
result.errors.push(`Failed to fetch metadata for: ${source}`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Normalize dependencies
|
|
71
|
+
const deps = normalizeDependencies(metadata.dependencies);
|
|
72
|
+
// Process skill dependencies first (depth-first)
|
|
73
|
+
for (const depSource of deps.skills || []) {
|
|
74
|
+
await this.resolveRecursive(depSource, installed, visited, inProgress, resolved, result, skillName);
|
|
75
|
+
}
|
|
76
|
+
// Collect MCP dependencies
|
|
77
|
+
for (const mcp of deps.mcp || []) {
|
|
78
|
+
if (!result.mcpToInstall.includes(mcp)) {
|
|
79
|
+
result.mcpToInstall.push(mcp);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Add this skill to resolved list
|
|
83
|
+
resolved.push({
|
|
84
|
+
name: skillName,
|
|
85
|
+
source,
|
|
86
|
+
type: 'skill',
|
|
87
|
+
transitive: requiredBy !== null,
|
|
88
|
+
requiredBy: requiredBy || undefined,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
// Remove from in progress
|
|
93
|
+
inProgress.delete(skillName);
|
|
94
|
+
// Mark as visited
|
|
95
|
+
visited.add(skillName);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build a dependency tree for visualization
|
|
100
|
+
*/
|
|
101
|
+
async buildDependencyTree(skillSource, installed = new Set()) {
|
|
102
|
+
const visited = new Set();
|
|
103
|
+
return this.buildTreeRecursive(skillSource, installed, visited);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Recursive tree building
|
|
107
|
+
*/
|
|
108
|
+
async buildTreeRecursive(source, installed, visited) {
|
|
109
|
+
const skillName = this.extractSkillName(source);
|
|
110
|
+
// Prevent infinite loops
|
|
111
|
+
if (visited.has(skillName)) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
visited.add(skillName);
|
|
115
|
+
// Fetch metadata
|
|
116
|
+
const metadata = await this.fetcher.fetchMetadata(source);
|
|
117
|
+
if (!metadata) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const deps = normalizeDependencies(metadata.dependencies);
|
|
121
|
+
const children = [];
|
|
122
|
+
// Recursively build children
|
|
123
|
+
for (const depSource of deps.skills || []) {
|
|
124
|
+
const child = await this.buildTreeRecursive(depSource, installed, visited);
|
|
125
|
+
if (child) {
|
|
126
|
+
children.push(child);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
name: metadata.name,
|
|
131
|
+
version: metadata.version,
|
|
132
|
+
source,
|
|
133
|
+
dependencies: children,
|
|
134
|
+
mcpDependencies: deps.mcp || [],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Detect circular dependencies
|
|
139
|
+
* Returns the circular chain if found, null otherwise
|
|
140
|
+
*/
|
|
141
|
+
async detectCircular(skillSource) {
|
|
142
|
+
const result = await this.resolveDependencies(skillSource);
|
|
143
|
+
return result.circularChain || null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get direct dependencies (not transitive)
|
|
147
|
+
*/
|
|
148
|
+
async getDirectDependencies(skillSource) {
|
|
149
|
+
const metadata = await this.fetcher.fetchMetadata(skillSource);
|
|
150
|
+
if (!metadata) {
|
|
151
|
+
return { skills: [], mcp: [] };
|
|
152
|
+
}
|
|
153
|
+
return normalizeDependencies(metadata.dependencies);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Extract skill name from source
|
|
157
|
+
* e.g., "github:user/skill-name" -> "skill-name"
|
|
158
|
+
*/
|
|
159
|
+
extractSkillName(source) {
|
|
160
|
+
// GitHub format: github:user/repo
|
|
161
|
+
if (source.startsWith('github:')) {
|
|
162
|
+
const parts = source.replace('github:', '').split('/');
|
|
163
|
+
return parts[parts.length - 1];
|
|
164
|
+
}
|
|
165
|
+
// URL format: https://github.com/user/repo
|
|
166
|
+
if (source.startsWith('http://') || source.startsWith('https://')) {
|
|
167
|
+
try {
|
|
168
|
+
const url = new URL(source);
|
|
169
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
170
|
+
return parts[parts.length - 1] || source;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return source;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Local path or skill name
|
|
177
|
+
return source.split('/').pop() || source;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Circular dependency error
|
|
182
|
+
*/
|
|
183
|
+
export class CircularDependencyError extends Error {
|
|
184
|
+
chain;
|
|
185
|
+
constructor(chain) {
|
|
186
|
+
super(`Circular dependency detected: ${chain.join(' → ')}`);
|
|
187
|
+
this.name = 'CircularDependencyError';
|
|
188
|
+
this.chain = chain;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Create a DependencyResolver instance
|
|
193
|
+
*/
|
|
194
|
+
export function createDependencyResolver(fetcher) {
|
|
195
|
+
return new DependencyResolver(fetcher);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Create a mock fetcher for testing
|
|
199
|
+
*/
|
|
200
|
+
export function createMockFetcher(skills) {
|
|
201
|
+
return {
|
|
202
|
+
async fetchMetadata(source) {
|
|
203
|
+
// Try exact match first
|
|
204
|
+
if (skills.has(source)) {
|
|
205
|
+
return skills.get(source) || null;
|
|
206
|
+
}
|
|
207
|
+
// Try by name
|
|
208
|
+
for (const [key, metadata] of skills.entries()) {
|
|
209
|
+
if (metadata.name === source || key.endsWith(`/${source}`)) {
|
|
210
|
+
return metadata;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/resolver/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolver module - Dependency resolution for skills and MCPs
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { DependencyResolver, createDependencyResolver, createInstallPlan } from '@skillpkg/core';
|
|
7
|
+
*
|
|
8
|
+
* const fetcher = {
|
|
9
|
+
* async fetchMetadata(source) {
|
|
10
|
+
* // Fetch skill metadata from source
|
|
11
|
+
* return { name: 'my-skill', version: '1.0.0' };
|
|
12
|
+
* }
|
|
13
|
+
* };
|
|
14
|
+
*
|
|
15
|
+
* const resolver = createDependencyResolver(fetcher);
|
|
16
|
+
*
|
|
17
|
+
* // Resolve all dependencies
|
|
18
|
+
* const result = await resolver.resolveDependencies('github:user/my-skill');
|
|
19
|
+
*
|
|
20
|
+
* // Create install plan
|
|
21
|
+
* const plan = createInstallPlan(result);
|
|
22
|
+
* console.log(formatInstallPlan(plan));
|
|
23
|
+
*
|
|
24
|
+
* // Check for circular dependencies
|
|
25
|
+
* const circular = await resolver.detectCircular('github:user/my-skill');
|
|
26
|
+
* if (circular) {
|
|
27
|
+
* console.log('Circular dependency:', circular.join(' → '));
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export type { ResolvedDependency, DependencyNode, ResolutionResult, McpResolutionResult, SkillFetcher, SkillMetadata, } from './types.js';
|
|
32
|
+
export { DependencyResolver, CircularDependencyError, createDependencyResolver, createMockFetcher, } from './dependency-resolver.js';
|
|
33
|
+
export type { InstallStep, McpRequirement, InstallPlan, InstallStepResult, InstallPlanResult, } from './install-plan.js';
|
|
34
|
+
export { createInstallPlan, recordDependencyInstall, getSkillsToInstall, getInstallCount, hasMcpRequirements, formatInstallPlan, } from './install-plan.js';
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolver module - Dependency resolution for skills and MCPs
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { DependencyResolver, createDependencyResolver, createInstallPlan } from '@skillpkg/core';
|
|
7
|
+
*
|
|
8
|
+
* const fetcher = {
|
|
9
|
+
* async fetchMetadata(source) {
|
|
10
|
+
* // Fetch skill metadata from source
|
|
11
|
+
* return { name: 'my-skill', version: '1.0.0' };
|
|
12
|
+
* }
|
|
13
|
+
* };
|
|
14
|
+
*
|
|
15
|
+
* const resolver = createDependencyResolver(fetcher);
|
|
16
|
+
*
|
|
17
|
+
* // Resolve all dependencies
|
|
18
|
+
* const result = await resolver.resolveDependencies('github:user/my-skill');
|
|
19
|
+
*
|
|
20
|
+
* // Create install plan
|
|
21
|
+
* const plan = createInstallPlan(result);
|
|
22
|
+
* console.log(formatInstallPlan(plan));
|
|
23
|
+
*
|
|
24
|
+
* // Check for circular dependencies
|
|
25
|
+
* const circular = await resolver.detectCircular('github:user/my-skill');
|
|
26
|
+
* if (circular) {
|
|
27
|
+
* console.log('Circular dependency:', circular.join(' → '));
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
// DependencyResolver
|
|
32
|
+
export { DependencyResolver, CircularDependencyError, createDependencyResolver, createMockFetcher, } from './dependency-resolver.js';
|
|
33
|
+
export { createInstallPlan, recordDependencyInstall, getSkillsToInstall, getInstallCount, hasMcpRequirements, formatInstallPlan, } from './install-plan.js';
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAYH,qBAAqB;AACrB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAWlC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InstallPlan - Prepare installation plan from resolved dependencies
|
|
3
|
+
*
|
|
4
|
+
* This module bridges the gap between DependencyResolver and the actual
|
|
5
|
+
* installation process. It creates a plan that can be executed by the installer.
|
|
6
|
+
*/
|
|
7
|
+
import type { ResolutionResult } from './types.js';
|
|
8
|
+
import type { StateManager } from '../state/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* A single step in the install plan
|
|
11
|
+
*/
|
|
12
|
+
export interface InstallStep {
|
|
13
|
+
/** Skill name */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Source to install from (github:user/repo, URL, etc.) */
|
|
16
|
+
source: string;
|
|
17
|
+
/** Whether this is a transitive dependency */
|
|
18
|
+
isTransitive: boolean;
|
|
19
|
+
/** The skill that requires this dependency (for transitive deps) */
|
|
20
|
+
requiredBy?: string;
|
|
21
|
+
/** Action to take */
|
|
22
|
+
action: 'install' | 'skip';
|
|
23
|
+
/** Reason for skipping (if action is 'skip') */
|
|
24
|
+
skipReason?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* MCP dependency that needs attention
|
|
28
|
+
*/
|
|
29
|
+
export interface McpRequirement {
|
|
30
|
+
/** MCP server name */
|
|
31
|
+
name: string;
|
|
32
|
+
/** Skills that require this MCP */
|
|
33
|
+
requiredBy: string[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Complete installation plan
|
|
37
|
+
*/
|
|
38
|
+
export interface InstallPlan {
|
|
39
|
+
/** Steps to execute in order */
|
|
40
|
+
steps: InstallStep[];
|
|
41
|
+
/** MCP servers that need to be installed */
|
|
42
|
+
mcpRequirements: McpRequirement[];
|
|
43
|
+
/** Whether there were any errors during planning */
|
|
44
|
+
hasErrors: boolean;
|
|
45
|
+
/** Error messages */
|
|
46
|
+
errors: string[];
|
|
47
|
+
/** Circular dependency chain if detected */
|
|
48
|
+
circularChain?: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Result of executing an install step
|
|
52
|
+
*/
|
|
53
|
+
export interface InstallStepResult {
|
|
54
|
+
step: InstallStep;
|
|
55
|
+
success: boolean;
|
|
56
|
+
error?: string;
|
|
57
|
+
/** Version that was installed */
|
|
58
|
+
version?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Result of executing the full install plan
|
|
62
|
+
*/
|
|
63
|
+
export interface InstallPlanResult {
|
|
64
|
+
/** Successfully installed skills */
|
|
65
|
+
installed: InstallStepResult[];
|
|
66
|
+
/** Failed installations */
|
|
67
|
+
failed: InstallStepResult[];
|
|
68
|
+
/** Skipped skills */
|
|
69
|
+
skipped: InstallStep[];
|
|
70
|
+
/** MCP requirements (not auto-installed) */
|
|
71
|
+
mcpRequirements: McpRequirement[];
|
|
72
|
+
/** Overall success */
|
|
73
|
+
success: boolean;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create an install plan from resolution result
|
|
77
|
+
*/
|
|
78
|
+
export declare function createInstallPlan(resolution: ResolutionResult, installedSkills?: Set<string>): InstallPlan;
|
|
79
|
+
/**
|
|
80
|
+
* Record dependencies in state after successful installation
|
|
81
|
+
*
|
|
82
|
+
* Call this after each skill is successfully installed to update
|
|
83
|
+
* the dependency tracking in state.
|
|
84
|
+
*
|
|
85
|
+
* @param projectPath - Path to the project root
|
|
86
|
+
* @param stateManager - StateManager instance
|
|
87
|
+
* @param step - The install step that was completed
|
|
88
|
+
* @param version - Version that was installed
|
|
89
|
+
*/
|
|
90
|
+
export declare function recordDependencyInstall(projectPath: string, stateManager: StateManager, step: InstallStep, version: string): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Get skills that would be installed (excluding skipped)
|
|
93
|
+
*/
|
|
94
|
+
export declare function getSkillsToInstall(plan: InstallPlan): InstallStep[];
|
|
95
|
+
/**
|
|
96
|
+
* Get count of skills to install
|
|
97
|
+
*/
|
|
98
|
+
export declare function getInstallCount(plan: InstallPlan): number;
|
|
99
|
+
/**
|
|
100
|
+
* Check if plan has any MCP requirements
|
|
101
|
+
*/
|
|
102
|
+
export declare function hasMcpRequirements(plan: InstallPlan): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Format plan for display
|
|
105
|
+
*/
|
|
106
|
+
export declare function formatInstallPlan(plan: InstallPlan): string;
|
|
107
|
+
//# sourceMappingURL=install-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-plan.d.ts","sourceRoot":"","sources":["../../src/resolver/install-plan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,YAAY,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,4CAA4C;IAC5C,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,2BAA2B;IAC3B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,qBAAqB;IACrB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,4CAA4C;IAC5C,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,gBAAgB,EAC5B,eAAe,GAAE,GAAG,CAAC,MAAM,CAAa,GACvC,WAAW,CAgDb;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,CAEnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAyC3D"}
|