import { afterEach, beforeEach, describe, expect, it } from "bun:test"; import { mkdir, mkdtemp, readFile, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { SkillStore } from "../../src/skills/store.js"; describe("SkillStore", () => { let originalCwd: string; let tempDir: string; let alternateCwd: string; let skillsRoot: string; let backupRoot: string; let store: SkillStore; beforeEach(async () => { originalCwd = process.cwd(); tempDir = await mkdtemp(join(tmpdir(), "tjwater-skills-")); alternateCwd = join(tempDir, "runtime-cwd"); skillsRoot = join(tempDir, "project", ".opencode", "skills"); backupRoot = join(tempDir, "backup", "skills"); store = new SkillStore(skillsRoot, backupRoot); }); afterEach(async () => { process.chdir(originalCwd); await rm(tempDir, { force: true, recursive: true }); }); it("writes scripts under the configured skills root regardless of process cwd", async () => { await mkdir(alternateCwd, { recursive: true }); process.chdir(alternateCwd); const result = await store.writeScript( "workflow/hydraulic-bottleneck-analysis", "scripts/analyze.py", "print('ok')\n", ); expect(result).toEqual({ changed: true, detail: "script written", target: join( skillsRoot, "workflow", "hydraulic-bottleneck-analysis", "scripts", "analyze.py", ), }); await expect(readFile(result.target, "utf8")).resolves.toBe("print('ok')\n"); }); it("rejects script paths outside scripts/*.py", async () => { const result = await store.writeScript( "workflow/hydraulic-bottleneck-analysis", "analyze.ts", "console.log('ok')\n", ); expect(result).toEqual({ changed: false, detail: "invalid script file_path", target: "", }); }); });