import assert from "node:assert/strict"; import { mkdtempSync, mkdirSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; import test from "node:test"; import { SettingsManager } from "@mariozechner/pi-coding-agent"; import { buildPiResourceLoaderOptions, createPiResourceLoader, getPiResourcesDir } from "../src/pi-resources.js"; test("buildPiResourceLoaderOptions includes repo-managed resource directories", () => { const cwd = mkdtempSync(path.join(tmpdir(), "pi-bot-pi-resources-")); const options = buildPiResourceLoaderOptions({ cwd, agentDir: cwd, settingsManager: SettingsManager.inMemory() }); const resourcesDir = getPiResourcesDir(); assert.ok((options.additionalExtensionPaths ?? []).includes(path.join(resourcesDir, "extensions", "test-ping.ts"))); assert.ok( (options.additionalExtensionPaths ?? []).includes( path.join(resourcesDir, "extensions", "preference-memory", "index.ts") ) ); assert.deepEqual(options.additionalSkillPaths, [path.join(resourcesDir, "skills")]); assert.deepEqual(options.additionalPromptTemplatePaths, [path.join(resourcesDir, "prompts")]); assert.deepEqual(options.agentsFilesOverride?.({ agentsFiles: [{ path: "/tmp/AGENTS.md", content: "x" }] }), { agentsFiles: [] }); }); test("buildPiResourceLoaderOptions prefers local .pi SYSTEM.md over repo-managed SYSTEM.md", () => { const cwd = mkdtempSync(path.join(tmpdir(), "pi-bot-pi-resources-local-system-")); mkdirSync(path.join(cwd, ".pi"), { recursive: true }); writeFileSync(path.join(cwd, ".pi", "SYSTEM.md"), "local-system"); const options = buildPiResourceLoaderOptions({ cwd, agentDir: cwd, settingsManager: SettingsManager.inMemory() }); assert.equal(options.systemPrompt, path.join(cwd, ".pi", "SYSTEM.md")); }); test("buildPiResourceLoaderOptions falls back to repo-managed SYSTEM.md when no local override exists", () => { const cwd = mkdtempSync(path.join(tmpdir(), "pi-bot-pi-resources-source-system-")); const options = buildPiResourceLoaderOptions({ cwd, agentDir: cwd, settingsManager: SettingsManager.inMemory() }); assert.equal(options.systemPrompt, path.join(getPiResourcesDir(), "SYSTEM.md")); }); test("createPiResourceLoader loads repo-managed extensions without errors", async () => { const cwd = mkdtempSync(path.join(tmpdir(), "pi-bot-pi-resources-loader-")); const loader = createPiResourceLoader({ cwd, agentDir: cwd, settingsManager: SettingsManager.inMemory() }); await loader.reload(); const result = loader.getExtensions(); assert.equal(result.errors.length, 0); assert.ok(result.extensions.length >= 2); });