skill-forge / test_skillforge.mjs
WhySoCodius's picture
Skill Forge: static browser app + Python/MCP port for Agent Skills
4fa5831 verified
Raw
History Blame Contribute Delete
2.38 kB
/* Node smoke test for skillforge.js parity. Run: node test_skillforge.mjs
* Uses a minimal yaml shim covering only the shapes the tests exercise. */
import { readFileSync } from "node:fs";
import assert from "node:assert";
import vm from "node:vm";
const shim = {
load(src) {
const o = {};
for (const raw of src.split("\n")) {
const line = raw.replace(/\r$/, "");
if (!line.trim() || line.trim().startsWith("#")) continue;
const m = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
if (!m) { const e = new Error("bad yaml line: " + line); throw e; }
let v = m[2].trim();
if (v.startsWith("[") && !v.endsWith("]")) throw new Error("unterminated flow seq");
o[m[1]] = v.replace(/^["']|["']$/g, "");
}
return o;
},
};
const ctx = { window: { jsyaml: shim }, globalThis: {} };
vm.createContext(ctx);
vm.runInContext(readFileSync(new URL("./skillforge.js", import.meta.url), "utf8"), ctx);
const SF = ctx.window.SkillForge;
const GOOD = `---
name: pdf-form-filler
description: Fills interactive PDF forms from a data mapping. Use when the user asks to complete or auto-fill a PDF form, e.g. "fill out this application PDF".
---
# PDF Form Filler
## When to use
- Fillable PDF + field values.
## Instructions
1. Inspect fields.
2. Map and flatten.
`;
assert.ok(SF.validateSkill(GOOD).ok, "good skill should pass");
assert.ok(!SF.validateSkill("# no frontmatter").ok, "missing frontmatter fails");
const bad = SF.validateSkill('---\nname: Not_Kebab!!\ndescription: short\n---\n\nbody\n');
assert.ok(!bad.ok && bad.errors.some(e => e.includes("kebab-case")), "kebab error");
assert.ok(!SF.validateSkill('---\nname: [unclosed\n---\nbody\n').ok, "invalid yaml fails");
const weak = SF.lintDescription("Does stuff.");
const strong = SF.lintDescription(
'Converts Markdown notes into a styled slide deck. Use when the user asks to ' +
'"turn this into slides" or "make a deck", e.g. a report rendered as shareable slides.');
assert.ok(weak.score < 55 && strong.score >= 55, `scores ${weak.score}/${strong.score}`);
const md = SF.scaffoldSkill("My Cool Skill", "Reviews Terraform plans for drift.",
"the user runs terraform plan and wants a risk summary");
assert.ok(md.includes("name: my-cool-skill"), "scaffold name");
assert.ok(SF.validateSkill(md).ok, "scaffold output validates");
console.log("all checks passed");