/* 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");