var test = require("node:test"); var assert = require("node:assert/strict"); var fs = require("fs"); var os = require("os"); var path = require("path"); var skills = require("../lib/yoke/skill-discovery"); var renderer = require("../lib/plantuml-renderer"); test("clay-sketch is available without user installation and can be explicitly loaded", function () { var root = fs.mkdtempSync(path.join(os.tmpdir(), "clay-sketch-skill-")); try { var discovered = skills.discoverSkills(root, { homeDir: root }); var sketch = skills.indexSkills(discovered)["clay-sketch"]; assert.equal(sketch.source, "clay-builtin"); assert.equal(sketch.path, fs.realpathSync(path.join(__dirname, "../lib/bundled-skills/clay-sketch/SKILL.md"))); var content = skills.readReferencedSkills("Use $clay-sketch for this page", discovered); assert.match(content, //); assert.match(content, /present_wireframe/); assert.match(content, /```clay-sketch/); assert.deepEqual(fs.readdirSync(root), [], "discovery must not install anything in the user's home"); var override = path.join(root, ".agents", "skills", "clay-sketch"); fs.mkdirSync(override, { recursive: true }); fs.writeFileSync(path.join(override, "SKILL.md"), "---\nname: clay-sketch\ndescription: Project-specific sketch guidance\n---\nProject layout rules\n"); var selected = skills.indexSkills(skills.discoverSkills(root, { homeDir: root }))["clay-sketch"]; assert.equal(selected.source, "clay-project", "project guidance retains precedence over bundled defaults"); } finally { fs.rmSync(root, { recursive: true, force: true }); } }); test("the bundled skill's whole-page example renders with the built-in engine", async function () { var source = fs.readFileSync(path.join(__dirname, "../lib/bundled-skills/clay-sketch/SKILL.md"), "utf8"); var examples = Array.from(source.matchAll(/```clay-sketch\n([\s\S]*?)\n```/g)); assert.ok(examples.length > 0); for (var i = 0; i < examples.length; i++) { var svg = await renderer.renderPlantUml(examples[i][1]); assert.match(svg, /