Merge #675: decode quoted skill identities consistently in run-evals

This commit is contained in:
Addy Osmani authored and GitHub committed 2026-10-13 13:12:28 -07:00
commit e6e5213971
2 files changed
+21 -4

No files matched your search

+17
View File
@@ -56,6 +56,8 @@ function makeSandbox() {
fs.mkdirSync(path.join(root, 'evals', 'cases'), { recursive: true });
fs.mkdirSync(path.join(root, 'evals', 'fixtures', 'project'), { recursive: true });
fs.copyFileSync(RUNNER, path.join(root, 'scripts', 'run-evals.js'));
fs.mkdirSync(path.join(root, 'scripts', 'lib'), { recursive: true });
fs.copyFileSync(path.join(__dirname, 'lib', 'skill-lint.js'), path.join(root, 'scripts', 'lib', 'skill-lint.js'));
fs.writeFileSync(path.join(root, 'evals', 'fixtures', 'project', 'context.txt'), 'fixture\n');
return root;
}
@@ -811,3 +813,18 @@ test('removes the throwaway workspace when fixture setup fails', () => {
fs.rmSync(temp, { recursive: true, force: true });
}
});
test('loads quoted YAML skill identities using their decoded values', () => {
const root = makeSandbox();
try {
writeSkill(root, 'alpha', 'code unit tests');
const skill = path.join(root, 'skills', 'alpha', 'SKILL.md');
fs.writeFileSync(skill, fs.readFileSync(skill, 'utf8').replace('name: alpha', "name: 'alpha'")
.replace('description: code unit tests', 'description: "code unit tests"'));
writeJson(path.join(root, 'evals', 'cases', 'alpha.json'), completeCase('alpha', 'code unit tests'));
const result = run(root);
assert.equal(result.status, 0, result.stdout + result.stderr);
assert.match(result.stdout, /PASSED/);
} finally { fs.rmSync(root, { recursive: true, force: true }); }
});
+4 -4
View File
@@ -31,6 +31,7 @@
const fs = require('fs');
const os = require('os');
const path = require('path');
const { parseFrontmatter } = require('./lib/skill-lint');
const { execFileSync } = require('child_process');
const ROOT = path.join(__dirname, '..');
@@ -156,10 +157,9 @@ function loadSkills() {
const file = path.join(SKILLS_DIR, dir, 'SKILL.md');
if (!fs.existsSync(file)) continue;
const src = fs.readFileSync(file, 'utf8');
const m = src.match(/^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/);
if (!m) continue;
const name = (m[1].match(/^name:\s*(.+)$/m) || [])[1];
const description = (m[1].match(/^description:\s*(.+)$/m) || [])[1];
const frontmatter = parseFrontmatter(src);
if (!frontmatter) continue;
const { name, description } = frontmatter;
if (name && description) skills.push({ name: name.trim(), description: description.trim(), dir });
}
return skills;