From 2a6f7a7d04bc612cce0934be9aabc3e1dde6bf9a Mon Sep 17 00:00:00 2001 From: Rudy Celekli Date: Sat, 10 Oct 2026 16:22:56 -0400 Subject: [PATCH] fix(evals): decode quoted skill identities consistently Signed-off-by: Rudy Celekli --- scripts/run-evals-test.js | 17 +++++++++++++++++ scripts/run-evals.js | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/scripts/run-evals-test.js b/scripts/run-evals-test.js index bc970c15..94c4eb1a 100644 --- a/scripts/run-evals-test.js +++ b/scripts/run-evals-test.js @@ -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; } @@ -688,3 +690,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 }); } +}); diff --git a/scripts/run-evals.js b/scripts/run-evals.js index 78f061c5..9b10bfc9 100644 --- a/scripts/run-evals.js +++ b/scripts/run-evals.js @@ -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;