mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-17 20:21:13 +00:00
69 lines
2.7 KiB
TypeScript
69 lines
2.7 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
import { describe, expect, it } from "vitest";
|
|
import { lintMemoryWikiVault } from "./lint.js";
|
|
import { renderWikiMarkdown } from "./markdown.js";
|
|
import { createMemoryWikiTestHarness } from "./test-helpers.js";
|
|
|
|
const { createVault } = createMemoryWikiTestHarness();
|
|
|
|
describe("lintMemoryWikiVault", () => {
|
|
it("detects duplicate ids, provenance gaps, contradictions, and open questions", async () => {
|
|
const { rootDir, config } = await createVault({
|
|
prefix: "memory-wiki-lint-",
|
|
initialize: true,
|
|
config: {
|
|
vault: { renderMode: "obsidian" },
|
|
},
|
|
});
|
|
|
|
const duplicate = renderWikiMarkdown({
|
|
frontmatter: {
|
|
pageType: "entity",
|
|
id: "entity.alpha",
|
|
title: "Alpha",
|
|
contradictions: ["Conflicts with source.beta"],
|
|
questions: ["Is Alpha still active?"],
|
|
confidence: 0.2,
|
|
},
|
|
body: "# Alpha\n\n[[missing-page]]\n",
|
|
});
|
|
await fs.writeFile(path.join(rootDir, "entities", "alpha.md"), duplicate, "utf8");
|
|
await fs.writeFile(path.join(rootDir, "concepts", "alpha.md"), duplicate, "utf8");
|
|
await fs.writeFile(
|
|
path.join(rootDir, "sources", "bridge-alpha.md"),
|
|
renderWikiMarkdown({
|
|
frontmatter: {
|
|
pageType: "source",
|
|
id: "source.bridge.alpha",
|
|
title: "Bridge Alpha",
|
|
sourceType: "memory-bridge",
|
|
},
|
|
body: "# Bridge Alpha\n",
|
|
}),
|
|
"utf8",
|
|
);
|
|
|
|
const result = await lintMemoryWikiVault(config);
|
|
|
|
expect(result.issueCount).toBeGreaterThan(0);
|
|
expect(result.issues.map((issue) => issue.code)).toContain("duplicate-id");
|
|
expect(result.issues.map((issue) => issue.code)).toContain("missing-source-ids");
|
|
expect(result.issues.map((issue) => issue.code)).toContain("missing-import-provenance");
|
|
expect(result.issues.map((issue) => issue.code)).toContain("broken-wikilink");
|
|
expect(result.issues.map((issue) => issue.code)).toContain("contradiction-present");
|
|
expect(result.issues.map((issue) => issue.code)).toContain("open-question");
|
|
expect(result.issues.map((issue) => issue.code)).toContain("low-confidence");
|
|
expect(result.issuesByCategory.contradictions).toHaveLength(2);
|
|
expect(result.issuesByCategory["open-questions"]).toHaveLength(2);
|
|
expect(
|
|
result.issuesByCategory.provenance.some(
|
|
(issue) => issue.code === "missing-import-provenance",
|
|
),
|
|
).toBe(true);
|
|
await expect(fs.readFile(result.reportPath, "utf8")).resolves.toContain("### Errors");
|
|
await expect(fs.readFile(result.reportPath, "utf8")).resolves.toContain("### Contradictions");
|
|
await expect(fs.readFile(result.reportPath, "utf8")).resolves.toContain("### Open Questions");
|
|
});
|
|
});
|