skillpkg-core 0.5.4 → 0.5.7
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/adapters/adapter-manager.d.ts +51 -0
- package/dist/adapters/adapter-manager.d.ts.map +1 -0
- package/dist/adapters/adapter-manager.js +147 -0
- package/dist/adapters/adapter-manager.js.map +1 -0
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +14 -3
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/config/types.d.ts +3 -3
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -1
- package/dist/config/types.js.map +1 -1
- package/dist/discovery/discovery-manager.d.ts +55 -0
- package/dist/discovery/discovery-manager.d.ts.map +1 -0
- package/dist/discovery/discovery-manager.js +217 -0
- package/dist/discovery/discovery-manager.js.map +1 -0
- package/dist/discovery/index.d.ts +20 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +21 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/manager.d.ts +53 -0
- package/dist/discovery/manager.d.ts.map +1 -0
- package/dist/discovery/manager.js +203 -0
- package/dist/discovery/manager.js.map +1 -0
- package/dist/discovery/providers/awesome.d.ts +72 -0
- package/dist/discovery/providers/awesome.d.ts.map +1 -0
- package/dist/discovery/providers/awesome.js +214 -0
- package/dist/discovery/providers/awesome.js.map +1 -0
- package/dist/discovery/providers/github.d.ts +44 -0
- package/dist/discovery/providers/github.d.ts.map +1 -0
- package/dist/discovery/providers/github.js +82 -0
- package/dist/discovery/providers/github.js.map +1 -0
- package/dist/discovery/providers/index.d.ts +9 -0
- package/dist/discovery/providers/index.d.ts.map +1 -0
- package/dist/discovery/providers/index.js +9 -0
- package/dist/discovery/providers/index.js.map +1 -0
- package/dist/discovery/providers/local.d.ts +38 -0
- package/dist/discovery/providers/local.d.ts.map +1 -0
- package/dist/discovery/providers/local.js +75 -0
- package/dist/discovery/providers/local.js.map +1 -0
- package/dist/discovery/providers/priority.d.ts +89 -0
- package/dist/discovery/providers/priority.d.ts.map +1 -0
- package/dist/discovery/providers/priority.js +258 -0
- package/dist/discovery/providers/priority.js.map +1 -0
- package/dist/discovery/providers/skillsmp.d.ts +66 -0
- package/dist/discovery/providers/skillsmp.d.ts.map +1 -0
- package/dist/discovery/providers/skillsmp.js +134 -0
- package/dist/discovery/providers/skillsmp.js.map +1 -0
- package/dist/discovery/types.d.ts +108 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +5 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/doctor/doctor.d.ts +62 -0
- package/dist/doctor/doctor.d.ts.map +1 -0
- package/dist/doctor/doctor.js +399 -0
- package/dist/doctor/doctor.js.map +1 -0
- package/dist/doctor/index.d.ts +6 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +6 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/types.d.ts +68 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/fetcher/fetcher.d.ts.map +1 -1
- package/dist/fetcher/fetcher.js +265 -25
- package/dist/fetcher/fetcher.js.map +1 -1
- package/dist/fetcher/source-parser.d.ts +8 -6
- package/dist/fetcher/source-parser.d.ts.map +1 -1
- package/dist/fetcher/source-parser.js +37 -16
- package/dist/fetcher/source-parser.js.map +1 -1
- package/dist/fetcher/types.d.ts +17 -4
- package/dist/fetcher/types.d.ts.map +1 -1
- package/dist/fetcher/types.js.map +1 -1
- package/dist/importer/importer.js +1 -1
- package/dist/importer/importer.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/installer.d.ts +1 -1
- package/dist/installer/installer.d.ts.map +1 -1
- package/dist/installer/installer.js +21 -13
- package/dist/installer/installer.js.map +1 -1
- package/dist/installer/types.d.ts +15 -13
- package/dist/installer/types.d.ts.map +1 -1
- package/dist/matching/engine.d.ts +57 -0
- package/dist/matching/engine.d.ts.map +1 -0
- package/dist/matching/engine.js +419 -0
- package/dist/matching/engine.js.map +1 -0
- package/dist/matching/index.d.ts +9 -0
- package/dist/matching/index.d.ts.map +1 -0
- package/dist/matching/index.js +8 -0
- package/dist/matching/index.js.map +1 -0
- package/dist/matching/types.d.ts +91 -0
- package/dist/matching/types.d.ts.map +1 -0
- package/dist/matching/types.js +13 -0
- package/dist/matching/types.js.map +1 -0
- package/dist/parser/schema.d.ts +61 -8
- package/dist/parser/schema.d.ts.map +1 -1
- package/dist/parser/schema.js +59 -9
- package/dist/parser/schema.js.map +1 -1
- package/dist/resolver/dependency-resolver.d.ts.map +1 -1
- package/dist/resolver/dependency-resolver.js +15 -3
- package/dist/resolver/dependency-resolver.js.map +1 -1
- package/dist/resolver/index.d.ts +1 -1
- package/dist/resolver/index.d.ts.map +1 -1
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/types.d.ts +13 -0
- package/dist/resolver/types.d.ts.map +1 -1
- package/dist/skill/reader.d.ts.map +1 -1
- package/dist/skill/reader.js +12 -11
- package/dist/skill/reader.js.map +1 -1
- package/dist/skill/types.d.ts +28 -2
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/state/state-manager.d.ts +19 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +50 -0
- package/dist/state/state-manager.js.map +1 -1
- package/dist/store/config.d.ts.map +1 -1
- package/dist/store/config.js +7 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/manager.d.ts +2 -0
- package/dist/store/manager.d.ts.map +1 -1
- package/dist/store/manager.js +19 -1
- package/dist/store/manager.js.map +1 -1
- package/dist/store/store-manager.d.ts +123 -0
- package/dist/store/store-manager.d.ts.map +1 -0
- package/dist/store/store-manager.js +312 -0
- package/dist/store/store-manager.js.map +1 -0
- package/dist/syncer/syncer.d.ts +4 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +91 -27
- package/dist/syncer/syncer.js.map +1 -1
- package/dist/syncer/types.d.ts +16 -8
- package/dist/syncer/types.d.ts.map +1 -1
- package/dist/syncer/types.js +29 -32
- package/dist/syncer/types.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -2
- package/dist/types.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor class - diagnoses and repairs skillpkg state
|
|
3
|
+
*
|
|
4
|
+
* Leverages existing methods:
|
|
5
|
+
* - StateManager.getOrphanStates() - detect orphan state entries
|
|
6
|
+
* - StateManager.cleanOrphanStates() - remove orphan state entries
|
|
7
|
+
* - StateManager.cleanDanglingReferences() - clean dangling deps
|
|
8
|
+
* - StoreManager.cleanOrphans() - remove orphan registry entries
|
|
9
|
+
*/
|
|
10
|
+
export class Doctor {
|
|
11
|
+
stateManager;
|
|
12
|
+
configManager;
|
|
13
|
+
storeManager;
|
|
14
|
+
constructor(stateManager, configManager, storeManager) {
|
|
15
|
+
this.stateManager = stateManager;
|
|
16
|
+
this.configManager = configManager;
|
|
17
|
+
this.storeManager = storeManager;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Diagnose the current state
|
|
21
|
+
* Uses StateManager.getOrphanStates() for consistency with existing API
|
|
22
|
+
*/
|
|
23
|
+
async diagnose(projectPath) {
|
|
24
|
+
const issues = [];
|
|
25
|
+
// Load all data sources
|
|
26
|
+
const state = await this.stateManager.loadState(projectPath);
|
|
27
|
+
const registry = await this.storeManager.getRegistry();
|
|
28
|
+
const config = await this.configManager.loadProjectConfig(projectPath);
|
|
29
|
+
const diskSkills = await this.storeManager.getSkillNames();
|
|
30
|
+
// Get skill sets
|
|
31
|
+
const stateSkills = new Set(Object.keys(state.skills));
|
|
32
|
+
const registrySkills = new Set(Object.keys(registry.skills));
|
|
33
|
+
const diskSkillSet = new Set(diskSkills);
|
|
34
|
+
const configSkills = new Set(config?.skills ? Object.keys(config.skills) : []);
|
|
35
|
+
// Check 1: Skills in state but not on disk (orphan_state)
|
|
36
|
+
// Uses StateManager.getOrphanStates() for consistency
|
|
37
|
+
const orphanStates = this.stateManager.getOrphanStates(state, diskSkills);
|
|
38
|
+
for (const skillName of orphanStates) {
|
|
39
|
+
issues.push(this.createIssue('orphan_state', 'error', skillName, `Skill "${skillName}" is in state.json but has no files on disk`, 'Remove from state.json', true));
|
|
40
|
+
}
|
|
41
|
+
// Check 2: Skills in registry but not on disk (orphan_registry)
|
|
42
|
+
// These will be cleaned by StoreManager.cleanOrphans()
|
|
43
|
+
for (const skillName of registrySkills) {
|
|
44
|
+
if (!diskSkillSet.has(skillName)) {
|
|
45
|
+
issues.push(this.createIssue('orphan_registry', 'error', skillName, `Skill "${skillName}" is in registry.json but has no files on disk`, 'Remove from registry.json', true));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Check 3: Skills on disk but not in registry (orphan_disk)
|
|
49
|
+
for (const skillName of diskSkillSet) {
|
|
50
|
+
if (!registrySkills.has(skillName)) {
|
|
51
|
+
issues.push(this.createIssue('orphan_disk', 'warning', skillName, `Skill "${skillName}" exists on disk but not in registry.json`, 'Add to registry.json or remove from disk', true));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Check 4: Invalid skill names (contains path separators)
|
|
55
|
+
for (const skillName of [...stateSkills, ...registrySkills]) {
|
|
56
|
+
if (skillName.includes('/') || skillName.includes('\\')) {
|
|
57
|
+
issues.push(this.createIssue('invalid_skill_name', 'error', skillName, `Skill name "${skillName}" contains path separators`, 'Reinstall with correct name from SKILL.md frontmatter', true));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Check 5: State-Registry version mismatch
|
|
61
|
+
for (const skillName of stateSkills) {
|
|
62
|
+
if (registrySkills.has(skillName)) {
|
|
63
|
+
const stateVersion = state.skills[skillName].version;
|
|
64
|
+
const registryVersion = registry.skills[skillName].version;
|
|
65
|
+
if (stateVersion !== registryVersion) {
|
|
66
|
+
issues.push(this.createIssue('state_registry_mismatch', 'warning', skillName, `Version mismatch: state=${stateVersion}, registry=${registryVersion}`, 'Update to latest version', true));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Check 6: User-installed skills not in skillpkg.json
|
|
71
|
+
if (config) {
|
|
72
|
+
for (const [skillName, skillState] of Object.entries(state.skills)) {
|
|
73
|
+
if (skillState.installed_by === 'user' && !configSkills.has(skillName)) {
|
|
74
|
+
issues.push(this.createIssue('missing_skillpkg_entry', 'info', skillName, `User-installed skill "${skillName}" is not in skillpkg.json`, 'Add to skillpkg.json for team sharing', false));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Check 7: Dangling dependency references
|
|
79
|
+
// Check depended_by arrays for references to non-existent skills
|
|
80
|
+
for (const [skillName, skillState] of Object.entries(state.skills)) {
|
|
81
|
+
if (skillState.depended_by) {
|
|
82
|
+
for (const dependent of skillState.depended_by) {
|
|
83
|
+
if (!stateSkills.has(dependent)) {
|
|
84
|
+
issues.push(this.createIssue('dangling_dependency', 'warning', skillName, `Skill "${skillName}" has dangling dependency reference to "${dependent}"`, 'Clean up dependency references', true));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Check 8: Orphan dependencies (using existing StateManager method)
|
|
90
|
+
// Skills installed as dependencies but their installer no longer exists
|
|
91
|
+
const orphanDeps = this.stateManager.getOrphanDependencies(state);
|
|
92
|
+
for (const skillName of orphanDeps) {
|
|
93
|
+
// Only add if not already reported as orphan_state
|
|
94
|
+
if (!orphanStates.includes(skillName)) {
|
|
95
|
+
issues.push(this.createIssue('orphan_dependency', 'warning', skillName, `Skill "${skillName}" was installed as a dependency but is no longer needed`, 'Remove unused dependency', true));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Count synced skills
|
|
99
|
+
let syncedCount = 0;
|
|
100
|
+
for (const skillName of registrySkills) {
|
|
101
|
+
const entry = registry.skills[skillName];
|
|
102
|
+
if (entry.syncedPlatforms && entry.syncedPlatforms.length > 0) {
|
|
103
|
+
syncedCount++;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
healthy: issues.filter(i => i.severity === 'error').length === 0,
|
|
108
|
+
issues,
|
|
109
|
+
stats: {
|
|
110
|
+
stateCount: stateSkills.size,
|
|
111
|
+
registryCount: registrySkills.size,
|
|
112
|
+
diskCount: diskSkillSet.size,
|
|
113
|
+
syncedCount,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Repair detected issues
|
|
119
|
+
*
|
|
120
|
+
* Uses batch operations from existing managers for efficiency:
|
|
121
|
+
* - StateManager.cleanOrphanStates() for orphan_state issues
|
|
122
|
+
* - StoreManager.cleanOrphans() for orphan_registry issues
|
|
123
|
+
* - StateManager.cleanDanglingReferences() for dangling_dependency issues
|
|
124
|
+
*/
|
|
125
|
+
async repair(projectPath, options = {}) {
|
|
126
|
+
const result = {
|
|
127
|
+
success: true,
|
|
128
|
+
actions: [],
|
|
129
|
+
errors: [],
|
|
130
|
+
issuesFixed: 0,
|
|
131
|
+
issuesRemaining: 0,
|
|
132
|
+
};
|
|
133
|
+
// First, diagnose
|
|
134
|
+
const diagnosis = await this.diagnose(projectPath);
|
|
135
|
+
// Filter issues based on options
|
|
136
|
+
const issuesToFix = options.autoOnly
|
|
137
|
+
? diagnosis.issues.filter(i => i.autoFixable)
|
|
138
|
+
: diagnosis.issues;
|
|
139
|
+
if (options.dryRun) {
|
|
140
|
+
// Just report what would be done
|
|
141
|
+
for (const issue of issuesToFix) {
|
|
142
|
+
const action = this.getRepairAction(issue);
|
|
143
|
+
if (action) {
|
|
144
|
+
result.actions.push(action);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
result.issuesRemaining = diagnosis.issues.length;
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
// Use batch operations where possible for efficiency
|
|
151
|
+
if (options.removeOrphans !== false) {
|
|
152
|
+
// Batch clean orphan registry entries using StoreManager.cleanOrphans()
|
|
153
|
+
const orphanRegistryIssues = issuesToFix.filter(i => i.type === 'orphan_registry');
|
|
154
|
+
if (orphanRegistryIssues.length > 0) {
|
|
155
|
+
try {
|
|
156
|
+
const cleaned = await this.storeManager.cleanOrphans();
|
|
157
|
+
for (const name of cleaned) {
|
|
158
|
+
result.issuesFixed++;
|
|
159
|
+
result.actions.push({
|
|
160
|
+
type: 'remove_registry',
|
|
161
|
+
skillName: name,
|
|
162
|
+
description: `Remove "${name}" from registry.json`,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
result.errors.push(`Failed to clean orphan registry entries: ${error instanceof Error ? error.message : String(error)}`);
|
|
168
|
+
result.success = false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Batch clean orphan state entries using StateManager.cleanOrphanStates()
|
|
172
|
+
const orphanStateIssues = issuesToFix.filter(i => i.type === 'orphan_state');
|
|
173
|
+
if (orphanStateIssues.length > 0) {
|
|
174
|
+
try {
|
|
175
|
+
const diskSkills = await this.storeManager.getSkillNames();
|
|
176
|
+
const cleaned = await this.stateManager.cleanOrphanStates(projectPath, diskSkills);
|
|
177
|
+
for (const name of cleaned) {
|
|
178
|
+
result.issuesFixed++;
|
|
179
|
+
result.actions.push({
|
|
180
|
+
type: 'remove_state',
|
|
181
|
+
skillName: name,
|
|
182
|
+
description: `Remove "${name}" from state.json`,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
result.errors.push(`Failed to clean orphan state entries: ${error instanceof Error ? error.message : String(error)}`);
|
|
188
|
+
result.success = false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Batch clean dangling references using StateManager.cleanDanglingReferences()
|
|
192
|
+
const danglingIssues = issuesToFix.filter(i => i.type === 'dangling_dependency');
|
|
193
|
+
if (danglingIssues.length > 0) {
|
|
194
|
+
try {
|
|
195
|
+
const cleanedCount = await this.stateManager.cleanDanglingReferences(projectPath);
|
|
196
|
+
if (cleanedCount > 0) {
|
|
197
|
+
result.issuesFixed += danglingIssues.length;
|
|
198
|
+
for (const issue of danglingIssues) {
|
|
199
|
+
result.actions.push({
|
|
200
|
+
type: 'update_state',
|
|
201
|
+
skillName: issue.skillName,
|
|
202
|
+
description: `Clean dependency references for "${issue.skillName}"`,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
result.errors.push(`Failed to clean dangling references: ${error instanceof Error ? error.message : String(error)}`);
|
|
209
|
+
result.success = false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Handle remaining issues individually
|
|
214
|
+
const handledTypes = new Set(['orphan_registry', 'orphan_state', 'dangling_dependency']);
|
|
215
|
+
const remainingIssues = issuesToFix.filter(i => !handledTypes.has(i.type));
|
|
216
|
+
for (const issue of remainingIssues) {
|
|
217
|
+
if (!issue.autoFixable && options.autoOnly) {
|
|
218
|
+
result.issuesRemaining++;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const fixed = await this.fixIssue(projectPath, issue, options);
|
|
223
|
+
if (fixed) {
|
|
224
|
+
result.issuesFixed++;
|
|
225
|
+
const action = this.getRepairAction(issue);
|
|
226
|
+
if (action) {
|
|
227
|
+
result.actions.push(action);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
result.issuesRemaining++;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
result.errors.push(`Failed to fix ${issue.type} for ${issue.skillName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
236
|
+
result.success = false;
|
|
237
|
+
result.issuesRemaining++;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Fix a single issue
|
|
244
|
+
*/
|
|
245
|
+
async fixIssue(projectPath, issue, options) {
|
|
246
|
+
switch (issue.type) {
|
|
247
|
+
case 'orphan_state':
|
|
248
|
+
if (options.removeOrphans !== false) {
|
|
249
|
+
// Remove from state.json
|
|
250
|
+
await this.stateManager.recordSkillUninstall(projectPath, issue.skillName);
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
return false;
|
|
254
|
+
case 'orphan_registry':
|
|
255
|
+
if (options.removeOrphans !== false) {
|
|
256
|
+
// Remove from registry.json
|
|
257
|
+
const registry = await this.storeManager.getRegistry();
|
|
258
|
+
delete registry.skills[issue.skillName];
|
|
259
|
+
await this.storeManager.saveRegistry(registry);
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
case 'orphan_disk':
|
|
264
|
+
if (options.removeOrphans !== false) {
|
|
265
|
+
// Add to registry from disk (or remove, depending on preference)
|
|
266
|
+
// For now, we'll remove the orphan directory
|
|
267
|
+
await this.storeManager.removeSkill(issue.skillName);
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
return false;
|
|
271
|
+
case 'invalid_skill_name':
|
|
272
|
+
if (options.removeOrphans !== false) {
|
|
273
|
+
// Remove entries with invalid names
|
|
274
|
+
const state = await this.stateManager.loadState(projectPath);
|
|
275
|
+
if (state.skills[issue.skillName]) {
|
|
276
|
+
await this.stateManager.recordSkillUninstall(projectPath, issue.skillName);
|
|
277
|
+
}
|
|
278
|
+
const registry = await this.storeManager.getRegistry();
|
|
279
|
+
if (registry.skills[issue.skillName]) {
|
|
280
|
+
delete registry.skills[issue.skillName];
|
|
281
|
+
await this.storeManager.saveRegistry(registry);
|
|
282
|
+
}
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
return false;
|
|
286
|
+
case 'state_registry_mismatch':
|
|
287
|
+
// Sync state version to registry version
|
|
288
|
+
const registry = await this.storeManager.getRegistry();
|
|
289
|
+
const registryEntry = registry.skills[issue.skillName];
|
|
290
|
+
if (registryEntry) {
|
|
291
|
+
const state = await this.stateManager.loadState(projectPath);
|
|
292
|
+
state.skills[issue.skillName].version = registryEntry.version;
|
|
293
|
+
await this.stateManager.saveState(projectPath, state);
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
return false;
|
|
297
|
+
case 'dangling_dependency':
|
|
298
|
+
// Handled by batch operation (cleanDanglingReferences), but keep as fallback
|
|
299
|
+
const currentState = await this.stateManager.loadState(projectPath);
|
|
300
|
+
const skillState = currentState.skills[issue.skillName];
|
|
301
|
+
if (skillState && skillState.depended_by) {
|
|
302
|
+
skillState.depended_by = skillState.depended_by.filter(dep => currentState.skills[dep] !== undefined);
|
|
303
|
+
await this.stateManager.saveState(projectPath, currentState);
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
return false;
|
|
307
|
+
case 'orphan_dependency':
|
|
308
|
+
// Remove skill that was installed as dependency but is no longer needed
|
|
309
|
+
if (options.removeOrphans !== false) {
|
|
310
|
+
await this.storeManager.removeSkill(issue.skillName);
|
|
311
|
+
await this.stateManager.recordSkillUninstall(projectPath, issue.skillName);
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
return false;
|
|
315
|
+
case 'missing_skillpkg_entry':
|
|
316
|
+
// This is informational, don't auto-fix
|
|
317
|
+
return false;
|
|
318
|
+
case 'sync_outdated':
|
|
319
|
+
if (options.resync) {
|
|
320
|
+
// Would need Syncer to fix this
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
return false;
|
|
324
|
+
default:
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Get repair action for an issue
|
|
330
|
+
*/
|
|
331
|
+
getRepairAction(issue) {
|
|
332
|
+
switch (issue.type) {
|
|
333
|
+
case 'orphan_state':
|
|
334
|
+
return {
|
|
335
|
+
type: 'remove_state',
|
|
336
|
+
skillName: issue.skillName,
|
|
337
|
+
description: `Remove "${issue.skillName}" from state.json`,
|
|
338
|
+
};
|
|
339
|
+
case 'orphan_registry':
|
|
340
|
+
return {
|
|
341
|
+
type: 'remove_registry',
|
|
342
|
+
skillName: issue.skillName,
|
|
343
|
+
description: `Remove "${issue.skillName}" from registry.json`,
|
|
344
|
+
};
|
|
345
|
+
case 'orphan_disk':
|
|
346
|
+
return {
|
|
347
|
+
type: 'remove_registry',
|
|
348
|
+
skillName: issue.skillName,
|
|
349
|
+
description: `Remove orphan skill directory "${issue.skillName}"`,
|
|
350
|
+
};
|
|
351
|
+
case 'invalid_skill_name':
|
|
352
|
+
return {
|
|
353
|
+
type: 'remove_state',
|
|
354
|
+
skillName: issue.skillName,
|
|
355
|
+
description: `Remove invalid skill name "${issue.skillName}"`,
|
|
356
|
+
};
|
|
357
|
+
case 'state_registry_mismatch':
|
|
358
|
+
return {
|
|
359
|
+
type: 'update_state',
|
|
360
|
+
skillName: issue.skillName,
|
|
361
|
+
description: `Sync version for "${issue.skillName}"`,
|
|
362
|
+
};
|
|
363
|
+
case 'dangling_dependency':
|
|
364
|
+
return {
|
|
365
|
+
type: 'update_state',
|
|
366
|
+
skillName: issue.skillName,
|
|
367
|
+
description: `Clean dependency references for "${issue.skillName}"`,
|
|
368
|
+
};
|
|
369
|
+
case 'orphan_dependency':
|
|
370
|
+
return {
|
|
371
|
+
type: 'remove_state',
|
|
372
|
+
skillName: issue.skillName,
|
|
373
|
+
description: `Remove unused dependency "${issue.skillName}"`,
|
|
374
|
+
};
|
|
375
|
+
default:
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Create an issue object
|
|
381
|
+
*/
|
|
382
|
+
createIssue(type, severity, skillName, message, suggestion, autoFixable) {
|
|
383
|
+
return {
|
|
384
|
+
type,
|
|
385
|
+
severity,
|
|
386
|
+
skillName,
|
|
387
|
+
message,
|
|
388
|
+
suggestion,
|
|
389
|
+
autoFixable,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Create a Doctor instance
|
|
395
|
+
*/
|
|
396
|
+
export function createDoctor(stateManager, configManager, storeManager) {
|
|
397
|
+
return new Doctor(stateManager, configManager, storeManager);
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/doctor/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor module types
|
|
3
|
+
*
|
|
4
|
+
* Types for diagnosing and repairing skillpkg state
|
|
5
|
+
*/
|
|
6
|
+
import type { BaseResult } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Issue severity levels
|
|
9
|
+
*/
|
|
10
|
+
export type IssueSeverity = 'error' | 'warning' | 'info';
|
|
11
|
+
/**
|
|
12
|
+
* Issue types that can be detected
|
|
13
|
+
*/
|
|
14
|
+
export type IssueType = 'orphan_state' | 'orphan_registry' | 'orphan_disk' | 'orphan_dependency' | 'state_registry_mismatch' | 'invalid_skill_name' | 'missing_skillpkg_entry' | 'dangling_dependency' | 'sync_outdated';
|
|
15
|
+
/**
|
|
16
|
+
* Detected issue
|
|
17
|
+
*/
|
|
18
|
+
export interface Issue {
|
|
19
|
+
type: IssueType;
|
|
20
|
+
severity: IssueSeverity;
|
|
21
|
+
skillName: string;
|
|
22
|
+
message: string;
|
|
23
|
+
suggestion: string;
|
|
24
|
+
autoFixable: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Diagnosis result
|
|
28
|
+
*/
|
|
29
|
+
export interface DiagnosisResult {
|
|
30
|
+
healthy: boolean;
|
|
31
|
+
issues: Issue[];
|
|
32
|
+
stats: {
|
|
33
|
+
stateCount: number;
|
|
34
|
+
registryCount: number;
|
|
35
|
+
diskCount: number;
|
|
36
|
+
syncedCount: number;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Repair options
|
|
41
|
+
*/
|
|
42
|
+
export interface RepairOptions {
|
|
43
|
+
/** Only fix auto-fixable issues */
|
|
44
|
+
autoOnly?: boolean;
|
|
45
|
+
/** Dry run - don't actually make changes */
|
|
46
|
+
dryRun?: boolean;
|
|
47
|
+
/** Remove orphaned entries from state/registry */
|
|
48
|
+
removeOrphans?: boolean;
|
|
49
|
+
/** Re-sync skills to platforms */
|
|
50
|
+
resync?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Repair action
|
|
54
|
+
*/
|
|
55
|
+
export interface RepairAction {
|
|
56
|
+
type: 'remove_state' | 'remove_registry' | 'add_registry' | 'update_state' | 'resync';
|
|
57
|
+
skillName: string;
|
|
58
|
+
description: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Repair result
|
|
62
|
+
*/
|
|
63
|
+
export interface RepairResult extends BaseResult {
|
|
64
|
+
actions: RepairAction[];
|
|
65
|
+
issuesFixed: number;
|
|
66
|
+
issuesRemaining: number;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,iBAAiB,GACjB,aAAa,GACb,mBAAmB,GACnB,yBAAyB,GACzB,oBAAoB,GACpB,wBAAwB,GACxB,qBAAqB,GACrB,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kCAAkC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,GAAG,iBAAiB,GAAG,cAAc,GAAG,cAAc,GAAG,QAAQ,CAAC;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/fetcher/fetcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/fetcher/fetcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAA2B,MAAM,YAAY,CAAC;AAGvF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,uBAAuB,CAAC;AAEnF;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAyBtB;AAkdD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAuB1D;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAW/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,cAAmB,GAAG,YAAY,CAU7E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,cAAmB,GAAG,mBAAmB,CAqB3F"}
|