1+ import fs from "node:fs/promises" ;
2+ import path from "node:path" ;
13import { describe , expect , it } from "vitest" ;
24import type { ResolvedMemoryWikiConfig } from "./config.js" ;
3- import { createWikiApplyTool } from "./tool.js" ;
5+ import { createWikiApplyTool , createWikiLintTool } from "./tool.js" ;
6+ import { lintMemoryWikiVault } from "./lint.js" ;
7+ import { createMemoryWikiTestHarness } from "./test-helpers.js" ;
48
59function asSchemaObject ( value : unknown ) : Record < string , unknown > {
610 if ( typeof value !== "object" || value === null || Array . isArray ( value ) ) {
@@ -10,6 +14,8 @@ function asSchemaObject(value: unknown): Record<string, unknown> {
1014}
1115
1216describe ( "memory-wiki tools" , ( ) => {
17+ const harness = createMemoryWikiTestHarness ( ) ;
18+
1319 it ( "allows provenance metadata in wiki_apply claim evidence" , ( ) => {
1420 const tool = createWikiApplyTool ( { } as ResolvedMemoryWikiConfig ) ;
1521 const applyProperties = asSchemaObject ( asSchemaObject ( tool . parameters ) . properties ) ;
@@ -33,4 +39,40 @@ describe("memory-wiki tools", () => {
3339 ] ) ;
3440 expect ( evidenceProperties . confidence ) . toEqual ( { type : "number" , minimum : 0 , maximum : 1 } ) ;
3541 } ) ;
42+
43+ it ( "returns tool-safe relative report paths from wiki_lint" , async ( ) => {
44+ const { rootDir, config } = await harness . createVault ( { initialize : true } ) ;
45+ await fs . mkdir ( path . join ( rootDir , "syntheses" ) , { recursive : true } ) ;
46+ await fs . writeFile (
47+ path . join ( rootDir , "syntheses" , "bad.md" ) ,
48+ [
49+ "---" ,
50+ "id: synth-bad" ,
51+ "pageType: synthesis" ,
52+ "title: Bad Page" ,
53+ "---" ,
54+ "" ,
55+ "This links to [[Missing Page]]." ,
56+ ] . join ( "\n" ) ,
57+ "utf8" ,
58+ ) ;
59+
60+ const tool = createWikiLintTool ( config ) ;
61+ const result = await tool . execute ( "lint-call" , { } ) ;
62+ const text = result . content . find ( ( part ) => part . type === "text" ) ?. text ?? "" ;
63+ const details = asSchemaObject ( result . details ) ;
64+
65+ expect ( text ) . toContain ( "Report: reports/lint.md" ) ;
66+ expect ( text ) . not . toContain ( rootDir ) ;
67+ expect ( details . reportPath ) . toBe ( "reports/lint.md" ) ;
68+ expect ( details ) . not . toHaveProperty ( "vaultRoot" ) ;
69+ expect ( JSON . stringify ( details ) ) . not . toContain ( rootDir ) ;
70+ expect ( asSchemaObject ( details . issuesByCategory ) . links ) . toEqual (
71+ expect . arrayContaining ( [ expect . objectContaining ( { code : "broken-wikilink" } ) ] ) ,
72+ ) ;
73+
74+ const lintResult = await lintMemoryWikiVault ( config ) ;
75+ expect ( path . isAbsolute ( lintResult . reportPath ) ) . toBe ( true ) ;
76+ expect ( lintResult . reportPath ) . toContain ( rootDir ) ;
77+ } ) ;
3678} ) ;
0 commit comments