@ev3lynx/md-analyzer
Advanced tools
| import type { AnalysisResult } from '../types/index.js'; | ||
| export declare function analyzeFileCached(file: string, analyze: (f: string) => AnalysisResult, fallback: (f: string) => AnalysisResult): AnalysisResult; |
| import * as fs from 'fs'; | ||
| import * as path from 'path'; | ||
| import { CACHE_FILE } from '../utils/constants.js'; | ||
| function loadCache() { | ||
| try { | ||
| if (!fs.existsSync(CACHE_FILE)) | ||
| return { version: 1, entries: {} }; | ||
| return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8')); | ||
| } | ||
| catch { | ||
| return { version: 1, entries: {} }; | ||
| } | ||
| } | ||
| function saveCache(store) { | ||
| try { | ||
| const dir = path.dirname(CACHE_FILE); | ||
| if (!fs.existsSync(dir)) | ||
| fs.mkdirSync(dir, { recursive: true }); | ||
| fs.writeFileSync(CACHE_FILE, JSON.stringify(store)); | ||
| } | ||
| catch (e) { | ||
| console.error('cache_write_error:', e instanceof Error ? e.message : e); | ||
| } | ||
| } | ||
| export function analyzeFileCached(file, analyze, fallback) { | ||
| const store = loadCache(); | ||
| const stat = fs.statSync(file); | ||
| const key = fs.realpathSync(file); | ||
| const cached = store.entries[key]; | ||
| const maxAge = 1000 * 60 * 60 * 24; | ||
| if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size && cached.cachedAt) { | ||
| return cached.result; | ||
| } | ||
| let result; | ||
| try { | ||
| result = analyze(file); | ||
| } | ||
| catch { | ||
| result = fallback(file); | ||
| } | ||
| store.entries[key] = { mtimeMs: stat.mtimeMs, size: stat.size, cachedAt: Date.now(), result }; | ||
| // prune stale entries periodically by cachedAt | ||
| const now = Date.now(); | ||
| for (const [k, v] of Object.entries(store.entries)) { | ||
| if (now - v.cachedAt > maxAge) | ||
| delete store.entries[k]; | ||
| } | ||
| saveCache(store); | ||
| return result; | ||
| } | ||
| //# sourceMappingURL=cache.js.map |
| {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"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"} |
| import type { AnalysisResult } from '../types/index.js'; | ||
| type Reanalyse = (files: string[]) => AnalysisResult[]; | ||
| export declare function watchDirectory(dir: string, reanalyse: Reanalyse): void; | ||
| export {}; |
| import * as fs from 'fs'; | ||
| import * as path from 'path'; | ||
| import { buildSummary } from '../cli/output.js'; | ||
| import { scanMarkdownFiles } from './analyzer.js'; | ||
| export function watchDirectory(dir, reanalyse) { | ||
| const mdFiles = new Set(); | ||
| function isMd(f) { return f.endsWith('.md') || f.endsWith('.mdx'); } | ||
| function addFile(f) { if (isMd(f)) | ||
| mdFiles.add(f); } | ||
| function removeFile(f) { mdFiles.delete(f); } | ||
| process.stdout.write('Scanning for .md files...\n'); | ||
| const scanned = scanMarkdownFiles(dir); | ||
| for (const f of scanned.files) | ||
| addFile(f); | ||
| process.stdout.write(`Watching ${dir} (${mdFiles.size} .md files)\n`); | ||
| const reanalyseAndPrint = (changed) => { | ||
| const results = reanalyse(changed); | ||
| const totalTok = results.reduce((s, r) => s + r.stats.tokens, 0); | ||
| process.stdout.write(JSON.stringify(buildSummary(results, totalTok, 0), null, 2) + '\n'); | ||
| process.stdout.write(`--- ${new Date().toLocaleTimeString()} ---\n`); | ||
| }; | ||
| const pending = new Map(); | ||
| const DEBOUNCE_MS = 300; | ||
| try { | ||
| const watcher = fs.watch(dir, { recursive: true }, (event, filename) => { | ||
| if (!filename) | ||
| return; | ||
| const fullPath = path.resolve(dir, filename); | ||
| if (!isMd(fullPath)) | ||
| return; | ||
| if (event === 'rename') { | ||
| try { | ||
| fs.accessSync(fullPath); | ||
| addFile(fullPath); | ||
| } | ||
| catch { | ||
| removeFile(fullPath); | ||
| return; | ||
| } | ||
| } | ||
| if (pending.has(fullPath)) | ||
| clearTimeout(pending.get(fullPath)); | ||
| pending.set(fullPath, setTimeout(() => { | ||
| pending.delete(fullPath); | ||
| reanalyseAndPrint([fullPath]); | ||
| }, DEBOUNCE_MS)); | ||
| }); | ||
| watcher.on('error', (err) => { | ||
| if (err.code === 'EACCES' || err.code === 'EPERM') | ||
| return; | ||
| process.stderr.write(`watcher_error: ${err.message}\n`); | ||
| }); | ||
| } | ||
| catch (e) { | ||
| process.stderr.write(`watch_error: cannot watch ${dir} — ${e instanceof Error ? e.message : e}\n`); | ||
| } | ||
| if (mdFiles.size > 0) { | ||
| process.stdout.write(`Starting initial analysis of ${mdFiles.size} files...\n`); | ||
| reanalyseAndPrint([...mdFiles]); | ||
| } | ||
| } | ||
| //# sourceMappingURL=watcher.js.map |
| {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"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"} |
+34
-13
@@ -10,9 +10,10 @@ #!/usr/bin/env node | ||
| import { CliOptions } from '../core/schema.js'; | ||
| import { getTomlConfig, resolveConfigPath } from '../utils/config.js'; | ||
| import { scanMarkdownFiles, analyzeFile, analyzeFileWithMicromark } from '../core/analyzer.js'; | ||
| import { buildGraph, findOrphans, findBacklinks } from '../core/graph.js'; | ||
| import { analyzeFileCached } from '../core/cache.js'; | ||
| import { watchDirectory } from '../core/watcher.js'; | ||
| import { searchContent, filterByMetadata, rankByRelevance } from '../core/search.js'; | ||
| import { getFragmentHealth } from '../core/health.js'; | ||
| import { loadSession, saveSession, updateSessionStats, getTokenBudgetReport } from '../core/session.js'; | ||
| import { extractKeyPoints, writeRunLog } from './output.js'; | ||
| import { extractKeyPoints, buildSummary, writeRunLog } from './output.js'; | ||
| const pkgVersion = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf-8')).version; | ||
@@ -35,2 +36,4 @@ const program = new Command(); | ||
| .option('--lint-fragments', 'Fragment health check') | ||
| .option('--summary', 'Aggregated stats across all files') | ||
| .option('--watch', 'Watch mode — re-analyze on file changes') | ||
| .option('--session', 'Token budget report') | ||
@@ -43,2 +46,4 @@ .option('--budget <n>', 'Set token budget limit', parseInt, 100000) | ||
| md-analyzer /path/to/docs --keypoints --json | ||
| md-analyzer . --summary --json | ||
| md-analyzer . --watch --summary # live re-analysis with summary output | ||
| md-analyzer . --search "task" --rank --json | ||
@@ -50,2 +55,6 @@ md-analyzer . --session --budget 50000 --json | ||
| program.action(async (directory, options) => { | ||
| if (directory === undefined && process.argv.slice(2).length === 0) { | ||
| program.help(); | ||
| return; | ||
| } | ||
| const startTime = Date.now(); | ||
@@ -68,5 +77,3 @@ let parsed; | ||
| } | ||
| const configPath = resolveConfigPath(); | ||
| const config = getTomlConfig(configPath); | ||
| const targetArg = parsed.directory || process.env['MD_ANALYZER_DEFAULT_DIR'] || config.default_directory || process.cwd(); | ||
| const targetArg = parsed.directory || process.env['MD_ANALYZER_DEFAULT_DIR'] || process.cwd(); | ||
| let mdFiles = []; | ||
@@ -104,8 +111,19 @@ let scanErrors = []; | ||
| } | ||
| let results = mdFiles.map(file => { try { | ||
| return analyzeFileWithMicromark(file); | ||
| if (parsed.watch) { | ||
| if (parsed.directory) { | ||
| try { | ||
| watchDirectory(targetArg, (changed) => changed.map(f => analyzeFileCached(f, analyzeFileWithMicromark, analyzeFile))); | ||
| } | ||
| catch (e) { | ||
| console.error('watch_error:', e instanceof Error ? e.message : e); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| else { | ||
| console.error('--watch requires a directory path'); | ||
| process.exit(1); | ||
| } | ||
| return; | ||
| } | ||
| catch { | ||
| return analyzeFile(file); | ||
| } }); | ||
| let results = mdFiles.map(file => analyzeFileCached(file, analyzeFileWithMicromark, analyzeFile)); | ||
| if (scanErrors.length > 0 && results.length > 0) { | ||
@@ -140,6 +158,9 @@ if (!results[0].stats.errors) | ||
| const updatedSession = updateSessionStats(results, session); | ||
| saveSession(updatedSession); | ||
| const tokensThisCall = results.reduce((sum, r) => sum + r.stats.tokens, 0); | ||
| if (parsed.session) | ||
| if (parsed.session) { | ||
| saveSession(updatedSession); | ||
| console.log(JSON.stringify(getTokenBudgetReport(updatedSession, parsed.budget), null, 2)); | ||
| } | ||
| else if (parsed.summary) | ||
| console.log(JSON.stringify(buildSummary(limitedResults, tokensThisCall, Date.now() - startTime), null, 2)); | ||
| else if (parsed.keypoints) | ||
@@ -171,3 +192,3 @@ console.log(JSON.stringify(limitedResults.map(doc => extractKeyPoints(doc)), null, 2)); | ||
| const usedFlags = process.argv.slice(2).filter(a => a.startsWith('--')).map(a => a.replace(/=.*/, '')); | ||
| const mode = parsed.deps ? 'deps' : parsed.lintFragments ? 'lint-fragments' : parsed.session ? 'session' : parsed.keypoints ? 'keypoints' : parsed.orphans ? 'orphans' : parsed.backlinks ? 'backlinks' : parsed.graph ? 'graph' : parsed.search ? 'search' : 'default'; | ||
| const mode = parsed.deps ? 'deps' : parsed.lintFragments ? 'lint-fragments' : parsed.session ? 'session' : parsed.summary ? 'summary' : parsed.keypoints ? 'keypoints' : parsed.orphans ? 'orphans' : parsed.backlinks ? 'backlinks' : parsed.graph ? 'graph' : parsed.search ? 'search' : 'default'; | ||
| writeRunLog({ | ||
@@ -174,0 +195,0 @@ timestamp: new Date().toISOString(), |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"} |
| import type { AnalysisResult, RunLog } from '../types/index.js'; | ||
| export declare function extractKeyPoints(doc: AnalysisResult): object; | ||
| export declare function buildSummary(results: AnalysisResult[], totalTokens: number, durationMs: number): object; | ||
| export declare function writeRunLog(log: RunLog): void; |
+55
-0
@@ -21,2 +21,57 @@ import * as fs from 'fs'; | ||
| } | ||
| export function buildSummary(results, totalTokens, durationMs) { | ||
| const count = results.length; | ||
| if (count === 0) | ||
| return { files: 0, durationMs }; | ||
| const sum = (fn) => results.reduce((a, r) => a + fn(r), 0); | ||
| const avg = (fn) => sum(fn) / count; | ||
| let largestFile = results[0], smallestFile = results[0]; | ||
| let mostHeadings = results[0], mostLinks = results[0], mostTokens = results[0]; | ||
| for (const r of results) { | ||
| if (r.stats.tokens > mostTokens.stats.tokens) | ||
| mostTokens = r; | ||
| if (r.stats.totalHeadings > mostHeadings.stats.totalHeadings) | ||
| mostHeadings = r; | ||
| if (r.stats.totalLinks > mostLinks.stats.totalLinks) | ||
| mostLinks = r; | ||
| if (r.stats.tokens < smallestFile.stats.tokens) | ||
| smallestFile = r; | ||
| if (r.stats.tokens > largestFile.stats.tokens) | ||
| largestFile = r; | ||
| } | ||
| return { | ||
| files: count, | ||
| durationMs, | ||
| totalTokensThisCall: totalTokens, | ||
| totals: { | ||
| headings: sum(r => r.stats.totalHeadings), | ||
| links: sum(r => r.stats.totalLinks), | ||
| internalLinks: sum(r => r.stats.internalLinks), | ||
| externalLinks: sum(r => r.stats.externalLinks), | ||
| wikilinks: sum(r => r.stats.totalWikilinks), | ||
| tokens: sum(r => r.stats.tokens), | ||
| words: sum(r => r.stats.wordCount), | ||
| chars: sum(r => r.stats.charCount), | ||
| codeBlocks: sum(r => r.stats.codeBlocks), | ||
| tables: sum(r => r.stats.tables), | ||
| bold: sum(r => r.stats.boldCount ?? 0), | ||
| italic: sum(r => r.stats.italicCount ?? 0), | ||
| bullets: sum(r => r.stats.bulletCount ?? 0) | ||
| }, | ||
| averages: { | ||
| headings: +avg(r => r.stats.totalHeadings).toFixed(1), | ||
| links: +avg(r => r.stats.totalLinks).toFixed(1), | ||
| tokens: Math.round(avg(r => r.stats.tokens)), | ||
| words: Math.round(avg(r => r.stats.wordCount)), | ||
| readingTimeMin: Math.round(sum(r => r.stats.wordCount) / 200) | ||
| }, | ||
| extremes: { | ||
| largestFile: { file: largestFile.fileName, tokens: largestFile.stats.tokens, lines: largestFile.stats.lineCount }, | ||
| smallestFile: { file: smallestFile.fileName, tokens: smallestFile.stats.tokens, lines: smallestFile.stats.lineCount }, | ||
| mostHeadings: { file: mostHeadings.fileName, count: mostHeadings.stats.totalHeadings, tokens: mostHeadings.stats.tokens, lines: mostHeadings.stats.lineCount }, | ||
| mostLinks: { file: mostLinks.fileName, count: mostLinks.stats.totalLinks, tokens: mostLinks.stats.tokens, lines: mostLinks.stats.lineCount }, | ||
| mostTokens: { file: mostTokens.fileName, tokens: mostTokens.stats.tokens, lines: mostTokens.stats.lineCount } | ||
| } | ||
| }; | ||
| } | ||
| export function writeRunLog(log) { | ||
@@ -23,0 +78,0 @@ try { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"} |
@@ -71,5 +71,2 @@ import * as fs from 'fs'; | ||
| const counts = countStats(markdownContent); | ||
| if (counts.tokens === 0 && !errors.includes('token_count_fallback')) { | ||
| errors.push('token_count_fallback: tiktoken unavailable'); | ||
| } | ||
| const sections = computeSections(markdownContent, headings); | ||
@@ -76,0 +73,0 @@ const fileName = path.basename(filePath, '.md'); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"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"} |
@@ -38,2 +38,3 @@ import { parse, postprocess, preprocess } from 'micromark'; | ||
| } | ||
| const HTML_SRC_RE = /<(\w+)\s[^>]*?(?:src|href)="([^"]+)"/gi; | ||
| export function walkLinks(content) { | ||
@@ -63,6 +64,11 @@ try { | ||
| let current = null; | ||
| let htmlBlock = null; | ||
| for (const ev of events) { | ||
| const token = ev[1]; | ||
| const slice = (t) => content.slice(t.start.offset, t.end?.offset ?? t.start.offset); | ||
| if (ev[0] === 'enter' && (token.type === 'link' || token.type === 'image' || token.type === 'autolink')) { | ||
| if (ev[0] === 'enter' && (token.type === 'link' || token.type === 'image' || token.type === 'autolink' || token.type === 'htmlFlow')) { | ||
| if (token.type === 'htmlFlow') { | ||
| htmlBlock = { start: token.start.offset, end: 0 }; | ||
| continue; | ||
| } | ||
| current = { type: token.type, start: token.start.offset, text: '', url: '', hasRef: false }; | ||
@@ -87,2 +93,19 @@ } | ||
| } | ||
| if (ev[0] === 'exit' && token.type === 'htmlFlow' && htmlBlock) { | ||
| htmlBlock.end = token.end?.offset ?? content.length; | ||
| const raw = content.slice(htmlBlock.start, htmlBlock.end); | ||
| HTML_SRC_RE.lastIndex = 0; | ||
| for (const m of raw.matchAll(HTML_SRC_RE)) { | ||
| links.push({ | ||
| text: m[2], | ||
| url: m[2], | ||
| start: htmlBlock.start + (m.index ?? 0), | ||
| end: htmlBlock.start + (m.index ?? 0) + m[0].length, | ||
| isImage: m[1].toLowerCase() === 'img', | ||
| isAutolink: false, | ||
| isReference: false | ||
| }); | ||
| } | ||
| htmlBlock = null; | ||
| } | ||
| if (ev[0] === 'exit' && current && token.type === current.type) { | ||
@@ -89,0 +112,0 @@ if (token.end && (current.text || current.url)) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"micromark-walk.js","sourceRoot":"","sources":["../../src/core/micromark-walk.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"micromark-walk.js","sourceRoot":"","sources":["../../src/core/micromark-walk.ts"],"names":[],"mappings":"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"} |
@@ -14,2 +14,4 @@ import { z } from 'zod'; | ||
| lintFragments: z.ZodDefault<z.ZodBoolean>; | ||
| summary: z.ZodDefault<z.ZodBoolean>; | ||
| watch: z.ZodDefault<z.ZodBoolean>; | ||
| session: z.ZodDefault<z.ZodBoolean>; | ||
@@ -16,0 +18,0 @@ budget: z.ZodDefault<z.ZodNumber>; |
@@ -17,2 +17,4 @@ import { z } from 'zod'; | ||
| lintFragments: z.boolean().default(false), | ||
| summary: z.boolean().default(false), | ||
| watch: z.boolean().default(false), | ||
| session: z.boolean().default(false), | ||
@@ -19,0 +21,0 @@ budget: z.number().int().positive('Budget must be a positive integer').default(100000), |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAExB,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAA;AAE1H,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC,QAAQ,EAAE;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,oCAAoC,CAAC,CAAC,QAAQ,EAAE;IACvF,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kCAAkC,CAAC,CAAC,QAAQ,EAAE;IAC3E,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACtF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACxF,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACvD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;CACrD,CAAC,CAAA"} | ||
| {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAExB,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAA;AAE1H,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC,QAAQ,EAAE;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,oCAAoC,CAAC,CAAC,QAAQ,EAAE;IACvF,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kCAAkC,CAAC,CAAC,QAAQ,EAAE;IAC3E,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACtF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACxF,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACvD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;CACrD,CAAC,CAAA"} |
| import * as fs from 'fs'; | ||
| import * as cp from 'child_process'; | ||
| import * as path from 'path'; | ||
| let _rgAvailable = null; | ||
@@ -30,3 +29,3 @@ function isRgAvailable() { | ||
| const out = cp.execFileSync('rg', ['-ilF', kw, ...files], { encoding: 'utf-8', timeout: 30000, maxBuffer: 10 * 1024 * 1024 }); | ||
| const matched = new Set(out.trim().split('\n').filter(Boolean).map(f => path.resolve(f))); | ||
| const matched = new Set(out.trim().split('\n').filter(Boolean)); | ||
| return results.filter(r => matched.has(r.file)); | ||
@@ -33,0 +32,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"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"} |
| export declare const SKIP_DIRS: Set<string>; | ||
| export declare const SESSION_FILE: string; | ||
| export declare const LOG_DIR: string; | ||
| export declare const CACHE_FILE: string; |
@@ -16,2 +16,4 @@ import * as path from 'path'; | ||
| export const LOG_DIR = process.env.LOG_DIR || path.join(os.homedir(), '.local', 'state', 'md-analyzer', 'log'); | ||
| // XDG cache dir for file analysis cache | ||
| export const CACHE_FILE = path.join(os.homedir(), '.local', 'cache', 'md-analyzer', 'analysis-cache.json'); | ||
| //# sourceMappingURL=constants.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IACrC,UAAU,EAAE,MAAM,EAAE,eAAe;IACnC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU;CACpD,CAAC,CAAA;AAEF,+EAA+E;AAC/E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;AACpG,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAA;AAEtF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAA"} | ||
| {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IACrC,UAAU,EAAE,MAAM,EAAE,eAAe;IACnC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU;CACpD,CAAC,CAAA;AAEF,+EAA+E;AAC/E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;AACpG,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,0BAA0B,CAAC,CAAA;AAEtF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAA;AAE9G,wCAAwC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAA"} |
+12
-6
| { | ||
| "name": "@ev3lynx/md-analyzer", | ||
| "version": "0.2.2", | ||
| "version": "0.3.0", | ||
| "description": "Markdown document analyzer for AI agents - extract metadata, headings, links, tables, tokens, and key points", | ||
@@ -11,2 +11,10 @@ "type": "module", | ||
| }, | ||
| "./core/*": { | ||
| "types": "./dist/core/*.d.ts", | ||
| "default": "./dist/core/*.js" | ||
| }, | ||
| "./types": { | ||
| "types": "./dist/types/index.d.ts", | ||
| "default": "./dist/types/index.js" | ||
| }, | ||
| "./package.json": "./package.json" | ||
@@ -60,2 +68,4 @@ }, | ||
| "@eslint/js": "^10.0.1", | ||
| "@semantic-release/changelog": "^6.0.3", | ||
| "@semantic-release/git": "^10.0.1", | ||
| "@types/js-yaml": "^4.0.9", | ||
@@ -69,9 +79,5 @@ "@types/node": "^20.0.0", | ||
| "dist/", | ||
| "src/", | ||
| "hooks.toml", | ||
| "config.yaml", | ||
| "README.md", | ||
| "LICENSE", | ||
| ".env.example" | ||
| "LICENSE" | ||
| ] | ||
| } |
+14
-46
@@ -14,2 +14,4 @@ # md-analyzer | ||
| | **Keypoints** | Single-shot document overview (ideal for agents) | | ||
| | **Summary** | Aggregated totals + averages + extremes across all files (`--summary`) | | ||
| | **Watch** | Live re-analysis on file changes via fs.watch (`--watch`) | | ||
| | **Token Tracking** | Session-based token budget with persistent storage (`~/.local/share/md-analyzer/tokens/md-analyzer-session.json`) | | ||
@@ -105,2 +107,4 @@ | **Graph** | Document relationship topology (backlinks, orphans) | | ||
| | `--json` | Output as JSON | `--json` | | ||
| | `--summary` | Aggregated totals + averages + extremes across all files | `--summary` | | ||
| | `--watch` | Live re-analysis via fs.watch with 300ms debounce | `--watch` | | ||
| | `--search <kw>` | Search keyword in content | `--search "task"` | | ||
@@ -128,2 +132,8 @@ | `--filter <k=v>` | Filter by metadata field | `--filter "category=guides"` | | ||
| # Aggregated summary (totals, averages, extremes) | ||
| md-analyzer . --summary --json | ||
| # Live re-analysis on file changes | ||
| md-analyzer . --watch | ||
| # Search with ranking | ||
@@ -194,10 +204,2 @@ md-analyzer . --search "task lifecycle" --rank --json | ||
| ```python | ||
| # Python | ||
| import subprocess, json | ||
| result = subprocess.run(["md-analyzer", "./docs", "--keypoints", "--json"], | ||
| capture_output=True, text=True) | ||
| docs = json.loads(result.stdout) | ||
| ``` | ||
| For agent hooks, see the [pre-read integration](#agent-hook-integration-pre-read) section above. | ||
@@ -209,17 +211,4 @@ | ||
| ### hooks.toml | ||
| Priority chain: CLI flag → `MD_ANALYZER_DEFAULT_DIR` env var → `process.cwd()`. | ||
| ```toml | ||
| [tool.md-analyzer.config] | ||
| # Path configuration | ||
| default_directory = "/path/to/docs" | ||
| # Token budget configuration | ||
| default_budget = 100000 | ||
| max_tokens = 200000 | ||
| # Output safety (prevent token blowout) | ||
| max_results_default = 0 | ||
| ``` | ||
| ### Environment Variables | ||
@@ -229,22 +218,6 @@ | ||
| |----------|-------------|---------| | ||
| | `MD_ANALYZER_PATH` | Path to compiled CLI entry | `dist/cli/index.js` | | ||
| | `MD_ANALYZER_DEFAULT_DIR` | Default directory | `.` | | ||
| | `MD_ANALYZER_MAX_TOKENS` | Max token limit | `200000` | | ||
| | `MD_ANALYZER_DEFAULT_BUDGET` | Default budget | `100000` | | ||
| | `MD_ANALYZER_MAX_RESULTS` | Max results | `20` | | ||
| | `MD_ANALYZER_DEFAULT_DIR` | Default directory | `process.cwd()` | | ||
| | `STATE_DIR` | Token tracking storage directory | `~/.local/share/md-analyzer` | | ||
| | `LOG_DIR` | Run logs storage directory | `~/.local/state/md-analyzer/log` | | ||
| ### Priority Chain | ||
| ``` | ||
| CLI --max-results 3 | ||
| ↓ | ||
| MD_ANALYZER_MAX_RESULTS=5 | ||
| ↓ | ||
| max_results_default=0 (hooks.toml, default: no limit) | ||
| ↓ | ||
| 0 (no limit — raw results) | ||
| ``` | ||
| --- | ||
@@ -311,11 +284,6 @@ | ||
| │ │ ├── health.ts # Fragment health checks | ||
| │ │ └── session.ts # Token budget tracking → XDG persistent storage | ||
| │ │ └── session.ts # Token budget tracking (disk write only with --session) | ||
| │ ├── types/index.ts # Shared TypeScript types | ||
| │ ├── utils/constants.ts # SKIP_DIRS, SESSION_FILE, LOG_DIR (XDG paths) | ||
| │ └── utils/config.ts # TOML config parser | ||
| │ └── utils/constants.ts # SKIP_DIRS, SESSION_FILE, LOG_DIR (XDG paths) | ||
| ├── dist/ # Compiled output | ||
| ├── hooks.toml # Configuration | ||
| ├── python/ # Agent hook integration | ||
| │ ├── pre_read.py | ||
| │ └── README.md | ||
| └── embedded-docs/ # Sample documents for testing | ||
@@ -322,0 +290,0 @@ ``` |
Sorry, the diff of this file is not supported yet
-18
| # md-analyzer configuration | ||
| # Standalone config for the micromark analysis tool. | ||
| # articpub-ai aggregates this + md-fabrication config into its own unified config. | ||
| tool: md-analyzer | ||
| paths: | ||
| default_directory: "." | ||
| budget: | ||
| default: 100000 | ||
| max: 200000 | ||
| output: | ||
| max_results: 20 | ||
| session: | ||
| file: /tmp/md-analyzer-session.json |
-55
| [tool.md-analyzer] | ||
| name = "md-analyzer" | ||
| description = "Markdown document analyzer for AI agents - extract metadata, headings, links, tables, tokens, and key points from .md files" | ||
| [tool.md-analyzer.capabilities] | ||
| capabilities = [ | ||
| "Analyze markdown files recursively", | ||
| "Extract YAML frontmatter metadata", | ||
| "Parse headings (h1-h6)", | ||
| "Extract internal/external links", | ||
| "Parse markdown tables", | ||
| "Count tokens using tiktoken", | ||
| "Track session token budget", | ||
| "Build document relationship graph" | ||
| ] | ||
| [tool.md-analyzer.config] | ||
| # Path configuration | ||
| default_directory = "" | ||
| tool_path = "" | ||
| # Token budget configuration | ||
| default_budget = 100000 | ||
| max_tokens = 200000 | ||
| # Output safety (prevent token blowout) | ||
| max_results_default = 20 | ||
| # Session file | ||
| session_file = "/tmp/md-analyzer-session.json" | ||
| [tool.md-analyzer.flags] | ||
| json = "Output as JSON" | ||
| search = "Search keyword in headings/metadata" | ||
| filter = "Filter by metadata (e.g., category=guides)" | ||
| rank = "Rank results by relevance" | ||
| graph = "Output document relationship graph" | ||
| orphans = "Find unreferenced documents" | ||
| backlinks = "Find documents referencing a specific doc" | ||
| keypoints = "Extract key points for quick overview (single-shot)" | ||
| session = "Show session token budget stats" | ||
| budget = "Set token budget limit (default: 100000)" | ||
| [tool.md-analyzer.examples] | ||
| quick_overview = "md-analyzer <file|dir> --keypoints --json" | ||
| search_and_rank = "md-analyzer <dir> --search 'task' --rank --json" | ||
| find_related = "md-analyzer <dir> --backlinks adr-2026-04-01-task-lifecycle --json" | ||
| token_budget = "md-analyzer <dir> --session --budget 50000 --json" | ||
| filter_by_category = "md-analyzer <dir> --filter category=guides --json" | ||
| [tool.md-analyzer.agent_use_case] | ||
| single_shot = "Use --keypoints flag to get quick document overview without reading full content" | ||
| rag_context = "Use --search + --rank to find relevant docs for RAG context" | ||
| relationship_discovery = "Use --graph or --backlinks to understand doc relationships" | ||
| token_tracking = "Use --session --budget to track token usage per agent session" |
-173
| #!/usr/bin/env node | ||
| import { Command } from 'commander' | ||
| import * as path from 'path' | ||
| import * as fs from 'fs' | ||
| import { fileURLToPath } from 'url' | ||
| import { z } from 'zod' | ||
| const __filename = fileURLToPath(import.meta.url) | ||
| const __dirname = path.dirname(__filename) | ||
| import { CliOptions } from '../core/schema.js' | ||
| import { getTomlConfig, resolveConfigPath } from '../utils/config.js' | ||
| import { scanMarkdownFiles, analyzeFile, analyzeFileWithMicromark } from '../core/analyzer.js' | ||
| import { buildGraph, findOrphans, findBacklinks } from '../core/graph.js' | ||
| import { searchContent, filterByMetadata, rankByRelevance } from '../core/search.js' | ||
| import { getFragmentHealth } from '../core/health.js' | ||
| import { loadSession, saveSession, updateSessionStats, getTokenBudgetReport } from '../core/session.js' | ||
| import { extractKeyPoints, writeRunLog } from './output.js' | ||
| const pkgVersion: string = JSON.parse( | ||
| fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf-8') | ||
| ).version | ||
| const program = new Command() | ||
| program | ||
| .name('md-analyzer') | ||
| .description('Markdown document analyzer for AI agents - extract metadata, headings, links, tables, tokens, formatting counts, and key points from .md files') | ||
| .version(pkgVersion, '--version, -v', 'Show version number') | ||
| .arguments('[directory]') | ||
| .option('--json', 'Output as JSON') | ||
| .option('--search <kw>', 'Search keyword in content') | ||
| .option('--filter <k=v>', 'Filter by metadata field') | ||
| .option('--rank', 'Rank results by relevance') | ||
| .option('--graph', 'Document relationship graph') | ||
| .option('--deps', 'Dependency graph (DAG order + levels)') | ||
| .option('--orphans', 'Find unreferenced docs') | ||
| .option('--backlinks <doc>', 'Find docs linking to <doc>') | ||
| .option('--keypoints', 'Quick overview (single-shot)') | ||
| .option('--lint-fragments', 'Fragment health check') | ||
| .option('--session', 'Token budget report') | ||
| .option('--budget <n>', 'Set token budget limit', parseInt, 100000) | ||
| .option('--max-results <n>', 'Limit output', parseInt, 0) | ||
| .addHelpText('after', ` | ||
| Examples: | ||
| md-analyzer /path/to/docs --keypoints --json | ||
| md-analyzer . --search "task" --rank --json | ||
| md-analyzer . --session --budget 50000 --json | ||
| md-analyzer . --orphans --json | ||
| md-analyzer . --lint-fragments --json | ||
| md-analyzer . --deps --json`) | ||
| program.action(async (directory: string | undefined, options: Record<string, unknown>) => { | ||
| const startTime = Date.now() | ||
| let parsed: CliOptions | ||
| try { | ||
| parsed = CliOptions.parse({ directory, ...options }) | ||
| } catch (e: unknown) { | ||
| if (e instanceof z.ZodError) { | ||
| console.error('Invalid arguments:') | ||
| for (const issue of e.issues) { | ||
| console.error(' ' + issue.path.join('.') + ': ' + issue.message) | ||
| } | ||
| } else { | ||
| console.error('Unexpected error:', e instanceof Error ? e.message : e) | ||
| } | ||
| process.exit(1) | ||
| } | ||
| const configPath = resolveConfigPath() | ||
| const config = getTomlConfig(configPath) | ||
| const targetArg = parsed.directory || process.env['MD_ANALYZER_DEFAULT_DIR'] || config.default_directory || process.cwd() | ||
| let mdFiles: string[] = [] | ||
| let scanErrors: string[] = [] | ||
| try { | ||
| const stat = fs.statSync(targetArg) | ||
| if (stat.isFile()) { | ||
| if (targetArg.endsWith('.md')) mdFiles = [targetArg] | ||
| else { | ||
| scanErrors.push('not_a_markdown_file: ' + targetArg) | ||
| if (!parsed.json) console.log('Not a .md file: ' + targetArg + '\n') | ||
| } | ||
| } else if (stat.isDirectory()) { | ||
| if (!parsed.json) console.log('Scanning: ' + targetArg + '\n') | ||
| const scanned = scanMarkdownFiles(targetArg) | ||
| mdFiles = scanned.files | ||
| scanErrors = scanned.errors | ||
| if (!parsed.json) { | ||
| console.log('Found ' + mdFiles.length + ' .md files\n') | ||
| if (scanErrors.length > 0) console.log('Warnings: ' + scanErrors.length + ' directories skipped\n') | ||
| } | ||
| } else { | ||
| scanErrors.push('unsupported_path_type: ' + targetArg) | ||
| } | ||
| } catch { | ||
| scanErrors.push('path_not_found: ' + targetArg) | ||
| } | ||
| let results = mdFiles.map(file => { try { return analyzeFileWithMicromark(file) } catch { return analyzeFile(file) } }) | ||
| if (scanErrors.length > 0 && results.length > 0) { | ||
| if (!results[0].stats.errors) results[0].stats.errors = [] | ||
| results[0].stats.errors.push(...scanErrors) | ||
| } | ||
| if (parsed.filter && parsed.filter.includes('=')) { | ||
| const [key, value] = parsed.filter.split('=') | ||
| results = filterByMetadata(results, key, value) | ||
| if (!parsed.json) console.log('Filtered by ' + key + '=' + value + ': ' + results.length + ' results\n') | ||
| } | ||
| if (parsed.search) { | ||
| results = searchContent(results, parsed.search) | ||
| if (!parsed.json) console.log('Search "' + parsed.search + '": ' + results.length + ' results\n') | ||
| } | ||
| if (parsed.rank && parsed.search) { | ||
| results = rankByRelevance(results, parsed.search) | ||
| if (!parsed.json) console.log('Ranked by relevance to "' + parsed.search + '"\n') | ||
| } | ||
| let limitedResults = results | ||
| if (parsed.maxResults > 0 && results.length > parsed.maxResults) { | ||
| if (!parsed.json) console.log('Warning: Limiting output to ' + parsed.maxResults + ' of ' + results.length + ' results\n') | ||
| limitedResults = results.slice(0, parsed.maxResults) | ||
| } | ||
| const session = loadSession() | ||
| const updatedSession = updateSessionStats(results, session) | ||
| saveSession(updatedSession) | ||
| const tokensThisCall = results.reduce((sum, r) => sum + r.stats.tokens, 0) | ||
| if (parsed.session) console.log(JSON.stringify(getTokenBudgetReport(updatedSession, parsed.budget), null, 2)) | ||
| else if (parsed.keypoints) console.log(JSON.stringify(limitedResults.map(doc => extractKeyPoints(doc)), null, 2)) | ||
| else if (parsed.lintFragments) console.log(JSON.stringify(getFragmentHealth(limitedResults), null, 2)) | ||
| else if (parsed.deps) { | ||
| const graph = buildGraph(limitedResults) | ||
| console.log(JSON.stringify({ nodes: Object.keys(graph.nodes), edges: graph.edges, tokensThisCall }, null, 2)) | ||
| } else if (parsed.orphans) { | ||
| const orphans = findOrphans(buildGraph(limitedResults)) | ||
| console.log(JSON.stringify({ orphans, count: orphans.length, tokensThisCall }, null, 2)) | ||
| } else if (parsed.backlinks) { | ||
| const backlinks = findBacklinks(limitedResults, parsed.backlinks) | ||
| console.log(JSON.stringify({ target: parsed.backlinks, backlinks, count: backlinks.length, tokensThisCall }, null, 2)) | ||
| } else if (parsed.graph) console.log(JSON.stringify(buildGraph(limitedResults), null, 2)) | ||
| else { | ||
| if (!parsed.json) { | ||
| console.log('\nTokens this call: ' + tokensThisCall) | ||
| console.log('Total session tokens: ' + updatedSession.totalTokens + '\n') | ||
| } | ||
| console.log(JSON.stringify(limitedResults, null, 2)) | ||
| } | ||
| const usedFlags = process.argv.slice(2).filter(a => a.startsWith('--')).map(a => a.replace(/=.*/, '')) | ||
| const mode = parsed.deps ? 'deps' : parsed.lintFragments ? 'lint-fragments' : parsed.session ? 'session' : parsed.keypoints ? 'keypoints' : parsed.orphans ? 'orphans' : parsed.backlinks ? 'backlinks' : parsed.graph ? 'graph' : parsed.search ? 'search' : 'default' | ||
| writeRunLog({ | ||
| timestamp: new Date().toISOString(), | ||
| sessionId: updatedSession.sessionId, | ||
| directory: targetArg, | ||
| flags: usedFlags, | ||
| filesFound: mdFiles.length, | ||
| filesProcessed: results.length, | ||
| tokensThisCall, | ||
| totalSessionTokens: updatedSession.totalTokens, | ||
| errors: scanErrors, | ||
| durationMs: Date.now() - startTime, | ||
| mode | ||
| }) | ||
| }) | ||
| program.parse() |
| import * as fs from 'fs' | ||
| import * as path from 'path' | ||
| import { LOG_DIR } from '../utils/constants.js' | ||
| import type { AnalysisResult, RunLog } from '../types/index.js' | ||
| export function extractKeyPoints(doc: AnalysisResult): object { | ||
| return { | ||
| fileName: doc.fileName, title: doc.headings[0]?.text || doc.fileName, level: doc.headings[0]?.level || 1, | ||
| summary: { | ||
| totalHeadings: doc.stats.totalHeadings, totalLinks: doc.stats.totalLinks, totalWikilinks: doc.stats.totalWikilinks, | ||
| totalTokens: doc.stats.tokens, wordCount: doc.stats.wordCount, | ||
| boldCount: doc.stats.boldCount ?? 0, italicCount: doc.stats.italicCount ?? 0, bulletCount: doc.stats.bulletCount ?? 0 | ||
| }, | ||
| keyHeadings: doc.headings.slice(0, 10).map((h, i) => ({ | ||
| level: h.level, text: h.text, line: h.line, | ||
| tokens: doc.sections?.[i]?.tokens ?? 0 | ||
| })), | ||
| importantLinks: doc.links.filter(l => !l.isInternal).slice(0, 3).map(l => ({ text: l.text, url: l.url })), | ||
| internalReferences: doc.links.filter(l => l.isInternal && l.fileName).slice(0, 5).map(l => l.fileName), | ||
| metadata: doc.metadata, readingTime: Math.ceil(doc.stats.wordCount / 200) + ' min' | ||
| } | ||
| } | ||
| export function writeRunLog(log: RunLog): void { | ||
| try { | ||
| if (!fs.existsSync(LOG_DIR)) fs.mkdirSync(LOG_DIR, { recursive: true }) | ||
| const logFile = path.join(LOG_DIR, `${log.sessionId}.json`) | ||
| const existing: RunLog[] = fs.existsSync(logFile) ? JSON.parse(fs.readFileSync(logFile, 'utf-8')) : [] | ||
| existing.push(log) | ||
| fs.writeFileSync(logFile, JSON.stringify(existing, null, 2)) | ||
| } catch (e: unknown) { | ||
| console.error('run_log_write_error:', e instanceof Error ? e.message : e) | ||
| } | ||
| } |
| import * as fs from 'fs' | ||
| import * as path from 'path' | ||
| import { encodingForModel } from 'js-tiktoken' | ||
| import { SKIP_DIRS } from '../utils/constants.js' | ||
| import { extractFrontmatter, extractFragmentMeta, extractHeadings, extractLinks, extractTables, extractWikilinks } from './extractors.js' | ||
| import { countStats } from './counters.js' | ||
| import { walkCodeBlocks, walkLinks, walkHeadings, walkTables, walkFormatting } from './micromark-walk.js' | ||
| import { filterMicromarkLinks, filterMicromarkHeadings, filterMicromarkTables, countCodeBlocks, countFormatting } from './hybrid-merge.js' | ||
| import type { AnalysisResult, SectionInfo } from '../types/index.js' | ||
| export function scanMarkdownFiles(dir: string): { files: string[]; errors: string[] } { | ||
| const files: string[] = [], errors: string[] = [] | ||
| function walk(dir: string): void { | ||
| let entries | ||
| try { entries = fs.readdirSync(dir, { withFileTypes: true }) } | ||
| catch (e: unknown) { errors.push(`permission_denied: ${dir}`); console.error('scan_error:', e instanceof Error ? e.message : e); return } | ||
| for (const entry of entries) { | ||
| if (entry.name.startsWith('.') || SKIP_DIRS.has(entry.name)) continue | ||
| const fullPath = path.join(dir, entry.name) | ||
| try { | ||
| if (entry.isDirectory()) walk(fullPath) | ||
| else if (entry.isFile() && entry.name.endsWith('.md')) files.push(fullPath) | ||
| } catch (e: unknown) { errors.push(`access_error: ${fullPath}`); console.error('access_error:', e instanceof Error ? e.message : e) } | ||
| } | ||
| } | ||
| try { walk(dir) } catch (e: unknown) { errors.push(`scan_error: ${e instanceof Error ? e.message : 'unknown'}`); console.error('walk_error:', e instanceof Error ? e.message : e) } | ||
| return { files, errors } | ||
| } | ||
| function computeSections(content: string, headings: { line: number }[]): SectionInfo[] { | ||
| const bodyLines = content.split('\n') | ||
| return headings.map((h, i) => { | ||
| const startIdx = h.line - 1 | ||
| const endIdx = i + 1 < headings.length ? headings[i + 1].line - 1 : bodyLines.length | ||
| const sectionText = bodyLines.slice(startIdx, endIdx).join('\n') | ||
| let tokens = 0 | ||
| try { tokens = encodingForModel('gpt-4').encode(sectionText).length } | ||
| catch (e: unknown) { | ||
| console.error('section_token_fallback:', e instanceof Error ? e.message : e) | ||
| tokens = Math.ceil(sectionText.length / 4) | ||
| } | ||
| return { line: h.line, tokens } | ||
| }) | ||
| } | ||
| function buildBaseResult(filePath: string, content: string, errors: string[]): AnalysisResult { | ||
| const { metadata, content: markdownContent } = extractFrontmatter(content) | ||
| const fragmentMeta = extractFragmentMeta(metadata) | ||
| const headings = extractHeadings(markdownContent) | ||
| const links = extractLinks(markdownContent) | ||
| const wikilinks = extractWikilinks(markdownContent) | ||
| const tables = extractTables(markdownContent) | ||
| const counts = countStats(markdownContent) | ||
| if (counts.tokens === 0 && !errors.includes('token_count_fallback')) { | ||
| errors.push('token_count_fallback: tiktoken unavailable') | ||
| } | ||
| const sections = computeSections(markdownContent, headings) | ||
| const fileName = path.basename(filePath, '.md') | ||
| return { | ||
| file: filePath, fileName, metadata, fragmentMeta, headings, sections, links, wikilinks, tables, | ||
| stats: { | ||
| totalHeadings: headings.length, totalLinks: links.length, | ||
| internalLinks: links.filter(l => l.isInternal).length, | ||
| externalLinks: links.filter(l => !l.isInternal).length, | ||
| totalWikilinks: wikilinks.length, wordCount: counts.wordCount, | ||
| charCount: counts.charCount, lineCount: counts.lineCount, | ||
| codeBlocks: counts.codeBlocks, tables: tables.length, | ||
| tokens: counts.tokens, errors: errors.length > 0 ? errors : undefined | ||
| } | ||
| } | ||
| } | ||
| export function analyzeFile(filePath: string): AnalysisResult { | ||
| const errors: string[] = [] | ||
| let content = '' | ||
| try { content = fs.readFileSync(filePath, 'utf-8') } | ||
| catch (e: unknown) { | ||
| errors.push(`file_read_error: ${e instanceof Error ? e.message : 'unknown'}`) | ||
| return { | ||
| file: filePath, fileName: path.basename(filePath, '.md'), metadata: null, fragmentMeta: null, | ||
| headings: [], sections: [], links: [], wikilinks: [], tables: [], | ||
| stats: { totalHeadings: 0, totalLinks: 0, internalLinks: 0, externalLinks: 0, totalWikilinks: 0, wordCount: 0, charCount: 0, lineCount: 0, codeBlocks: 0, tables: 0, tokens: 0, errors } | ||
| } | ||
| } | ||
| return buildBaseResult(filePath, content, errors) | ||
| } | ||
| export function analyzeFileWithMicromark(filePath: string): AnalysisResult { | ||
| const errors: string[] = [] | ||
| let content = '' | ||
| try { content = fs.readFileSync(filePath, 'utf-8') } | ||
| catch (e: unknown) { | ||
| errors.push(`file_read_error: ${e instanceof Error ? e.message : 'unknown'}`) | ||
| return { | ||
| file: filePath, fileName: path.basename(filePath, '.md'), metadata: null, fragmentMeta: null, | ||
| headings: [], sections: [], links: [], wikilinks: [], tables: [], | ||
| stats: { totalHeadings: 0, totalLinks: 0, internalLinks: 0, externalLinks: 0, totalWikilinks: 0, wordCount: 0, charCount: 0, lineCount: 0, codeBlocks: 0, tables: 0, tokens: 0, errors } | ||
| } | ||
| } | ||
| const { content: markdownContent } = extractFrontmatter(content) | ||
| try { | ||
| const regions = walkCodeBlocks(markdownContent) | ||
| const mmLinks = walkLinks(markdownContent) | ||
| const mmHeadings = walkHeadings(markdownContent) | ||
| const mmTables = walkTables(markdownContent) | ||
| const mmFormatting = walkFormatting(markdownContent) | ||
| if (mmLinks === null) errors.push('walkLinks_failed') | ||
| if (mmHeadings === null) errors.push('walkHeadings_failed') | ||
| if (mmTables === null) errors.push('walkTables_failed') | ||
| if (mmFormatting === null) errors.push('walkFormatting_failed') | ||
| const safeRegions = regions ?? [] | ||
| const result = buildBaseResult(filePath, content, errors) | ||
| result.links = filterMicromarkLinks(mmLinks ?? [], safeRegions) | ||
| result.stats.totalLinks = result.links.length | ||
| result.stats.internalLinks = result.links.filter(l => l.isInternal).length | ||
| result.stats.externalLinks = result.links.filter(l => !l.isInternal).length | ||
| result.headings = filterMicromarkHeadings(mmHeadings ?? [], safeRegions, markdownContent) | ||
| result.sections = computeSections(markdownContent, result.headings) | ||
| result.stats.totalHeadings = result.headings.length | ||
| result.tables = filterMicromarkTables(mmTables ?? [], safeRegions, markdownContent) | ||
| result.stats.tables = result.tables.length | ||
| result.stats.codeBlocks = countCodeBlocks(regions) | ||
| const fmt = countFormatting(mmFormatting, markdownContent, safeRegions) | ||
| result.stats.boldCount = fmt.boldCount | ||
| result.stats.italicCount = fmt.italicCount | ||
| result.stats.bulletCount = fmt.bulletCount | ||
| result.stats.errors = errors.length > 0 ? errors : undefined | ||
| return result | ||
| } catch (e) { | ||
| errors.push(`micromark_pipeline_failed: ${e instanceof Error ? e.message : 'unknown'}`) | ||
| return buildBaseResult(filePath, content, errors) | ||
| } | ||
| } |
| import { encodingForModel } from 'js-tiktoken' | ||
| export function countStats(content: string): { wordCount: number; charCount: number; lineCount: number; codeBlocks: number; tokens: number } { | ||
| const wordCount = content.split(/\s+/).filter(w => w.length > 0).length | ||
| const charCount = content.length | ||
| const lineCount = content.split('\n').length | ||
| const codeBlocks = (content.match(/```[\s\S]*?```/g) || []).length | ||
| let tokens = 0 | ||
| try { | ||
| tokens = encodingForModel('gpt-4').encode(content).length | ||
| } catch (e: unknown) { | ||
| console.error('token_count_fallback: tiktoken unavailable, using estimate:', e instanceof Error ? e.message : e) | ||
| tokens = Math.ceil(charCount / 4) | ||
| } | ||
| return { wordCount, charCount, lineCount, codeBlocks, tokens } | ||
| } |
| import * as path from 'path' | ||
| import * as yaml from 'js-yaml' | ||
| import type { Link, Wikilink, Heading, Table, FragmentMeta } from '../types/index.js' | ||
| export function extractFrontmatter(content: string): { metadata: Record<string, unknown> | null; content: string } { | ||
| const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n/ | ||
| const match = content.match(frontmatterRegex) | ||
| if (!match) return { metadata: null, content } | ||
| try { | ||
| const parsed = yaml.load(match[1]) | ||
| const metadata = parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : null | ||
| return { metadata, content: content.substring(match[0].length) } | ||
| } catch (e: unknown) { | ||
| console.error('frontmatter_parse_error:', e instanceof Error ? e.message : e) | ||
| return { metadata: null, content } | ||
| } | ||
| } | ||
| export function extractFragmentMeta(metadata: Record<string, unknown> | null): FragmentMeta | null { | ||
| if (!metadata) return null | ||
| const dependsRaw = metadata.depends_on | ||
| const depends: string[] = Array.isArray(dependsRaw) ? dependsRaw.map(String) : (typeof dependsRaw === 'string' ? [dependsRaw] : []) | ||
| const tags: string[] = Array.isArray(metadata.tags) ? metadata.tags.map(String) : (typeof metadata.tags === 'string' ? [metadata.tags] : []) | ||
| return { | ||
| title: String(metadata.title || ''), | ||
| description: metadata.description ? String(metadata.description) : null, | ||
| tags, | ||
| depends_on: depends, | ||
| status: metadata.status ? String(metadata.status) : null, | ||
| source: metadata.source ? String(metadata.source) : null, | ||
| order: metadata.order != null ? Number(metadata.order) : null, | ||
| date_iso: metadata.date_iso ? String(metadata.date_iso) : null, | ||
| } | ||
| } | ||
| /** @deprecated Use walkHeadings from micromark-walk.js instead (token-accurate) */ | ||
| export function extractHeadings(content: string): Heading[] { | ||
| const headings: Heading[] = [] | ||
| const headingRegex = /^(#{1,6})\s+(.+)$/gm | ||
| let match: RegExpExecArray | null | ||
| while ((match = headingRegex.exec(content)) !== null) { | ||
| const line = content.substring(0, match.index).split('\n').length | ||
| headings.push({ level: match[1].length, text: match[2].trim(), line }) | ||
| } | ||
| return headings | ||
| } | ||
| /** @deprecated Use walkLinks from micromark-walk.js instead (token-accurate) */ | ||
| export function extractLinks(content: string): Link[] { | ||
| const links: Link[] = [] | ||
| const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g | ||
| let match: RegExpExecArray | null | ||
| while ((match = linkRegex.exec(content)) !== null) { | ||
| const url = match[2].trim() | ||
| const isInternal = url.startsWith('#') || (!url.startsWith('http') && !url.startsWith('//')) | ||
| let fileName: string | null = null | ||
| if (isInternal && !url.startsWith('#')) { | ||
| const baseName = path.basename(url, '.md') | ||
| if (baseName && baseName !== url) fileName = baseName | ||
| } | ||
| links.push({ text: match[1].trim(), url, isInternal, fileName }) | ||
| } | ||
| return links | ||
| } | ||
| export function extractWikilinks(content: string): Wikilink[] { | ||
| const wikilinks: Wikilink[] = [] | ||
| const wikiRegex = /\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g | ||
| let match: RegExpExecArray | null | ||
| while ((match = wikiRegex.exec(content)) !== null) { | ||
| wikilinks.push({ target: match[1].trim(), display: match[2]?.trim() || null }) | ||
| } | ||
| return wikilinks | ||
| } | ||
| /** @deprecated Use walkTables from micromark-walk.js instead (uses GFM spec) */ | ||
| export function extractTables(content: string): Table[] { | ||
| const tables: Table[] = [] | ||
| const tableRegex = /\|(.+)\|\n\|[-:\s|]+\|\n((?:\|.+\|\n?)+)/g | ||
| let match: RegExpExecArray | null | ||
| while ((match = tableRegex.exec(content)) !== null) { | ||
| const headers = match[1].split('|').map(h => h.trim()).filter(h => h) | ||
| const rows: string[][] = [] | ||
| match[2].trim().split('\n').forEach(row => { | ||
| const cells = row.split('|').map(c => c.trim()).filter(c => c) | ||
| if (cells.length > 0) rows.push(cells) | ||
| }) | ||
| tables.push({ headers, rows }) | ||
| } | ||
| return tables | ||
| } |
| import type { AnalysisResult, Graph, GraphNode } from '../types/index.js' | ||
| function addEdge(graph: Record<string, GraphNode>, edges: { source: string; target: string; type: string }[], source: string, target: string, type: string): void { | ||
| if (!graph[source]) graph[source] = { inbound: [], outbound: [] } | ||
| if (!graph[target]) graph[target] = { inbound: [], outbound: [] } | ||
| if (!graph[source].outbound.includes(target)) graph[source].outbound.push(target) | ||
| if (!graph[target].inbound.includes(source)) graph[target].inbound.push(source) | ||
| edges.push({ source, target, type }) | ||
| } | ||
| export function buildGraph(results: AnalysisResult[]): Graph { | ||
| const graph: Record<string, GraphNode> = {}, edges: { source: string; target: string; type: string }[] = [] | ||
| results.forEach(doc => { | ||
| const source = doc.fileName | ||
| if (!graph[source]) graph[source] = { inbound: [], outbound: [] } | ||
| doc.links.forEach(link => { | ||
| if (link.isInternal && link.fileName) addEdge(graph, edges, source, link.fileName, 'link') | ||
| }) | ||
| doc.wikilinks.forEach(w => { | ||
| const slug = w.target.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') | ||
| if (slug !== source && results.some(r => r.fileName === slug)) addEdge(graph, edges, source, slug, 'wikilink') | ||
| }) | ||
| if (doc.fragmentMeta) { | ||
| doc.fragmentMeta.depends_on.forEach(dep => { | ||
| const depName = dep.replace(/\.md$/, '') | ||
| if (depName !== source && results.some(r => r.fileName === depName)) addEdge(graph, edges, source, depName, 'depends_on') | ||
| }) | ||
| } | ||
| }) | ||
| return { nodes: graph, edges } | ||
| } | ||
| export function findOrphans(graph: Graph, excludeOrphansWithDeps?: Set<string>): string[] { | ||
| return Object.keys(graph.nodes).filter(node => { | ||
| if (excludeOrphansWithDeps?.has(node)) return false | ||
| return graph.nodes[node].inbound.length === 0 && graph.nodes[node].outbound.length === 0 | ||
| }) | ||
| } | ||
| export function findBacklinks(results: AnalysisResult[], targetFileName: string): string[] { | ||
| const backlinks: string[] = [] | ||
| results.forEach(doc => { | ||
| doc.links.forEach(link => { | ||
| if (link.isInternal && link.fileName === targetFileName && !backlinks.includes(doc.fileName)) { | ||
| backlinks.push(doc.fileName) | ||
| } | ||
| }) | ||
| doc.wikilinks.forEach(w => { | ||
| const slug = w.target.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') | ||
| if (slug === targetFileName && !backlinks.includes(doc.fileName)) backlinks.push(doc.fileName) | ||
| }) | ||
| }) | ||
| return backlinks | ||
| } |
| import type { AnalysisResult } from '../types/index.js' | ||
| export function getFragmentHealth(results: AnalysisResult[]): object { | ||
| const total = results.length | ||
| const withFrontmatter = results.filter(r => r.fragmentMeta).length | ||
| const withDeps = results.filter(r => r.fragmentMeta && r.fragmentMeta.depends_on.length > 0).length | ||
| const withWikilinks = results.filter(r => r.stats.totalWikilinks > 0).length | ||
| const withStatus = results.filter(r => r.fragmentMeta && r.fragmentMeta.status).length | ||
| const withDescription = results.filter(r => r.fragmentMeta && r.fragmentMeta.description).length | ||
| const withSource = results.filter(r => r.fragmentMeta && r.fragmentMeta.source).length | ||
| const noTitle = results.filter(r => r.fragmentMeta && !r.fragmentMeta.title).length | ||
| const issues: { file: string; issues: string[] }[] = [] | ||
| for (const r of results) { | ||
| const fileIssues: string[] = [] | ||
| if (!r.fragmentMeta) fileIssues.push('no_frontmatter') | ||
| else { | ||
| if (!r.fragmentMeta.title) fileIssues.push('empty_title') | ||
| if (!r.fragmentMeta.source) fileIssues.push('no_source') | ||
| if (r.fragmentMeta.depends_on.length === 0 && r.stats.totalWikilinks > 0) fileIssues.push('wikilinks_no_depends_on') | ||
| } | ||
| if (fileIssues.length > 0) issues.push({ file: r.fileName, issues: fileIssues }) | ||
| } | ||
| return { total, withFrontmatter, withDeps, withWikilinks, withStatus, withDescription, withSource, noTitle, filesWithIssues: issues.length, issues } | ||
| } |
| import * as path from 'path' | ||
| import type { CodeBlockRegion, FormattingCounts, MicromarkLink } from './micromark-walk.js' | ||
| import type { Link, Heading, Table } from '../types/index.js' | ||
| function isInsideBlock(offset: number, regions: CodeBlockRegion[]): boolean { | ||
| if (regions.length === 0) return false | ||
| return regions.some(r => offset >= r.start && offset < r.end) | ||
| } | ||
| export function filterMicromarkLinks(links: MicromarkLink[], regions: CodeBlockRegion[]): Link[] { | ||
| if (!links || links.length === 0) return [] | ||
| return links | ||
| .filter(ml => { | ||
| if (regions.length === 0) return true | ||
| return !isInsideBlock(ml.start, regions) | ||
| }) | ||
| .map(ml => ({ | ||
| text: ml.text, | ||
| url: ml.url, | ||
| isInternal: ml.url.startsWith('#') || (!ml.url.startsWith('http') && !ml.url.startsWith('//')), | ||
| fileName: (() => { | ||
| if (!ml.url.startsWith('#') && !ml.url.startsWith('http') && !ml.url.startsWith('//')) { | ||
| const baseName = path.basename(ml.url, '.md') | ||
| if (baseName && baseName !== ml.url) return baseName | ||
| } | ||
| return null | ||
| })(), | ||
| isImage: ml.isImage || undefined | ||
| })) | ||
| } | ||
| export function filterMicromarkHeadings(headings: Heading[], regions: CodeBlockRegion[], content: string): Heading[] { | ||
| if (!headings || headings.length === 0) return [] | ||
| if (regions.length === 0) return headings | ||
| return headings.filter(h => { | ||
| const idx = content.indexOf(h.text) | ||
| return idx === -1 || !isInsideBlock(idx, regions) | ||
| }) | ||
| } | ||
| export function filterMicromarkTables(tables: Table[], regions: CodeBlockRegion[], content: string): Table[] { | ||
| if (!tables || tables.length === 0) return [] | ||
| if (regions.length === 0) return tables | ||
| return tables.filter(t => { | ||
| const idx = content.indexOf(t.headers.join('|')) | ||
| return idx === -1 || !isInsideBlock(idx, regions) | ||
| }) | ||
| } | ||
| export function countCodeBlocks(regions: CodeBlockRegion[] | null): number { | ||
| return regions ? regions.length : -1 | ||
| } | ||
| function isInsideAnyBlock(offset: number, regions: CodeBlockRegion[]): boolean { | ||
| return regions.some(r => offset >= r.start && offset < r.end) | ||
| } | ||
| export function countFormatting( | ||
| counts: FormattingCounts | null, | ||
| content: string, | ||
| regions: CodeBlockRegion[] | ||
| ): { boldCount: number; italicCount: number; bulletCount: number } { | ||
| if (!counts) return { boldCount: 0, italicCount: 0, bulletCount: 0 } | ||
| if (regions.length === 0) { | ||
| return { | ||
| boldCount: counts.bold + counts.boldItalic, | ||
| italicCount: counts.italic, | ||
| bulletCount: counts.bullet | ||
| } | ||
| } | ||
| const boldItalicRe = /\*\*\*(.+?)\*\*\*/g | ||
| const boldRe = /(?<!\*)\*\*(?!\*)(.+?)\*\*/g | ||
| const italicRe = /(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g | ||
| const bulletRe = /^[ \t]*[-*+][ \t]/gm | ||
| const isInCode = (offset: number) => isInsideAnyBlock(offset, regions) | ||
| const boldItalicCount = [...content.matchAll(boldItalicRe)].filter(m => !isInCode(m.index)).length | ||
| const boldCount = [...content.matchAll(boldRe)].filter(m => !isInCode(m.index)).length | ||
| const italicCount = [...content.matchAll(italicRe)].filter(m => !isInCode(m.index)).length | ||
| const bulletCount = [...content.matchAll(bulletRe)].filter(m => !isInCode(m.index)).length | ||
| return { | ||
| boldCount: boldCount + boldItalicCount, | ||
| italicCount, | ||
| bulletCount | ||
| } | ||
| } |
| export interface CodeBlockRegion { | ||
| start: number | ||
| end: number | ||
| } | ||
| export interface FormattingCounts { | ||
| bold: number | ||
| italic: number | ||
| boldItalic: number | ||
| bullet: number | ||
| } | ||
| export interface MicromarkLink { | ||
| text: string | ||
| url: string | ||
| start: number | ||
| end: number | ||
| isImage: boolean | ||
| isAutolink: boolean | ||
| isReference: boolean | ||
| } | ||
| import { parse, postprocess, preprocess } from 'micromark' | ||
| import { gfm } from 'micromark-extension-gfm' | ||
| import type { Heading, Table } from '../types/index.js' | ||
| interface MicromarkEvent { | ||
| 0: 'enter' | 'exit' | ||
| 1: { type: string; start: { offset: number }; end?: { offset: number } } | ||
| } | ||
| function parseEvents(content: string, extensions?: any[]): MicromarkEvent[] { | ||
| if (!content) return [] | ||
| const opts = extensions && extensions.length > 0 ? { extensions } : {} | ||
| return postprocess( | ||
| parse(opts).document().write(preprocess()(content, 'utf-8', true)) | ||
| ) | ||
| } | ||
| export function walkCodeBlocks(content: string): CodeBlockRegion[] | null { | ||
| try { | ||
| const events = parseEvents(content) | ||
| const regions: CodeBlockRegion[] = [] | ||
| let depth = 0 | ||
| let currentStart = 0 | ||
| for (const ev of events) { | ||
| const token = ev[1] | ||
| if (token.type === 'codeFenced' || token.type === 'codeIndented') { | ||
| if (ev[0] === 'enter') { | ||
| if (depth === 0) currentStart = token.start.offset | ||
| depth++ | ||
| } else { | ||
| depth-- | ||
| if (depth === 0 && token.end) { | ||
| regions.push({ start: currentStart, end: token.end.offset }) | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return regions | ||
| } catch (e) { | ||
| console.error('walkCodeBlocks_error:', e instanceof Error ? e.message : e) | ||
| return null | ||
| } | ||
| } | ||
| export function walkLinks(content: string): MicromarkLink[] | null { | ||
| try { | ||
| const events = parseEvents(content) | ||
| const definitions = new Map<string, string>() | ||
| for (const ev of events) { | ||
| if (ev[0] === 'enter' && ev[1].type === 'definitionLabelString') { | ||
| const name = content.slice(ev[1].start.offset, ev[1].end?.offset ?? ev[1].start.offset).toLowerCase() | ||
| definitions.set(name, '') | ||
| } else if (ev[0] === 'enter' && ev[1].type === 'definitionDestinationString') { | ||
| const url = content.slice(ev[1].start.offset, ev[1].end?.offset ?? ev[1].start.offset) | ||
| let lastName = '' | ||
| for (const [k, v] of definitions) { | ||
| if (!v) { lastName = k; break } | ||
| } | ||
| if (lastName) definitions.set(lastName, url) | ||
| } | ||
| } | ||
| const links: MicromarkLink[] = [] | ||
| let current: { type: string; start: number; text: string; url: string; hasRef: boolean } | null = null | ||
| for (const ev of events) { | ||
| const token = ev[1] | ||
| const slice = (t: typeof token): string => | ||
| content.slice(t.start.offset, t.end?.offset ?? t.start.offset) | ||
| if (ev[0] === 'enter' && (token.type === 'link' || token.type === 'image' || token.type === 'autolink')) { | ||
| current = { type: token.type, start: token.start.offset, text: '', url: '', hasRef: false } | ||
| } | ||
| if (current && ev[0] === 'enter') { | ||
| if (token.type === 'labelText') { | ||
| current.text = slice(token) | ||
| } else if (token.type === 'resourceDestinationString') { | ||
| current.url = slice(token) | ||
| } else if (token.type === 'referenceString') { | ||
| current.hasRef = true | ||
| current.url = definitions.get(slice(token).toLowerCase()) ?? slice(token) | ||
| } else if (token.type === 'autolinkEmail' || token.type === 'autolinkProtocol') { | ||
| current.url = slice(token) | ||
| if (!current.text) current.text = current.url | ||
| } | ||
| } | ||
| if (ev[0] === 'exit' && current && token.type === current.type) { | ||
| if (token.end && (current.text || current.url)) { | ||
| links.push({ | ||
| text: current.text || current.url, | ||
| url: current.url || current.text, | ||
| start: current.start, | ||
| end: token.end.offset, | ||
| isImage: current.type === 'image', | ||
| isAutolink: current.type === 'autolink', | ||
| isReference: current.hasRef | ||
| }) | ||
| } | ||
| current = null | ||
| } | ||
| } | ||
| return links | ||
| } catch (e) { | ||
| console.error('walkLinks_error:', e instanceof Error ? e.message : e) | ||
| return null | ||
| } | ||
| } | ||
| function offsetToLine(content: string, offset: number): number { | ||
| let line = 1 | ||
| for (let i = 0; i < offset && i < content.length; i++) { | ||
| if (content[i] === '\n') line++ | ||
| } | ||
| return line | ||
| } | ||
| export function walkHeadings(content: string): Heading[] | null { | ||
| try { | ||
| const events = parseEvents(content) | ||
| const headings: Heading[] = [] | ||
| let current: { level: number; text: string; start: number } | null = null | ||
| for (const ev of events) { | ||
| const token = ev[1] | ||
| const slice = (t: typeof token): string => | ||
| content.slice(t.start.offset, t.end?.offset ?? t.start.offset) | ||
| if (ev[0] === 'enter') { | ||
| if (token.type === 'setextHeadingText') { | ||
| current = { level: 0, text: slice(token), start: token.start.offset } | ||
| } else if (token.type === 'setextHeadingLineSequence') { | ||
| if (current) current.level = slice(token).startsWith('=') ? 1 : 2 | ||
| } else if (token.type === 'atxHeadingSequence') { | ||
| current = { level: slice(token).length, text: '', start: token.start.offset } | ||
| } else if (token.type === 'atxHeadingText') { | ||
| if (current) current.text = slice(token) | ||
| } | ||
| } | ||
| if (ev[0] === 'exit' && current && (token.type === 'atxHeading' || token.type === 'setextHeading')) { | ||
| headings.push({ | ||
| level: current.level, | ||
| text: current.text.trim(), | ||
| line: offsetToLine(content, current.start) | ||
| }) | ||
| current = null | ||
| } | ||
| } | ||
| return headings.length > 0 ? headings : null | ||
| } catch (e) { | ||
| console.error('walkHeadings_error:', e instanceof Error ? e.message : e) | ||
| return null | ||
| } | ||
| } | ||
| export function walkFormatting(content: string): FormattingCounts | null { | ||
| try { | ||
| const boldItalicRe = /\*\*\*(.+?)\*\*\*/g | ||
| const boldRe = /(?<!\*)\*\*(?!\*)(.+?)\*\*/g | ||
| const italicRe = /(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g | ||
| const bulletRe = /^[ \t]*[-*+][ \t]/gm | ||
| const boldItalicMatches = [...content.matchAll(boldItalicRe)] | ||
| const boldMatches = [...content.matchAll(boldRe)] | ||
| const italicMatches = [...content.matchAll(italicRe)] | ||
| const bulletMatches = [...content.matchAll(bulletRe)] | ||
| return { | ||
| bold: boldMatches.length, | ||
| italic: italicMatches.length, | ||
| boldItalic: boldItalicMatches.length, | ||
| bullet: bulletMatches.length | ||
| } | ||
| } catch (e) { | ||
| console.error('walkFormatting_error:', e instanceof Error ? e.message : e) | ||
| return null | ||
| } | ||
| } | ||
| export function walkTables(content: string): Table[] | null { | ||
| try { | ||
| const events = parseEvents(content, [gfm()]) | ||
| const tables: Table[] = [] | ||
| let currentTable: { headers: string[]; rows: string[][] } | null = null | ||
| let inHead = false | ||
| let inBody = false | ||
| let currentRow: string[] | null = null | ||
| let currentCell: string | null = null | ||
| for (const ev of events) { | ||
| const token = ev[1] | ||
| const slice = (t: typeof token): string => | ||
| content.slice(t.start.offset, t.end?.offset ?? t.start.offset) | ||
| if (ev[0] === 'enter') { | ||
| if (token.type === 'table') { | ||
| currentTable = { headers: [], rows: [] } | ||
| } else if (token.type === 'tableHead') { | ||
| inHead = true | ||
| } else if (token.type === 'tableBody') { | ||
| inBody = true | ||
| } else if (token.type === 'tableRow' && (inHead || inBody)) { | ||
| currentRow = [] | ||
| } else if (token.type === 'tableHeader' && inHead) { | ||
| currentCell = '' | ||
| } else if (token.type === 'tableData' && inBody) { | ||
| currentCell = '' | ||
| } else if (token.type === 'tableContent' && currentCell !== null) { | ||
| currentCell = slice(token) | ||
| } | ||
| } | ||
| if (ev[0] === 'exit') { | ||
| if (token.type === 'tableHeader' && inHead && currentCell !== null) { | ||
| if (currentRow) currentRow.push(currentCell) | ||
| currentCell = null | ||
| } else if (token.type === 'tableData' && inBody && currentCell !== null) { | ||
| if (currentRow) currentRow.push(currentCell) | ||
| currentCell = null | ||
| } else if (token.type === 'tableRow' && currentRow !== null) { | ||
| if (inHead) currentTable!.headers = currentRow | ||
| else if (inBody) currentTable!.rows.push(currentRow) | ||
| currentRow = null | ||
| } else if (token.type === 'tableHead') { | ||
| inHead = false | ||
| } else if (token.type === 'tableBody') { | ||
| inBody = false | ||
| } else if (token.type === 'table' && currentTable) { | ||
| tables.push(currentTable) | ||
| currentTable = null | ||
| } | ||
| } | ||
| } | ||
| return tables.length > 0 ? tables : null | ||
| } catch (e) { | ||
| console.error('walkTables_error:', e instanceof Error ? e.message : e) | ||
| return null | ||
| } | ||
| } |
| import { z } from 'zod' | ||
| import * as path from 'path' | ||
| import * as os from 'os' | ||
| const defaultSessionFile = path.join(os.homedir(), '.local', 'share', 'md-analyzer', 'tokens', 'md-analyzer-session.json') | ||
| export const CliOptions = z.object({ | ||
| directory: z.string().optional(), | ||
| json: z.boolean().default(false), | ||
| search: z.string().min(1, 'Search keyword cannot be empty').optional(), | ||
| filter: z.string().regex(/^[^=]+=.+$/, 'Filter must be in format key=value').optional(), | ||
| rank: z.boolean().default(false), | ||
| graph: z.boolean().default(false), | ||
| deps: z.boolean().default(false), | ||
| orphans: z.boolean().default(false), | ||
| backlinks: z.string().min(1, 'Backlinks target cannot be empty').optional(), | ||
| keypoints: z.boolean().default(false), | ||
| lintFragments: z.boolean().default(false), | ||
| session: z.boolean().default(false), | ||
| budget: z.number().int().positive('Budget must be a positive integer').default(100000), | ||
| maxResults: z.number().int().nonnegative('max-results must be non-negative').default(0), | ||
| }) | ||
| export type CliOptions = z.infer<typeof CliOptions> | ||
| export const AnalyzerConfigSchema = z.object({ | ||
| default_directory: z.string().default(''), | ||
| default_budget: z.number().int().positive().default(100000), | ||
| max_tokens: z.number().int().positive().default(200000), | ||
| max_results_default: z.number().int().nonnegative().default(20), | ||
| session_file: z.string().default(defaultSessionFile), | ||
| }) | ||
| export type AnalyzerConfig = z.infer<typeof AnalyzerConfigSchema> |
| import * as fs from 'fs' | ||
| import * as cp from 'child_process' | ||
| import * as path from 'path' | ||
| import type { AnalysisResult } from '../types/index.js' | ||
| let _rgAvailable: boolean | null = null | ||
| function isRgAvailable(): boolean { | ||
| if (_rgAvailable === null) { | ||
| try { cp.execSync('rg --version', { stdio: 'ignore' }); _rgAvailable = true } | ||
| catch { _rgAvailable = false } | ||
| } | ||
| return _rgAvailable | ||
| } | ||
| export function searchContent(results: AnalysisResult[], keyword: string): AnalysisResult[] { | ||
| const kw = keyword.toLowerCase() | ||
| const files = results.map(r => r.file) | ||
| if (files.length === 0) return [] | ||
| if (!isRgAvailable()) { | ||
| return results.filter(doc => { | ||
| const content = fs.readFileSync(doc.file, 'utf-8').toLowerCase() | ||
| return content.includes(kw) | ||
| }) | ||
| } | ||
| try { | ||
| const out = cp.execFileSync('rg', ['-ilF', kw, ...files], { encoding: 'utf-8', timeout: 30000, maxBuffer: 10 * 1024 * 1024 }) | ||
| const matched = new Set(out.trim().split('\n').filter(Boolean).map(f => path.resolve(f))) | ||
| return results.filter(r => matched.has(r.file)) | ||
| } catch { | ||
| return [] | ||
| } | ||
| } | ||
| export function filterByMetadata(results: AnalysisResult[], key: string, value: string): AnalysisResult[] { | ||
| return results.filter(doc => doc.metadata && String(doc.metadata[key] || '') === value) | ||
| } | ||
| export function rankByRelevance(results: AnalysisResult[], keyword: string): AnalysisResult[] { | ||
| const kw = keyword.toLowerCase() | ||
| const files = results.map(r => r.file) | ||
| if (files.length === 0) return [] | ||
| if (!isRgAvailable()) { | ||
| return [...results].sort((a, b) => { | ||
| const countA = (fs.readFileSync(a.file, 'utf-8').toLowerCase().match(new RegExp(kw, 'g')) || []).length | ||
| const countB = (fs.readFileSync(b.file, 'utf-8').toLowerCase().match(new RegExp(kw, 'g')) || []).length | ||
| return countB - countA | ||
| }) | ||
| } | ||
| const counts = new Map<string, number>() | ||
| try { | ||
| const out = cp.execFileSync('rg', ['-icF', kw, ...files], { encoding: 'utf-8', timeout: 30000, maxBuffer: 10 * 1024 * 1024 }) | ||
| for (const line of out.trim().split('\n').filter(Boolean)) { | ||
| const idx = line.lastIndexOf(':') | ||
| if (idx > 0) { | ||
| const f = line.slice(0, idx) | ||
| const c = parseInt(line.slice(idx + 1), 10) | ||
| if (!isNaN(c)) counts.set(f, c) | ||
| } | ||
| } | ||
| } catch {} | ||
| return [...results].sort((a, b) => (counts.get(b.file) ?? 0) - (counts.get(a.file) ?? 0)) | ||
| } |
| import * as fs from 'fs' | ||
| import * as path from 'path' | ||
| import { SESSION_FILE } from '../utils/constants.js' | ||
| import type { AnalysisResult, SessionStats } from '../types/index.js' | ||
| export function loadSession(): SessionStats { | ||
| try { | ||
| return JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8')) | ||
| } catch (e: unknown) { | ||
| console.error('session_load: new session created') | ||
| return { sessionId: `session-${Date.now()}`, calls: 0, totalTokens: 0, filesProcessed: 0, startTime: new Date().toISOString() } | ||
| } | ||
| } | ||
| export function saveSession(session: SessionStats): void { | ||
| try { | ||
| const dir = path.dirname(SESSION_FILE) | ||
| if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }) | ||
| fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2)) | ||
| } catch (e: unknown) { | ||
| console.error('session_save_error:', e instanceof Error ? e.message : e) | ||
| } | ||
| } | ||
| export function updateSessionStats(results: AnalysisResult[], session: SessionStats): SessionStats { | ||
| const tokensThisCall = results.reduce((sum, r) => sum + r.stats.tokens, 0) | ||
| return { ...session, calls: session.calls + 1, totalTokens: session.totalTokens + tokensThisCall, filesProcessed: session.filesProcessed + results.length } | ||
| } | ||
| export function getTokenBudgetReport(session: SessionStats, budget: number): object { | ||
| const remaining = budget - session.totalTokens | ||
| const percentUsed = Math.round((session.totalTokens / budget) * 100) | ||
| return { | ||
| sessionId: session.sessionId, totalCalls: session.calls, totalTokens: session.totalTokens, budget, remaining, | ||
| percentUsed: percentUsed + '%', status: percentUsed >= 100 ? 'EXCEEDED' : percentUsed >= 80 ? 'WARNING' : 'OK' | ||
| } | ||
| } |
-15
| export { analyzeFile, analyzeFileWithMicromark, scanMarkdownFiles } from './core/analyzer.js' | ||
| export { buildGraph, findOrphans, findBacklinks } from './core/graph.js' | ||
| export { searchContent, filterByMetadata, rankByRelevance } from './core/search.js' | ||
| export { getFragmentHealth } from './core/health.js' | ||
| export { loadSession, saveSession, updateSessionStats, getTokenBudgetReport } from './core/session.js' | ||
| export { countStats } from './core/counters.js' | ||
| export { extractFrontmatter, extractFragmentMeta, extractHeadings, extractLinks, extractWikilinks, extractTables } from './core/extractors.js' | ||
| export { CliOptions, AnalyzerConfigSchema } from './core/schema.js' | ||
| export type { AnalyzerConfig } from './core/schema.js' | ||
| export type { | ||
| Link, Wikilink, Heading, Table, FragmentMeta, Stats, SectionInfo, | ||
| AnalysisResult, GraphNode, Graph, SessionStats, RunLog | ||
| } from './types/index.js' |
| export interface Link { | ||
| text: string | ||
| url: string | ||
| isInternal: boolean | ||
| fileName: string | null | ||
| isImage?: boolean | ||
| } | ||
| export interface Wikilink { | ||
| target: string | ||
| display: string | null | ||
| } | ||
| export interface Heading { | ||
| level: number | ||
| text: string | ||
| line: number | ||
| } | ||
| export interface Table { | ||
| headers: string[] | ||
| rows: string[][] | ||
| } | ||
| export interface FragmentMeta { | ||
| title: string | ||
| description: string | null | ||
| tags: string[] | ||
| depends_on: string[] | ||
| status: string | null | ||
| source: string | null | ||
| order: number | null | ||
| date_iso: string | null | ||
| } | ||
| export interface Stats { | ||
| totalHeadings: number | ||
| totalLinks: number | ||
| internalLinks: number | ||
| externalLinks: number | ||
| totalWikilinks: number | ||
| wordCount: number | ||
| charCount: number | ||
| lineCount: number | ||
| codeBlocks: number | ||
| tables: number | ||
| tokens: number | ||
| boldCount?: number | ||
| italicCount?: number | ||
| bulletCount?: number | ||
| errors?: string[] | ||
| } | ||
| export interface SectionInfo { | ||
| line: number | ||
| tokens: number | ||
| } | ||
| export interface AnalysisResult { | ||
| file: string | ||
| fileName: string | ||
| metadata: Record<string, unknown> | null | ||
| fragmentMeta: FragmentMeta | null | ||
| headings: Heading[] | ||
| sections: SectionInfo[] | ||
| links: Link[] | ||
| wikilinks: Wikilink[] | ||
| tables: Table[] | ||
| stats: Stats | ||
| } | ||
| export interface GraphNode { | ||
| inbound: string[] | ||
| outbound: string[] | ||
| } | ||
| export interface Graph { | ||
| nodes: Record<string, GraphNode> | ||
| edges: { source: string; target: string; type: string }[] | ||
| } | ||
| export interface SessionStats { | ||
| sessionId: string | ||
| calls: number | ||
| totalTokens: number | ||
| filesProcessed: number | ||
| startTime: string | ||
| } | ||
| export interface RunLog { | ||
| timestamp: string | ||
| sessionId: string | ||
| directory: string | ||
| flags: string[] | ||
| filesFound: number | ||
| filesProcessed: number | ||
| tokensThisCall: number | ||
| totalSessionTokens: number | ||
| errors: string[] | ||
| durationMs: number | ||
| mode: string | ||
| } | ||
| export interface AnalyzerConfig { | ||
| default_directory: string | ||
| default_budget: number | ||
| max_tokens: number | ||
| max_results_default: number | ||
| session_file: string | ||
| } |
| import * as fs from 'fs' | ||
| import * as path from 'path' | ||
| import { fileURLToPath } from 'url' | ||
| import { AnalyzerConfigSchema } from '../core/schema.js' | ||
| import type { AnalyzerConfig } from '../core/schema.js' | ||
| const __filename = fileURLToPath(import.meta.url) | ||
| const __dirname = path.dirname(__filename) | ||
| const DEFAULT_CONFIG: AnalyzerConfig = AnalyzerConfigSchema.parse({}) | ||
| export function getTomlConfig(tomlPath: string): AnalyzerConfig { | ||
| try { | ||
| const content = fs.readFileSync(tomlPath, 'utf-8') | ||
| const config: Record<string, string> = {} | ||
| let inConfigSection = false | ||
| content.split('\n').forEach(line => { | ||
| const trimmed = line.trim() | ||
| if (trimmed === '[tool.md-analyzer.config]') { inConfigSection = true; return } | ||
| if (inConfigSection) { | ||
| if (trimmed.startsWith('[')) { inConfigSection = false; return } | ||
| if (trimmed.includes('=')) { | ||
| const separatorIdx = trimmed.indexOf('=') | ||
| const key = trimmed.substring(0, separatorIdx).trim() | ||
| const value = trimmed.substring(separatorIdx + 1).trim().replace(/^["']|["']$/g, '') | ||
| config[key] = value | ||
| } | ||
| } | ||
| }) | ||
| return { | ||
| default_directory: config['default_directory'] || DEFAULT_CONFIG.default_directory, | ||
| default_budget: parseInt(config['default_budget'] || '', 10) || DEFAULT_CONFIG.default_budget, | ||
| max_tokens: parseInt(config['max_tokens'] || '', 10) || DEFAULT_CONFIG.max_tokens, | ||
| max_results_default: parseInt(config['max_results_default'] || '', 10) || DEFAULT_CONFIG.max_results_default, | ||
| session_file: config['session_file'] || DEFAULT_CONFIG.session_file, | ||
| } | ||
| } catch (e: unknown) { | ||
| console.error('config_load_error: could not read hooks.toml:', e instanceof Error ? e.message : e) | ||
| return { ...DEFAULT_CONFIG } | ||
| } | ||
| } | ||
| export function resolveConfigPath(): string { | ||
| const candidates = [ | ||
| path.join(__dirname, '..', '..', 'hooks.toml'), | ||
| path.join(__dirname, '..', 'hooks.toml'), | ||
| path.join(process.cwd(), 'hooks.toml'), | ||
| ] | ||
| for (const candidate of candidates) { | ||
| if (fs.existsSync(candidate)) return candidate | ||
| } | ||
| return candidates[0] | ||
| } |
| import * as path from 'path' | ||
| import * as os from 'os' | ||
| import { fileURLToPath } from 'url' | ||
| const __filename = fileURLToPath(import.meta.url) | ||
| const __dirname = path.dirname(__filename) | ||
| export const SKIP_DIRS = new Set([ | ||
| 'node_modules', '.git', '.svn', '.hg', | ||
| 'services', 'data', 'appendonlydir', | ||
| 'dist', 'build', '__pycache__', '.next', 'coverage' | ||
| ]) | ||
| // Get STATE_DIR from env, default to XDG data dir (~/.local/share/md-analyzer) | ||
| const STATE_DIR = process.env.STATE_DIR || path.join(os.homedir(), '.local', 'share', 'md-analyzer') | ||
| export const SESSION_FILE = path.join(STATE_DIR, 'tokens', 'md-analyzer-session.json') | ||
| // Get LOG_DIR from env, default to XDG state dir (~/.local/state/md-analyzer) | ||
| export const LOG_DIR = process.env.LOG_DIR || path.join(os.homedir(), '.local', 'state', 'md-analyzer', 'log') |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
11
-38.89%1
-50%145257
-17.73%8
33.33%57
-18.57%1544
-36.28%334
-8.74%