mirror of
https://github.com/hansjone/oclaw.git
synced 2026-10-11 12:10:45 +08:00
重构主控编排与运行时预热链路,统一工作区提示词/专家调度协议并补齐 wiki 记忆注入与写回闭环。
同时收敛启动与运维脚本默认行为(含 wiki worker)、更新 Admin 可观测性与相关测试,降低首轮时延并提高运行稳定性。 Made-with: Cursor
This commit is contained in:
parent
4a23b715a2
commit
dbbe3add6a
14438 changed files with 2693620 additions and 2546 deletions
119
openclaw/extensions/memory-wiki/src/lint.test.ts
Normal file
119
openclaw/extensions/memory-wiki/src/lint.test.ts
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
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-",
|
||||
config: {
|
||||
vault: { renderMode: "obsidian" },
|
||||
},
|
||||
});
|
||||
await Promise.all(
|
||||
["entities", "concepts", "sources", "syntheses"].map((dir) =>
|
||||
fs.mkdir(path.join(rootDir, dir), { recursive: true }),
|
||||
),
|
||||
);
|
||||
|
||||
const duplicate = renderWikiMarkdown({
|
||||
frontmatter: {
|
||||
pageType: "entity",
|
||||
id: "entity.alpha",
|
||||
title: "Alpha",
|
||||
contradictions: ["Conflicts with source.beta"],
|
||||
questions: ["Is Alpha still active?"],
|
||||
confidence: 0.2,
|
||||
claims: [
|
||||
{
|
||||
id: "claim.alpha.db",
|
||||
text: "Alpha uses PostgreSQL for production writes.",
|
||||
confidence: 0.2,
|
||||
evidence: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
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",
|
||||
);
|
||||
await fs.writeFile(
|
||||
path.join(rootDir, "syntheses", "alpha-db.md"),
|
||||
renderWikiMarkdown({
|
||||
frontmatter: {
|
||||
pageType: "synthesis",
|
||||
id: "synthesis.alpha.db",
|
||||
title: "Alpha Database",
|
||||
sourceIds: ["source.bridge.alpha"],
|
||||
updatedAt: "2025-10-01T00:00:00.000Z",
|
||||
claims: [
|
||||
{
|
||||
id: "claim.alpha.db",
|
||||
text: "Alpha uses MySQL for production writes.",
|
||||
status: "contested",
|
||||
confidence: 0.7,
|
||||
evidence: [
|
||||
{
|
||||
sourceId: "source.bridge.alpha",
|
||||
lines: "1-3",
|
||||
updatedAt: "2025-10-01T00:00:00.000Z",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
body: "# Alpha Database\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("claim-conflict");
|
||||
expect(result.issues.map((issue) => issue.code)).toContain("open-question");
|
||||
expect(result.issues.map((issue) => issue.code)).toContain("low-confidence");
|
||||
expect(result.issues.map((issue) => issue.code)).toContain("claim-missing-evidence");
|
||||
expect(result.issues.map((issue) => issue.code)).toContain("claim-low-confidence");
|
||||
expect(result.issues.map((issue) => issue.code)).toContain("stale-page");
|
||||
expect(result.issues.map((issue) => issue.code)).toContain("stale-claim");
|
||||
expect(
|
||||
result.issuesByCategory.contradictions.some((issue) => issue.code === "claim-conflict"),
|
||||
).toBe(true);
|
||||
expect(result.issuesByCategory["open-questions"].length).toBeGreaterThanOrEqual(2);
|
||||
expect(
|
||||
result.issuesByCategory.provenance.some(
|
||||
(issue) => issue.code === "missing-import-provenance",
|
||||
),
|
||||
).toBe(true);
|
||||
expect(
|
||||
result.issuesByCategory.provenance.some((issue) => issue.code === "claim-missing-evidence"),
|
||||
).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");
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue