skillpkg-core 0.2.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/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,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installer module - Dependency-aware skill installation
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { createInstaller, createStateManager, createConfigManager } from '@skillpkg/core';
|
|
7
|
+
* import { StoreManager } from '@skillpkg/core';
|
|
8
|
+
*
|
|
9
|
+
* // Create dependencies
|
|
10
|
+
* const stateManager = createStateManager();
|
|
11
|
+
* const configManager = createConfigManager();
|
|
12
|
+
* const storeManager = new StoreManager();
|
|
13
|
+
* const fetcher = {
|
|
14
|
+
* async fetchMetadata(source) { ... },
|
|
15
|
+
* async fetchSkill(source) { ... },
|
|
16
|
+
* };
|
|
17
|
+
*
|
|
18
|
+
* // Create installer
|
|
19
|
+
* const installer = createInstaller(stateManager, configManager, storeManager, fetcher);
|
|
20
|
+
*
|
|
21
|
+
* // Install with dependencies
|
|
22
|
+
* const result = await installer.install(projectPath, 'github:user/my-skill');
|
|
23
|
+
*
|
|
24
|
+
* // Uninstall with dependency check
|
|
25
|
+
* const uninstallResult = await installer.uninstall(projectPath, 'my-skill');
|
|
26
|
+
*
|
|
27
|
+
* // Install all from config
|
|
28
|
+
* const configResult = await installer.installFromConfig(projectPath);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export type { InstallSource, InstallOptions, InstallResult, SkillInstallResult, UninstallOptions, InstallerUninstallCheck, UninstallResult, SkillFetcherAdapter, InstallFromConfigResult, } from './types.js';
|
|
32
|
+
export { Installer, createInstaller } from './installer.js';
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,YAAY,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installer module - Dependency-aware skill installation
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import { createInstaller, createStateManager, createConfigManager } from '@skillpkg/core';
|
|
7
|
+
* import { StoreManager } from '@skillpkg/core';
|
|
8
|
+
*
|
|
9
|
+
* // Create dependencies
|
|
10
|
+
* const stateManager = createStateManager();
|
|
11
|
+
* const configManager = createConfigManager();
|
|
12
|
+
* const storeManager = new StoreManager();
|
|
13
|
+
* const fetcher = {
|
|
14
|
+
* async fetchMetadata(source) { ... },
|
|
15
|
+
* async fetchSkill(source) { ... },
|
|
16
|
+
* };
|
|
17
|
+
*
|
|
18
|
+
* // Create installer
|
|
19
|
+
* const installer = createInstaller(stateManager, configManager, storeManager, fetcher);
|
|
20
|
+
*
|
|
21
|
+
* // Install with dependencies
|
|
22
|
+
* const result = await installer.install(projectPath, 'github:user/my-skill');
|
|
23
|
+
*
|
|
24
|
+
* // Uninstall with dependency check
|
|
25
|
+
* const uninstallResult = await installer.uninstall(projectPath, 'my-skill');
|
|
26
|
+
*
|
|
27
|
+
* // Install all from config
|
|
28
|
+
* const configResult = await installer.installFromConfig(projectPath);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
// Installer
|
|
32
|
+
export { Installer, createInstaller } from './installer.js';
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAeH,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installer - Dependency-aware skill installation
|
|
3
|
+
*
|
|
4
|
+
* Integrates DependencyResolver, StateManager, StoreManager to provide
|
|
5
|
+
* a complete installation experience with dependency tracking.
|
|
6
|
+
*/
|
|
7
|
+
import type { StateManager } from '../state/index.js';
|
|
8
|
+
import type { ConfigManager } from '../config/index.js';
|
|
9
|
+
import type { StoreManager } from '../store/manager.js';
|
|
10
|
+
import type { InstallOptions, InstallResult, UninstallOptions, UninstallResult, InstallerUninstallCheck, SkillFetcherAdapter, InstallFromConfigResult } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Installer class - orchestrates skill installation with dependency resolution
|
|
13
|
+
*/
|
|
14
|
+
export declare class Installer {
|
|
15
|
+
private stateManager;
|
|
16
|
+
private configManager;
|
|
17
|
+
private storeManager;
|
|
18
|
+
private fetcher;
|
|
19
|
+
private resolver;
|
|
20
|
+
constructor(stateManager: StateManager, configManager: ConfigManager, storeManager: StoreManager, fetcher: SkillFetcherAdapter);
|
|
21
|
+
/**
|
|
22
|
+
* Create a SkillFetcher compatible with DependencyResolver
|
|
23
|
+
*/
|
|
24
|
+
private createResolverFetcher;
|
|
25
|
+
/**
|
|
26
|
+
* Install a skill with all its dependencies
|
|
27
|
+
*/
|
|
28
|
+
install(projectPath: string, source: string, options?: InstallOptions): Promise<InstallResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Install a single skill (without dependency resolution)
|
|
31
|
+
*/
|
|
32
|
+
private installSingleSkill;
|
|
33
|
+
/**
|
|
34
|
+
* Uninstall a skill with dependency checking
|
|
35
|
+
*/
|
|
36
|
+
uninstall(projectPath: string, skillName: string, options?: UninstallOptions): Promise<UninstallResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a skill can be uninstalled
|
|
39
|
+
*/
|
|
40
|
+
canUninstall(projectPath: string, skillName: string): Promise<InstallerUninstallCheck>;
|
|
41
|
+
/**
|
|
42
|
+
* Clean up orphan dependencies (dependencies no longer needed by any skill)
|
|
43
|
+
*/
|
|
44
|
+
private cleanupOrphanDependencies;
|
|
45
|
+
/**
|
|
46
|
+
* Install all skills from skillpkg.json
|
|
47
|
+
*/
|
|
48
|
+
installFromConfig(projectPath: string, options?: InstallOptions): Promise<InstallFromConfigResult>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create an Installer instance
|
|
52
|
+
*/
|
|
53
|
+
export declare function createInstaller(stateManager: StateManager, configManager: ConfigManager, storeManager: StoreManager, fetcher: SkillFetcherAdapter): Installer;
|
|
54
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/installer/installer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAEb,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,QAAQ,CAAqB;gBAGnC,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,mBAAmB;IAW9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACG,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC;IAqJzB;;OAEG;YACW,kBAAkB;IA6DhC;;OAEG;IACG,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC;IAiE3B;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAU5F;;OAEG;YACW,yBAAyB;IAyBvC;;OAEG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,uBAAuB,CAAC;CA8CpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,mBAAmB,GAC3B,SAAS,CAEX"}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { DependencyResolver, createInstallPlan, recordDependencyInstall, getSkillsToInstall, hasMcpRequirements, } from '../resolver/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Installer class - orchestrates skill installation with dependency resolution
|
|
4
|
+
*/
|
|
5
|
+
export class Installer {
|
|
6
|
+
stateManager;
|
|
7
|
+
configManager;
|
|
8
|
+
storeManager;
|
|
9
|
+
fetcher;
|
|
10
|
+
resolver;
|
|
11
|
+
constructor(stateManager, configManager, storeManager, fetcher) {
|
|
12
|
+
this.stateManager = stateManager;
|
|
13
|
+
this.configManager = configManager;
|
|
14
|
+
this.storeManager = storeManager;
|
|
15
|
+
this.fetcher = fetcher;
|
|
16
|
+
// Create resolver with adapter
|
|
17
|
+
this.resolver = new DependencyResolver(this.createResolverFetcher());
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a SkillFetcher compatible with DependencyResolver
|
|
21
|
+
*/
|
|
22
|
+
createResolverFetcher() {
|
|
23
|
+
return {
|
|
24
|
+
fetchMetadata: async (source) => {
|
|
25
|
+
const meta = await this.fetcher.fetchMetadata(source);
|
|
26
|
+
if (!meta)
|
|
27
|
+
return null;
|
|
28
|
+
return {
|
|
29
|
+
name: meta.name,
|
|
30
|
+
version: meta.version,
|
|
31
|
+
dependencies: meta.dependencies,
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Install a skill with all its dependencies
|
|
38
|
+
*/
|
|
39
|
+
async install(projectPath, source, options = {}) {
|
|
40
|
+
const result = {
|
|
41
|
+
success: true,
|
|
42
|
+
skills: [],
|
|
43
|
+
mcpRequired: [],
|
|
44
|
+
errors: [],
|
|
45
|
+
stats: {
|
|
46
|
+
installed: 0,
|
|
47
|
+
updated: 0,
|
|
48
|
+
skipped: 0,
|
|
49
|
+
failed: 0,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
try {
|
|
53
|
+
// Step 1: Resolve dependencies (unless skipped)
|
|
54
|
+
let resolution;
|
|
55
|
+
if (options.skipDependencies) {
|
|
56
|
+
// Skip dependency resolution, install only the requested skill
|
|
57
|
+
const meta = await this.fetcher.fetchMetadata(source);
|
|
58
|
+
if (!meta) {
|
|
59
|
+
result.success = false;
|
|
60
|
+
result.errors.push(`Failed to fetch skill metadata from: ${source}`);
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
resolution = {
|
|
64
|
+
dependencies: [
|
|
65
|
+
{ name: meta.name, source, type: 'skill', transitive: false },
|
|
66
|
+
],
|
|
67
|
+
mcpToInstall: meta.dependencies?.mcp || [],
|
|
68
|
+
errors: [],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
resolution = await this.resolver.resolveDependencies(source);
|
|
73
|
+
}
|
|
74
|
+
// Check for circular dependencies
|
|
75
|
+
if (resolution.circularChain) {
|
|
76
|
+
result.success = false;
|
|
77
|
+
result.errors.push(`Circular dependency detected: ${resolution.circularChain.join(' → ')}`);
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
// Check for resolution errors
|
|
81
|
+
if (resolution.errors.length > 0) {
|
|
82
|
+
result.errors.push(...resolution.errors);
|
|
83
|
+
// If there were errors and no dependencies were resolved,
|
|
84
|
+
// the resolution failed entirely
|
|
85
|
+
if (resolution.dependencies.length === 0) {
|
|
86
|
+
result.success = false;
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Step 2: Get currently installed skills
|
|
91
|
+
const state = await this.stateManager.loadState(projectPath);
|
|
92
|
+
const installedSkills = new Set(Object.keys(state.skills));
|
|
93
|
+
// Step 3: Create install plan
|
|
94
|
+
const plan = createInstallPlan(resolution, installedSkills);
|
|
95
|
+
// If plan has errors, return early
|
|
96
|
+
if (plan.hasErrors && plan.circularChain) {
|
|
97
|
+
result.success = false;
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
// Step 4: Execute installation (dry run check)
|
|
101
|
+
if (options.dryRun) {
|
|
102
|
+
// In dry run, just report what would be installed
|
|
103
|
+
for (const step of plan.steps) {
|
|
104
|
+
result.skills.push({
|
|
105
|
+
name: step.name,
|
|
106
|
+
version: '?.?.?', // Version unknown in dry run
|
|
107
|
+
success: true,
|
|
108
|
+
action: step.action === 'skip' ? 'skipped' : 'installed',
|
|
109
|
+
transitive: step.isTransitive,
|
|
110
|
+
requiredBy: step.requiredBy,
|
|
111
|
+
});
|
|
112
|
+
if (step.action === 'skip') {
|
|
113
|
+
result.stats.skipped++;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
result.stats.installed++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
result.mcpRequired = plan.mcpRequirements.map((m) => m.name);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
// Step 5: Install each skill in order (dependencies first)
|
|
123
|
+
const skillsToInstall = getSkillsToInstall(plan);
|
|
124
|
+
for (const step of skillsToInstall) {
|
|
125
|
+
const skillResult = await this.installSingleSkill(projectPath, step.source, step);
|
|
126
|
+
result.skills.push({
|
|
127
|
+
...skillResult,
|
|
128
|
+
transitive: step.isTransitive,
|
|
129
|
+
requiredBy: step.requiredBy,
|
|
130
|
+
});
|
|
131
|
+
if (skillResult.success) {
|
|
132
|
+
if (skillResult.action === 'installed') {
|
|
133
|
+
result.stats.installed++;
|
|
134
|
+
}
|
|
135
|
+
else if (skillResult.action === 'updated') {
|
|
136
|
+
result.stats.updated++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
result.stats.failed++;
|
|
141
|
+
result.success = false;
|
|
142
|
+
if (skillResult.error) {
|
|
143
|
+
result.errors.push(skillResult.error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Record skipped skills
|
|
148
|
+
for (const step of plan.steps.filter((s) => s.action === 'skip')) {
|
|
149
|
+
result.skills.push({
|
|
150
|
+
name: step.name,
|
|
151
|
+
version: state.skills[step.name]?.version || 'unknown',
|
|
152
|
+
success: true,
|
|
153
|
+
action: 'skipped',
|
|
154
|
+
transitive: step.isTransitive,
|
|
155
|
+
requiredBy: step.requiredBy,
|
|
156
|
+
});
|
|
157
|
+
result.stats.skipped++;
|
|
158
|
+
}
|
|
159
|
+
// Step 6: Record MCP requirements
|
|
160
|
+
if (hasMcpRequirements(plan)) {
|
|
161
|
+
result.mcpRequired = plan.mcpRequirements.map((m) => m.name);
|
|
162
|
+
}
|
|
163
|
+
// Step 7: Update skillpkg.json if user-installed (not transitive)
|
|
164
|
+
const rootSkill = skillsToInstall.find((s) => !s.isTransitive);
|
|
165
|
+
if (rootSkill) {
|
|
166
|
+
await this.configManager.addSkill(projectPath, rootSkill.name, source);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
result.success = false;
|
|
171
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Install a single skill (without dependency resolution)
|
|
177
|
+
*/
|
|
178
|
+
async installSingleSkill(projectPath, source, step) {
|
|
179
|
+
try {
|
|
180
|
+
// Fetch the full skill
|
|
181
|
+
const skill = await this.fetcher.fetchSkill(source);
|
|
182
|
+
if (!skill) {
|
|
183
|
+
return {
|
|
184
|
+
name: step.name,
|
|
185
|
+
version: 'unknown',
|
|
186
|
+
success: false,
|
|
187
|
+
action: 'failed',
|
|
188
|
+
error: `Failed to fetch skill from: ${source}`,
|
|
189
|
+
transitive: step.isTransitive,
|
|
190
|
+
requiredBy: step.requiredBy,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// Check if already installed
|
|
194
|
+
const existing = await this.storeManager.getSkill(step.name);
|
|
195
|
+
const action = existing ? 'updated' : 'installed';
|
|
196
|
+
// Add/update in store
|
|
197
|
+
if (existing) {
|
|
198
|
+
await this.storeManager.updateSkill(step.name, skill);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
await this.storeManager.addSkill(skill, { source: 'registry', sourceUrl: source });
|
|
202
|
+
}
|
|
203
|
+
// Record in state
|
|
204
|
+
await recordDependencyInstall(projectPath, this.stateManager, {
|
|
205
|
+
name: step.name,
|
|
206
|
+
source: step.source,
|
|
207
|
+
isTransitive: step.isTransitive,
|
|
208
|
+
requiredBy: step.requiredBy,
|
|
209
|
+
action: 'install',
|
|
210
|
+
}, skill.version);
|
|
211
|
+
return {
|
|
212
|
+
name: step.name,
|
|
213
|
+
version: skill.version,
|
|
214
|
+
success: true,
|
|
215
|
+
action,
|
|
216
|
+
transitive: step.isTransitive,
|
|
217
|
+
requiredBy: step.requiredBy,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return {
|
|
222
|
+
name: step.name,
|
|
223
|
+
version: 'unknown',
|
|
224
|
+
success: false,
|
|
225
|
+
action: 'failed',
|
|
226
|
+
error: error instanceof Error ? error.message : String(error),
|
|
227
|
+
transitive: step.isTransitive,
|
|
228
|
+
requiredBy: step.requiredBy,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Uninstall a skill with dependency checking
|
|
234
|
+
*/
|
|
235
|
+
async uninstall(projectPath, skillName, options = {}) {
|
|
236
|
+
const result = {
|
|
237
|
+
success: true,
|
|
238
|
+
removed: [],
|
|
239
|
+
orphansRemoved: [],
|
|
240
|
+
errors: [],
|
|
241
|
+
};
|
|
242
|
+
try {
|
|
243
|
+
// Step 1: Check if skill exists
|
|
244
|
+
const skill = await this.storeManager.getSkill(skillName);
|
|
245
|
+
if (!skill) {
|
|
246
|
+
result.success = false;
|
|
247
|
+
result.errors.push(`Skill not found: ${skillName}`);
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
// Step 2: Check for dependents (unless force)
|
|
251
|
+
if (!options.force) {
|
|
252
|
+
const state = await this.stateManager.loadState(projectPath);
|
|
253
|
+
const check = this.stateManager.canUninstall(state, skillName);
|
|
254
|
+
if (!check.canUninstall) {
|
|
255
|
+
result.success = false;
|
|
256
|
+
result.errors.push(`Cannot uninstall: ${skillName} is required by: ${check.dependents.join(', ')}`);
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Step 3: Dry run check
|
|
261
|
+
if (options.dryRun) {
|
|
262
|
+
result.removed.push(skillName);
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
// Step 4: Remove from store
|
|
266
|
+
const removed = await this.storeManager.removeSkill(skillName);
|
|
267
|
+
if (!removed) {
|
|
268
|
+
result.success = false;
|
|
269
|
+
result.errors.push(`Failed to remove skill: ${skillName}`);
|
|
270
|
+
return result;
|
|
271
|
+
}
|
|
272
|
+
// Step 5: Remove from state
|
|
273
|
+
await this.stateManager.recordSkillUninstall(projectPath, skillName);
|
|
274
|
+
result.removed.push(skillName);
|
|
275
|
+
// Step 6: Remove from skillpkg.json
|
|
276
|
+
await this.configManager.removeSkill(projectPath, skillName);
|
|
277
|
+
// Step 7: Clean up orphan dependencies (if requested)
|
|
278
|
+
if (options.removeOrphans) {
|
|
279
|
+
const orphans = await this.cleanupOrphanDependencies(projectPath);
|
|
280
|
+
result.orphansRemoved.push(...orphans);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
result.success = false;
|
|
285
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
286
|
+
}
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Check if a skill can be uninstalled
|
|
291
|
+
*/
|
|
292
|
+
async canUninstall(projectPath, skillName) {
|
|
293
|
+
const state = await this.stateManager.loadState(projectPath);
|
|
294
|
+
const check = this.stateManager.canUninstall(state, skillName);
|
|
295
|
+
return {
|
|
296
|
+
canUninstall: check.canUninstall,
|
|
297
|
+
dependents: check.dependents,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Clean up orphan dependencies (dependencies no longer needed by any skill)
|
|
302
|
+
*/
|
|
303
|
+
async cleanupOrphanDependencies(projectPath) {
|
|
304
|
+
const removed = [];
|
|
305
|
+
const state = await this.stateManager.loadState(projectPath);
|
|
306
|
+
// Find skills that were installed as dependencies but are no longer needed
|
|
307
|
+
for (const [skillName, skillState] of Object.entries(state.skills)) {
|
|
308
|
+
// Skip user-installed skills
|
|
309
|
+
if (skillState.installed_by === 'user')
|
|
310
|
+
continue;
|
|
311
|
+
// Check if any skill still depends on this one
|
|
312
|
+
const hasDependents = Object.values(state.skills).some((s) => s.depended_by?.includes(skillName));
|
|
313
|
+
if (!hasDependents) {
|
|
314
|
+
// This is an orphan - remove it
|
|
315
|
+
await this.storeManager.removeSkill(skillName);
|
|
316
|
+
await this.stateManager.recordSkillUninstall(projectPath, skillName);
|
|
317
|
+
removed.push(skillName);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return removed;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Install all skills from skillpkg.json
|
|
324
|
+
*/
|
|
325
|
+
async installFromConfig(projectPath, options = {}) {
|
|
326
|
+
const result = {
|
|
327
|
+
success: true,
|
|
328
|
+
skills: [],
|
|
329
|
+
mcpRequired: [],
|
|
330
|
+
errors: [],
|
|
331
|
+
};
|
|
332
|
+
try {
|
|
333
|
+
// Load config
|
|
334
|
+
const config = await this.configManager.loadProjectConfig(projectPath);
|
|
335
|
+
if (!config) {
|
|
336
|
+
result.success = false;
|
|
337
|
+
result.errors.push('No skillpkg.json found');
|
|
338
|
+
return result;
|
|
339
|
+
}
|
|
340
|
+
// Get skills to install
|
|
341
|
+
const skills = config.skills || {};
|
|
342
|
+
if (Object.keys(skills).length === 0) {
|
|
343
|
+
// No skills to install
|
|
344
|
+
return result;
|
|
345
|
+
}
|
|
346
|
+
// Install each skill
|
|
347
|
+
for (const [, source] of Object.entries(skills)) {
|
|
348
|
+
const installResult = await this.install(projectPath, source, options);
|
|
349
|
+
// Merge results
|
|
350
|
+
result.skills.push(...installResult.skills);
|
|
351
|
+
result.mcpRequired.push(...installResult.mcpRequired.filter((m) => !result.mcpRequired.includes(m)));
|
|
352
|
+
result.errors.push(...installResult.errors);
|
|
353
|
+
if (!installResult.success) {
|
|
354
|
+
result.success = false;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
result.success = false;
|
|
360
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
361
|
+
}
|
|
362
|
+
return result;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Create an Installer instance
|
|
367
|
+
*/
|
|
368
|
+
export function createInstaller(stateManager, configManager, storeManager, fetcher) {
|
|
369
|
+
return new Installer(stateManager, configManager, storeManager, fetcher);
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/installer/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installer types - Dependency-aware skill installation
|
|
3
|
+
*/
|
|
4
|
+
import type { Skill } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Installation source types
|
|
7
|
+
*/
|
|
8
|
+
export type InstallSource = {
|
|
9
|
+
type: 'github';
|
|
10
|
+
repo: string;
|
|
11
|
+
ref?: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'url';
|
|
14
|
+
url: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'local';
|
|
17
|
+
path: string;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'registry';
|
|
20
|
+
name: string;
|
|
21
|
+
version?: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Install options
|
|
25
|
+
*/
|
|
26
|
+
export interface InstallOptions {
|
|
27
|
+
/** Force reinstall even if already installed */
|
|
28
|
+
force?: boolean;
|
|
29
|
+
/** Skip dependency resolution */
|
|
30
|
+
skipDependencies?: boolean;
|
|
31
|
+
/** Dry run mode */
|
|
32
|
+
dryRun?: boolean;
|
|
33
|
+
/** Verbose output */
|
|
34
|
+
verbose?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Single skill install result
|
|
38
|
+
*/
|
|
39
|
+
export interface SkillInstallResult {
|
|
40
|
+
/** Skill name */
|
|
41
|
+
name: string;
|
|
42
|
+
/** Skill version */
|
|
43
|
+
version: string;
|
|
44
|
+
/** Whether installation succeeded */
|
|
45
|
+
success: boolean;
|
|
46
|
+
/** Action taken */
|
|
47
|
+
action: 'installed' | 'updated' | 'skipped' | 'failed';
|
|
48
|
+
/** Error message if failed */
|
|
49
|
+
error?: string;
|
|
50
|
+
/** Whether this was a transitive dependency */
|
|
51
|
+
transitive: boolean;
|
|
52
|
+
/** Skill that required this dependency */
|
|
53
|
+
requiredBy?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Overall install result
|
|
57
|
+
*/
|
|
58
|
+
export interface InstallResult {
|
|
59
|
+
/** Whether overall installation succeeded */
|
|
60
|
+
success: boolean;
|
|
61
|
+
/** Individual skill results */
|
|
62
|
+
skills: SkillInstallResult[];
|
|
63
|
+
/** MCP servers that need manual installation */
|
|
64
|
+
mcpRequired: string[];
|
|
65
|
+
/** Errors during installation */
|
|
66
|
+
errors: string[];
|
|
67
|
+
/** Summary stats */
|
|
68
|
+
stats: {
|
|
69
|
+
installed: number;
|
|
70
|
+
updated: number;
|
|
71
|
+
skipped: number;
|
|
72
|
+
failed: number;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Uninstall options
|
|
77
|
+
*/
|
|
78
|
+
export interface UninstallOptions {
|
|
79
|
+
/** Force uninstall even if other skills depend on it */
|
|
80
|
+
force?: boolean;
|
|
81
|
+
/** Remove orphan dependencies too */
|
|
82
|
+
removeOrphans?: boolean;
|
|
83
|
+
/** Dry run mode */
|
|
84
|
+
dryRun?: boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Installer uninstall check result
|
|
88
|
+
* Note: Named differently from state.UninstallCheck to avoid conflicts
|
|
89
|
+
*/
|
|
90
|
+
export interface InstallerUninstallCheck {
|
|
91
|
+
/** Whether can safely uninstall */
|
|
92
|
+
canUninstall: boolean;
|
|
93
|
+
/** Skills that depend on this skill */
|
|
94
|
+
dependents: string[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Uninstall result
|
|
98
|
+
*/
|
|
99
|
+
export interface UninstallResult {
|
|
100
|
+
/** Whether uninstall succeeded */
|
|
101
|
+
success: boolean;
|
|
102
|
+
/** Skills that were removed */
|
|
103
|
+
removed: string[];
|
|
104
|
+
/** Orphan dependencies that were cleaned */
|
|
105
|
+
orphansRemoved: string[];
|
|
106
|
+
/** Errors during uninstall */
|
|
107
|
+
errors: string[];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Skill fetcher interface for dependency resolution
|
|
111
|
+
*/
|
|
112
|
+
export interface SkillFetcherAdapter {
|
|
113
|
+
/** Fetch skill metadata from source */
|
|
114
|
+
fetchMetadata(source: string): Promise<{
|
|
115
|
+
name: string;
|
|
116
|
+
version: string;
|
|
117
|
+
dependencies?: {
|
|
118
|
+
skills?: string[];
|
|
119
|
+
mcp?: string[];
|
|
120
|
+
};
|
|
121
|
+
} | null>;
|
|
122
|
+
/** Fetch full skill from source */
|
|
123
|
+
fetchSkill(source: string): Promise<Skill | null>;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Install from config result
|
|
127
|
+
*/
|
|
128
|
+
export interface InstallFromConfigResult {
|
|
129
|
+
/** Overall success */
|
|
130
|
+
success: boolean;
|
|
131
|
+
/** Skills that were processed */
|
|
132
|
+
skills: SkillInstallResult[];
|
|
133
|
+
/** MCP servers that need attention */
|
|
134
|
+
mcpRequired: string[];
|
|
135
|
+
/** Errors */
|
|
136
|
+
errors: string[];
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":"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"}
|