| 328 | } |
| 329 | |
| 330 | function getExpectedSkillNames(): Set<string> { |
| 331 | const expected = new Set<string>() |
| 332 | |
| 333 | // Skills from submodules (generated skills use same name as submodule key) |
| 334 | for (const name of Object.keys(submodules)) { |
| 335 | expected.add(name) |
| 336 | } |
| 337 | |
| 338 | // Skills from vendors (use the output skill name) |
| 339 | for (const config of Object.values(vendors)) { |
| 340 | const vendorConfig = config as VendorConfig |
| 341 | for (const outputName of Object.values(vendorConfig.skills)) { |
| 342 | expected.add(outputName) |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | // Manual skills |
| 347 | for (const name of manual) { |
| 348 | expected.add(name) |
| 349 | } |
| 350 | |
| 351 | return expected |
| 352 | } |
| 353 | |
| 354 | function getExistingSkillNames(): string[] { |
| 355 | const skillsDir = join(root, 'skills') |