1351
1352
for (const skill of allSkills) {
1354
>
const promptPath = skill;
1355
>
1356
>
try {
1357
>
const parsedFile = await this.parseNew(uri, token);
1358
>
const folderName = getSkillFolderName(uri);
1359
>
1360
>
let name = parsedFile.header?.name;
1361
>
const description = parsedFile.header?.description;
1362
>
1363
>
if (!name) {
1364
this.logger.debug(`[computeSkillDiscoveryInfo] Agent skill file missing name attribute, using folder name "${folderName}": ${uri}`);
1365
name = folderName;
1366
}
1368
>
if (sanitizedName !== folderName) {
1369
this.logger.debug(`[computeSkillDiscoveryInfo] Agent skill name "${sanitizedName}" does not match folder name "${folderName}", using folder name: ${uri}`);
1370
sanitizedName = folderName;
1371
}
1373
>
if (seenNames.has(sanitizedName)) {
1374
this.logger.debug(`[computeSkillDiscoveryInfo] Skipping duplicate agent skill name: ${sanitizedName} at ${uri}`);
1375
files.push({ status: 'skipped', skipReason: 'duplicate-name', duplicateOf: nameToUri.get(sanitizedName), promptPath: this.withPromptPathMetadata(promptPath, sanitizedName, description) });
1376
continue;
1377
}
1379
>
seenNames.add(sanitizedName);
1380
>
nameToUri.set(sanitizedName, uri);
1381
>
const disableModelInvocation = parsedFile.header?.disableModelInvocation === true;
1382
>
const userInvocable = parsedFile.header?.userInvocable !== false;
1383
>
1384
>
files.push({ status: 'loaded', promptPath: this.withPromptPathMetadata(promptPath, sanitizedName, description), disableModelInvocation, userInvocable });
1385
>
} catch (e) {
1386
const msg = e instanceof Error ? e.message : String(e);
1387
this.logger.error(`[computeSkillDiscoveryInfo] Failed to validate Agent skill file: ${uri}`, msg);