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.
Files changed (78) hide show
  1. package/dist/config/config-manager.d.ts +83 -0
  2. package/dist/config/config-manager.d.ts.map +1 -0
  3. package/dist/config/config-manager.js +220 -0
  4. package/dist/config/config-manager.js.map +1 -0
  5. package/dist/config/index.d.ts +23 -0
  6. package/dist/config/index.d.ts.map +1 -0
  7. package/dist/config/index.js +23 -0
  8. package/dist/config/index.js.map +1 -0
  9. package/dist/config/schemas/skillpkg.schema.json +103 -0
  10. package/dist/config/types.d.ts +69 -0
  11. package/dist/config/types.d.ts.map +1 -0
  12. package/dist/config/types.js +29 -0
  13. package/dist/config/types.js.map +1 -0
  14. package/dist/index.d.ts +6 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +11 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/installer/index.d.ts +33 -0
  19. package/dist/installer/index.d.ts.map +1 -0
  20. package/dist/installer/index.js +33 -0
  21. package/dist/installer/index.js.map +1 -0
  22. package/dist/installer/installer.d.ts +54 -0
  23. package/dist/installer/installer.d.ts.map +1 -0
  24. package/dist/installer/installer.js +371 -0
  25. package/dist/installer/installer.js.map +1 -0
  26. package/dist/installer/types.d.ts +138 -0
  27. package/dist/installer/types.d.ts.map +1 -0
  28. package/dist/installer/types.js +2 -0
  29. package/dist/installer/types.js.map +1 -0
  30. package/dist/parser/schema.d.ts +26 -5
  31. package/dist/parser/schema.d.ts.map +1 -1
  32. package/dist/parser/schema.js +25 -3
  33. package/dist/parser/schema.js.map +1 -1
  34. package/dist/resolver/dependency-resolver.d.ts +59 -0
  35. package/dist/resolver/dependency-resolver.d.ts.map +1 -0
  36. package/dist/resolver/dependency-resolver.js +217 -0
  37. package/dist/resolver/dependency-resolver.js.map +1 -0
  38. package/dist/resolver/index.d.ts +35 -0
  39. package/dist/resolver/index.d.ts.map +1 -0
  40. package/dist/resolver/index.js +34 -0
  41. package/dist/resolver/index.js.map +1 -0
  42. package/dist/resolver/install-plan.d.ts +107 -0
  43. package/dist/resolver/install-plan.d.ts.map +1 -0
  44. package/dist/resolver/install-plan.js +137 -0
  45. package/dist/resolver/install-plan.js.map +1 -0
  46. package/dist/resolver/types.d.ts +76 -0
  47. package/dist/resolver/types.d.ts.map +1 -0
  48. package/dist/resolver/types.js +5 -0
  49. package/dist/resolver/types.js.map +1 -0
  50. package/dist/state/index.d.ts +30 -0
  51. package/dist/state/index.d.ts.map +1 -0
  52. package/dist/state/index.js +30 -0
  53. package/dist/state/index.js.map +1 -0
  54. package/dist/state/state-manager.d.ts +105 -0
  55. package/dist/state/state-manager.d.ts.map +1 -0
  56. package/dist/state/state-manager.js +242 -0
  57. package/dist/state/state-manager.js.map +1 -0
  58. package/dist/state/types.d.ts +86 -0
  59. package/dist/state/types.d.ts.map +1 -0
  60. package/dist/state/types.js +21 -0
  61. package/dist/state/types.js.map +1 -0
  62. package/dist/syncer/index.d.ts +28 -0
  63. package/dist/syncer/index.d.ts.map +1 -0
  64. package/dist/syncer/index.js +28 -0
  65. package/dist/syncer/index.js.map +1 -0
  66. package/dist/syncer/syncer.d.ts +74 -0
  67. package/dist/syncer/syncer.d.ts.map +1 -0
  68. package/dist/syncer/syncer.js +405 -0
  69. package/dist/syncer/syncer.js.map +1 -0
  70. package/dist/syncer/types.d.ts +143 -0
  71. package/dist/syncer/types.d.ts.map +1 -0
  72. package/dist/syncer/types.js +84 -0
  73. package/dist/syncer/types.js.map +1 -0
  74. package/dist/types.d.ts +27 -2
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/types.js +25 -0
  77. package/dist/types.js.map +1 -1
  78. 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":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvD,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,gDAAgD;IAChD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,oBAAoB;IACpB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qCAAqC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,mCAAmC;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,uCAAuC;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE;YACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;SAChB,CAAC;KACH,GAAG,IAAI,CAAC,CAAC;IAEV,mCAAmC;IACnC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,sCAAsC;IACtC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map