import assert from "node:assert/strict"; import test from "node:test"; import { extractPreferencesFromText, getPreferencesFilePath, renderPreferencesDocument, upsertPreferencesDocument } from "../pi-resources/extensions/preference-memory/index.js"; test("getPreferencesFilePath points to workspace root preference.md", () => { const filePath = getPreferencesFilePath("/tmp/pi-workspace"); assert.equal(filePath, "/tmp/pi-workspace/preference.md"); }); test("extractPreferencesFromText captures stable reply and project preferences", () => { const preferences = extractPreferencesFromText( "以后都用中文回复,回答尽量简洁。这个项目统一使用 pnpm。后续资源都写到 workspace/.pi。" ); assert.deepEqual( preferences.map((preference) => preference.key).sort(), ["package-manager", "reply-language", "reply-style", "runtime-resource-dir"] ); }); test("extractPreferencesFromText ignores temporary one-off instructions", () => { const preferences = extractPreferencesFromText("这次请用中文回复,先不要删文件。"); assert.deepEqual(preferences, []); }); test("upsertPreferencesDocument replaces existing values instead of appending duplicates", () => { const initial = renderPreferencesDocument([ { key: "reply-language", section: "回复偏好", label: "回复语言", value: "中文" } ]); const updated = upsertPreferencesDocument(initial, [ { key: "reply-language", section: "回复偏好", label: "回复语言", value: "英文" }, { key: "package-manager", section: "项目约定", label: "包管理器", value: "pnpm" } ]); assert.match(updated, /回复语言:英文/); assert.doesNotMatch(updated, /回复语言:中文/); assert.match(updated, /包管理器:pnpm/); });