kirograph 1.1.1 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/bin/commands/memory.js +12 -2
- package/dist/bin/commands/memory.js.map +2 -2
- package/dist/bin/commands/wiki.js +3 -2
- package/dist/bin/commands/wiki.js.map +2 -2
- package/dist/bin/kirograph.js +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +2 -2
- package/dist/db/memory-schema.sql +2 -1
- package/dist/mcp/handlers/memory.js +2 -1
- package/dist/mcp/handlers/memory.js.map +2 -2
- package/dist/mcp/handlers/wiki.js +4 -2
- package/dist/mcp/handlers/wiki.js.map +2 -2
- package/dist/mcp/tools.js +2 -1
- package/dist/mcp/tools.js.map +2 -2
- package/dist/memory/database.js +17 -4
- package/dist/memory/database.js.map +2 -2
- package/dist/memory/index.js +18 -1
- package/dist/memory/index.js.map +2 -2
- package/dist/memory/schema.js +35 -0
- package/dist/memory/schema.js.map +2 -2
- package/dist/memory/types.js.map +1 -1
- package/dist/patterns/loader.js +2 -146
- package/dist/patterns/loader.js.map +3 -3
- package/dist/security/manifest/plugins/maven.js +33 -3
- package/dist/security/manifest/plugins/maven.js.map +2 -2
- package/dist/security/manifest/plugins/npm.js +32 -3
- package/dist/security/manifest/plugins/npm.js.map +2 -2
- package/dist/shared/json-schema.js +136 -0
- package/dist/shared/json-schema.js.map +7 -0
- package/dist/shared/yaml.js +174 -0
- package/dist/shared/yaml.js.map +7 -0
- package/dist/wiki/index.js +3 -1
- package/dist/wiki/index.js.map +2 -2
- package/dist/wiki/lint.js +14 -1
- package/dist/wiki/lint.js.map +2 -2
- package/dist/wiki/typed-pages.js +67 -0
- package/dist/wiki/typed-pages.js.map +7 -0
- package/dist/wiki/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/commands/wiki.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph Wiki CLI\n *\n * kirograph wiki init\n * kirograph wiki ingest [source-file]\n * kirograph wiki apply-diff [diff-file]\n * kirograph wiki search <query>\n * kirograph wiki page <slug>\n * kirograph wiki list\n * kirograph wiki lint\n * kirograph wiki links <slug>\n * kirograph wiki rename <from> <to>\n * kirograph wiki reindex\n * kirograph wiki status\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport { dim, reset, violet, bold, section, green } from '../ui';\n\nconst yellow = '\\x1b[33m';\n\nasync function getWiki(cwd: string) {\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../../wiki/index.js'));\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n\n if (!KiroGraph.isInitialized(cwd)) {\n console.error(' \u2716 KiroGraph is not initialized. Run `kirograph init` first.');\n process.exit(1);\n }\n const config = await loadConfig(cwd);\n if (!config.enableWiki) {\n console.error(' \u2716 Wiki is not enabled. Set enableWiki: true in .kirograph/config.json');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyWikiSchema();\n\n const kirographDir = `${cwd}/.kirograph`;\n const wiki = new KiroGraphWiki(db.getRawDb(), kirographDir, {\n autoResolveConflicts: config.wikiAutoResolveConflicts,\n });\n wiki.initialize();\n return wiki;\n}\n\nfunction readStdinSync(): string {\n return fs.readFileSync('/dev/stdin', 'utf8');\n}\n\nexport function register(program: Command): void {\n const wiki = program\n .command('wiki')\n .description('LLM-maintained structured wiki (requires enableWiki: true)');\n\n // \u2500\u2500 init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('init')\n .description('Initialize wiki: create SCHEMA.md and MANIFEST.md in .kirograph/wiki/')\n .action(async () => {\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../../wiki/index.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const cwd = process.cwd();\n if (!KiroGraph.isInitialized(cwd)) {\n console.error(' \u2716 KiroGraph is not initialized. Run `kirograph init` first.');\n process.exit(1);\n }\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const config = await loadConfig(cwd);\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const w = new KiroGraphWiki(db.getRawDb(), `${cwd}/.kirograph`, {\n autoResolveConflicts: config.wikiAutoResolveConflicts,\n });\n w.initWiki();\n console.log(`\\n ${green}\u2713${reset} Wiki initialized in ${dim}.kirograph/wiki/${reset}`);\n console.log(` ${dim}Edit .kirograph/wiki/SCHEMA.md to customize naming and page structure.${reset}\\n`);\n });\n\n // \u2500\u2500 ingest \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('ingest [source]')\n .description('Print the ingest prompt for the LLM (reads file or stdin)')\n .option('--name <name>', 'Source name to include in the prompt')\n .action(async (source: string | undefined, opts: { name?: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n\n let content: string;\n let sourceName = opts.name ?? source ?? 'source';\n\n if (source && fs.existsSync(source)) {\n content = fs.readFileSync(source, 'utf8');\n sourceName = opts.name ?? source;\n } else if (source) {\n content = source;\n } else {\n content = readStdinSync();\n }\n\n const prompt = w.getIngestPrompt(content, sourceName);\n console.log(`\\n ${section('Wiki Ingest Prompt')} ${dim}(pass to LLM, then run wiki apply-diff)${reset}\\n`);\n console.log(prompt);\n console.log();\n });\n\n // \u2500\u2500 apply-diff \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('apply-diff [diff]')\n .description('Apply a WIKI_DIFF string to the wiki (reads file or stdin)')\n .action(async (diff: string | undefined) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n\n let rawDiff: string;\n if (diff && fs.existsSync(diff)) {\n rawDiff = fs.readFileSync(diff, 'utf8');\n } else if (diff) {\n rawDiff = diff;\n } else {\n rawDiff = readStdinSync();\n }\n\n const result = w.applyDiff(rawDiff);\n\n console.log(`\\n ${green}\u2713${reset} Wiki diff applied\\n`);\n if (result.created.length) {\n console.log(` ${violet}Created:${reset} ${result.created.join(', ')}`);\n }\n if (result.updated.length) {\n console.log(` ${violet}Updated:${reset} ${result.updated.join(', ')}`);\n }\n if (result.conflictsResolved.length) {\n console.log(` ${green}Conflicts resolved:${reset} ${result.conflictsResolved.join(', ')}`);\n }\n if (result.conflictsPending.length) {\n console.log(`\\n ${yellow}\u26A1 Conflicts pending (${result.conflictsPending.length}):${reset}`);\n for (const c of result.conflictsPending) {\n console.log(` ${dim} ${c.page} \u00A7${c.section}${reset}`);\n console.log(` existing: \"${c.existing}\"`);\n console.log(` incoming: \"${c.incoming}\" (source: ${c.source})`);\n }\n }\n console.log();\n });\n\n // \u2500\u2500 search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('search <query>')\n .description('Full-text search over wiki pages')\n .option('--limit <n>', 'Max results', '5')\n .option('--format <fmt>', 'Output format: text, json', 'text')\n .action(async (query: string, opts: { limit: string; format: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const results = w.search(query, parseInt(opts.limit));\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(results.map(r => ({\n slug: r.page.slug,\n title: r.page.title,\n score: r.score,\n updatedAt: r.page.updatedAt,\n })), null, 2));\n return;\n }\n\n if (results.length === 0) {\n console.log(`\\n ${dim}No wiki pages found for \"${query}\"${reset}\\n`);\n return;\n }\n\n console.log(`\\n ${section('Wiki Search:')} ${violet}${bold}${query}${reset}\\n`);\n for (const { page, score } of results) {\n console.log(` ${violet}[${page.slug}]${reset} ${bold}${page.title}${reset} ${dim}score: ${score.toFixed(3)}${reset}`);\n const preview = page.content.split('\\n').find(l => l.trim() && !l.startsWith('#'));\n if (preview) console.log(` ${dim}${preview.trim().slice(0, 120)}${reset}`);\n console.log();\n }\n });\n\n // \u2500\u2500 page \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('page <slug>')\n .description('Print the full content of a wiki page')\n .action(async (slug: string) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const page = w.getPage(slug);\n if (!page) {\n console.error(` \u2716 Wiki page \"${slug}\" not found. Run \\`kirograph wiki list\\` to see available pages.`);\n process.exit(1);\n }\n console.log();\n console.log(page.content);\n });\n\n // \u2500\u2500 list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('list')\n .description('List all wiki pages')\n .option('--format <fmt>', 'Output format: text, json', 'text')\n .action(async (opts: { format: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const pages = w.listPages();\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(pages.map(p => ({\n slug: p.slug,\n title: p.title,\n sourceCount: p.sourceCount,\n updatedAt: p.updatedAt,\n })), null, 2));\n return;\n }\n\n const stats = w.getStats();\n console.log(`\\n ${section('Wiki')} ${dim}${stats.pageCount} page(s)${reset}\\n`);\n if (pages.length === 0) {\n console.log(` ${dim}No pages yet. Run \\`kirograph wiki ingest\\` to add pages.${reset}\\n`);\n return;\n }\n for (const p of pages) {\n const date = new Date(p.updatedAt).toISOString().slice(0, 10);\n console.log(` ${violet}${p.slug.padEnd(32)}${reset} ${p.title} ${dim}(${p.sourceCount} src, ${date})${reset}`);\n }\n console.log();\n });\n\n // \u2500\u2500 lint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('lint')\n .description('Health check the wiki for issues')\n .action(async () => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const issues = w.lint();\n\n if (issues.length === 0) {\n console.log(`\\n ${green}\u2713${reset} Wiki lint passed \u2014 no issues found.\\n`);\n return;\n }\n\n console.log(`\\n ${section('Wiki Lint')} ${yellow}${issues.length} issue(s)${reset}\\n`);\n for (const issue of issues) {\n const icon = issue.kind === 'contradiction' ? '\u26A1' : issue.kind === 'orphan' ? '\u25CB' : issue.kind === 'broken_link' ? '\uD83D\uDD17' : '\u26A0';\n console.log(` ${icon} ${dim}[${issue.kind}]${reset} ${violet}${issue.slug}${reset}`);\n console.log(` ${issue.detail}`);\n console.log();\n }\n });\n\n // \u2500\u2500 links \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('links <slug>')\n .description('Show outgoing, broken, and incoming [[slug]] links for a page')\n .option('--format <fmt>', 'Output format: text, json', 'text')\n .action(async (slug: string, opts: { format: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const links = w.getLinks(slug);\n\n if (!links) {\n console.error(` \u2716 Wiki page \"${slug}\" not found. Run \\`kirograph wiki list\\` to see available pages.`);\n process.exit(1);\n }\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(links, null, 2));\n return;\n }\n\n console.log(`\\n ${section('Wiki Links:')} ${violet}${bold}${slug}${reset}\\n`);\n\n console.log(` ${bold}Outgoing${reset} ${dim}(${links.outgoing.length})${reset}`);\n if (links.outgoing.length === 0) {\n console.log(` ${dim}(none)${reset}`);\n } else {\n for (const s of links.outgoing) console.log(` ${violet}\u2192${reset} [[${s}]]`);\n }\n\n if (links.broken.length > 0) {\n console.log(`\\n ${yellow}Broken${reset} ${dim}(${links.broken.length})${reset}`);\n for (const s of links.broken) console.log(` ${yellow}\u26A0${reset} [[${s}]] ${dim}\u2014 page does not exist${reset}`);\n }\n\n console.log(`\\n ${bold}Incoming${reset} ${dim}(${links.incoming.length}) \u2014 pages that link here${reset}`);\n if (links.incoming.length === 0) {\n console.log(` ${dim}(none)${reset}`);\n } else {\n for (const s of links.incoming) console.log(` ${violet}\u2190${reset} [[${s}]]`);\n }\n console.log();\n });\n\n // \u2500\u2500 rename \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('rename <from> <to>')\n .description('Rename a page slug, moving its file and updating every [[slug]] reference to it')\n .action(async (from: string, to: string) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n\n let result;\n try {\n result = w.rename(from, to);\n } catch (err) {\n console.error(` \u2716 ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n console.log(`\\n ${green}\u2713${reset} Renamed ${violet}[[${result.from}]]${reset} \u2192 ${violet}[[${result.to}]]${reset}\\n`);\n if (result.linksUpdated.length > 0) {\n console.log(` ${bold}Links updated in ${result.linksUpdated.length} page(s):${reset}`);\n for (const s of result.linksUpdated) console.log(` ${dim}\u00B7${reset} ${s}`);\n } else {\n console.log(` ${dim}No other pages referenced [[${result.from}]].${reset}`);\n }\n console.log();\n });\n\n // \u2500\u2500 reindex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('reindex')\n .description('Rebuild SQLite index from .kirograph/wiki/*.md files')\n .action(async () => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const count = w.reindex();\n console.log(`\\n ${green}\u2713${reset} Reindexed ${bold}${count}${reset} wiki page(s)\\n`);\n });\n\n // \u2500\u2500 status \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('status')\n .description('Wiki subsystem stats')\n .action(async () => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const stats = w.getStats();\n const oldest = stats.oldestPage ? new Date(stats.oldestPage).toISOString().slice(0, 10) : 'n/a';\n const newest = stats.newestPage ? new Date(stats.newestPage).toISOString().slice(0, 10) : 'n/a';\n console.log(`\\n ${section('Wiki Status')}\\n`);\n console.log(` Pages: ${bold}${stats.pageCount}${reset}`);\n console.log(` Total sources: ${bold}${stats.totalSources}${reset}`);\n console.log(` Oldest page: ${dim}${oldest}${reset}`);\n console.log(` Newest page: ${dim}${newest}${reset}`);\n console.log(` Wiki dir: ${dim}.kirograph/wiki/${reset}\\n`);\n });\n\n // \u2500\u2500 synthesize (local model) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('synthesize')\n .description('Run local-model wiki synthesis: process the pending source queue (wikiSynthesisMode: local)')\n .option('--quiet', 'suppress progress output')\n .action(async (opts) => {\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../../wiki/index.js'));\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const cwd = process.cwd();\n\n if (!KiroGraph.isInitialized(cwd)) {\n console.error(' \u2716 KiroGraph is not initialized. Run `kirograph init` first.');\n process.exit(1);\n }\n const config = await loadConfig(cwd);\n if (!config.enableWiki) {\n console.error(' \u2716 Wiki is not enabled.');\n process.exit(1);\n }\n if (config.wikiSynthesisMode !== 'local') {\n console.error(' \u2716 wikiSynthesisMode is not \"local\". This command is for local-model synthesis only.');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const w = new KiroGraphWiki(db.getRawDb(), `${cwd}/.kirograph`, {\n autoResolveConflicts: config.wikiAutoResolveConflicts,\n });\n w.initialize();\n\n const queueCount = w.getQueueCount();\n if (queueCount === 0) {\n if (!opts.quiet) console.log(`\\n ${dim}Wiki queue is empty \u2014 nothing to synthesize.${reset}\\n`);\n process.exit(0);\n }\n\n if (!opts.quiet) console.log(`\\n ${yellow}\u27F3${reset} Synthesizing ${bold}${queueCount}${reset} queued source(s) with local model...\\n`);\n\n const result = await w.synthesize(config.wikiLocalModel, !!opts.quiet);\n\n if (!opts.quiet) {\n if (result.processed > 0) {\n console.log(` ${green}\u2713${reset} Processed: ${bold}${result.processed}${reset} source(s)`);\n if (result.created.length) console.log(` ${green}\u2713${reset} Created: ${result.created.join(', ')}`);\n if (result.updated.length) console.log(` ${green}\u2713${reset} Updated: ${result.updated.join(', ')}`);\n }\n if (result.errors.length) {\n for (const e of result.errors) console.error(` ${yellow}\u26A0${reset} ${e}`);\n }\n console.log('');\n }\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph Wiki CLI\n *\n * kirograph wiki init\n * kirograph wiki ingest [source-file]\n * kirograph wiki apply-diff [diff-file]\n * kirograph wiki search <query>\n * kirograph wiki page <slug>\n * kirograph wiki list\n * kirograph wiki lint\n * kirograph wiki links <slug>\n * kirograph wiki rename <from> <to>\n * kirograph wiki reindex\n * kirograph wiki status\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport { dim, reset, violet, bold, section, green } from '../ui';\n\nconst yellow = '\\x1b[33m';\n\nasync function getWiki(cwd: string) {\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../../wiki/index.js'));\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n\n if (!KiroGraph.isInitialized(cwd)) {\n console.error(' \u2716 KiroGraph is not initialized. Run `kirograph init` first.');\n process.exit(1);\n }\n const config = await loadConfig(cwd);\n if (!config.enableWiki) {\n console.error(' \u2716 Wiki is not enabled. Set enableWiki: true in .kirograph/config.json');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyWikiSchema();\n\n const kirographDir = `${cwd}/.kirograph`;\n const wiki = new KiroGraphWiki(db.getRawDb(), kirographDir, {\n autoResolveConflicts: config.wikiAutoResolveConflicts,\n typedPages: config.wikiTypedPages,\n });\n wiki.initialize();\n return wiki;\n}\n\nfunction readStdinSync(): string {\n return fs.readFileSync('/dev/stdin', 'utf8');\n}\n\nexport function register(program: Command): void {\n const wiki = program\n .command('wiki')\n .description('LLM-maintained structured wiki (requires enableWiki: true)');\n\n // \u2500\u2500 init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('init')\n .description('Initialize wiki: create SCHEMA.md and MANIFEST.md in .kirograph/wiki/')\n .action(async () => {\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../../wiki/index.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const cwd = process.cwd();\n if (!KiroGraph.isInitialized(cwd)) {\n console.error(' \u2716 KiroGraph is not initialized. Run `kirograph init` first.');\n process.exit(1);\n }\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const config = await loadConfig(cwd);\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const w = new KiroGraphWiki(db.getRawDb(), `${cwd}/.kirograph`, {\n autoResolveConflicts: config.wikiAutoResolveConflicts,\n });\n w.initWiki();\n console.log(`\\n ${green}\u2713${reset} Wiki initialized in ${dim}.kirograph/wiki/${reset}`);\n console.log(` ${dim}Edit .kirograph/wiki/SCHEMA.md to customize naming and page structure.${reset}\\n`);\n });\n\n // \u2500\u2500 ingest \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('ingest [source]')\n .description('Print the ingest prompt for the LLM (reads file or stdin)')\n .option('--name <name>', 'Source name to include in the prompt')\n .action(async (source: string | undefined, opts: { name?: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n\n let content: string;\n let sourceName = opts.name ?? source ?? 'source';\n\n if (source && fs.existsSync(source)) {\n content = fs.readFileSync(source, 'utf8');\n sourceName = opts.name ?? source;\n } else if (source) {\n content = source;\n } else {\n content = readStdinSync();\n }\n\n const prompt = w.getIngestPrompt(content, sourceName);\n console.log(`\\n ${section('Wiki Ingest Prompt')} ${dim}(pass to LLM, then run wiki apply-diff)${reset}\\n`);\n console.log(prompt);\n console.log();\n });\n\n // \u2500\u2500 apply-diff \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('apply-diff [diff]')\n .description('Apply a WIKI_DIFF string to the wiki (reads file or stdin)')\n .action(async (diff: string | undefined) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n\n let rawDiff: string;\n if (diff && fs.existsSync(diff)) {\n rawDiff = fs.readFileSync(diff, 'utf8');\n } else if (diff) {\n rawDiff = diff;\n } else {\n rawDiff = readStdinSync();\n }\n\n const result = w.applyDiff(rawDiff);\n\n console.log(`\\n ${green}\u2713${reset} Wiki diff applied\\n`);\n if (result.created.length) {\n console.log(` ${violet}Created:${reset} ${result.created.join(', ')}`);\n }\n if (result.updated.length) {\n console.log(` ${violet}Updated:${reset} ${result.updated.join(', ')}`);\n }\n if (result.conflictsResolved.length) {\n console.log(` ${green}Conflicts resolved:${reset} ${result.conflictsResolved.join(', ')}`);\n }\n if (result.conflictsPending.length) {\n console.log(`\\n ${yellow}\u26A1 Conflicts pending (${result.conflictsPending.length}):${reset}`);\n for (const c of result.conflictsPending) {\n console.log(` ${dim} ${c.page} \u00A7${c.section}${reset}`);\n console.log(` existing: \"${c.existing}\"`);\n console.log(` incoming: \"${c.incoming}\" (source: ${c.source})`);\n }\n }\n console.log();\n });\n\n // \u2500\u2500 search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('search <query>')\n .description('Full-text search over wiki pages')\n .option('--limit <n>', 'Max results', '5')\n .option('--format <fmt>', 'Output format: text, json', 'text')\n .action(async (query: string, opts: { limit: string; format: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const results = w.search(query, parseInt(opts.limit));\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(results.map(r => ({\n slug: r.page.slug,\n title: r.page.title,\n score: r.score,\n updatedAt: r.page.updatedAt,\n })), null, 2));\n return;\n }\n\n if (results.length === 0) {\n console.log(`\\n ${dim}No wiki pages found for \"${query}\"${reset}\\n`);\n return;\n }\n\n console.log(`\\n ${section('Wiki Search:')} ${violet}${bold}${query}${reset}\\n`);\n for (const { page, score } of results) {\n console.log(` ${violet}[${page.slug}]${reset} ${bold}${page.title}${reset} ${dim}score: ${score.toFixed(3)}${reset}`);\n const preview = page.content.split('\\n').find(l => l.trim() && !l.startsWith('#'));\n if (preview) console.log(` ${dim}${preview.trim().slice(0, 120)}${reset}`);\n console.log();\n }\n });\n\n // \u2500\u2500 page \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('page <slug>')\n .description('Print the full content of a wiki page')\n .action(async (slug: string) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const page = w.getPage(slug);\n if (!page) {\n console.error(` \u2716 Wiki page \"${slug}\" not found. Run \\`kirograph wiki list\\` to see available pages.`);\n process.exit(1);\n }\n console.log();\n console.log(page.content);\n });\n\n // \u2500\u2500 list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('list')\n .description('List all wiki pages')\n .option('--format <fmt>', 'Output format: text, json', 'text')\n .action(async (opts: { format: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const pages = w.listPages();\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(pages.map(p => ({\n slug: p.slug,\n title: p.title,\n sourceCount: p.sourceCount,\n updatedAt: p.updatedAt,\n })), null, 2));\n return;\n }\n\n const stats = w.getStats();\n console.log(`\\n ${section('Wiki')} ${dim}${stats.pageCount} page(s)${reset}\\n`);\n if (pages.length === 0) {\n console.log(` ${dim}No pages yet. Run \\`kirograph wiki ingest\\` to add pages.${reset}\\n`);\n return;\n }\n for (const p of pages) {\n const date = new Date(p.updatedAt).toISOString().slice(0, 10);\n console.log(` ${violet}${p.slug.padEnd(32)}${reset} ${p.title} ${dim}(${p.sourceCount} src, ${date})${reset}`);\n }\n console.log();\n });\n\n // \u2500\u2500 lint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('lint')\n .description('Health check the wiki for issues')\n .action(async () => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const issues = w.lint();\n\n if (issues.length === 0) {\n console.log(`\\n ${green}\u2713${reset} Wiki lint passed \u2014 no issues found.\\n`);\n return;\n }\n\n console.log(`\\n ${section('Wiki Lint')} ${yellow}${issues.length} issue(s)${reset}\\n`);\n for (const issue of issues) {\n const icon = issue.kind === 'contradiction' ? '\u26A1' : issue.kind === 'orphan' ? '\u25CB' : issue.kind === 'broken_link' ? '\uD83D\uDD17' : issue.kind === 'schema_error' ? '\u2716' : '\u26A0';\n console.log(` ${icon} ${dim}[${issue.kind}]${reset} ${violet}${issue.slug}${reset}`);\n console.log(` ${issue.detail}`);\n console.log();\n }\n });\n\n // \u2500\u2500 links \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('links <slug>')\n .description('Show outgoing, broken, and incoming [[slug]] links for a page')\n .option('--format <fmt>', 'Output format: text, json', 'text')\n .action(async (slug: string, opts: { format: string }) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const links = w.getLinks(slug);\n\n if (!links) {\n console.error(` \u2716 Wiki page \"${slug}\" not found. Run \\`kirograph wiki list\\` to see available pages.`);\n process.exit(1);\n }\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(links, null, 2));\n return;\n }\n\n console.log(`\\n ${section('Wiki Links:')} ${violet}${bold}${slug}${reset}\\n`);\n\n console.log(` ${bold}Outgoing${reset} ${dim}(${links.outgoing.length})${reset}`);\n if (links.outgoing.length === 0) {\n console.log(` ${dim}(none)${reset}`);\n } else {\n for (const s of links.outgoing) console.log(` ${violet}\u2192${reset} [[${s}]]`);\n }\n\n if (links.broken.length > 0) {\n console.log(`\\n ${yellow}Broken${reset} ${dim}(${links.broken.length})${reset}`);\n for (const s of links.broken) console.log(` ${yellow}\u26A0${reset} [[${s}]] ${dim}\u2014 page does not exist${reset}`);\n }\n\n console.log(`\\n ${bold}Incoming${reset} ${dim}(${links.incoming.length}) \u2014 pages that link here${reset}`);\n if (links.incoming.length === 0) {\n console.log(` ${dim}(none)${reset}`);\n } else {\n for (const s of links.incoming) console.log(` ${violet}\u2190${reset} [[${s}]]`);\n }\n console.log();\n });\n\n // \u2500\u2500 rename \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('rename <from> <to>')\n .description('Rename a page slug, moving its file and updating every [[slug]] reference to it')\n .action(async (from: string, to: string) => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n\n let result;\n try {\n result = w.rename(from, to);\n } catch (err) {\n console.error(` \u2716 ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n console.log(`\\n ${green}\u2713${reset} Renamed ${violet}[[${result.from}]]${reset} \u2192 ${violet}[[${result.to}]]${reset}\\n`);\n if (result.linksUpdated.length > 0) {\n console.log(` ${bold}Links updated in ${result.linksUpdated.length} page(s):${reset}`);\n for (const s of result.linksUpdated) console.log(` ${dim}\u00B7${reset} ${s}`);\n } else {\n console.log(` ${dim}No other pages referenced [[${result.from}]].${reset}`);\n }\n console.log();\n });\n\n // \u2500\u2500 reindex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('reindex')\n .description('Rebuild SQLite index from .kirograph/wiki/*.md files')\n .action(async () => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const count = w.reindex();\n console.log(`\\n ${green}\u2713${reset} Reindexed ${bold}${count}${reset} wiki page(s)\\n`);\n });\n\n // \u2500\u2500 status \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('status')\n .description('Wiki subsystem stats')\n .action(async () => {\n const cwd = process.cwd();\n const w = await getWiki(cwd);\n const stats = w.getStats();\n const oldest = stats.oldestPage ? new Date(stats.oldestPage).toISOString().slice(0, 10) : 'n/a';\n const newest = stats.newestPage ? new Date(stats.newestPage).toISOString().slice(0, 10) : 'n/a';\n console.log(`\\n ${section('Wiki Status')}\\n`);\n console.log(` Pages: ${bold}${stats.pageCount}${reset}`);\n console.log(` Total sources: ${bold}${stats.totalSources}${reset}`);\n console.log(` Oldest page: ${dim}${oldest}${reset}`);\n console.log(` Newest page: ${dim}${newest}${reset}`);\n console.log(` Wiki dir: ${dim}.kirograph/wiki/${reset}\\n`);\n });\n\n // \u2500\u2500 synthesize (local model) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n wiki\n .command('synthesize')\n .description('Run local-model wiki synthesis: process the pending source queue (wikiSynthesisMode: local)')\n .option('--quiet', 'suppress progress output')\n .action(async (opts) => {\n const { KiroGraphWiki } = await Promise.resolve().then(() => require('../../wiki/index.js'));\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const cwd = process.cwd();\n\n if (!KiroGraph.isInitialized(cwd)) {\n console.error(' \u2716 KiroGraph is not initialized. Run `kirograph init` first.');\n process.exit(1);\n }\n const config = await loadConfig(cwd);\n if (!config.enableWiki) {\n console.error(' \u2716 Wiki is not enabled.');\n process.exit(1);\n }\n if (config.wikiSynthesisMode !== 'local') {\n console.error(' \u2716 wikiSynthesisMode is not \"local\". This command is for local-model synthesis only.');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyWikiSchema();\n const w = new KiroGraphWiki(db.getRawDb(), `${cwd}/.kirograph`, {\n autoResolveConflicts: config.wikiAutoResolveConflicts,\n });\n w.initialize();\n\n const queueCount = w.getQueueCount();\n if (queueCount === 0) {\n if (!opts.quiet) console.log(`\\n ${dim}Wiki queue is empty \u2014 nothing to synthesize.${reset}\\n`);\n process.exit(0);\n }\n\n if (!opts.quiet) console.log(`\\n ${yellow}\u27F3${reset} Synthesizing ${bold}${queueCount}${reset} queued source(s) with local model...\\n`);\n\n const result = await w.synthesize(config.wikiLocalModel, !!opts.quiet);\n\n if (!opts.quiet) {\n if (result.processed > 0) {\n console.log(` ${green}\u2713${reset} Processed: ${bold}${result.processed}${reset} source(s)`);\n if (result.created.length) console.log(` ${green}\u2713${reset} Created: ${result.created.join(', ')}`);\n if (result.updated.length) console.log(` ${green}\u2713${reset} Updated: ${result.updated.join(', ')}`);\n }\n if (result.errors.length) {\n for (const e of result.errors) console.error(` ${yellow}\u26A0${reset} ${e}`);\n }\n console.log('');\n }\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,SAAoB;AACpB,gBAAyD;AAEzD,MAAM,SAAS;AAEf,eAAe,QAAQ,KAAa;AAClC,QAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,qBAAqB,CAAC;AAC3F,QAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,QAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAElF,MAAI,CAAC,UAAU,cAAc,GAAG,GAAG;AACjC,YAAQ,MAAM,oEAA+D;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,OAAO,YAAY;AACtB,YAAQ,MAAM,8EAAyE;AACvF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,KAAK,MAAM,UAAU,KAAK,GAAG;AACnC,QAAM,KAAK,GAAG,YAAY;AAC1B,KAAG,gBAAgB;AAEnB,QAAM,eAAe,GAAG,GAAG;AAC3B,QAAM,OAAO,IAAI,cAAc,GAAG,SAAS,GAAG,cAAc;AAAA,IAC1D,sBAAsB,OAAO;AAAA,IAC7B,YAAY,OAAO;AAAA,EACrB,CAAC;AACD,OAAK,WAAW;AAChB,SAAO;AACT;AAEA,SAAS,gBAAwB;AAC/B,SAAO,GAAG,aAAa,cAAc,MAAM;AAC7C;AAEO,SAAS,SAAS,SAAwB;AAC/C,QAAM,OAAO,QACV,QAAQ,MAAM,EACd,YAAY,4DAA4D;AAI3E,OACG,QAAQ,MAAM,EACd,YAAY,uEAAuE,EACnF,OAAO,YAAY;AAClB,UAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,qBAAqB,CAAC;AAC3F,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,CAAC,UAAU,cAAc,GAAG,GAAG;AACjC,cAAQ,MAAM,oEAA+D;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,UAAM,SAAS,MAAM,WAAW,GAAG;AACnC,UAAM,KAAK,MAAM,UAAU,KAAK,GAAG;AACnC,UAAM,KAAK,GAAG,YAAY;AAC1B,OAAG,gBAAgB;AACnB,UAAM,IAAI,IAAI,cAAc,GAAG,SAAS,GAAG,GAAG,GAAG,eAAe;AAAA,MAC9D,sBAAsB,OAAO;AAAA,IAC/B,CAAC;AACD,MAAE,SAAS;AACX,YAAQ,IAAI;AAAA,IAAO,eAAK,SAAI,eAAK,yBAAyB,aAAG,mBAAmB,eAAK,EAAE;AACvF,YAAQ,IAAI,KAAK,aAAG,yEAAyE,eAAK;AAAA,CAAI;AAAA,EACxG,CAAC;AAIH,OACG,QAAQ,iBAAiB,EACzB,YAAY,2DAA2D,EACvE,OAAO,iBAAiB,sCAAsC,EAC9D,OAAO,OAAO,QAA4B,SAA4B;AACrE,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAE3B,QAAI;AACJ,QAAI,aAAa,KAAK,QAAQ,UAAU;AAExC,QAAI,UAAU,GAAG,WAAW,MAAM,GAAG;AACnC,gBAAU,GAAG,aAAa,QAAQ,MAAM;AACxC,mBAAa,KAAK,QAAQ;AAAA,IAC5B,WAAW,QAAQ;AACjB,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU,cAAc;AAAA,IAC1B;AAEA,UAAM,SAAS,EAAE,gBAAgB,SAAS,UAAU;AACpD,YAAQ,IAAI;AAAA,QAAO,mBAAQ,oBAAoB,CAAC,IAAI,aAAG,0CAA0C,eAAK;AAAA,CAAI;AAC1G,YAAQ,IAAI,MAAM;AAClB,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,OACG,QAAQ,mBAAmB,EAC3B,YAAY,4DAA4D,EACxE,OAAO,OAAO,SAA6B;AAC1C,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAE3B,QAAI;AACJ,QAAI,QAAQ,GAAG,WAAW,IAAI,GAAG;AAC/B,gBAAU,GAAG,aAAa,MAAM,MAAM;AAAA,IACxC,WAAW,MAAM;AACf,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU,cAAc;AAAA,IAC1B;AAEA,UAAM,SAAS,EAAE,UAAU,OAAO;AAElC,YAAQ,IAAI;AAAA,IAAO,eAAK,SAAI,eAAK;AAAA,CAAuB;AACxD,QAAI,OAAO,QAAQ,QAAQ;AACzB,cAAQ,IAAI,KAAK,gBAAM,WAAW,eAAK,KAAK,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IACzE;AACA,QAAI,OAAO,QAAQ,QAAQ;AACzB,cAAQ,IAAI,KAAK,gBAAM,WAAW,eAAK,KAAK,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IACzE;AACA,QAAI,OAAO,kBAAkB,QAAQ;AACnC,cAAQ,IAAI,KAAK,eAAK,sBAAsB,eAAK,KAAK,OAAO,kBAAkB,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7F;AACA,QAAI,OAAO,iBAAiB,QAAQ;AAClC,cAAQ,IAAI;AAAA,IAAO,MAAM,6BAAwB,OAAO,iBAAiB,MAAM,KAAK,eAAK,EAAE;AAC3F,iBAAW,KAAK,OAAO,kBAAkB;AACvC,gBAAQ,IAAI,KAAK,aAAG,KAAK,EAAE,IAAI,QAAK,EAAE,OAAO,GAAG,eAAK,EAAE;AACvD,gBAAQ,IAAI,kBAAkB,EAAE,QAAQ,GAAG;AAC3C,gBAAQ,IAAI,kBAAkB,EAAE,QAAQ,cAAc,EAAE,MAAM,GAAG;AAAA,MACnE;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,OACG,QAAQ,gBAAgB,EACxB,YAAY,kCAAkC,EAC9C,OAAO,eAAe,eAAe,GAAG,EACxC,OAAO,kBAAkB,6BAA6B,MAAM,EAC5D,OAAO,OAAO,OAAe,SAA4C;AACxE,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,UAAM,UAAU,EAAE,OAAO,OAAO,SAAS,KAAK,KAAK,CAAC;AAEpD,QAAI,KAAK,WAAW,QAAQ;AAC1B,cAAQ,IAAI,KAAK,UAAU,QAAQ,IAAI,QAAM;AAAA,QAC3C,MAAM,EAAE,KAAK;AAAA,QACb,OAAO,EAAE,KAAK;AAAA,QACd,OAAO,EAAE;AAAA,QACT,WAAW,EAAE,KAAK;AAAA,MACpB,EAAE,GAAG,MAAM,CAAC,CAAC;AACb;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI;AAAA,IAAO,aAAG,4BAA4B,KAAK,IAAI,eAAK;AAAA,CAAI;AACpE;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,QAAO,mBAAQ,cAAc,CAAC,IAAI,gBAAM,GAAG,cAAI,GAAG,KAAK,GAAG,eAAK;AAAA,CAAI;AAC/E,eAAW,EAAE,MAAM,MAAM,KAAK,SAAS;AACrC,cAAQ,IAAI,KAAK,gBAAM,IAAI,KAAK,IAAI,IAAI,eAAK,IAAI,cAAI,GAAG,KAAK,KAAK,GAAG,eAAK,KAAK,aAAG,UAAU,MAAM,QAAQ,CAAC,CAAC,GAAG,eAAK,EAAE;AACtH,YAAM,UAAU,KAAK,QAAQ,MAAM,IAAI,EAAE,KAAK,OAAK,EAAE,KAAK,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AACjF,UAAI,QAAS,SAAQ,IAAI,KAAK,aAAG,GAAG,QAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,GAAG,eAAK,EAAE;AAC1E,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,CAAC;AAIH,OACG,QAAQ,aAAa,EACrB,YAAY,uCAAuC,EACnD,OAAO,OAAO,SAAiB;AAC9B,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,UAAM,OAAO,EAAE,QAAQ,IAAI;AAC3B,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,uBAAkB,IAAI,kEAAkE;AACtG,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAK,OAAO;AAAA,EAC1B,CAAC;AAIH,OACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,OAAO,kBAAkB,6BAA6B,MAAM,EAC5D,OAAO,OAAO,SAA6B;AAC1C,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,UAAM,QAAQ,EAAE,UAAU;AAE1B,QAAI,KAAK,WAAW,QAAQ;AAC1B,cAAQ,IAAI,KAAK,UAAU,MAAM,IAAI,QAAM;AAAA,QACzC,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,aAAa,EAAE;AAAA,QACf,WAAW,EAAE;AAAA,MACf,EAAE,GAAG,MAAM,CAAC,CAAC;AACb;AAAA,IACF;AAEA,UAAM,QAAQ,EAAE,SAAS;AACzB,YAAQ,IAAI;AAAA,QAAO,mBAAQ,MAAM,CAAC,IAAI,aAAG,GAAG,MAAM,SAAS,WAAW,eAAK;AAAA,CAAI;AAC/E,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,KAAK,aAAG,4DAA4D,eAAK;AAAA,CAAI;AACzF;AAAA,IACF;AACA,eAAW,KAAK,OAAO;AACrB,YAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC5D,cAAQ,IAAI,KAAK,gBAAM,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,GAAG,eAAK,IAAI,EAAE,KAAK,KAAK,aAAG,IAAI,EAAE,WAAW,SAAS,IAAI,IAAI,eAAK,EAAE;AAAA,IACjH;AACA,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,OACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,OAAO,YAAY;AAClB,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,UAAM,SAAS,EAAE,KAAK;AAEtB,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,IAAI;AAAA,IAAO,eAAK,SAAI,eAAK;AAAA,CAAyC;AAC1E;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,QAAO,mBAAQ,WAAW,CAAC,IAAI,MAAM,GAAG,OAAO,MAAM,YAAY,eAAK;AAAA,CAAI;AACtF,eAAW,SAAS,QAAQ;AAC1B,YAAM,OAAO,MAAM,SAAS,kBAAkB,WAAM,MAAM,SAAS,WAAW,WAAM,MAAM,SAAS,gBAAgB,cAAO,MAAM,SAAS,iBAAiB,WAAM;AAChK,cAAQ,IAAI,KAAK,IAAI,IAAI,aAAG,IAAI,MAAM,IAAI,IAAI,eAAK,IAAI,gBAAM,GAAG,MAAM,IAAI,GAAG,eAAK,EAAE;AACpF,cAAQ,IAAI,OAAO,MAAM,MAAM,EAAE;AACjC,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,CAAC;AAIH,OACG,QAAQ,cAAc,EACtB,YAAY,+DAA+D,EAC3E,OAAO,kBAAkB,6BAA6B,MAAM,EAC5D,OAAO,OAAO,MAAc,SAA6B;AACxD,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,UAAM,QAAQ,EAAE,SAAS,IAAI;AAE7B,QAAI,CAAC,OAAO;AACV,cAAQ,MAAM,uBAAkB,IAAI,kEAAkE;AACtG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,KAAK,WAAW,QAAQ;AAC1B,cAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,QAAO,mBAAQ,aAAa,CAAC,IAAI,gBAAM,GAAG,cAAI,GAAG,IAAI,GAAG,eAAK;AAAA,CAAI;AAE7E,YAAQ,IAAI,KAAK,cAAI,WAAW,eAAK,IAAI,aAAG,IAAI,MAAM,SAAS,MAAM,IAAI,eAAK,EAAE;AAChF,QAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,cAAQ,IAAI,OAAO,aAAG,SAAS,eAAK,EAAE;AAAA,IACxC,OAAO;AACL,iBAAW,KAAK,MAAM,SAAU,SAAQ,IAAI,OAAO,gBAAM,SAAI,eAAK,MAAM,CAAC,IAAI;AAAA,IAC/E;AAEA,QAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,cAAQ,IAAI;AAAA,IAAO,MAAM,SAAS,eAAK,IAAI,aAAG,IAAI,MAAM,OAAO,MAAM,IAAI,eAAK,EAAE;AAChF,iBAAW,KAAK,MAAM,OAAQ,SAAQ,IAAI,OAAO,MAAM,SAAI,eAAK,MAAM,CAAC,MAAM,aAAG,6BAAwB,eAAK,EAAE;AAAA,IACjH;AAEA,YAAQ,IAAI;AAAA,IAAO,cAAI,WAAW,eAAK,IAAI,aAAG,IAAI,MAAM,SAAS,MAAM,gCAA2B,eAAK,EAAE;AACzG,QAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,cAAQ,IAAI,OAAO,aAAG,SAAS,eAAK,EAAE;AAAA,IACxC,OAAO;AACL,iBAAW,KAAK,MAAM,SAAU,SAAQ,IAAI,OAAO,gBAAM,SAAI,eAAK,MAAM,CAAC,IAAI;AAAA,IAC/E;AACA,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,OACG,QAAQ,oBAAoB,EAC5B,YAAY,iFAAiF,EAC7F,OAAO,OAAO,MAAc,OAAe;AAC1C,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAE3B,QAAI;AACJ,QAAI;AACF,eAAS,EAAE,OAAO,MAAM,EAAE;AAAA,IAC5B,SAAS,KAAK;AACZ,cAAQ,MAAM,YAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ,IAAI;AAAA,IAAO,eAAK,SAAI,eAAK,aAAa,gBAAM,KAAK,OAAO,IAAI,KAAK,eAAK,WAAM,gBAAM,KAAK,OAAO,EAAE,KAAK,eAAK;AAAA,CAAI;AACtH,QAAI,OAAO,aAAa,SAAS,GAAG;AAClC,cAAQ,IAAI,KAAK,cAAI,oBAAoB,OAAO,aAAa,MAAM,YAAY,eAAK,EAAE;AACtF,iBAAW,KAAK,OAAO,aAAc,SAAQ,IAAI,OAAO,aAAG,OAAI,eAAK,IAAI,CAAC,EAAE;AAAA,IAC7E,OAAO;AACL,cAAQ,IAAI,KAAK,aAAG,+BAA+B,OAAO,IAAI,MAAM,eAAK,EAAE;AAAA,IAC7E;AACA,YAAQ,IAAI;AAAA,EACd,CAAC;AAIH,OACG,QAAQ,SAAS,EACjB,YAAY,sDAAsD,EAClE,OAAO,YAAY;AAClB,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,UAAM,QAAQ,EAAE,QAAQ;AACxB,YAAQ,IAAI;AAAA,IAAO,eAAK,SAAI,eAAK,eAAe,cAAI,GAAG,KAAK,GAAG,eAAK;AAAA,CAAiB;AAAA,EACvF,CAAC;AAIH,OACG,QAAQ,QAAQ,EAChB,YAAY,sBAAsB,EAClC,OAAO,YAAY;AAClB,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,UAAM,QAAQ,EAAE,SAAS;AACzB,UAAM,SAAS,MAAM,aAAa,IAAI,KAAK,MAAM,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAC1F,UAAM,SAAS,MAAM,aAAa,IAAI,KAAK,MAAM,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,IAAI;AAC1F,YAAQ,IAAI;AAAA,QAAO,mBAAQ,aAAa,CAAC;AAAA,CAAI;AAC7C,YAAQ,IAAI,qBAAqB,cAAI,GAAG,MAAM,SAAS,GAAG,eAAK,EAAE;AACjE,YAAQ,IAAI,qBAAqB,cAAI,GAAG,MAAM,YAAY,GAAG,eAAK,EAAE;AACpE,YAAQ,IAAI,qBAAqB,aAAG,GAAG,MAAM,GAAG,eAAK,EAAE;AACvD,YAAQ,IAAI,qBAAqB,aAAG,GAAG,MAAM,GAAG,eAAK,EAAE;AACvD,YAAQ,IAAI,qBAAqB,aAAG,mBAAmB,eAAK;AAAA,CAAI;AAAA,EAClE,CAAC;AAIH,OACG,QAAQ,YAAY,EACpB,YAAY,6FAA6F,EACzG,OAAO,WAAW,0BAA0B,EAC5C,OAAO,OAAO,SAAS;AACtB,UAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,qBAAqB,CAAC;AAC3F,UAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,MAAM,QAAQ,IAAI;AAExB,QAAI,CAAC,UAAU,cAAc,GAAG,GAAG;AACjC,cAAQ,MAAM,oEAA+D;AAC7E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAS,MAAM,WAAW,GAAG;AACnC,QAAI,CAAC,OAAO,YAAY;AACtB,cAAQ,MAAM,+BAA0B;AACxC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,OAAO,sBAAsB,SAAS;AACxC,cAAQ,MAAM,4FAAuF;AACrG,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,KAAK,MAAM,UAAU,KAAK,GAAG;AACnC,UAAM,KAAK,GAAG,YAAY;AAC1B,OAAG,gBAAgB;AACnB,UAAM,IAAI,IAAI,cAAc,GAAG,SAAS,GAAG,GAAG,GAAG,eAAe;AAAA,MAC9D,sBAAsB,OAAO;AAAA,IAC/B,CAAC;AACD,MAAE,WAAW;AAEb,UAAM,aAAa,EAAE,cAAc;AACnC,QAAI,eAAe,GAAG;AACpB,UAAI,CAAC,KAAK,MAAO,SAAQ,IAAI;AAAA,IAAO,aAAG,oDAA+C,eAAK;AAAA,CAAI;AAC/F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,CAAC,KAAK,MAAO,SAAQ,IAAI;AAAA,IAAO,MAAM,SAAI,eAAK,kBAAkB,cAAI,GAAG,UAAU,GAAG,eAAK;AAAA,CAAyC;AAEvI,UAAM,SAAS,MAAM,EAAE,WAAW,OAAO,gBAAgB,CAAC,CAAC,KAAK,KAAK;AAErE,QAAI,CAAC,KAAK,OAAO;AACf,UAAI,OAAO,YAAY,GAAG;AACxB,gBAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,gBAAgB,cAAI,GAAG,OAAO,SAAS,GAAG,eAAK,YAAY;AAC1F,YAAI,OAAO,QAAQ,OAAQ,SAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,gBAAgB,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AACrG,YAAI,OAAO,QAAQ,OAAQ,SAAQ,IAAI,KAAK,eAAK,SAAI,eAAK,gBAAgB,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,MACvG;AACA,UAAI,OAAO,OAAO,QAAQ;AACxB,mBAAW,KAAK,OAAO,OAAQ,SAAQ,MAAM,KAAK,MAAM,SAAI,eAAK,KAAK,CAAC,EAAE;AAAA,MAC3E;AACA,cAAQ,IAAI,EAAE;AAAA,IAChB;AAAA,EACF,CAAC;AACL;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/bin/kirograph.js
CHANGED
|
@@ -128,7 +128,7 @@ process.on("uncaughtException", (err) => {
|
|
|
128
128
|
process.exit(1);
|
|
129
129
|
});
|
|
130
130
|
const program = new import_commander.Command();
|
|
131
|
-
program.name("kirograph").description("Semantic code knowledge graph for Kiro").version("1.
|
|
131
|
+
program.name("kirograph").description("Semantic code knowledge graph for Kiro").version("1.2.1").addHelpCommand(true).hook("preAction", (thisCommand) => {
|
|
132
132
|
const name = thisCommand.name();
|
|
133
133
|
if (name === "init") (0, import_banner.printBanner)();
|
|
134
134
|
});
|
package/dist/config.js
CHANGED
|
@@ -81,6 +81,7 @@ const KNOWN_FIELDS = /* @__PURE__ */ new Set([
|
|
|
81
81
|
"memoryContextThreshold",
|
|
82
82
|
"memoryExcludePatterns",
|
|
83
83
|
"memoryStrictWrites",
|
|
84
|
+
"memorySchemaValidation",
|
|
84
85
|
"enableWatchmen",
|
|
85
86
|
"watchmenThreshold",
|
|
86
87
|
"watchmenSynthesisMode",
|
|
@@ -89,6 +90,7 @@ const KNOWN_FIELDS = /* @__PURE__ */ new Set([
|
|
|
89
90
|
"wikiSynthesisMode",
|
|
90
91
|
"wikiLocalModel",
|
|
91
92
|
"wikiSources",
|
|
93
|
+
"wikiTypedPages",
|
|
92
94
|
"wikiAutoResolveConflicts",
|
|
93
95
|
"wikiLintFrequency",
|
|
94
96
|
"wikiContextLimit",
|
|
@@ -197,6 +199,7 @@ function createDefaultConfig(_projectRoot) {
|
|
|
197
199
|
memoryContextThreshold: 0.3,
|
|
198
200
|
memoryExcludePatterns: [],
|
|
199
201
|
memoryStrictWrites: false,
|
|
202
|
+
memorySchemaValidation: false,
|
|
200
203
|
enableWatchmen: false,
|
|
201
204
|
watchmenThreshold: 5,
|
|
202
205
|
watchmenSynthesisMode: "local",
|
|
@@ -205,6 +208,7 @@ function createDefaultConfig(_projectRoot) {
|
|
|
205
208
|
wikiSynthesisMode: "agent",
|
|
206
209
|
wikiLocalModel: "onnx-community/gemma-4-E4B-it-ONNX",
|
|
207
210
|
wikiSources: ["docs/"],
|
|
211
|
+
wikiTypedPages: false,
|
|
208
212
|
wikiAutoResolveConflicts: false,
|
|
209
213
|
wikiLintFrequency: "off",
|
|
210
214
|
wikiContextLimit: 3,
|
|
@@ -302,6 +306,7 @@ function validateConfig(config) {
|
|
|
302
306
|
const memoryContextThreshold = typeof raw.memoryContextThreshold === "number" && raw.memoryContextThreshold >= 0 && raw.memoryContextThreshold <= 1 ? raw.memoryContextThreshold : defaults.memoryContextThreshold;
|
|
303
307
|
const memoryExcludePatterns = Array.isArray(raw.memoryExcludePatterns) && raw.memoryExcludePatterns.every((p) => typeof p === "string") ? raw.memoryExcludePatterns : defaults.memoryExcludePatterns;
|
|
304
308
|
const memoryStrictWrites = typeof raw.memoryStrictWrites === "boolean" ? raw.memoryStrictWrites : defaults.memoryStrictWrites;
|
|
309
|
+
const memorySchemaValidation = typeof raw.memorySchemaValidation === "boolean" ? raw.memorySchemaValidation : defaults.memorySchemaValidation;
|
|
305
310
|
const enableWatchmen = typeof raw.enableWatchmen === "boolean" ? raw.enableWatchmen : defaults.enableWatchmen;
|
|
306
311
|
const watchmenThreshold = typeof raw.watchmenThreshold === "number" && raw.watchmenThreshold > 0 ? Math.round(raw.watchmenThreshold) : defaults.watchmenThreshold;
|
|
307
312
|
const WATCHMEN_SYNTHESIS_MODES = /* @__PURE__ */ new Set(["local", "agent"]);
|
|
@@ -311,6 +316,7 @@ function validateConfig(config) {
|
|
|
311
316
|
const wikiSynthesisMode = raw.wikiSynthesisMode === "local" ? "local" : "agent";
|
|
312
317
|
const wikiLocalModel = typeof raw.wikiLocalModel === "string" ? raw.wikiLocalModel : defaults.wikiLocalModel;
|
|
313
318
|
const wikiSources = Array.isArray(raw.wikiSources) ? raw.wikiSources : defaults.wikiSources;
|
|
319
|
+
const wikiTypedPages = typeof raw.wikiTypedPages === "boolean" ? raw.wikiTypedPages : defaults.wikiTypedPages;
|
|
314
320
|
const wikiAutoResolveConflicts = typeof raw.wikiAutoResolveConflicts === "boolean" ? raw.wikiAutoResolveConflicts : defaults.wikiAutoResolveConflicts;
|
|
315
321
|
const wikiLintFrequency = raw.wikiLintFrequency === "weekly" ? "weekly" : "off";
|
|
316
322
|
const wikiContextLimit = typeof raw.wikiContextLimit === "number" ? raw.wikiContextLimit : defaults.wikiContextLimit;
|
|
@@ -476,6 +482,7 @@ function validateConfig(config) {
|
|
|
476
482
|
memoryContextThreshold,
|
|
477
483
|
memoryExcludePatterns,
|
|
478
484
|
memoryStrictWrites,
|
|
485
|
+
memorySchemaValidation,
|
|
479
486
|
enableWatchmen: enableWatchmen && enableMemory,
|
|
480
487
|
watchmenThreshold,
|
|
481
488
|
watchmenSynthesisMode,
|
|
@@ -484,6 +491,7 @@ function validateConfig(config) {
|
|
|
484
491
|
wikiSynthesisMode,
|
|
485
492
|
wikiLocalModel,
|
|
486
493
|
wikiSources,
|
|
494
|
+
wikiTypedPages,
|
|
487
495
|
wikiAutoResolveConflicts,
|
|
488
496
|
wikiLintFrequency,
|
|
489
497
|
wikiContextLimit,
|
package/dist/config.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/config.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph Config System\n *\n * Mirrors CodeGraph src/config.ts \u2014 load, save, validate, and provide defaults\n * for KiroGraph configuration.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport picomatch from 'picomatch';\nimport { logWarn, logError } from './errors';\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface KiroGraphConfig {\n version: number;\n languages: string[];\n include: string[];\n exclude: string[];\n maxFileSize: number;\n extractDocstrings: boolean;\n trackCallSites: boolean;\n // Parity fields:\n enableEmbeddings: boolean;\n embeddingModel: string;\n embeddingDim: number;\n /** @deprecated Use semanticEngine instead. Kept for backwards compatibility. */\n useVecIndex: boolean;\n semanticEngine: 'cosine' | 'turboquant' | 'turbovec' | 'sqlite-vec' | 'orama' | 'pglite' | 'lancedb' | 'qdrant' | 'typesense';\n /** Apply TurboQuant ANN index to memory observations and doc sections. Default: false. */\n turboquantMemDocs: boolean;\n /** TurboQuant bits per coordinate (1\u20138). Controls compression/quality tradeoff. Default: 3 (\u224825\u00D7). */\n turboquantBits: number;\n /** Apply TurboVec ANN index to memory observations and doc sections. Default: false. */\n turbovecMemDocs: boolean;\n /** TurboVec bits per coordinate (2, 3, or 4). Controls compression/quality tradeoff. Default: 4. */\n turbovecBits: number;\n typesenseDashboard: boolean;\n qdrantDashboard: boolean;\n minLogLevel: 'debug' | 'info' | 'warn' | 'error';\n frameworkHints: string[];\n fuzzyResolutionThreshold: number; // 0.0\u20131.0\n /** Enable architecture analysis (package graph + layer detection). Default: false. */\n enableArchitecture: boolean;\n /**\n * User-defined layer \u2192 glob pattern overrides.\n * When set, config-defined layers win over auto-detected ones.\n * Example: { \"api\": [\"src/routes/**\", \"src/controllers/**\"] }\n */\n architectureLayers?: Record<string, string[]>;\n /** Agent communication style injected at agentSpawn. Default: 'off'. */\n cavemanMode: 'off' | 'lite' | 'full' | 'ultra';\n /** Shell compression level for kirograph_exec. 'off' disables the hook/steering. Default: 'normal'. */\n shellCompressionLevel: 'off' | 'normal' | 'aggressive' | 'ultra';\n /**\n * Number of pending (unindexed) files above which kirograph_status warns the agent.\n * Set to 0 to disable the warning. Default: 10.\n */\n syncWarningThreshold: number;\n /** Enable persistent cross-session memory. Default: false. */\n enableMemory: boolean;\n /** FTS/vector blend for memory search: 0 = FTS only, 1 = vector only. Default: 0.5. */\n memorySearchAlpha: number;\n /** Store uncompressed originals when caveman is on. Default: false. */\n memoryKeepRaw: boolean;\n /** Auto-prune threshold (max observations). 0 = no limit. Default: 10000. */\n memoryMaxObservations: number;\n /** Seconds of inactivity before auto-closing a session. Default: 7200. */\n memorySessionTimeout: number;\n /** Max observations shown in kirograph_context. Default: 3. */\n memoryContextLimit: number;\n /** Min relevance score to include memory in context. Default: 0.3. */\n memoryContextThreshold: number;\n /** Glob patterns for paths to never capture in memory. Default: []. */\n memoryExcludePatterns: string[];\n /**\n * Reject observation writes that don't conform to the memory schema\n * (unknown `kind`, blank tags) instead of silently accepting them.\n * Applies to `kirograph mem store`, the `kirograph_mem_store` MCP tool,\n * and `MemoryManager.store()` directly. Off by default \u2014 existing\n * free-form writes are unaffected until explicitly opted in.\n * Default: false.\n */\n memoryStrictWrites: boolean;\n /** Enable watchmen \u2014 auto-synthesize workspace briefs from memory observations. Requires enableMemory. Default: false. */\n enableWatchmen: boolean;\n /** Minimum new observations since last synthesis before watchmenReady fires. Default: 5. */\n watchmenThreshold: number;\n /**\n * How synthesis is performed.\n * 'local' \u2014 runs a local HuggingFace model via @huggingface/transformers (no API cost, works for all tools).\n * 'agent' \u2014 delegates to the active AI agent via askAgent hook (Kiro only, consumes agent tokens).\n * Default: 'local'.\n */\n watchmenSynthesisMode: 'local' | 'agent';\n /** HuggingFace model ID for local synthesis. Only used when watchmenSynthesisMode is 'local'. Default: 'onnx-community/gemma-4-E4B-it-ONNX'. */\n watchmenLocalModel: string;\n /** Enable documentation indexing and navigation. Default: false. */\n enableDocs: boolean;\n /** Glob patterns for documentation files to include. */\n docsInclude: string[];\n /** Glob patterns for documentation files to exclude. */\n docsExclude: string[];\n /** Enable auto-linking of doc sections to code symbols. Default: true. */\n docsLinkCode: boolean;\n /** Max doc sections to include in kirograph_context. 0 = disabled. Default: 0. */\n docsContextLimit: number;\n /** Min relevance score to include a doc section in context. Default: 0.3. */\n docsContextThreshold: number;\n /** Max file size for doc files (bytes). Default: 1MB. */\n docsMaxFileSize: number;\n /** Summarization strategy. Default: 'first-sentence'. */\n docsSummarization: 'embedding' | 'first-sentence' | 'off';\n /** Enable LLM-maintained wiki (entity pages in .kirograph/wiki/). Default: false. */\n enableWiki: boolean;\n /** Wiki synthesis mode. Default: 'agent'. */\n wikiSynthesisMode: 'agent' | 'local';\n /** HuggingFace model for local wiki synthesis. */\n wikiLocalModel: string;\n /** Glob patterns for auto-ingest wiki sources. Default: ['docs/']. */\n wikiSources: string[];\n /** Auto-resolve wiki conflicts by source date. Default: false. */\n wikiAutoResolveConflicts: boolean;\n /** Lint frequency: 'weekly' (every ~20 sessions) or 'off'. Default: 'off'. */\n wikiLintFrequency: 'weekly' | 'off';\n /** Max wiki pages to include in kirograph_context. Default: 3. */\n wikiContextLimit: number;\n /** Min FTS score to include wiki page in context. Default: 0.4. */\n wikiContextThreshold: number;\n /** Enable tabular data indexing and querying. Default: false. */\n enableData: boolean;\n /** Glob patterns for data files to include. */\n dataInclude: string[];\n /** Glob patterns for data files to exclude. */\n dataExclude: string[];\n /** Enable auto-linking of data files to code symbols. Default: true. */\n dataLinkCode: boolean;\n /** Max datasets to include in kirograph_context. 0 = disabled. Default: 0. */\n dataContextLimit: number;\n /** Max file size for data files (bytes). Default: 50MB. */\n dataMaxFileSize: number;\n /** Max rows to index per file. Default: 1,000,000. */\n dataMaxRows: number;\n /** Max rows returned per query. Default: 500. */\n dataQueryLimit: number;\n /** Max token budget per response. Default: 8000. */\n dataMaxResponseTokens: number;\n /** Enable security analysis (dependency scanning + vulnerability detection). Default: false. */\n enableSecurity: boolean;\n /** Vulnerability databases to query. Default: ['OSV']. */\n securityDatabases: string[];\n /** Enable AST-level structural pattern matching (SAST) during indexing. Default: false. */\n enablePatterns: boolean;\n /** Enable code health tools (hotspots, dead code, path analysis, type hierarchy). Default: false. */\n enableCodeHealth: boolean;\n /** Enable navigation tools (status, files, impact). Default: false. */\n enableNavigation: boolean;\n /** Enable complexity metrics tools. Default: false. */\n enableComplexity: boolean;\n /** Enable git-context tools (diff_context, commit_context, flows, etc.). Default: false. */\n enableGitContext: boolean;\n /** Enable atomic edit primitive tools (str_replace, insert_at, etc.) and refactor. Default: false. */\n enableEditPrimitives: boolean;\n /** Enable multi-branch graph indexing tools. Default: false. */\n enableBranch: boolean;\n /** @deprecated Dissolved \u2014 tools moved to enableCodeHealth, enableGitContext, enableArchitecture, enableEditPrimitives. Kept in KNOWN_FIELDS for silent backwards compatibility. */\n enableAdvancedAnalysis?: boolean;\n /** Enable agent utility tools (file caching, budget tracking). Default: true. */\n enableAgentUtils: boolean;\n /** Enable general-purpose compression tool (kirograph_compress). Default: false. */\n enableGeneralCompression: boolean;\n /** Derived from shellCompressionLevel \u2014 true when compression is enabled. Controls kirograph_exec. */\n enableShellExec: boolean;\n /** Path to a directory of user-supplied YAML rule files. Merged with bundled library (user rules win on id conflict). Default: undefined. */\n patternLibraryPath: string | undefined;\n /** Minimum severity level for storing pattern matches during index-time analysis. Default: 'low'. */\n patternSeverityThreshold: 'critical' | 'high' | 'medium' | 'low';\n /** Auto-run vulnerability enrichment after manifest parsing. Default: true. */\n securityAutoEnrich: boolean;\n /** Max age in days for vulnerability data before showing a staleness warning. Default: 7. */\n securityEnrichMaxAgeDays: number;\n /**\n * License policy for dependency compliance.\n * deny: licenses to block (build fails / command exits non-zero).\n * warn: licenses to flag as warnings.\n * Patterns support wildcards: GPL-* matches GPL-2.0, GPL-3.0, etc.\n * Default: { deny: [], warn: [] }.\n */\n securityLicensePolicy: {\n deny: string[];\n warn: string[];\n };\n /** Context budget governance settings. */\n contextBudget?: {\n maxTokensPerSession: number;\n warnAt: number;\n throttleAt: number;\n };\n}\n\n// \u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst KIROGRAPH_DIR = '.kirograph';\nconst CONFIG_FILE = 'config.json';\n\nconst KNOWN_FIELDS = new Set<string>([\n 'version', 'languages', 'include', 'exclude', 'maxFileSize',\n 'extractDocstrings', 'trackCallSites', 'enableEmbeddings', 'embeddingModel', 'embeddingDim',\n 'useVecIndex', 'semanticEngine', 'turboquantMemDocs', 'turboquantBits', 'turbovecMemDocs', 'turbovecBits', 'typesenseDashboard', 'qdrantDashboard',\n 'minLogLevel', 'frameworkHints', 'fuzzyResolutionThreshold',\n 'enableArchitecture', 'architectureLayers', 'cavemanMode', 'shellCompressionLevel', 'syncWarningThreshold',\n 'enableMemory', 'memorySearchAlpha', 'memoryKeepRaw', 'memoryMaxObservations',\n 'memorySessionTimeout', 'memoryContextLimit', 'memoryContextThreshold', 'memoryExcludePatterns', 'memoryStrictWrites',\n 'enableWatchmen', 'watchmenThreshold', 'watchmenSynthesisMode', 'watchmenLocalModel',\n 'enableWiki', 'wikiSynthesisMode', 'wikiLocalModel', 'wikiSources',\n 'wikiAutoResolveConflicts', 'wikiLintFrequency', 'wikiContextLimit', 'wikiContextThreshold',\n 'enableDocs', 'docsInclude', 'docsExclude', 'docsLinkCode',\n 'docsContextLimit', 'docsContextThreshold', 'docsMaxFileSize', 'docsSummarization',\n 'enableData', 'dataInclude', 'dataExclude', 'dataLinkCode',\n 'dataContextLimit', 'dataMaxFileSize', 'dataMaxRows', 'dataQueryLimit', 'dataMaxResponseTokens',\n 'enableSecurity', 'securityDatabases', 'securityAutoEnrich', 'securityEnrichMaxAgeDays', 'securityLicensePolicy',\n 'enablePatterns', 'patternLibraryPath', 'patternSeverityThreshold',\n 'enableCodeHealth', 'enableNavigation', 'enableComplexity', 'enableGitContext',\n 'enableEditPrimitives', 'enableBranch',\n 'enableAgentUtils', 'enableGeneralCompression',\n 'contextBudget',\n // Legacy aliases / derived fields (accepted but ignored or recomputed)\n 'enableCompression', 'compressionLevel', 'enableShellExec',\n // Deprecated: dissolved flag kept here so old configs don't warn\n 'enableAdvancedAnalysis',\n]);\n\nconst LOG_LEVELS = new Set(['debug', 'info', 'warn', 'error']);\n\n// \u2500\u2500 ReDoS-safe regex check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns false if the pattern is potentially dangerous (ReDoS risk) or too long.\n * Checks for catastrophic backtracking patterns like (a+)+ or (a|a)+.\n */\nexport function isSafeRegex(pattern: string): boolean {\n if (pattern.length > 100) return false;\n // Detect nested quantifiers: (x+)+ or (x*)+ or (x+)* etc.\n if (/\\([^)]*[+*][^)]*\\)[+*?]/.test(pattern)) return false;\n // Detect alternation with overlap: (a|a)+ style\n if (/\\([^)]*\\|[^)]*\\)[+*]/.test(pattern)) return false;\n return true;\n}\n\n// \u2500\u2500 Default config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function createDefaultConfig(_projectRoot?: string): KiroGraphConfig {\n return {\n version: 2,\n languages: [],\n include: [],\n exclude: [\n '**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.kirograph/**',\n // Compiled / minified output and build artifacts \u2014 not meaningful source to index,\n // and large bundles can crash the parser (issue #33). '*.min.js' was previously\n // non-recursive (root-only); use '**/' so nested bundles are matched.\n '**/*.min.js', '**/*.min.css', '**/*.bundle.js', '**/*.map',\n '**/out/**', '**/.next/**', '**/.nuxt/**', '**/.vite/**', '**/.svelte-kit/**',\n '**/public/build/**', '**/Resources/Public/**',\n ],\n maxFileSize: 1_048_576,\n extractDocstrings: false,\n trackCallSites: false,\n enableEmbeddings: false,\n embeddingModel: 'nomic-ai/nomic-embed-text-v1.5',\n embeddingDim: 768,\n useVecIndex: false,\n semanticEngine: 'cosine',\n turboquantMemDocs: false,\n turboquantBits: 3,\n turbovecMemDocs: false,\n turbovecBits: 4,\n typesenseDashboard: false,\n qdrantDashboard: false,\n minLogLevel: 'warn',\n frameworkHints: [],\n fuzzyResolutionThreshold: 0.5,\n enableArchitecture: false,\n cavemanMode: 'off',\n shellCompressionLevel: 'off',\n syncWarningThreshold: 10,\n enableMemory: false,\n memorySearchAlpha: 0.5,\n memoryKeepRaw: false,\n memoryMaxObservations: 10000,\n memorySessionTimeout: 7200,\n memoryContextLimit: 3,\n memoryContextThreshold: 0.3,\n memoryExcludePatterns: [],\n memoryStrictWrites: false,\n enableWatchmen: false,\n watchmenThreshold: 5,\n watchmenSynthesisMode: 'local',\n watchmenLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX',\n enableWiki: false,\n wikiSynthesisMode: 'agent' as const,\n wikiLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX',\n wikiSources: ['docs/'],\n wikiAutoResolveConflicts: false,\n wikiLintFrequency: 'off' as const,\n wikiContextLimit: 3,\n wikiContextThreshold: 0.4,\n enableDocs: false,\n docsInclude: ['**/*.md', '**/*.mdx', '**/*.rst', '**/*.adoc', '**/*.asciidoc', '**/*.rdoc', '**/*.org', '**/*.cheatmd', 'docs/**/*.txt', 'docs/**/*.html'],\n docsExclude: ['node_modules/**', '**/CHANGELOG*', '**/LICENSE*', '**/CHANGES*', 'dist/**', 'build/**', 'coverage/**', '.git/**', '**/generated/**', '**/auto-generated/**', '**/vendor/**', '_build/**'],\n docsLinkCode: true,\n docsContextLimit: 0,\n docsContextThreshold: 0.3,\n docsMaxFileSize: 1_048_576,\n docsSummarization: 'first-sentence',\n enableData: false,\n dataInclude: ['**/*.csv', '**/*.tsv', '**/*.jsonl', '**/*.ndjson', '**/*.xlsx', '**/*.xls', '**/*.parquet', 'data/**/*.json', '**/*.pdf'],\n dataExclude: ['node_modules/**', 'dist/**', 'build/**', '.git/**', '**/package-lock.json', '**/yarn.lock', '**/pnpm-lock.yaml', '**/tsconfig.json', '**/jsconfig.json', 'coverage/**', '**/generated/**'],\n dataLinkCode: true,\n dataContextLimit: 0,\n dataMaxFileSize: 52_428_800,\n dataMaxRows: 1_000_000,\n dataQueryLimit: 500,\n dataMaxResponseTokens: 8000,\n enableSecurity: false,\n securityDatabases: ['OSV'],\n securityAutoEnrich: true,\n securityEnrichMaxAgeDays: 7,\n securityLicensePolicy: { deny: [], warn: [] },\n enablePatterns: false,\n patternLibraryPath: undefined,\n patternSeverityThreshold: 'low',\n enableCodeHealth: false,\n enableNavigation: false,\n enableComplexity: false,\n enableGitContext: false,\n enableEditPrimitives: false,\n enableBranch: false,\n enableAgentUtils: true,\n enableGeneralCompression: false,\n enableShellExec: false,\n };\n}\n\n// \u2500\u2500 Validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function validateConfig(config: unknown): KiroGraphConfig {\n const defaults = createDefaultConfig();\n\n if (typeof config !== 'object' || config === null) {\n return defaults;\n }\n\n const raw = config as Record<string, unknown>;\n\n // Warn about unknown fields\n for (const key of Object.keys(raw)) {\n if (!KNOWN_FIELDS.has(key)) {\n logWarn(`Unknown config field: ${key}`);\n }\n }\n\n // Validate and coerce each field\n const version = typeof raw.version === 'number' ? raw.version : defaults.version;\n const languages = Array.isArray(raw.languages) && raw.languages.every(l => typeof l === 'string')\n ? (raw.languages as string[])\n : defaults.languages;\n const maxFileSize = typeof raw.maxFileSize === 'number' && raw.maxFileSize > 0\n ? raw.maxFileSize\n : defaults.maxFileSize;\n const extractDocstrings = typeof raw.extractDocstrings === 'boolean'\n ? raw.extractDocstrings\n : defaults.extractDocstrings;\n const trackCallSites = typeof raw.trackCallSites === 'boolean'\n ? raw.trackCallSites\n : defaults.trackCallSites;\n const enableEmbeddings = typeof raw.enableEmbeddings === 'boolean'\n ? raw.enableEmbeddings\n : defaults.enableEmbeddings;\n const embeddingModel = typeof raw.embeddingModel === 'string' && raw.embeddingModel.length > 0\n ? raw.embeddingModel\n : defaults.embeddingModel;\n const embeddingDim = typeof raw.embeddingDim === 'number' && raw.embeddingDim > 0\n ? raw.embeddingDim\n : defaults.embeddingDim;\n const useVecIndex = typeof raw.useVecIndex === 'boolean'\n ? raw.useVecIndex\n : defaults.useVecIndex;\n const SEMANTIC_ENGINES = new Set(['cosine', 'turboquant', 'turbovec', 'sqlite-vec', 'orama', 'pglite', 'lancedb', 'qdrant', 'typesense']);\n // useVecIndex is a legacy alias: if set and no explicit semanticEngine, map it\n const semanticEngine = typeof raw.semanticEngine === 'string' && SEMANTIC_ENGINES.has(raw.semanticEngine)\n ? (raw.semanticEngine as KiroGraphConfig['semanticEngine'])\n : useVecIndex ? 'sqlite-vec' : defaults.semanticEngine;\n const turboquantMemDocs = typeof raw.turboquantMemDocs === 'boolean'\n ? raw.turboquantMemDocs\n : defaults.turboquantMemDocs;\n const turboquantBits = typeof raw.turboquantBits === 'number'\n && raw.turboquantBits >= 1 && raw.turboquantBits <= 8\n ? Math.round(raw.turboquantBits)\n : defaults.turboquantBits;\n const turbovecMemDocs = typeof raw.turbovecMemDocs === 'boolean'\n ? raw.turbovecMemDocs\n : defaults.turbovecMemDocs;\n const TURBOVEC_BIT_WIDTHS = new Set([2, 3, 4]);\n const turbovecBits = typeof raw.turbovecBits === 'number' && TURBOVEC_BIT_WIDTHS.has(Math.round(raw.turbovecBits))\n ? Math.round(raw.turbovecBits)\n : defaults.turbovecBits;\n const typesenseDashboard = typeof raw.typesenseDashboard === 'boolean'\n ? raw.typesenseDashboard\n : defaults.typesenseDashboard;\n const qdrantDashboard = typeof raw.qdrantDashboard === 'boolean'\n ? raw.qdrantDashboard\n : defaults.qdrantDashboard;\n const minLogLevel = typeof raw.minLogLevel === 'string' && LOG_LEVELS.has(raw.minLogLevel)\n ? (raw.minLogLevel as KiroGraphConfig['minLogLevel'])\n : defaults.minLogLevel;\n const frameworkHints = Array.isArray(raw.frameworkHints) && raw.frameworkHints.every(h => typeof h === 'string')\n ? (raw.frameworkHints as string[])\n : defaults.frameworkHints;\n const fuzzyResolutionThreshold = typeof raw.fuzzyResolutionThreshold === 'number'\n && raw.fuzzyResolutionThreshold >= 0\n && raw.fuzzyResolutionThreshold <= 1\n ? raw.fuzzyResolutionThreshold\n : defaults.fuzzyResolutionThreshold;\n const enableArchitecture = typeof raw.enableArchitecture === 'boolean'\n ? raw.enableArchitecture\n : defaults.enableArchitecture;\n const architectureLayers = _validateArchitectureLayers(raw.architectureLayers);\n const CAVEMAN_MODES = new Set(['off', 'lite', 'full', 'ultra']);\n const cavemanMode = typeof raw.cavemanMode === 'string' && CAVEMAN_MODES.has(raw.cavemanMode)\n ? (raw.cavemanMode as KiroGraphConfig['cavemanMode'])\n : defaults.cavemanMode;\n const COMPRESSION_LEVELS = new Set(['off', 'normal', 'aggressive', 'ultra']);\n // Support legacy field names: enableCompression (boolean) and compressionLevel (string)\n let shellCompressionLevel: KiroGraphConfig['shellCompressionLevel'];\n if (typeof raw.shellCompressionLevel === 'string' && COMPRESSION_LEVELS.has(raw.shellCompressionLevel)) {\n shellCompressionLevel = raw.shellCompressionLevel as KiroGraphConfig['shellCompressionLevel'];\n } else if (typeof raw.compressionLevel === 'string' && COMPRESSION_LEVELS.has(raw.compressionLevel)) {\n shellCompressionLevel = raw.compressionLevel as KiroGraphConfig['shellCompressionLevel'];\n } else if (typeof raw.enableCompression === 'boolean') {\n shellCompressionLevel = raw.enableCompression ? 'normal' : 'off';\n } else {\n shellCompressionLevel = defaults.shellCompressionLevel;\n }\n const syncWarningThreshold = typeof raw.syncWarningThreshold === 'number' && raw.syncWarningThreshold >= 0\n ? Math.round(raw.syncWarningThreshold)\n : defaults.syncWarningThreshold;\n\n // \u2500\u2500 Memory config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableMemory = typeof raw.enableMemory === 'boolean'\n ? raw.enableMemory\n : defaults.enableMemory;\n const memorySearchAlpha = typeof raw.memorySearchAlpha === 'number'\n && raw.memorySearchAlpha >= 0 && raw.memorySearchAlpha <= 1\n ? raw.memorySearchAlpha\n : defaults.memorySearchAlpha;\n const memoryKeepRaw = typeof raw.memoryKeepRaw === 'boolean'\n ? raw.memoryKeepRaw\n : defaults.memoryKeepRaw;\n const memoryMaxObservations = typeof raw.memoryMaxObservations === 'number' && raw.memoryMaxObservations >= 0\n ? Math.round(raw.memoryMaxObservations)\n : defaults.memoryMaxObservations;\n const memorySessionTimeout = typeof raw.memorySessionTimeout === 'number' && raw.memorySessionTimeout > 0\n ? Math.round(raw.memorySessionTimeout)\n : defaults.memorySessionTimeout;\n const memoryContextLimit = typeof raw.memoryContextLimit === 'number' && raw.memoryContextLimit >= 0\n ? Math.round(raw.memoryContextLimit)\n : defaults.memoryContextLimit;\n const memoryContextThreshold = typeof raw.memoryContextThreshold === 'number'\n && raw.memoryContextThreshold >= 0 && raw.memoryContextThreshold <= 1\n ? raw.memoryContextThreshold\n : defaults.memoryContextThreshold;\n const memoryExcludePatterns = Array.isArray(raw.memoryExcludePatterns)\n && raw.memoryExcludePatterns.every((p: unknown) => typeof p === 'string')\n ? (raw.memoryExcludePatterns as string[])\n : defaults.memoryExcludePatterns;\n const memoryStrictWrites = typeof raw.memoryStrictWrites === 'boolean'\n ? raw.memoryStrictWrites\n : defaults.memoryStrictWrites;\n\n // \u2500\u2500 Watchmen config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableWatchmen = typeof raw.enableWatchmen === 'boolean'\n ? raw.enableWatchmen\n : defaults.enableWatchmen;\n const watchmenThreshold = typeof raw.watchmenThreshold === 'number' && raw.watchmenThreshold > 0\n ? Math.round(raw.watchmenThreshold)\n : defaults.watchmenThreshold;\n const WATCHMEN_SYNTHESIS_MODES = new Set(['local', 'agent']);\n const watchmenSynthesisMode = typeof raw.watchmenSynthesisMode === 'string' && WATCHMEN_SYNTHESIS_MODES.has(raw.watchmenSynthesisMode)\n ? (raw.watchmenSynthesisMode as KiroGraphConfig['watchmenSynthesisMode'])\n : defaults.watchmenSynthesisMode;\n const watchmenLocalModel = typeof raw.watchmenLocalModel === 'string' && raw.watchmenLocalModel.length > 0\n ? raw.watchmenLocalModel\n : defaults.watchmenLocalModel;\n\n // \u2500\u2500 Wiki config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableWiki = typeof raw.enableWiki === 'boolean' ? raw.enableWiki : defaults.enableWiki;\n const wikiSynthesisMode = raw.wikiSynthesisMode === 'local' ? 'local' as const : 'agent' as const;\n const wikiLocalModel = typeof raw.wikiLocalModel === 'string' ? raw.wikiLocalModel : defaults.wikiLocalModel;\n const wikiSources = Array.isArray(raw.wikiSources) ? raw.wikiSources : defaults.wikiSources;\n const wikiAutoResolveConflicts = typeof raw.wikiAutoResolveConflicts === 'boolean' ? raw.wikiAutoResolveConflicts : defaults.wikiAutoResolveConflicts;\n const wikiLintFrequency = raw.wikiLintFrequency === 'weekly' ? 'weekly' as const : 'off' as const;\n const wikiContextLimit = typeof raw.wikiContextLimit === 'number' ? raw.wikiContextLimit : defaults.wikiContextLimit;\n const wikiContextThreshold = typeof raw.wikiContextThreshold === 'number' ? raw.wikiContextThreshold : defaults.wikiContextThreshold;\n\n // \u2500\u2500 Docs config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableDocs = typeof raw.enableDocs === 'boolean'\n ? raw.enableDocs\n : defaults.enableDocs;\n const docsInclude = Array.isArray(raw.docsInclude)\n && raw.docsInclude.every((p: unknown) => typeof p === 'string')\n ? (raw.docsInclude as string[])\n : defaults.docsInclude;\n const docsExclude = Array.isArray(raw.docsExclude)\n && raw.docsExclude.every((p: unknown) => typeof p === 'string')\n ? (raw.docsExclude as string[])\n : defaults.docsExclude;\n const docsLinkCode = typeof raw.docsLinkCode === 'boolean'\n ? raw.docsLinkCode\n : defaults.docsLinkCode;\n const docsContextLimit = typeof raw.docsContextLimit === 'number' && raw.docsContextLimit >= 0\n ? Math.round(raw.docsContextLimit)\n : defaults.docsContextLimit;\n const docsContextThreshold = typeof raw.docsContextThreshold === 'number'\n && raw.docsContextThreshold >= 0 && raw.docsContextThreshold <= 1\n ? raw.docsContextThreshold\n : defaults.docsContextThreshold;\n const docsMaxFileSize = typeof raw.docsMaxFileSize === 'number' && raw.docsMaxFileSize > 0\n ? raw.docsMaxFileSize\n : defaults.docsMaxFileSize;\n const DOCS_SUMMARIZATION_MODES = new Set(['embedding', 'first-sentence', 'off']);\n const docsSummarization = typeof raw.docsSummarization === 'string' && DOCS_SUMMARIZATION_MODES.has(raw.docsSummarization)\n ? (raw.docsSummarization as KiroGraphConfig['docsSummarization'])\n : defaults.docsSummarization;\n\n // \u2500\u2500 Data config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableData = typeof raw.enableData === 'boolean' ? raw.enableData : defaults.enableData;\n const dataInclude = Array.isArray(raw.dataInclude) && raw.dataInclude.every((p: unknown) => typeof p === 'string')\n ? (raw.dataInclude as string[]) : defaults.dataInclude;\n const dataExclude = Array.isArray(raw.dataExclude) && raw.dataExclude.every((p: unknown) => typeof p === 'string')\n ? (raw.dataExclude as string[]) : defaults.dataExclude;\n const dataLinkCode = typeof raw.dataLinkCode === 'boolean' ? raw.dataLinkCode : defaults.dataLinkCode;\n const dataContextLimit = typeof raw.dataContextLimit === 'number' && raw.dataContextLimit >= 0\n ? Math.round(raw.dataContextLimit) : defaults.dataContextLimit;\n const dataMaxFileSize = typeof raw.dataMaxFileSize === 'number' && raw.dataMaxFileSize > 0\n ? raw.dataMaxFileSize : defaults.dataMaxFileSize;\n const dataMaxRows = typeof raw.dataMaxRows === 'number' && raw.dataMaxRows > 0\n ? Math.round(raw.dataMaxRows) : defaults.dataMaxRows;\n const dataQueryLimit = typeof raw.dataQueryLimit === 'number' && raw.dataQueryLimit > 0\n ? Math.min(Math.round(raw.dataQueryLimit), 500) : defaults.dataQueryLimit;\n const dataMaxResponseTokens = typeof raw.dataMaxResponseTokens === 'number' && raw.dataMaxResponseTokens > 0\n ? Math.round(raw.dataMaxResponseTokens) : defaults.dataMaxResponseTokens;\n\n // \u2500\u2500 Security config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let enableSecurity: boolean;\n if (typeof raw.enableSecurity === 'boolean') {\n enableSecurity = raw.enableSecurity;\n } else {\n if (raw.enableSecurity !== undefined) {\n logWarn('Invalid config field enableSecurity: expected boolean, applying default (false)');\n }\n enableSecurity = defaults.enableSecurity;\n }\n\n let securityAutoEnrich: boolean;\n if (typeof raw.securityAutoEnrich === 'boolean') {\n securityAutoEnrich = raw.securityAutoEnrich;\n } else {\n if (raw.securityAutoEnrich !== undefined) {\n logWarn('Invalid config field securityAutoEnrich: expected boolean, applying default (true)');\n }\n securityAutoEnrich = defaults.securityAutoEnrich;\n }\n\n let securityEnrichMaxAgeDays: number;\n if (typeof raw.securityEnrichMaxAgeDays === 'number' && raw.securityEnrichMaxAgeDays > 0) {\n securityEnrichMaxAgeDays = raw.securityEnrichMaxAgeDays;\n } else {\n if (raw.securityEnrichMaxAgeDays !== undefined) {\n logWarn('Invalid config field securityEnrichMaxAgeDays: expected positive number, applying default (7)');\n }\n securityEnrichMaxAgeDays = defaults.securityEnrichMaxAgeDays;\n }\n\n const SUPPORTED_SECURITY_DATABASES = new Set(['OSV']);\n let securityDatabases: string[];\n if (Array.isArray(raw.securityDatabases) && raw.securityDatabases.every((d: unknown) => typeof d === 'string')) {\n const valid = (raw.securityDatabases as string[]).filter(d => {\n if (!SUPPORTED_SECURITY_DATABASES.has(d)) {\n logWarn(`Unsupported security database \"${d}\" in securityDatabases, ignoring`);\n return false;\n }\n return true;\n });\n securityDatabases = valid.length > 0 ? valid : defaults.securityDatabases;\n } else {\n if (raw.securityDatabases !== undefined) {\n logWarn('Invalid config field securityDatabases: expected array of strings, applying default ([\"OSV\"])');\n }\n securityDatabases = defaults.securityDatabases;\n }\n\n let securityLicensePolicy: KiroGraphConfig['securityLicensePolicy'];\n if (raw.securityLicensePolicy && typeof raw.securityLicensePolicy === 'object' && !Array.isArray(raw.securityLicensePolicy)) {\n const rawPolicy = raw.securityLicensePolicy as Record<string, unknown>;\n const deny = Array.isArray(rawPolicy.deny) && rawPolicy.deny.every((p: unknown) => typeof p === 'string')\n ? (rawPolicy.deny as string[])\n : defaults.securityLicensePolicy.deny;\n const warn = Array.isArray(rawPolicy.warn) && rawPolicy.warn.every((p: unknown) => typeof p === 'string')\n ? (rawPolicy.warn as string[])\n : defaults.securityLicensePolicy.warn;\n securityLicensePolicy = { deny, warn };\n } else {\n if (raw.securityLicensePolicy !== undefined) {\n logWarn('Invalid config field securityLicensePolicy: expected object with deny/warn arrays, applying default');\n }\n securityLicensePolicy = defaults.securityLicensePolicy;\n }\n\n // \u2500\u2500 Patterns config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let enablePatterns: boolean;\n if (typeof raw.enablePatterns === 'boolean') {\n enablePatterns = raw.enablePatterns;\n } else {\n if (raw.enablePatterns !== undefined) {\n logWarn('Invalid config field enablePatterns: expected boolean, applying default (false)');\n }\n enablePatterns = defaults.enablePatterns;\n }\n\n let patternLibraryPath: string | undefined;\n if (raw.patternLibraryPath === undefined || raw.patternLibraryPath === null) {\n patternLibraryPath = undefined;\n } else if (typeof raw.patternLibraryPath === 'string') {\n patternLibraryPath = raw.patternLibraryPath;\n } else {\n logWarn('Invalid config field patternLibraryPath: expected string or undefined, applying default (undefined)');\n patternLibraryPath = defaults.patternLibraryPath;\n }\n\n const PATTERN_SEVERITY_LEVELS = new Set(['critical', 'high', 'medium', 'low']);\n let patternSeverityThreshold: KiroGraphConfig['patternSeverityThreshold'];\n if (typeof raw.patternSeverityThreshold === 'string' && PATTERN_SEVERITY_LEVELS.has(raw.patternSeverityThreshold)) {\n patternSeverityThreshold = raw.patternSeverityThreshold as KiroGraphConfig['patternSeverityThreshold'];\n } else {\n if (raw.patternSeverityThreshold !== undefined) {\n logWarn('Invalid config field patternSeverityThreshold: expected critical|high|medium|low, applying default (low)');\n }\n patternSeverityThreshold = defaults.patternSeverityThreshold;\n }\n\n // \u2500\u2500 Tool group flags \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableCodeHealth = typeof raw.enableCodeHealth === 'boolean'\n ? raw.enableCodeHealth\n : defaults.enableCodeHealth;\n const enableNavigation = typeof raw.enableNavigation === 'boolean'\n ? raw.enableNavigation\n : defaults.enableNavigation;\n const enableComplexity = typeof raw.enableComplexity === 'boolean'\n ? raw.enableComplexity\n : defaults.enableComplexity;\n const enableGitContext = typeof raw.enableGitContext === 'boolean'\n ? raw.enableGitContext\n : defaults.enableGitContext;\n const enableEditPrimitives = typeof raw.enableEditPrimitives === 'boolean'\n ? raw.enableEditPrimitives\n : defaults.enableEditPrimitives;\n const enableBranch = typeof raw.enableBranch === 'boolean'\n ? raw.enableBranch\n : defaults.enableBranch;\n // enableAdvancedAnalysis is deprecated \u2014 silently accepted, not applied\n const enableAgentUtils = typeof raw.enableAgentUtils === 'boolean'\n ? raw.enableAgentUtils\n : defaults.enableAgentUtils;\n const enableGeneralCompression = typeof raw.enableGeneralCompression === 'boolean'\n ? raw.enableGeneralCompression\n : defaults.enableGeneralCompression;\n\n // Dependency constraint: enableSecurity requires enableArchitecture\n let finalEnableArchitecture = enableArchitecture;\n if (enableSecurity && !enableArchitecture) {\n logWarn('enableSecurity requires enableArchitecture \\u2014 auto-enabling architecture analysis');\n finalEnableArchitecture = true;\n }\n\n // \u2500\u2500 Context budget config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let contextBudget: KiroGraphConfig['contextBudget'] | undefined;\n if (raw.contextBudget && typeof raw.contextBudget === 'object' && !Array.isArray(raw.contextBudget)) {\n const cb = raw.contextBudget as Record<string, unknown>;\n contextBudget = {\n maxTokensPerSession: typeof cb.maxTokensPerSession === 'number' && cb.maxTokensPerSession > 0\n ? Math.round(cb.maxTokensPerSession) : 100_000,\n warnAt: typeof cb.warnAt === 'number' && cb.warnAt > 0\n ? Math.round(cb.warnAt) : 80_000,\n throttleAt: typeof cb.throttleAt === 'number' && cb.throttleAt > 0\n ? Math.round(cb.throttleAt) : 95_000,\n };\n }\n\n // Validate glob patterns \u2014 exclude unsafe regex patterns\n const include = _validatePatterns(raw.include, defaults.include);\n const exclude = _validatePatterns(raw.exclude, defaults.exclude);\n\n return {\n version,\n languages,\n include,\n exclude,\n maxFileSize,\n extractDocstrings,\n trackCallSites,\n enableEmbeddings,\n embeddingModel,\n embeddingDim,\n useVecIndex,\n semanticEngine,\n turboquantMemDocs,\n turboquantBits,\n turbovecMemDocs,\n turbovecBits,\n typesenseDashboard,\n qdrantDashboard,\n minLogLevel,\n frameworkHints,\n fuzzyResolutionThreshold,\n enableArchitecture: finalEnableArchitecture,\n cavemanMode,\n shellCompressionLevel,\n syncWarningThreshold,\n enableMemory,\n memorySearchAlpha,\n memoryKeepRaw,\n memoryMaxObservations,\n memorySessionTimeout,\n memoryContextLimit,\n memoryContextThreshold,\n memoryExcludePatterns,\n memoryStrictWrites,\n enableWatchmen: enableWatchmen && enableMemory,\n watchmenThreshold,\n watchmenSynthesisMode,\n watchmenLocalModel,\n enableWiki,\n wikiSynthesisMode,\n wikiLocalModel,\n wikiSources,\n wikiAutoResolveConflicts,\n wikiLintFrequency,\n wikiContextLimit,\n wikiContextThreshold,\n enableDocs,\n docsInclude,\n docsExclude,\n docsLinkCode,\n docsContextLimit,\n docsContextThreshold,\n docsMaxFileSize,\n docsSummarization,\n enableData,\n dataInclude,\n dataExclude,\n dataLinkCode,\n dataContextLimit,\n dataMaxFileSize,\n dataMaxRows,\n dataQueryLimit,\n dataMaxResponseTokens,\n enableSecurity,\n securityDatabases,\n securityAutoEnrich,\n securityEnrichMaxAgeDays,\n securityLicensePolicy,\n enablePatterns,\n patternLibraryPath,\n patternSeverityThreshold,\n enableCodeHealth,\n enableNavigation,\n enableComplexity,\n enableGitContext,\n enableEditPrimitives,\n enableBranch,\n enableAgentUtils,\n enableGeneralCompression,\n enableShellExec: shellCompressionLevel !== 'off',\n ...(architectureLayers !== undefined ? { architectureLayers } : {}),\n ...(contextBudget !== undefined ? { contextBudget } : {}),\n };\n}\n\nfunction _validateArchitectureLayers(raw: unknown): Record<string, string[]> | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const result: Record<string, string[]> = {};\n for (const [key, val] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof key !== 'string') continue;\n if (!Array.isArray(val)) continue;\n const patterns = val.filter((p): p is string => typeof p === 'string' && isSafeRegex(p));\n if (patterns.length > 0) result[key] = patterns;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction _validatePatterns(raw: unknown, fallback: string[]): string[] {\n if (!Array.isArray(raw)) return fallback;\n const valid: string[] = [];\n for (const p of raw) {\n if (typeof p !== 'string') continue;\n if (!isSafeRegex(p)) {\n logWarn(`Unsafe regex pattern skipped: ${p}`);\n continue;\n }\n valid.push(p);\n }\n return valid;\n}\n\n// \u2500\u2500 Migration helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Upgrades shallow exclude patterns (e.g. \"node_modules/**\") to recursive ones\n * (e.g. \"** /node_modules/**\") so nested directories are excluded at any depth.\n */\nconst SHALLOW_TO_RECURSIVE: Record<string, string> = {\n 'node_modules/**': '**/node_modules/**',\n 'dist/**': '**/dist/**',\n 'build/**': '**/build/**',\n '.git/**': '**/.git/**',\n '.kirograph/**': '**/.kirograph/**',\n};\n\nfunction migrateExcludePatterns(patterns: string[]): string[] {\n return patterns.map(p => SHALLOW_TO_RECURSIVE[p] ?? p);\n}\n\n// \u2500\u2500 Load / Save \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function loadConfig(projectRoot: string): Promise<KiroGraphConfig> {\n const dir = path.join(projectRoot, KIROGRAPH_DIR);\n const cfgPath = path.join(dir, CONFIG_FILE);\n\n if (!fs.existsSync(cfgPath)) {\n // Create default config file\n const defaults = createDefaultConfig(projectRoot);\n await fs.promises.mkdir(dir, { recursive: true });\n await _writeAtomic(cfgPath, defaults);\n return defaults;\n }\n\n let raw: unknown;\n try {\n const text = await fs.promises.readFile(cfgPath, 'utf8');\n raw = JSON.parse(text);\n } catch (err) {\n logError('Config parse error', { path: cfgPath, error: err instanceof Error ? err.message : String(err) });\n return createDefaultConfig(projectRoot);\n }\n\n const config = validateConfig(raw);\n\n // Migrate v1 \u2192 v2: upgrade shallow exclude patterns to recursive\n if (config.version < 2) {\n config.version = 2;\n config.exclude = migrateExcludePatterns(config.exclude);\n await fs.promises.mkdir(dir, { recursive: true });\n await _writeAtomic(cfgPath, config);\n }\n\n return config;\n}\n\nexport async function saveConfig(projectRoot: string, config: KiroGraphConfig): Promise<void> {\n const dir = path.join(projectRoot, KIROGRAPH_DIR);\n const cfgPath = path.join(dir, CONFIG_FILE);\n await fs.promises.mkdir(dir, { recursive: true });\n await _writeAtomic(cfgPath, config);\n}\n\nasync function _writeAtomic(cfgPath: string, config: KiroGraphConfig): Promise<void> {\n const tmp = cfgPath + '.tmp';\n await fs.promises.writeFile(tmp, JSON.stringify(config, null, 2), 'utf8');\n await fs.promises.rename(tmp, cfgPath);\n}\n\n// \u2500\u2500 Update helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function updateConfig(\n projectRoot: string,\n patch: Partial<KiroGraphConfig>\n): Promise<KiroGraphConfig> {\n const current = await loadConfig(projectRoot);\n const updated = validateConfig({ ...current, ...patch });\n await saveConfig(projectRoot, updated);\n return updated;\n}\n\nexport async function addIncludePatterns(projectRoot: string, patterns: string[]): Promise<void> {\n const config = await loadConfig(projectRoot);\n const existing = new Set(config.include);\n const toAdd = patterns.filter(p => isSafeRegex(p) && !existing.has(p));\n if (toAdd.length === 0) return;\n await saveConfig(projectRoot, { ...config, include: [...config.include, ...toAdd] });\n}\n\nexport async function addExcludePatterns(projectRoot: string, patterns: string[]): Promise<void> {\n const config = await loadConfig(projectRoot);\n const existing = new Set(config.exclude);\n const toAdd = patterns.filter(p => isSafeRegex(p) && !existing.has(p));\n if (toAdd.length === 0) return;\n await saveConfig(projectRoot, { ...config, exclude: [...config.exclude, ...toAdd] });\n}\n\n// \u2500\u2500 File inclusion check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function shouldIncludeFile(config: KiroGraphConfig, relPath: string): boolean {\n // Check exclude patterns first\n for (const pattern of config.exclude) {\n if (picomatch(pattern)(relPath)) return false;\n }\n // If include patterns are specified, file must match at least one\n if (config.include.length > 0) {\n return config.include.some(pattern => picomatch(pattern)(relPath));\n }\n return true;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph Config System\n *\n * Mirrors CodeGraph src/config.ts \u2014 load, save, validate, and provide defaults\n * for KiroGraph configuration.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport picomatch from 'picomatch';\nimport { logWarn, logError } from './errors';\n\n// \u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface KiroGraphConfig {\n version: number;\n languages: string[];\n include: string[];\n exclude: string[];\n maxFileSize: number;\n extractDocstrings: boolean;\n trackCallSites: boolean;\n // Parity fields:\n enableEmbeddings: boolean;\n embeddingModel: string;\n embeddingDim: number;\n /** @deprecated Use semanticEngine instead. Kept for backwards compatibility. */\n useVecIndex: boolean;\n semanticEngine: 'cosine' | 'turboquant' | 'turbovec' | 'sqlite-vec' | 'orama' | 'pglite' | 'lancedb' | 'qdrant' | 'typesense';\n /** Apply TurboQuant ANN index to memory observations and doc sections. Default: false. */\n turboquantMemDocs: boolean;\n /** TurboQuant bits per coordinate (1\u20138). Controls compression/quality tradeoff. Default: 3 (\u224825\u00D7). */\n turboquantBits: number;\n /** Apply TurboVec ANN index to memory observations and doc sections. Default: false. */\n turbovecMemDocs: boolean;\n /** TurboVec bits per coordinate (2, 3, or 4). Controls compression/quality tradeoff. Default: 4. */\n turbovecBits: number;\n typesenseDashboard: boolean;\n qdrantDashboard: boolean;\n minLogLevel: 'debug' | 'info' | 'warn' | 'error';\n frameworkHints: string[];\n fuzzyResolutionThreshold: number; // 0.0\u20131.0\n /** Enable architecture analysis (package graph + layer detection). Default: false. */\n enableArchitecture: boolean;\n /**\n * User-defined layer \u2192 glob pattern overrides.\n * When set, config-defined layers win over auto-detected ones.\n * Example: { \"api\": [\"src/routes/**\", \"src/controllers/**\"] }\n */\n architectureLayers?: Record<string, string[]>;\n /** Agent communication style injected at agentSpawn. Default: 'off'. */\n cavemanMode: 'off' | 'lite' | 'full' | 'ultra';\n /** Shell compression level for kirograph_exec. 'off' disables the hook/steering. Default: 'normal'. */\n shellCompressionLevel: 'off' | 'normal' | 'aggressive' | 'ultra';\n /**\n * Number of pending (unindexed) files above which kirograph_status warns the agent.\n * Set to 0 to disable the warning. Default: 10.\n */\n syncWarningThreshold: number;\n /** Enable persistent cross-session memory. Default: false. */\n enableMemory: boolean;\n /** FTS/vector blend for memory search: 0 = FTS only, 1 = vector only. Default: 0.5. */\n memorySearchAlpha: number;\n /** Store uncompressed originals when caveman is on. Default: false. */\n memoryKeepRaw: boolean;\n /** Auto-prune threshold (max observations). 0 = no limit. Default: 10000. */\n memoryMaxObservations: number;\n /** Seconds of inactivity before auto-closing a session. Default: 7200. */\n memorySessionTimeout: number;\n /** Max observations shown in kirograph_context. Default: 3. */\n memoryContextLimit: number;\n /** Min relevance score to include memory in context. Default: 0.3. */\n memoryContextThreshold: number;\n /** Glob patterns for paths to never capture in memory. Default: []. */\n memoryExcludePatterns: string[];\n /**\n * Reject observation writes that don't conform to the memory schema\n * (unknown `kind`, blank tags) instead of silently accepting them.\n * Applies to `kirograph mem store`, the `kirograph_mem_store` MCP tool,\n * and `MemoryManager.store()` directly. Off by default \u2014 existing\n * free-form writes are unaffected until explicitly opted in.\n * Default: false.\n */\n memoryStrictWrites: boolean;\n /**\n * Validate an observation's `fields` (structured data beyond `content`)\n * against a JSON Schema registered per kind at\n * `.kirograph/memory-schemas/<kind>.schema.json`. A kind with no schema\n * file registered is never validated \u2014 schemas are opt-in per kind.\n * Off by default; independent of memoryStrictWrites (that one validates\n * `kind`/`tags`, this one validates `fields`). Default: false.\n */\n memorySchemaValidation: boolean;\n /** Enable watchmen \u2014 auto-synthesize workspace briefs from memory observations. Requires enableMemory. Default: false. */\n enableWatchmen: boolean;\n /** Minimum new observations since last synthesis before watchmenReady fires. Default: 5. */\n watchmenThreshold: number;\n /**\n * How synthesis is performed.\n * 'local' \u2014 runs a local HuggingFace model via @huggingface/transformers (no API cost, works for all tools).\n * 'agent' \u2014 delegates to the active AI agent via askAgent hook (Kiro only, consumes agent tokens).\n * Default: 'local'.\n */\n watchmenSynthesisMode: 'local' | 'agent';\n /** HuggingFace model ID for local synthesis. Only used when watchmenSynthesisMode is 'local'. Default: 'onnx-community/gemma-4-E4B-it-ONNX'. */\n watchmenLocalModel: string;\n /** Enable documentation indexing and navigation. Default: false. */\n enableDocs: boolean;\n /** Glob patterns for documentation files to include. */\n docsInclude: string[];\n /** Glob patterns for documentation files to exclude. */\n docsExclude: string[];\n /** Enable auto-linking of doc sections to code symbols. Default: true. */\n docsLinkCode: boolean;\n /** Max doc sections to include in kirograph_context. 0 = disabled. Default: 0. */\n docsContextLimit: number;\n /** Min relevance score to include a doc section in context. Default: 0.3. */\n docsContextThreshold: number;\n /** Max file size for doc files (bytes). Default: 1MB. */\n docsMaxFileSize: number;\n /** Summarization strategy. Default: 'first-sentence'. */\n docsSummarization: 'embedding' | 'first-sentence' | 'off';\n /** Enable LLM-maintained wiki (entity pages in .kirograph/wiki/). Default: false. */\n enableWiki: boolean;\n /** Wiki synthesis mode. Default: 'agent'. */\n wikiSynthesisMode: 'agent' | 'local';\n /** HuggingFace model for local wiki synthesis. */\n wikiLocalModel: string;\n /** Glob patterns for auto-ingest wiki sources. Default: ['docs/']. */\n wikiSources: string[];\n /**\n * Validate a page's optional YAML frontmatter against a JSON Schema\n * registered per `_type` at `.kirograph/wiki-schemas/<type>.schema.json`.\n * Pages without frontmatter, or with a `_type` that has no schema\n * registered, are never validated \u2014 untyped prose pages are unaffected.\n * Checked by `wiki lint`, reported as `schema_error` issues. Default: false.\n */\n wikiTypedPages: boolean;\n /** Auto-resolve wiki conflicts by source date. Default: false. */\n wikiAutoResolveConflicts: boolean;\n /** Lint frequency: 'weekly' (every ~20 sessions) or 'off'. Default: 'off'. */\n wikiLintFrequency: 'weekly' | 'off';\n /** Max wiki pages to include in kirograph_context. Default: 3. */\n wikiContextLimit: number;\n /** Min FTS score to include wiki page in context. Default: 0.4. */\n wikiContextThreshold: number;\n /** Enable tabular data indexing and querying. Default: false. */\n enableData: boolean;\n /** Glob patterns for data files to include. */\n dataInclude: string[];\n /** Glob patterns for data files to exclude. */\n dataExclude: string[];\n /** Enable auto-linking of data files to code symbols. Default: true. */\n dataLinkCode: boolean;\n /** Max datasets to include in kirograph_context. 0 = disabled. Default: 0. */\n dataContextLimit: number;\n /** Max file size for data files (bytes). Default: 50MB. */\n dataMaxFileSize: number;\n /** Max rows to index per file. Default: 1,000,000. */\n dataMaxRows: number;\n /** Max rows returned per query. Default: 500. */\n dataQueryLimit: number;\n /** Max token budget per response. Default: 8000. */\n dataMaxResponseTokens: number;\n /** Enable security analysis (dependency scanning + vulnerability detection). Default: false. */\n enableSecurity: boolean;\n /** Vulnerability databases to query. Default: ['OSV']. */\n securityDatabases: string[];\n /** Enable AST-level structural pattern matching (SAST) during indexing. Default: false. */\n enablePatterns: boolean;\n /** Enable code health tools (hotspots, dead code, path analysis, type hierarchy). Default: false. */\n enableCodeHealth: boolean;\n /** Enable navigation tools (status, files, impact). Default: false. */\n enableNavigation: boolean;\n /** Enable complexity metrics tools. Default: false. */\n enableComplexity: boolean;\n /** Enable git-context tools (diff_context, commit_context, flows, etc.). Default: false. */\n enableGitContext: boolean;\n /** Enable atomic edit primitive tools (str_replace, insert_at, etc.) and refactor. Default: false. */\n enableEditPrimitives: boolean;\n /** Enable multi-branch graph indexing tools. Default: false. */\n enableBranch: boolean;\n /** @deprecated Dissolved \u2014 tools moved to enableCodeHealth, enableGitContext, enableArchitecture, enableEditPrimitives. Kept in KNOWN_FIELDS for silent backwards compatibility. */\n enableAdvancedAnalysis?: boolean;\n /** Enable agent utility tools (file caching, budget tracking). Default: true. */\n enableAgentUtils: boolean;\n /** Enable general-purpose compression tool (kirograph_compress). Default: false. */\n enableGeneralCompression: boolean;\n /** Derived from shellCompressionLevel \u2014 true when compression is enabled. Controls kirograph_exec. */\n enableShellExec: boolean;\n /** Path to a directory of user-supplied YAML rule files. Merged with bundled library (user rules win on id conflict). Default: undefined. */\n patternLibraryPath: string | undefined;\n /** Minimum severity level for storing pattern matches during index-time analysis. Default: 'low'. */\n patternSeverityThreshold: 'critical' | 'high' | 'medium' | 'low';\n /** Auto-run vulnerability enrichment after manifest parsing. Default: true. */\n securityAutoEnrich: boolean;\n /** Max age in days for vulnerability data before showing a staleness warning. Default: 7. */\n securityEnrichMaxAgeDays: number;\n /**\n * License policy for dependency compliance.\n * deny: licenses to block (build fails / command exits non-zero).\n * warn: licenses to flag as warnings.\n * Patterns support wildcards: GPL-* matches GPL-2.0, GPL-3.0, etc.\n * Default: { deny: [], warn: [] }.\n */\n securityLicensePolicy: {\n deny: string[];\n warn: string[];\n };\n /** Context budget governance settings. */\n contextBudget?: {\n maxTokensPerSession: number;\n warnAt: number;\n throttleAt: number;\n };\n}\n\n// \u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst KIROGRAPH_DIR = '.kirograph';\nconst CONFIG_FILE = 'config.json';\n\nconst KNOWN_FIELDS = new Set<string>([\n 'version', 'languages', 'include', 'exclude', 'maxFileSize',\n 'extractDocstrings', 'trackCallSites', 'enableEmbeddings', 'embeddingModel', 'embeddingDim',\n 'useVecIndex', 'semanticEngine', 'turboquantMemDocs', 'turboquantBits', 'turbovecMemDocs', 'turbovecBits', 'typesenseDashboard', 'qdrantDashboard',\n 'minLogLevel', 'frameworkHints', 'fuzzyResolutionThreshold',\n 'enableArchitecture', 'architectureLayers', 'cavemanMode', 'shellCompressionLevel', 'syncWarningThreshold',\n 'enableMemory', 'memorySearchAlpha', 'memoryKeepRaw', 'memoryMaxObservations',\n 'memorySessionTimeout', 'memoryContextLimit', 'memoryContextThreshold', 'memoryExcludePatterns', 'memoryStrictWrites',\n 'memorySchemaValidation',\n 'enableWatchmen', 'watchmenThreshold', 'watchmenSynthesisMode', 'watchmenLocalModel',\n 'enableWiki', 'wikiSynthesisMode', 'wikiLocalModel', 'wikiSources', 'wikiTypedPages',\n 'wikiAutoResolveConflicts', 'wikiLintFrequency', 'wikiContextLimit', 'wikiContextThreshold',\n 'enableDocs', 'docsInclude', 'docsExclude', 'docsLinkCode',\n 'docsContextLimit', 'docsContextThreshold', 'docsMaxFileSize', 'docsSummarization',\n 'enableData', 'dataInclude', 'dataExclude', 'dataLinkCode',\n 'dataContextLimit', 'dataMaxFileSize', 'dataMaxRows', 'dataQueryLimit', 'dataMaxResponseTokens',\n 'enableSecurity', 'securityDatabases', 'securityAutoEnrich', 'securityEnrichMaxAgeDays', 'securityLicensePolicy',\n 'enablePatterns', 'patternLibraryPath', 'patternSeverityThreshold',\n 'enableCodeHealth', 'enableNavigation', 'enableComplexity', 'enableGitContext',\n 'enableEditPrimitives', 'enableBranch',\n 'enableAgentUtils', 'enableGeneralCompression',\n 'contextBudget',\n // Legacy aliases / derived fields (accepted but ignored or recomputed)\n 'enableCompression', 'compressionLevel', 'enableShellExec',\n // Deprecated: dissolved flag kept here so old configs don't warn\n 'enableAdvancedAnalysis',\n]);\n\nconst LOG_LEVELS = new Set(['debug', 'info', 'warn', 'error']);\n\n// \u2500\u2500 ReDoS-safe regex check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns false if the pattern is potentially dangerous (ReDoS risk) or too long.\n * Checks for catastrophic backtracking patterns like (a+)+ or (a|a)+.\n */\nexport function isSafeRegex(pattern: string): boolean {\n if (pattern.length > 100) return false;\n // Detect nested quantifiers: (x+)+ or (x*)+ or (x+)* etc.\n if (/\\([^)]*[+*][^)]*\\)[+*?]/.test(pattern)) return false;\n // Detect alternation with overlap: (a|a)+ style\n if (/\\([^)]*\\|[^)]*\\)[+*]/.test(pattern)) return false;\n return true;\n}\n\n// \u2500\u2500 Default config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function createDefaultConfig(_projectRoot?: string): KiroGraphConfig {\n return {\n version: 2,\n languages: [],\n include: [],\n exclude: [\n '**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/.kirograph/**',\n // Compiled / minified output and build artifacts \u2014 not meaningful source to index,\n // and large bundles can crash the parser (issue #33). '*.min.js' was previously\n // non-recursive (root-only); use '**/' so nested bundles are matched.\n '**/*.min.js', '**/*.min.css', '**/*.bundle.js', '**/*.map',\n '**/out/**', '**/.next/**', '**/.nuxt/**', '**/.vite/**', '**/.svelte-kit/**',\n '**/public/build/**', '**/Resources/Public/**',\n ],\n maxFileSize: 1_048_576,\n extractDocstrings: false,\n trackCallSites: false,\n enableEmbeddings: false,\n embeddingModel: 'nomic-ai/nomic-embed-text-v1.5',\n embeddingDim: 768,\n useVecIndex: false,\n semanticEngine: 'cosine',\n turboquantMemDocs: false,\n turboquantBits: 3,\n turbovecMemDocs: false,\n turbovecBits: 4,\n typesenseDashboard: false,\n qdrantDashboard: false,\n minLogLevel: 'warn',\n frameworkHints: [],\n fuzzyResolutionThreshold: 0.5,\n enableArchitecture: false,\n cavemanMode: 'off',\n shellCompressionLevel: 'off',\n syncWarningThreshold: 10,\n enableMemory: false,\n memorySearchAlpha: 0.5,\n memoryKeepRaw: false,\n memoryMaxObservations: 10000,\n memorySessionTimeout: 7200,\n memoryContextLimit: 3,\n memoryContextThreshold: 0.3,\n memoryExcludePatterns: [],\n memoryStrictWrites: false,\n memorySchemaValidation: false,\n enableWatchmen: false,\n watchmenThreshold: 5,\n watchmenSynthesisMode: 'local',\n watchmenLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX',\n enableWiki: false,\n wikiSynthesisMode: 'agent' as const,\n wikiLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX',\n wikiSources: ['docs/'],\n wikiTypedPages: false,\n wikiAutoResolveConflicts: false,\n wikiLintFrequency: 'off' as const,\n wikiContextLimit: 3,\n wikiContextThreshold: 0.4,\n enableDocs: false,\n docsInclude: ['**/*.md', '**/*.mdx', '**/*.rst', '**/*.adoc', '**/*.asciidoc', '**/*.rdoc', '**/*.org', '**/*.cheatmd', 'docs/**/*.txt', 'docs/**/*.html'],\n docsExclude: ['node_modules/**', '**/CHANGELOG*', '**/LICENSE*', '**/CHANGES*', 'dist/**', 'build/**', 'coverage/**', '.git/**', '**/generated/**', '**/auto-generated/**', '**/vendor/**', '_build/**'],\n docsLinkCode: true,\n docsContextLimit: 0,\n docsContextThreshold: 0.3,\n docsMaxFileSize: 1_048_576,\n docsSummarization: 'first-sentence',\n enableData: false,\n dataInclude: ['**/*.csv', '**/*.tsv', '**/*.jsonl', '**/*.ndjson', '**/*.xlsx', '**/*.xls', '**/*.parquet', 'data/**/*.json', '**/*.pdf'],\n dataExclude: ['node_modules/**', 'dist/**', 'build/**', '.git/**', '**/package-lock.json', '**/yarn.lock', '**/pnpm-lock.yaml', '**/tsconfig.json', '**/jsconfig.json', 'coverage/**', '**/generated/**'],\n dataLinkCode: true,\n dataContextLimit: 0,\n dataMaxFileSize: 52_428_800,\n dataMaxRows: 1_000_000,\n dataQueryLimit: 500,\n dataMaxResponseTokens: 8000,\n enableSecurity: false,\n securityDatabases: ['OSV'],\n securityAutoEnrich: true,\n securityEnrichMaxAgeDays: 7,\n securityLicensePolicy: { deny: [], warn: [] },\n enablePatterns: false,\n patternLibraryPath: undefined,\n patternSeverityThreshold: 'low',\n enableCodeHealth: false,\n enableNavigation: false,\n enableComplexity: false,\n enableGitContext: false,\n enableEditPrimitives: false,\n enableBranch: false,\n enableAgentUtils: true,\n enableGeneralCompression: false,\n enableShellExec: false,\n };\n}\n\n// \u2500\u2500 Validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function validateConfig(config: unknown): KiroGraphConfig {\n const defaults = createDefaultConfig();\n\n if (typeof config !== 'object' || config === null) {\n return defaults;\n }\n\n const raw = config as Record<string, unknown>;\n\n // Warn about unknown fields\n for (const key of Object.keys(raw)) {\n if (!KNOWN_FIELDS.has(key)) {\n logWarn(`Unknown config field: ${key}`);\n }\n }\n\n // Validate and coerce each field\n const version = typeof raw.version === 'number' ? raw.version : defaults.version;\n const languages = Array.isArray(raw.languages) && raw.languages.every(l => typeof l === 'string')\n ? (raw.languages as string[])\n : defaults.languages;\n const maxFileSize = typeof raw.maxFileSize === 'number' && raw.maxFileSize > 0\n ? raw.maxFileSize\n : defaults.maxFileSize;\n const extractDocstrings = typeof raw.extractDocstrings === 'boolean'\n ? raw.extractDocstrings\n : defaults.extractDocstrings;\n const trackCallSites = typeof raw.trackCallSites === 'boolean'\n ? raw.trackCallSites\n : defaults.trackCallSites;\n const enableEmbeddings = typeof raw.enableEmbeddings === 'boolean'\n ? raw.enableEmbeddings\n : defaults.enableEmbeddings;\n const embeddingModel = typeof raw.embeddingModel === 'string' && raw.embeddingModel.length > 0\n ? raw.embeddingModel\n : defaults.embeddingModel;\n const embeddingDim = typeof raw.embeddingDim === 'number' && raw.embeddingDim > 0\n ? raw.embeddingDim\n : defaults.embeddingDim;\n const useVecIndex = typeof raw.useVecIndex === 'boolean'\n ? raw.useVecIndex\n : defaults.useVecIndex;\n const SEMANTIC_ENGINES = new Set(['cosine', 'turboquant', 'turbovec', 'sqlite-vec', 'orama', 'pglite', 'lancedb', 'qdrant', 'typesense']);\n // useVecIndex is a legacy alias: if set and no explicit semanticEngine, map it\n const semanticEngine = typeof raw.semanticEngine === 'string' && SEMANTIC_ENGINES.has(raw.semanticEngine)\n ? (raw.semanticEngine as KiroGraphConfig['semanticEngine'])\n : useVecIndex ? 'sqlite-vec' : defaults.semanticEngine;\n const turboquantMemDocs = typeof raw.turboquantMemDocs === 'boolean'\n ? raw.turboquantMemDocs\n : defaults.turboquantMemDocs;\n const turboquantBits = typeof raw.turboquantBits === 'number'\n && raw.turboquantBits >= 1 && raw.turboquantBits <= 8\n ? Math.round(raw.turboquantBits)\n : defaults.turboquantBits;\n const turbovecMemDocs = typeof raw.turbovecMemDocs === 'boolean'\n ? raw.turbovecMemDocs\n : defaults.turbovecMemDocs;\n const TURBOVEC_BIT_WIDTHS = new Set([2, 3, 4]);\n const turbovecBits = typeof raw.turbovecBits === 'number' && TURBOVEC_BIT_WIDTHS.has(Math.round(raw.turbovecBits))\n ? Math.round(raw.turbovecBits)\n : defaults.turbovecBits;\n const typesenseDashboard = typeof raw.typesenseDashboard === 'boolean'\n ? raw.typesenseDashboard\n : defaults.typesenseDashboard;\n const qdrantDashboard = typeof raw.qdrantDashboard === 'boolean'\n ? raw.qdrantDashboard\n : defaults.qdrantDashboard;\n const minLogLevel = typeof raw.minLogLevel === 'string' && LOG_LEVELS.has(raw.minLogLevel)\n ? (raw.minLogLevel as KiroGraphConfig['minLogLevel'])\n : defaults.minLogLevel;\n const frameworkHints = Array.isArray(raw.frameworkHints) && raw.frameworkHints.every(h => typeof h === 'string')\n ? (raw.frameworkHints as string[])\n : defaults.frameworkHints;\n const fuzzyResolutionThreshold = typeof raw.fuzzyResolutionThreshold === 'number'\n && raw.fuzzyResolutionThreshold >= 0\n && raw.fuzzyResolutionThreshold <= 1\n ? raw.fuzzyResolutionThreshold\n : defaults.fuzzyResolutionThreshold;\n const enableArchitecture = typeof raw.enableArchitecture === 'boolean'\n ? raw.enableArchitecture\n : defaults.enableArchitecture;\n const architectureLayers = _validateArchitectureLayers(raw.architectureLayers);\n const CAVEMAN_MODES = new Set(['off', 'lite', 'full', 'ultra']);\n const cavemanMode = typeof raw.cavemanMode === 'string' && CAVEMAN_MODES.has(raw.cavemanMode)\n ? (raw.cavemanMode as KiroGraphConfig['cavemanMode'])\n : defaults.cavemanMode;\n const COMPRESSION_LEVELS = new Set(['off', 'normal', 'aggressive', 'ultra']);\n // Support legacy field names: enableCompression (boolean) and compressionLevel (string)\n let shellCompressionLevel: KiroGraphConfig['shellCompressionLevel'];\n if (typeof raw.shellCompressionLevel === 'string' && COMPRESSION_LEVELS.has(raw.shellCompressionLevel)) {\n shellCompressionLevel = raw.shellCompressionLevel as KiroGraphConfig['shellCompressionLevel'];\n } else if (typeof raw.compressionLevel === 'string' && COMPRESSION_LEVELS.has(raw.compressionLevel)) {\n shellCompressionLevel = raw.compressionLevel as KiroGraphConfig['shellCompressionLevel'];\n } else if (typeof raw.enableCompression === 'boolean') {\n shellCompressionLevel = raw.enableCompression ? 'normal' : 'off';\n } else {\n shellCompressionLevel = defaults.shellCompressionLevel;\n }\n const syncWarningThreshold = typeof raw.syncWarningThreshold === 'number' && raw.syncWarningThreshold >= 0\n ? Math.round(raw.syncWarningThreshold)\n : defaults.syncWarningThreshold;\n\n // \u2500\u2500 Memory config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableMemory = typeof raw.enableMemory === 'boolean'\n ? raw.enableMemory\n : defaults.enableMemory;\n const memorySearchAlpha = typeof raw.memorySearchAlpha === 'number'\n && raw.memorySearchAlpha >= 0 && raw.memorySearchAlpha <= 1\n ? raw.memorySearchAlpha\n : defaults.memorySearchAlpha;\n const memoryKeepRaw = typeof raw.memoryKeepRaw === 'boolean'\n ? raw.memoryKeepRaw\n : defaults.memoryKeepRaw;\n const memoryMaxObservations = typeof raw.memoryMaxObservations === 'number' && raw.memoryMaxObservations >= 0\n ? Math.round(raw.memoryMaxObservations)\n : defaults.memoryMaxObservations;\n const memorySessionTimeout = typeof raw.memorySessionTimeout === 'number' && raw.memorySessionTimeout > 0\n ? Math.round(raw.memorySessionTimeout)\n : defaults.memorySessionTimeout;\n const memoryContextLimit = typeof raw.memoryContextLimit === 'number' && raw.memoryContextLimit >= 0\n ? Math.round(raw.memoryContextLimit)\n : defaults.memoryContextLimit;\n const memoryContextThreshold = typeof raw.memoryContextThreshold === 'number'\n && raw.memoryContextThreshold >= 0 && raw.memoryContextThreshold <= 1\n ? raw.memoryContextThreshold\n : defaults.memoryContextThreshold;\n const memoryExcludePatterns = Array.isArray(raw.memoryExcludePatterns)\n && raw.memoryExcludePatterns.every((p: unknown) => typeof p === 'string')\n ? (raw.memoryExcludePatterns as string[])\n : defaults.memoryExcludePatterns;\n const memoryStrictWrites = typeof raw.memoryStrictWrites === 'boolean'\n ? raw.memoryStrictWrites\n : defaults.memoryStrictWrites;\n const memorySchemaValidation = typeof raw.memorySchemaValidation === 'boolean'\n ? raw.memorySchemaValidation\n : defaults.memorySchemaValidation;\n\n // \u2500\u2500 Watchmen config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableWatchmen = typeof raw.enableWatchmen === 'boolean'\n ? raw.enableWatchmen\n : defaults.enableWatchmen;\n const watchmenThreshold = typeof raw.watchmenThreshold === 'number' && raw.watchmenThreshold > 0\n ? Math.round(raw.watchmenThreshold)\n : defaults.watchmenThreshold;\n const WATCHMEN_SYNTHESIS_MODES = new Set(['local', 'agent']);\n const watchmenSynthesisMode = typeof raw.watchmenSynthesisMode === 'string' && WATCHMEN_SYNTHESIS_MODES.has(raw.watchmenSynthesisMode)\n ? (raw.watchmenSynthesisMode as KiroGraphConfig['watchmenSynthesisMode'])\n : defaults.watchmenSynthesisMode;\n const watchmenLocalModel = typeof raw.watchmenLocalModel === 'string' && raw.watchmenLocalModel.length > 0\n ? raw.watchmenLocalModel\n : defaults.watchmenLocalModel;\n\n // \u2500\u2500 Wiki config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableWiki = typeof raw.enableWiki === 'boolean' ? raw.enableWiki : defaults.enableWiki;\n const wikiSynthesisMode = raw.wikiSynthesisMode === 'local' ? 'local' as const : 'agent' as const;\n const wikiLocalModel = typeof raw.wikiLocalModel === 'string' ? raw.wikiLocalModel : defaults.wikiLocalModel;\n const wikiSources = Array.isArray(raw.wikiSources) ? raw.wikiSources : defaults.wikiSources;\n const wikiTypedPages = typeof raw.wikiTypedPages === 'boolean' ? raw.wikiTypedPages : defaults.wikiTypedPages;\n const wikiAutoResolveConflicts = typeof raw.wikiAutoResolveConflicts === 'boolean' ? raw.wikiAutoResolveConflicts : defaults.wikiAutoResolveConflicts;\n const wikiLintFrequency = raw.wikiLintFrequency === 'weekly' ? 'weekly' as const : 'off' as const;\n const wikiContextLimit = typeof raw.wikiContextLimit === 'number' ? raw.wikiContextLimit : defaults.wikiContextLimit;\n const wikiContextThreshold = typeof raw.wikiContextThreshold === 'number' ? raw.wikiContextThreshold : defaults.wikiContextThreshold;\n\n // \u2500\u2500 Docs config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableDocs = typeof raw.enableDocs === 'boolean'\n ? raw.enableDocs\n : defaults.enableDocs;\n const docsInclude = Array.isArray(raw.docsInclude)\n && raw.docsInclude.every((p: unknown) => typeof p === 'string')\n ? (raw.docsInclude as string[])\n : defaults.docsInclude;\n const docsExclude = Array.isArray(raw.docsExclude)\n && raw.docsExclude.every((p: unknown) => typeof p === 'string')\n ? (raw.docsExclude as string[])\n : defaults.docsExclude;\n const docsLinkCode = typeof raw.docsLinkCode === 'boolean'\n ? raw.docsLinkCode\n : defaults.docsLinkCode;\n const docsContextLimit = typeof raw.docsContextLimit === 'number' && raw.docsContextLimit >= 0\n ? Math.round(raw.docsContextLimit)\n : defaults.docsContextLimit;\n const docsContextThreshold = typeof raw.docsContextThreshold === 'number'\n && raw.docsContextThreshold >= 0 && raw.docsContextThreshold <= 1\n ? raw.docsContextThreshold\n : defaults.docsContextThreshold;\n const docsMaxFileSize = typeof raw.docsMaxFileSize === 'number' && raw.docsMaxFileSize > 0\n ? raw.docsMaxFileSize\n : defaults.docsMaxFileSize;\n const DOCS_SUMMARIZATION_MODES = new Set(['embedding', 'first-sentence', 'off']);\n const docsSummarization = typeof raw.docsSummarization === 'string' && DOCS_SUMMARIZATION_MODES.has(raw.docsSummarization)\n ? (raw.docsSummarization as KiroGraphConfig['docsSummarization'])\n : defaults.docsSummarization;\n\n // \u2500\u2500 Data config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableData = typeof raw.enableData === 'boolean' ? raw.enableData : defaults.enableData;\n const dataInclude = Array.isArray(raw.dataInclude) && raw.dataInclude.every((p: unknown) => typeof p === 'string')\n ? (raw.dataInclude as string[]) : defaults.dataInclude;\n const dataExclude = Array.isArray(raw.dataExclude) && raw.dataExclude.every((p: unknown) => typeof p === 'string')\n ? (raw.dataExclude as string[]) : defaults.dataExclude;\n const dataLinkCode = typeof raw.dataLinkCode === 'boolean' ? raw.dataLinkCode : defaults.dataLinkCode;\n const dataContextLimit = typeof raw.dataContextLimit === 'number' && raw.dataContextLimit >= 0\n ? Math.round(raw.dataContextLimit) : defaults.dataContextLimit;\n const dataMaxFileSize = typeof raw.dataMaxFileSize === 'number' && raw.dataMaxFileSize > 0\n ? raw.dataMaxFileSize : defaults.dataMaxFileSize;\n const dataMaxRows = typeof raw.dataMaxRows === 'number' && raw.dataMaxRows > 0\n ? Math.round(raw.dataMaxRows) : defaults.dataMaxRows;\n const dataQueryLimit = typeof raw.dataQueryLimit === 'number' && raw.dataQueryLimit > 0\n ? Math.min(Math.round(raw.dataQueryLimit), 500) : defaults.dataQueryLimit;\n const dataMaxResponseTokens = typeof raw.dataMaxResponseTokens === 'number' && raw.dataMaxResponseTokens > 0\n ? Math.round(raw.dataMaxResponseTokens) : defaults.dataMaxResponseTokens;\n\n // \u2500\u2500 Security config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let enableSecurity: boolean;\n if (typeof raw.enableSecurity === 'boolean') {\n enableSecurity = raw.enableSecurity;\n } else {\n if (raw.enableSecurity !== undefined) {\n logWarn('Invalid config field enableSecurity: expected boolean, applying default (false)');\n }\n enableSecurity = defaults.enableSecurity;\n }\n\n let securityAutoEnrich: boolean;\n if (typeof raw.securityAutoEnrich === 'boolean') {\n securityAutoEnrich = raw.securityAutoEnrich;\n } else {\n if (raw.securityAutoEnrich !== undefined) {\n logWarn('Invalid config field securityAutoEnrich: expected boolean, applying default (true)');\n }\n securityAutoEnrich = defaults.securityAutoEnrich;\n }\n\n let securityEnrichMaxAgeDays: number;\n if (typeof raw.securityEnrichMaxAgeDays === 'number' && raw.securityEnrichMaxAgeDays > 0) {\n securityEnrichMaxAgeDays = raw.securityEnrichMaxAgeDays;\n } else {\n if (raw.securityEnrichMaxAgeDays !== undefined) {\n logWarn('Invalid config field securityEnrichMaxAgeDays: expected positive number, applying default (7)');\n }\n securityEnrichMaxAgeDays = defaults.securityEnrichMaxAgeDays;\n }\n\n const SUPPORTED_SECURITY_DATABASES = new Set(['OSV']);\n let securityDatabases: string[];\n if (Array.isArray(raw.securityDatabases) && raw.securityDatabases.every((d: unknown) => typeof d === 'string')) {\n const valid = (raw.securityDatabases as string[]).filter(d => {\n if (!SUPPORTED_SECURITY_DATABASES.has(d)) {\n logWarn(`Unsupported security database \"${d}\" in securityDatabases, ignoring`);\n return false;\n }\n return true;\n });\n securityDatabases = valid.length > 0 ? valid : defaults.securityDatabases;\n } else {\n if (raw.securityDatabases !== undefined) {\n logWarn('Invalid config field securityDatabases: expected array of strings, applying default ([\"OSV\"])');\n }\n securityDatabases = defaults.securityDatabases;\n }\n\n let securityLicensePolicy: KiroGraphConfig['securityLicensePolicy'];\n if (raw.securityLicensePolicy && typeof raw.securityLicensePolicy === 'object' && !Array.isArray(raw.securityLicensePolicy)) {\n const rawPolicy = raw.securityLicensePolicy as Record<string, unknown>;\n const deny = Array.isArray(rawPolicy.deny) && rawPolicy.deny.every((p: unknown) => typeof p === 'string')\n ? (rawPolicy.deny as string[])\n : defaults.securityLicensePolicy.deny;\n const warn = Array.isArray(rawPolicy.warn) && rawPolicy.warn.every((p: unknown) => typeof p === 'string')\n ? (rawPolicy.warn as string[])\n : defaults.securityLicensePolicy.warn;\n securityLicensePolicy = { deny, warn };\n } else {\n if (raw.securityLicensePolicy !== undefined) {\n logWarn('Invalid config field securityLicensePolicy: expected object with deny/warn arrays, applying default');\n }\n securityLicensePolicy = defaults.securityLicensePolicy;\n }\n\n // \u2500\u2500 Patterns config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let enablePatterns: boolean;\n if (typeof raw.enablePatterns === 'boolean') {\n enablePatterns = raw.enablePatterns;\n } else {\n if (raw.enablePatterns !== undefined) {\n logWarn('Invalid config field enablePatterns: expected boolean, applying default (false)');\n }\n enablePatterns = defaults.enablePatterns;\n }\n\n let patternLibraryPath: string | undefined;\n if (raw.patternLibraryPath === undefined || raw.patternLibraryPath === null) {\n patternLibraryPath = undefined;\n } else if (typeof raw.patternLibraryPath === 'string') {\n patternLibraryPath = raw.patternLibraryPath;\n } else {\n logWarn('Invalid config field patternLibraryPath: expected string or undefined, applying default (undefined)');\n patternLibraryPath = defaults.patternLibraryPath;\n }\n\n const PATTERN_SEVERITY_LEVELS = new Set(['critical', 'high', 'medium', 'low']);\n let patternSeverityThreshold: KiroGraphConfig['patternSeverityThreshold'];\n if (typeof raw.patternSeverityThreshold === 'string' && PATTERN_SEVERITY_LEVELS.has(raw.patternSeverityThreshold)) {\n patternSeverityThreshold = raw.patternSeverityThreshold as KiroGraphConfig['patternSeverityThreshold'];\n } else {\n if (raw.patternSeverityThreshold !== undefined) {\n logWarn('Invalid config field patternSeverityThreshold: expected critical|high|medium|low, applying default (low)');\n }\n patternSeverityThreshold = defaults.patternSeverityThreshold;\n }\n\n // \u2500\u2500 Tool group flags \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const enableCodeHealth = typeof raw.enableCodeHealth === 'boolean'\n ? raw.enableCodeHealth\n : defaults.enableCodeHealth;\n const enableNavigation = typeof raw.enableNavigation === 'boolean'\n ? raw.enableNavigation\n : defaults.enableNavigation;\n const enableComplexity = typeof raw.enableComplexity === 'boolean'\n ? raw.enableComplexity\n : defaults.enableComplexity;\n const enableGitContext = typeof raw.enableGitContext === 'boolean'\n ? raw.enableGitContext\n : defaults.enableGitContext;\n const enableEditPrimitives = typeof raw.enableEditPrimitives === 'boolean'\n ? raw.enableEditPrimitives\n : defaults.enableEditPrimitives;\n const enableBranch = typeof raw.enableBranch === 'boolean'\n ? raw.enableBranch\n : defaults.enableBranch;\n // enableAdvancedAnalysis is deprecated \u2014 silently accepted, not applied\n const enableAgentUtils = typeof raw.enableAgentUtils === 'boolean'\n ? raw.enableAgentUtils\n : defaults.enableAgentUtils;\n const enableGeneralCompression = typeof raw.enableGeneralCompression === 'boolean'\n ? raw.enableGeneralCompression\n : defaults.enableGeneralCompression;\n\n // Dependency constraint: enableSecurity requires enableArchitecture\n let finalEnableArchitecture = enableArchitecture;\n if (enableSecurity && !enableArchitecture) {\n logWarn('enableSecurity requires enableArchitecture \\u2014 auto-enabling architecture analysis');\n finalEnableArchitecture = true;\n }\n\n // \u2500\u2500 Context budget config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n let contextBudget: KiroGraphConfig['contextBudget'] | undefined;\n if (raw.contextBudget && typeof raw.contextBudget === 'object' && !Array.isArray(raw.contextBudget)) {\n const cb = raw.contextBudget as Record<string, unknown>;\n contextBudget = {\n maxTokensPerSession: typeof cb.maxTokensPerSession === 'number' && cb.maxTokensPerSession > 0\n ? Math.round(cb.maxTokensPerSession) : 100_000,\n warnAt: typeof cb.warnAt === 'number' && cb.warnAt > 0\n ? Math.round(cb.warnAt) : 80_000,\n throttleAt: typeof cb.throttleAt === 'number' && cb.throttleAt > 0\n ? Math.round(cb.throttleAt) : 95_000,\n };\n }\n\n // Validate glob patterns \u2014 exclude unsafe regex patterns\n const include = _validatePatterns(raw.include, defaults.include);\n const exclude = _validatePatterns(raw.exclude, defaults.exclude);\n\n return {\n version,\n languages,\n include,\n exclude,\n maxFileSize,\n extractDocstrings,\n trackCallSites,\n enableEmbeddings,\n embeddingModel,\n embeddingDim,\n useVecIndex,\n semanticEngine,\n turboquantMemDocs,\n turboquantBits,\n turbovecMemDocs,\n turbovecBits,\n typesenseDashboard,\n qdrantDashboard,\n minLogLevel,\n frameworkHints,\n fuzzyResolutionThreshold,\n enableArchitecture: finalEnableArchitecture,\n cavemanMode,\n shellCompressionLevel,\n syncWarningThreshold,\n enableMemory,\n memorySearchAlpha,\n memoryKeepRaw,\n memoryMaxObservations,\n memorySessionTimeout,\n memoryContextLimit,\n memoryContextThreshold,\n memoryExcludePatterns,\n memoryStrictWrites,\n memorySchemaValidation,\n enableWatchmen: enableWatchmen && enableMemory,\n watchmenThreshold,\n watchmenSynthesisMode,\n watchmenLocalModel,\n enableWiki,\n wikiSynthesisMode,\n wikiLocalModel,\n wikiSources,\n wikiTypedPages,\n wikiAutoResolveConflicts,\n wikiLintFrequency,\n wikiContextLimit,\n wikiContextThreshold,\n enableDocs,\n docsInclude,\n docsExclude,\n docsLinkCode,\n docsContextLimit,\n docsContextThreshold,\n docsMaxFileSize,\n docsSummarization,\n enableData,\n dataInclude,\n dataExclude,\n dataLinkCode,\n dataContextLimit,\n dataMaxFileSize,\n dataMaxRows,\n dataQueryLimit,\n dataMaxResponseTokens,\n enableSecurity,\n securityDatabases,\n securityAutoEnrich,\n securityEnrichMaxAgeDays,\n securityLicensePolicy,\n enablePatterns,\n patternLibraryPath,\n patternSeverityThreshold,\n enableCodeHealth,\n enableNavigation,\n enableComplexity,\n enableGitContext,\n enableEditPrimitives,\n enableBranch,\n enableAgentUtils,\n enableGeneralCompression,\n enableShellExec: shellCompressionLevel !== 'off',\n ...(architectureLayers !== undefined ? { architectureLayers } : {}),\n ...(contextBudget !== undefined ? { contextBudget } : {}),\n };\n}\n\nfunction _validateArchitectureLayers(raw: unknown): Record<string, string[]> | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const result: Record<string, string[]> = {};\n for (const [key, val] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof key !== 'string') continue;\n if (!Array.isArray(val)) continue;\n const patterns = val.filter((p): p is string => typeof p === 'string' && isSafeRegex(p));\n if (patterns.length > 0) result[key] = patterns;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction _validatePatterns(raw: unknown, fallback: string[]): string[] {\n if (!Array.isArray(raw)) return fallback;\n const valid: string[] = [];\n for (const p of raw) {\n if (typeof p !== 'string') continue;\n if (!isSafeRegex(p)) {\n logWarn(`Unsafe regex pattern skipped: ${p}`);\n continue;\n }\n valid.push(p);\n }\n return valid;\n}\n\n// \u2500\u2500 Migration helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Upgrades shallow exclude patterns (e.g. \"node_modules/**\") to recursive ones\n * (e.g. \"** /node_modules/**\") so nested directories are excluded at any depth.\n */\nconst SHALLOW_TO_RECURSIVE: Record<string, string> = {\n 'node_modules/**': '**/node_modules/**',\n 'dist/**': '**/dist/**',\n 'build/**': '**/build/**',\n '.git/**': '**/.git/**',\n '.kirograph/**': '**/.kirograph/**',\n};\n\nfunction migrateExcludePatterns(patterns: string[]): string[] {\n return patterns.map(p => SHALLOW_TO_RECURSIVE[p] ?? p);\n}\n\n// \u2500\u2500 Load / Save \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function loadConfig(projectRoot: string): Promise<KiroGraphConfig> {\n const dir = path.join(projectRoot, KIROGRAPH_DIR);\n const cfgPath = path.join(dir, CONFIG_FILE);\n\n if (!fs.existsSync(cfgPath)) {\n // Create default config file\n const defaults = createDefaultConfig(projectRoot);\n await fs.promises.mkdir(dir, { recursive: true });\n await _writeAtomic(cfgPath, defaults);\n return defaults;\n }\n\n let raw: unknown;\n try {\n const text = await fs.promises.readFile(cfgPath, 'utf8');\n raw = JSON.parse(text);\n } catch (err) {\n logError('Config parse error', { path: cfgPath, error: err instanceof Error ? err.message : String(err) });\n return createDefaultConfig(projectRoot);\n }\n\n const config = validateConfig(raw);\n\n // Migrate v1 \u2192 v2: upgrade shallow exclude patterns to recursive\n if (config.version < 2) {\n config.version = 2;\n config.exclude = migrateExcludePatterns(config.exclude);\n await fs.promises.mkdir(dir, { recursive: true });\n await _writeAtomic(cfgPath, config);\n }\n\n return config;\n}\n\nexport async function saveConfig(projectRoot: string, config: KiroGraphConfig): Promise<void> {\n const dir = path.join(projectRoot, KIROGRAPH_DIR);\n const cfgPath = path.join(dir, CONFIG_FILE);\n await fs.promises.mkdir(dir, { recursive: true });\n await _writeAtomic(cfgPath, config);\n}\n\nasync function _writeAtomic(cfgPath: string, config: KiroGraphConfig): Promise<void> {\n const tmp = cfgPath + '.tmp';\n await fs.promises.writeFile(tmp, JSON.stringify(config, null, 2), 'utf8');\n await fs.promises.rename(tmp, cfgPath);\n}\n\n// \u2500\u2500 Update helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function updateConfig(\n projectRoot: string,\n patch: Partial<KiroGraphConfig>\n): Promise<KiroGraphConfig> {\n const current = await loadConfig(projectRoot);\n const updated = validateConfig({ ...current, ...patch });\n await saveConfig(projectRoot, updated);\n return updated;\n}\n\nexport async function addIncludePatterns(projectRoot: string, patterns: string[]): Promise<void> {\n const config = await loadConfig(projectRoot);\n const existing = new Set(config.include);\n const toAdd = patterns.filter(p => isSafeRegex(p) && !existing.has(p));\n if (toAdd.length === 0) return;\n await saveConfig(projectRoot, { ...config, include: [...config.include, ...toAdd] });\n}\n\nexport async function addExcludePatterns(projectRoot: string, patterns: string[]): Promise<void> {\n const config = await loadConfig(projectRoot);\n const existing = new Set(config.exclude);\n const toAdd = patterns.filter(p => isSafeRegex(p) && !existing.has(p));\n if (toAdd.length === 0) return;\n await saveConfig(projectRoot, { ...config, exclude: [...config.exclude, ...toAdd] });\n}\n\n// \u2500\u2500 File inclusion check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function shouldIncludeFile(config: KiroGraphConfig, relPath: string): boolean {\n // Check exclude patterns first\n for (const pattern of config.exclude) {\n if (picomatch(pattern)(relPath)) return false;\n }\n // If include patterns are specified, file must match at least one\n if (config.include.length > 0) {\n return config.include.some(pattern => picomatch(pattern)(relPath));\n }\n return true;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["picomatch"]
|
|
7
7
|
}
|
|
@@ -26,7 +26,8 @@ CREATE TABLE IF NOT EXISTS mem_observations (
|
|
|
26
26
|
superseded_by TEXT,
|
|
27
27
|
fact_type TEXT DEFAULT 'observation',
|
|
28
28
|
topic_key TEXT,
|
|
29
|
-
review_after INTEGER
|
|
29
|
+
review_after INTEGER,
|
|
30
|
+
fields TEXT
|
|
30
31
|
);
|
|
31
32
|
|
|
32
33
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_mem_obs_hash ON mem_observations(content_hash);
|
|
@@ -71,7 +71,8 @@ async function handleMemory(toolName, args, cg) {
|
|
|
71
71
|
kind: args.kind ?? "note",
|
|
72
72
|
source: "agent",
|
|
73
73
|
topicKey: args.topicKey,
|
|
74
|
-
reviewAfter: args.reviewAfter
|
|
74
|
+
reviewAfter: args.reviewAfter,
|
|
75
|
+
fields: args.fields
|
|
75
76
|
});
|
|
76
77
|
} catch (err) {
|
|
77
78
|
if (err instanceof MemorySchemaError) return `Rejected: ${err.message}`;
|