import fs from 'fs'; import { unified } from 'unified'; import remarkParse from 'remark-parse'; import remarkFrontmatter from 'remark-frontmatter'; import remarkGfm from 'remark-gfm'; import remarkDirective from 'remark-directive'; export interface LintResult { ruleId: string; message: string; } export async function lintFile(filePath: string): Promise { const content = fs.readFileSync(filePath, 'utf-8'); const results: LintResult[] = []; const processor = unified() .use(remarkParse) .use(remarkFrontmatter, ['yaml']) .use(remarkGfm) .use(remarkDirective); const tree = processor.parse(content); // We will pass the tree to rules here later. const { checkFrontmatter } = await import('./rules/frontmatter.js'); results.push(...checkFrontmatter(tree as any)); const { checkToc } = await import('./rules/toc.js'); results.push(...checkToc(tree as any)); const { checkStructure } = await import('./rules/structure.js'); results.push(...checkStructure(tree as any)); const { checkCallouts } = await import('./rules/callouts.js'); results.push(...checkCallouts(tree as any)); const { checkCodeBlocks } = await import('./rules/codeblocks.js'); results.push(...checkCodeBlocks(tree as any)); // Placeholder logic if (content.length === 0) { results.push({ ruleId: 'empty-file', message: 'File is empty' }); } return results; }