kirograph 0.23.0 → 0.27.0
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 +19 -5
- package/dist/bin/commands/configure-mcp.js +104 -0
- package/dist/bin/commands/configure-mcp.js.map +7 -0
- package/dist/bin/commands/memory.js +334 -2
- package/dist/bin/commands/memory.js.map +2 -2
- package/dist/bin/commands/uninit.js +12 -5
- package/dist/bin/commands/uninit.js.map +2 -2
- package/dist/bin/commands/wiki.js +307 -0
- package/dist/bin/commands/wiki.js.map +7 -0
- package/dist/bin/installer/common.js +9 -0
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +96 -5
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/hooks.js +182 -88
- package/dist/bin/installer/hooks.js.map +2 -2
- package/dist/bin/installer/index.js +30 -12
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.js +27 -1
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/mcp.js +37 -4
- package/dist/bin/installer/mcp.js.map +2 -2
- package/dist/bin/installer/prompts.js +3 -3
- package/dist/bin/installer/prompts.js.map +2 -2
- package/dist/bin/installer/steering.js +633 -291
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/index.js.map +1 -1
- package/dist/bin/installer/targets/kiro.js +7 -6
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/kirograph.js +3 -1
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/config.js +52 -5
- package/dist/config.js.map +2 -2
- package/dist/db/database.js +11 -0
- package/dist/db/database.js.map +2 -2
- package/dist/db/memory-schema.sql +34 -1
- package/dist/db/wiki-schema.sql +40 -0
- package/dist/mcp/server.js +35 -11
- package/dist/mcp/server.js.map +2 -2
- package/dist/mcp/tool-names.js +112 -1
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.js +458 -3
- package/dist/mcp/tools.js.map +2 -2
- package/dist/memory/database.js +131 -7
- package/dist/memory/database.js.map +2 -2
- package/dist/memory/index.js +130 -4
- package/dist/memory/index.js.map +3 -3
- package/dist/memory/types.js.map +1 -1
- package/dist/watchmen/synthesize.js +2 -0
- package/dist/watchmen/synthesize.js.map +2 -2
- package/dist/wiki/database.js +143 -0
- package/dist/wiki/database.js.map +7 -0
- package/dist/wiki/index.js +149 -0
- package/dist/wiki/index.js.map +7 -0
- package/dist/wiki/ingest.js +259 -0
- package/dist/wiki/ingest.js.map +7 -0
- package/dist/wiki/lint.js +93 -0
- package/dist/wiki/lint.js.map +7 -0
- package/dist/wiki/schema.js +148 -0
- package/dist/wiki/schema.js.map +7 -0
- package/dist/wiki/synthesize.js +104 -0
- package/dist/wiki/synthesize.js.map +7 -0
- package/dist/wiki/types.js +17 -0
- package/dist/wiki/types.js.map +7 -0
- package/package.json +6 -4
|
@@ -116,18 +116,15 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
116
116
|
const installer = (0, import_targets.getTargetInstaller)(target);
|
|
117
117
|
console.log(` Workspace: ${cwd}
|
|
118
118
|
`);
|
|
119
|
-
if (!opts.yes) {
|
|
120
|
-
const proceed = await (0, import_prompts.askToggle)(rl, `Install KiroGraph for ${installer.label}?`, "Registers the MCP server and writes integration files for this workspace.");
|
|
121
|
-
if (!proceed) {
|
|
122
|
-
console.log(" Cancelled.");
|
|
123
|
-
rl.close();
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
} else {
|
|
127
|
-
console.log(` Installing KiroGraph for ${installer.label} (--yes)`);
|
|
128
|
-
}
|
|
129
119
|
console.log();
|
|
130
|
-
|
|
120
|
+
let kiroHookFormat = "v2";
|
|
121
|
+
if (target === "kiro") {
|
|
122
|
+
kiroHookFormat = await (0, import_prompts.arrowSelect)(rl, "Which version of Kiro IDE are you using?", [
|
|
123
|
+
{ value: "v1-legacy", label: "Beta Version 0.x.x", description: "Kiro IDE beta releases (uses .kiro.hook format)" },
|
|
124
|
+
{ value: "v2", label: "Version 1.x.x", description: "Kiro IDE stable releases (uses .json hook format)" }
|
|
125
|
+
], 1);
|
|
126
|
+
}
|
|
127
|
+
installer.installEarly(cwd, kiroHookFormat);
|
|
131
128
|
const alreadyInitialized = fs.existsSync(path.join(cwd, ".kirograph"));
|
|
132
129
|
let cavemanMode = "off";
|
|
133
130
|
let shellCompressionLevel = "normal";
|
|
@@ -139,6 +136,13 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
139
136
|
let enableArchitecture = false;
|
|
140
137
|
let enableWatchmen = false;
|
|
141
138
|
let watchmenSynthesisMode = "local";
|
|
139
|
+
let enableWiki = false;
|
|
140
|
+
let wikiSynthesisMode = "agent";
|
|
141
|
+
let wikiLocalModel = "onnx-community/gemma-4-E4B-it-ONNX";
|
|
142
|
+
let enableCodeHealth = false;
|
|
143
|
+
let enableAdvancedAnalysis = false;
|
|
144
|
+
let enableAgentUtils = false;
|
|
145
|
+
let trackCallSites = false;
|
|
142
146
|
let shouldOfferIndex = false;
|
|
143
147
|
let typesenseDashboard = false;
|
|
144
148
|
let qdrantDashboard = false;
|
|
@@ -155,6 +159,13 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
155
159
|
watchmenSynthesisMode = config.watchmenSynthesisMode ?? "local";
|
|
156
160
|
enablePatterns = config.enablePatterns ?? false;
|
|
157
161
|
enableArchitecture = config.enableArchitecture ?? false;
|
|
162
|
+
enableWiki = config.enableWiki ?? false;
|
|
163
|
+
wikiSynthesisMode = config.wikiSynthesisMode ?? "agent";
|
|
164
|
+
wikiLocalModel = config.wikiLocalModel ?? "onnx-community/gemma-4-E4B-it-ONNX";
|
|
165
|
+
enableCodeHealth = config.enableCodeHealth ?? true;
|
|
166
|
+
enableAdvancedAnalysis = config.enableAdvancedAnalysis ?? false;
|
|
167
|
+
enableAgentUtils = config.enableAgentUtils ?? true;
|
|
168
|
+
trackCallSites = config.trackCallSites ?? false;
|
|
158
169
|
console.log(` \u2713 Reusing existing KiroGraph data in ${cwd}/.kirograph/`);
|
|
159
170
|
console.log(` \u2022 semanticEngine: ${config.semanticEngine}`);
|
|
160
171
|
console.log(` \u2022 enableEmbeddings: ${config.enableEmbeddings}`);
|
|
@@ -202,6 +213,13 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
202
213
|
enableArchitecture = patch.enableArchitecture ?? false;
|
|
203
214
|
enableWatchmen = patch.enableWatchmen ?? false;
|
|
204
215
|
watchmenSynthesisMode = patch.watchmenSynthesisMode ?? "local";
|
|
216
|
+
enableWiki = patch.enableWiki ?? false;
|
|
217
|
+
wikiSynthesisMode = patch.wikiSynthesisMode ?? "agent";
|
|
218
|
+
wikiLocalModel = patch.wikiLocalModel ?? "onnx-community/gemma-4-E4B-it-ONNX";
|
|
219
|
+
enableCodeHealth = patch.enableCodeHealth ?? false;
|
|
220
|
+
enableAdvancedAnalysis = patch.enableAdvancedAnalysis ?? false;
|
|
221
|
+
enableAgentUtils = patch.enableAgentUtils ?? false;
|
|
222
|
+
trackCallSites = patch.trackCallSites ?? false;
|
|
205
223
|
typesenseDashboard = patch.typesenseDashboard;
|
|
206
224
|
qdrantDashboard = patch.qdrantDashboard;
|
|
207
225
|
console.log(`
|
|
@@ -373,7 +391,7 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
373
391
|
}
|
|
374
392
|
}
|
|
375
393
|
}
|
|
376
|
-
installer.installLate(cwd, cavemanMode, shellCompressionLevel, enableMemory, enableDocs, enableData, enableSecurity, enableArchitecture, enablePatterns, enableWatchmen, watchmenSynthesisMode);
|
|
394
|
+
installer.installLate(cwd, cavemanMode, shellCompressionLevel, enableMemory, enableDocs, enableData, enableSecurity, enableArchitecture, enablePatterns, enableWatchmen, watchmenSynthesisMode, enableWiki, wikiSynthesisMode, wikiLocalModel, enableCodeHealth, enableAdvancedAnalysis, enableAgentUtils, trackCallSites, kiroHookFormat);
|
|
377
395
|
} catch (err) {
|
|
378
396
|
const reason = err instanceof Error ? err.message : String(err);
|
|
379
397
|
console.error(`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/installer/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph Installer\n *\n * The default target wires up Kiro:\n * 1. .kiro/settings/mcp.json \u2014 registers the MCP server (IDE + CLI)\n * 2. .kiro/hooks/*.kiro.hook \u2014 auto-sync hooks for Kiro IDE\n * 3. .kiro/steering/kirograph.md \u2014 teaches Kiro to use the graph tools (IDE + CLI)\n * 4. .kiro/agents/kirograph.json \u2014 custom agent config for Kiro CLI\n */\n\nimport * as readline from 'readline';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\nimport { loadConfig, updateConfig } from '../../config';\nimport { printBanner } from '../banner';\nimport { renderIndexProgress } from '../progress';\nimport { dim, reset } from '../ui';\nimport { ask, askToggle } from './prompts';\nimport { promptConfigOptions } from './config-prompt';\nimport { openTypesenseDashboard } from './dashboard';\nimport { ensureQdrantUI, openQdrantDashboard } from './qdrant-dashboard';\nimport type { InstallTarget } from './common';\nimport { getTargetInstaller } from './targets';\nimport type { CavemanMode } from './caveman';\n\nfunction _findRustc(): string | null {\n // Check PATH first, then the default rustup install location\n const inPath = spawnSync('rustc', ['--version'], { encoding: 'utf8', shell: true });\n if (inPath.status === 0) return 'rustc';\n const home = process.env.HOME ?? process.env.USERPROFILE ?? '';\n const cargoRustc = path.join(home, '.cargo', 'bin', 'rustc');\n if (fs.existsSync(cargoRustc)) return cargoRustc;\n return null;\n}\n\nfunction _installTurbovecAddon(): void {\n const nativeDir = path.join(__dirname, '..', '..', '..', 'native', 'turbovec-node');\n const hasAddon = fs.existsSync(nativeDir) &&\n fs.readdirSync(nativeDir).some(f => f.startsWith('turbovec_node.') && f.endsWith('.node'));\n\n if (hasAddon) {\n console.log(` \u2713 turbovec-node addon already built`);\n return;\n }\n\n // Ensure Rust toolchain \u2014 install via rustup if missing\n let rustc = _findRustc();\n if (!rustc) {\n console.log(`\\n Rust toolchain not found. Installing via rustup...`);\n const isWindows = process.platform === 'win32';\n if (isWindows) {\n console.warn(` \u2717 Automated rustup install is not supported on Windows.`);\n console.warn(` Download rustup-init.exe from https://rustup.rs and re-run kirograph install.`);\n return;\n }\n const rustup = spawnSync(\n 'sh',\n ['-c', 'curl --proto \"=https\" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path'],\n { stdio: 'inherit', shell: false },\n );\n if (rustup.status !== 0) {\n console.warn(` \u2717 rustup install failed. Install Rust manually: https://rustup.rs`);\n console.warn(` Then: cd native/turbovec-node && npm install && npm run build`);\n return;\n }\n rustc = _findRustc();\n if (!rustc) {\n console.warn(` \u2717 rustc still not found after rustup install. Re-run kirograph install in a new shell.`);\n return;\n }\n console.log(` \u2713 Rust installed: ${spawnSync(rustc, ['--version'], { encoding: 'utf8' }).stdout?.trim()}`);\n } else {\n console.log(` \u2713 Rust: ${spawnSync(rustc, ['--version'], { encoding: 'utf8' }).stdout?.trim()}`);\n }\n\n // Ensure ~/.cargo/bin is on PATH for child processes so cargo/napi-rs cli can find it\n if (!process.env.PATH?.includes('.cargo')) {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? '';\n process.env.PATH = `${path.join(home, '.cargo', 'bin')}:${process.env.PATH ?? ''}`;\n }\n\n console.log(`\\n Building turbovec-node native addon (Rust/napi-rs)...`);\n console.log(` This may take a few minutes on first build.`);\n\n const npmInstall = spawnSync('npm', ['install'], { cwd: nativeDir, stdio: 'inherit', shell: true });\n if (npmInstall.status !== 0) {\n console.warn(` \u2717 npm install failed in native/turbovec-node`);\n return;\n }\n\n const build = spawnSync('npm', ['run', 'build'], { cwd: nativeDir, stdio: 'inherit', shell: true });\n if (build.status === 0) {\n console.log(` \u2713 turbovec-node addon built`);\n } else {\n console.warn(` \u2717 Build failed (exit ${build.status}). Run manually:`);\n console.warn(` cd native/turbovec-node && npm install && npm run build`);\n }\n}\n\nexport async function runInstaller(target: InstallTarget = 'kiro', opts: { yes?: boolean } = {}): Promise<void> {\n printBanner();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n const cwd = process.cwd();\n const installer = getTargetInstaller(target);\n\n console.log(` Workspace: ${cwd}\\n`);\n\n if (!opts.yes) {\n const proceed = await askToggle(rl, `Install KiroGraph for ${installer.label}?`, 'Registers the MCP server and writes integration files for this workspace.');\n if (!proceed) { console.log(' Cancelled.'); rl.close(); return; }\n } else {\n console.log(` Installing KiroGraph for ${installer.label} (--yes)`);\n }\n console.log();\n\n installer.installEarly(cwd);\n\n const alreadyInitialized = fs.existsSync(path.join(cwd, '.kirograph'));\n let cavemanMode: CavemanMode | 'off' = 'off';\n let shellCompressionLevel: 'off' | 'normal' | 'aggressive' | 'ultra' = 'normal';\n let enableMemory = false;\n let enableDocs = false;\n let enableData = false;\n let enableSecurity = false;\n let enablePatterns = false;\n let enableArchitecture = false;\n let enableWatchmen = false;\n let watchmenSynthesisMode: 'local' | 'agent' = 'local';\n let shouldOfferIndex = false;\n let typesenseDashboard = false;\n let qdrantDashboard = false;\n\n try {\n if (alreadyInitialized) {\n const config = await loadConfig(cwd);\n cavemanMode = config.cavemanMode ?? 'off';\n shellCompressionLevel = config.shellCompressionLevel ?? 'normal';\n enableMemory = config.enableMemory ?? false;\n enableDocs = config.enableDocs ?? false;\n enableData = (config as any).enableData ?? false;\n enableSecurity = (config as any).enableSecurity ?? false;\n enableWatchmen = config.enableWatchmen ?? false;\n watchmenSynthesisMode = config.watchmenSynthesisMode ?? 'local';\n enablePatterns = (config as any).enablePatterns ?? false;\n enableArchitecture = config.enableArchitecture ?? false;\n console.log(` \u2713 Reusing existing KiroGraph data in ${cwd}/.kirograph/`);\n console.log(` \u2022 semanticEngine: ${config.semanticEngine}`);\n console.log(` \u2022 enableEmbeddings: ${config.enableEmbeddings}`);\n if (config.enableEmbeddings && config.semanticEngine === 'turboquant') {\n let tqAvailable = false;\n try { require('turboquant-js'); tqAvailable = true; } catch { /* not installed */ }\n if (!tqAvailable) {\n console.log(`\\n Installing TurboQuant dependencies...`);\n const result = spawnSync('npm', ['install', 'turboquant-js'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 turboquant-js installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install turboquant-js`);\n }\n }\n }\n if (config.enableEmbeddings && config.semanticEngine === 'turbovec') {\n _installTurbovecAddon();\n }\n console.log(` \u2022 enableArchitecture: ${config.enableArchitecture}`);\n console.log(` \u2022 cavemanMode: ${cavemanMode}`);\n console.log(` \u2022 shellCompressionLevel: ${shellCompressionLevel}`);\n console.log(` \u2022 enableMemory: ${enableMemory}`);\n console.log(` \u2022 enableDocs: ${enableDocs}`);\n console.log(` \u2022 enableData: ${enableData}`);\n console.log(` \u2022 enableSecurity: ${enableSecurity}`);\n console.log(` \u2022 enablePatterns: ${enablePatterns}`);\n } else {\n shouldOfferIndex = true;\n const patch = await promptConfigOptions(rl);\n await updateConfig(cwd, patch);\n cavemanMode = patch.cavemanMode ?? 'off';\n shellCompressionLevel = patch.shellCompressionLevel ?? 'normal';\n enableMemory = patch.enableMemory ?? false;\n enableDocs = patch.enableDocs ?? false;\n enableData = patch.enableData ?? false;\n enableSecurity = patch.enableSecurity ?? false;\n enablePatterns = patch.enablePatterns ?? false;\n enableArchitecture = patch.enableArchitecture ?? false;\n enableWatchmen = patch.enableWatchmen ?? false;\n watchmenSynthesisMode = patch.watchmenSynthesisMode ?? 'local';\n typesenseDashboard = patch.typesenseDashboard;\n qdrantDashboard = patch.qdrantDashboard;\n\n console.log(`\\n Configuration saved to ${cwd}/.kirograph/config.json`);\n console.log(` \u2022 enableEmbeddings: ${patch.enableEmbeddings}`);\n if ('embeddingModel' in patch) {\n console.log(` \u2022 embeddingModel: ${patch.embeddingModel} ${dim}(${patch.embeddingDim}-dim)${reset}`);\n }\n if (patch.enableEmbeddings) {\n console.log(` \u2022 semanticEngine: ${patch.semanticEngine}`);\n if (patch.semanticEngine === 'sqlite-vec') {\n console.log(`\\n Installing sqlite-vec dependencies...`);\n const result = spawnSync('npm', ['install', 'better-sqlite3', 'sqlite-vec'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 better-sqlite3 and sqlite-vec installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install better-sqlite3 sqlite-vec`);\n }\n } else if (patch.semanticEngine === 'orama') {\n console.log(`\\n Installing Orama dependencies...`);\n const result = spawnSync('npm', ['install', '@orama/orama', '@orama/plugin-data-persistence'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 @orama/orama and @orama/plugin-data-persistence installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install @orama/orama @orama/plugin-data-persistence`);\n }\n } else if (patch.semanticEngine === 'pglite') {\n console.log(`\\n Installing PGlite dependencies...`);\n const result = spawnSync('npm', ['install', '@electric-sql/pglite'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 @electric-sql/pglite installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install @electric-sql/pglite`);\n }\n } else if (patch.semanticEngine === 'lancedb') {\n console.log(`\\n Installing LanceDB dependencies...`);\n const result = spawnSync('npm', ['install', '@lancedb/lancedb'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 @lancedb/lancedb installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install @lancedb/lancedb`);\n }\n } else if (patch.semanticEngine === 'qdrant') {\n console.log(`\\n Installing Qdrant dependencies...`);\n const result = spawnSync('npm', ['install', 'qdrant-local'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 qdrant-local installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install qdrant-local`);\n }\n } else if (patch.semanticEngine === 'typesense') {\n console.log(`\\n Installing Typesense dependencies...`);\n const result = spawnSync('npm', ['install', 'typesense'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 typesense installed`);\n console.log(` \u2139 The Typesense binary (~37MB) will be auto-downloaded on first index run.`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install typesense`);\n }\n } else if (patch.semanticEngine === 'turboquant') {\n console.log(`\\n Installing TurboQuant dependencies...`);\n const result = spawnSync('npm', ['install', 'turboquant-js'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 turboquant-js installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install turboquant-js`);\n }\n } else if (patch.semanticEngine === 'turbovec') {\n _installTurbovecAddon();\n }\n }\n console.log(` \u2022 extractDocstrings: ${patch.extractDocstrings}`);\n console.log(` \u2022 trackCallSites: ${patch.trackCallSites}`);\n console.log(` \u2022 enableArchitecture: ${patch.enableArchitecture}`);\n console.log(` \u2022 cavemanMode: ${cavemanMode}`);\n console.log(` \u2022 shellCompressionLevel: ${shellCompressionLevel}`);\n console.log(` \u2022 enableMemory: ${enableMemory}`);\n console.log(` \u2022 enableDocs: ${enableDocs}`);\n console.log(` \u2022 enableData: ${enableData}`);\n console.log(` \u2022 enableSecurity: ${enableSecurity}`);\n console.log(` \u2022 enablePatterns: ${enablePatterns}`);\n\n // Install optional data format deps if enableData is on\n if (enableData) {\n if ((patch as any).dataInstallExcel) {\n console.log(`\\n Installing xlsx...`);\n const xlsxResult = spawnSync('npm', ['install', 'xlsx'], { stdio: 'inherit', shell: true });\n if (xlsxResult.status === 0) {\n console.log(` \u2713 xlsx installed`);\n } else {\n console.warn(` \u2717 npm install failed. Run manually: npm install xlsx`);\n }\n }\n if ((patch as any).dataInstallParquet) {\n console.log(`\\n Installing parquetjs-lite...`);\n const pqResult = spawnSync('npm', ['install', 'parquetjs-lite'], { stdio: 'inherit', shell: true });\n if (pqResult.status === 0) {\n console.log(` \u2713 parquetjs-lite installed`);\n } else {\n console.warn(` \u2717 npm install failed. Run manually: npm install parquetjs-lite`);\n }\n }\n if ((patch as any).dataInstallPdf) {\n console.log(`\\n Installing @firecrawl/pdf-inspector...`);\n const pdfResult = spawnSync('npm', ['install', '--save-optional', '@firecrawl/pdf-inspector'], { stdio: 'inherit', shell: true });\n if (pdfResult.status === 0) {\n console.log(` \u2713 @firecrawl/pdf-inspector installed`);\n } else {\n console.warn(` \u2717 npm install failed. Run manually: npm install --save-optional @firecrawl/pdf-inspector`);\n }\n }\n }\n\n if (enablePatterns) {\n console.log(`\\n Installing @ast-grep/napi...`);\n const astGrepResult = spawnSync('npm', ['install', '@ast-grep/napi', '--save-optional'], {\n stdio: 'inherit',\n shell: true,\n });\n if (astGrepResult.status === 0) {\n console.log(` \u2713 @ast-grep/napi installed`);\n\n // Install tree-sitter grammar packages for languages beyond the built-in\n // JS/TS/HTML/CSS set. These are optional \u2014 missing packages are silently\n // skipped at runtime, so a failed install here isn't fatal.\n const langPackages = [\n '@ast-grep/lang-go',\n '@ast-grep/lang-python',\n '@ast-grep/lang-java',\n '@ast-grep/lang-rust',\n '@ast-grep/lang-c',\n '@ast-grep/lang-cpp',\n '@ast-grep/lang-csharp',\n '@ast-grep/lang-kotlin',\n '@ast-grep/lang-swift',\n '@ast-grep/lang-ruby',\n '@ast-grep/lang-php',\n '@ast-grep/lang-bash',\n '@ast-grep/lang-scala',\n '@ast-grep/lang-dart',\n '@ast-grep/lang-lua',\n '@ast-grep/lang-elixir',\n '@ast-grep/lang-haskell',\n ];\n const langResult = spawnSync('npm', ['install', ...langPackages, '--save-optional'], {\n stdio: 'inherit',\n shell: true,\n });\n if (langResult.status === 0) {\n console.log(` \u2713 @ast-grep language grammars installed`);\n } else {\n console.warn(` \u2717 Language grammar install failed. Pattern matching will be limited to JS/TS/HTML/CSS.`);\n console.warn(` Run manually: npm install ${langPackages.join(' ')}`);\n }\n } else {\n console.warn(` \u2717 @ast-grep/napi install failed. Run manually: npm install @ast-grep/napi`);\n console.warn(` KiroGraph will continue but kirograph pattern and kirograph_live_search will be unavailable.`);\n }\n }\n }\n\n installer.installLate(cwd, cavemanMode, shellCompressionLevel, enableMemory, enableDocs, enableData, enableSecurity, enableArchitecture, enablePatterns, enableWatchmen, watchmenSynthesisMode);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n console.error(`\\n \u2717 Failed to write configuration: ${reason}`);\n process.exit(1);\n }\n\n // 5. Pre-download Qdrant UI before indexing so Qdrant starts with static content dir\n if (qdrantDashboard) {\n await ensureQdrantUI(cwd);\n }\n\n // 6. Optionally init + index\n const doIndex = shouldOfferIndex && (opts.yes || await askToggle(rl, 'Initialize and index this project now?', 'Creates .kirograph/ and indexes all source files. Takes a few seconds for small projects, longer for large ones.'));\n if (doIndex) {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n\n const fileBytes = new Map<string, { loaded: number; total: number }>();\n const modelProgress = (file: string, loaded: number, total: number, done: boolean): void => {\n const entry = fileBytes.get(file) ?? { loaded: 0, total: 0 };\n if (total > 0) entry.total = total;\n entry.loaded = done ? entry.total : loaded;\n fileBytes.set(file, entry);\n\n // Only count files where we know the size (content-length was present)\n const knownFiles = Array.from(fileBytes.values()).filter(f => f.total > 0);\n const totalLoaded = knownFiles.reduce((s, f) => s + f.loaded, 0);\n const totalBytes = knownFiles.reduce((s, f) => s + f.total, 0);\n const pct = totalBytes > 0 ? Math.min((totalLoaded / totalBytes) * 100, 100) : 0;\n\n const filled = Math.round(pct / 5);\n const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(20 - filled);\n const mb = (totalLoaded / 1024 / 1024).toFixed(1);\n const totalMb = (totalBytes / 1024 / 1024).toFixed(1);\n process.stdout.write(`\\r [${bar}] ${pct.toFixed(0).padStart(3)}% ${mb} / ${totalMb} MB `);\n };\n\n // Suppress noisy internal warnings from @huggingface/transformers during download\n const originalStderrWrite = process.stderr.write.bind(process.stderr);\n const stderrFilter = (chunk: unknown, ...args: unknown[]): boolean => {\n const str = typeof chunk === 'string' ? chunk : String(chunk);\n if (str.includes('content-length') || str.includes('dtype not specified')) return true;\n return (originalStderrWrite as (...a: unknown[]) => boolean)(chunk, ...args);\n };\n process.stderr.write = stderrFilter as typeof process.stderr.write;\n\n let cg;\n try {\n if (!KiroGraph.isInitialized(cwd)) {\n process.stdout.write(' Downloading embedding model\u2026\\n');\n cg = await KiroGraph.init(cwd, undefined, modelProgress);\n process.stdout.write('\\n');\n console.log(' \u2713 Created .kirograph/');\n } else {\n cg = await KiroGraph.open(cwd, modelProgress);\n if (fileBytes.size > 0) process.stdout.write('\\n');\n }\n } finally {\n process.stderr.write = originalStderrWrite;\n }\n console.log(' Indexing...');\n const result = await cg.indexAll({ onProgress: renderIndexProgress });\n process.stdout.write('\\n');\n console.log(` \u2713 Indexed ${result.filesIndexed} files, ${result.nodesCreated} symbols, ${result.edgesCreated} edges`);\n cg.close();\n\n if (typesenseDashboard) {\n const dashboardServer = await openTypesenseDashboard(cwd);\n console.log(` ${dim}Press Ctrl+C to stop the dashboard server when done.${reset}`);\n await new Promise<void>(resolve => {\n process.on('SIGINT', () => {\n if (dashboardServer) {\n dashboardServer.close(() => resolve());\n } else {\n resolve();\n }\n });\n });\n return; // rl.close() handled in finally\n }\n\n if (qdrantDashboard) {\n await openQdrantDashboard(cwd);\n }\n }\n\n installer.printNextSteps(cwd);\n } finally {\n rl.close();\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph Installer\n *\n * The default target wires up Kiro:\n * 1. .kiro/settings/mcp.json \u2014 registers the MCP server (IDE + CLI)\n * 2. .kiro/hooks/*.kiro.hook \u2014 auto-sync hooks for Kiro IDE\n * 3. .kiro/steering/kirograph.md \u2014 teaches Kiro to use the graph tools (IDE + CLI)\n * 4. .kiro/agents/kirograph.json \u2014 custom agent config for Kiro CLI\n */\n\nimport * as readline from 'readline';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\nimport { loadConfig, updateConfig } from '../../config';\nimport { printBanner } from '../banner';\nimport { renderIndexProgress } from '../progress';\nimport { dim, reset } from '../ui';\nimport { ask, askToggle, arrowSelect } from './prompts';\nimport { promptConfigOptions } from './config-prompt';\nimport { openTypesenseDashboard } from './dashboard';\nimport { ensureQdrantUI, openQdrantDashboard } from './qdrant-dashboard';\nimport type { InstallTarget } from './common';\nimport { getTargetInstaller } from './targets';\nimport type { CavemanMode } from './caveman';\n\nfunction _findRustc(): string | null {\n // Check PATH first, then the default rustup install location\n const inPath = spawnSync('rustc', ['--version'], { encoding: 'utf8', shell: true });\n if (inPath.status === 0) return 'rustc';\n const home = process.env.HOME ?? process.env.USERPROFILE ?? '';\n const cargoRustc = path.join(home, '.cargo', 'bin', 'rustc');\n if (fs.existsSync(cargoRustc)) return cargoRustc;\n return null;\n}\n\nfunction _installTurbovecAddon(): void {\n const nativeDir = path.join(__dirname, '..', '..', '..', 'native', 'turbovec-node');\n const hasAddon = fs.existsSync(nativeDir) &&\n fs.readdirSync(nativeDir).some(f => f.startsWith('turbovec_node.') && f.endsWith('.node'));\n\n if (hasAddon) {\n console.log(` \u2713 turbovec-node addon already built`);\n return;\n }\n\n // Ensure Rust toolchain \u2014 install via rustup if missing\n let rustc = _findRustc();\n if (!rustc) {\n console.log(`\\n Rust toolchain not found. Installing via rustup...`);\n const isWindows = process.platform === 'win32';\n if (isWindows) {\n console.warn(` \u2717 Automated rustup install is not supported on Windows.`);\n console.warn(` Download rustup-init.exe from https://rustup.rs and re-run kirograph install.`);\n return;\n }\n const rustup = spawnSync(\n 'sh',\n ['-c', 'curl --proto \"=https\" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path'],\n { stdio: 'inherit', shell: false },\n );\n if (rustup.status !== 0) {\n console.warn(` \u2717 rustup install failed. Install Rust manually: https://rustup.rs`);\n console.warn(` Then: cd native/turbovec-node && npm install && npm run build`);\n return;\n }\n rustc = _findRustc();\n if (!rustc) {\n console.warn(` \u2717 rustc still not found after rustup install. Re-run kirograph install in a new shell.`);\n return;\n }\n console.log(` \u2713 Rust installed: ${spawnSync(rustc, ['--version'], { encoding: 'utf8' }).stdout?.trim()}`);\n } else {\n console.log(` \u2713 Rust: ${spawnSync(rustc, ['--version'], { encoding: 'utf8' }).stdout?.trim()}`);\n }\n\n // Ensure ~/.cargo/bin is on PATH for child processes so cargo/napi-rs cli can find it\n if (!process.env.PATH?.includes('.cargo')) {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? '';\n process.env.PATH = `${path.join(home, '.cargo', 'bin')}:${process.env.PATH ?? ''}`;\n }\n\n console.log(`\\n Building turbovec-node native addon (Rust/napi-rs)...`);\n console.log(` This may take a few minutes on first build.`);\n\n const npmInstall = spawnSync('npm', ['install'], { cwd: nativeDir, stdio: 'inherit', shell: true });\n if (npmInstall.status !== 0) {\n console.warn(` \u2717 npm install failed in native/turbovec-node`);\n return;\n }\n\n const build = spawnSync('npm', ['run', 'build'], { cwd: nativeDir, stdio: 'inherit', shell: true });\n if (build.status === 0) {\n console.log(` \u2713 turbovec-node addon built`);\n } else {\n console.warn(` \u2717 Build failed (exit ${build.status}). Run manually:`);\n console.warn(` cd native/turbovec-node && npm install && npm run build`);\n }\n}\n\nexport async function runInstaller(target: InstallTarget = 'kiro', opts: { yes?: boolean } = {}): Promise<void> {\n printBanner();\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n const cwd = process.cwd();\n const installer = getTargetInstaller(target);\n\n console.log(` Workspace: ${cwd}\\n`);\n\n console.log();\n\n // Ask Kiro IDE version as the first question for the kiro target\n let kiroHookFormat: 'v1-legacy' | 'v2' = 'v2';\n if (target === 'kiro') {\n kiroHookFormat = await arrowSelect<'v1-legacy' | 'v2'>(rl, 'Which version of Kiro IDE are you using?', [\n { value: 'v1-legacy', label: 'Beta Version 0.x.x', description: 'Kiro IDE beta releases (uses .kiro.hook format)' },\n { value: 'v2', label: 'Version 1.x.x', description: 'Kiro IDE stable releases (uses .json hook format)' },\n ], 1);\n }\n\n installer.installEarly(cwd, kiroHookFormat);\n\n const alreadyInitialized = fs.existsSync(path.join(cwd, '.kirograph'));\n let cavemanMode: CavemanMode | 'off' = 'off';\n let shellCompressionLevel: 'off' | 'normal' | 'aggressive' | 'ultra' = 'normal';\n let enableMemory = false;\n let enableDocs = false;\n let enableData = false;\n let enableSecurity = false;\n let enablePatterns = false;\n let enableArchitecture = false;\n let enableWatchmen = false;\n let watchmenSynthesisMode: 'local' | 'agent' = 'local';\n let enableWiki = false;\n let wikiSynthesisMode: 'local' | 'agent' = 'agent';\n let wikiLocalModel = 'onnx-community/gemma-4-E4B-it-ONNX';\n let enableCodeHealth = false;\n let enableAdvancedAnalysis = false;\n let enableAgentUtils = false;\n let trackCallSites = false;\n let shouldOfferIndex = false;\n let typesenseDashboard = false;\n let qdrantDashboard = false;\n\n try {\n if (alreadyInitialized) {\n const config = await loadConfig(cwd);\n cavemanMode = config.cavemanMode ?? 'off';\n shellCompressionLevel = config.shellCompressionLevel ?? 'normal';\n enableMemory = config.enableMemory ?? false;\n enableDocs = config.enableDocs ?? false;\n enableData = (config as any).enableData ?? false;\n enableSecurity = (config as any).enableSecurity ?? false;\n enableWatchmen = config.enableWatchmen ?? false;\n watchmenSynthesisMode = config.watchmenSynthesisMode ?? 'local';\n enablePatterns = (config as any).enablePatterns ?? false;\n enableArchitecture = config.enableArchitecture ?? false;\n enableWiki = config.enableWiki ?? false;\n wikiSynthesisMode = config.wikiSynthesisMode ?? 'agent';\n wikiLocalModel = config.wikiLocalModel ?? 'onnx-community/gemma-4-E4B-it-ONNX';\n enableCodeHealth = config.enableCodeHealth ?? true;\n enableAdvancedAnalysis = config.enableAdvancedAnalysis ?? false;\n enableAgentUtils = config.enableAgentUtils ?? true;\n trackCallSites = config.trackCallSites ?? false;\n console.log(` \u2713 Reusing existing KiroGraph data in ${cwd}/.kirograph/`);\n console.log(` \u2022 semanticEngine: ${config.semanticEngine}`);\n console.log(` \u2022 enableEmbeddings: ${config.enableEmbeddings}`);\n if (config.enableEmbeddings && config.semanticEngine === 'turboquant') {\n let tqAvailable = false;\n try { require('turboquant-js'); tqAvailable = true; } catch { /* not installed */ }\n if (!tqAvailable) {\n console.log(`\\n Installing TurboQuant dependencies...`);\n const result = spawnSync('npm', ['install', 'turboquant-js'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 turboquant-js installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install turboquant-js`);\n }\n }\n }\n if (config.enableEmbeddings && config.semanticEngine === 'turbovec') {\n _installTurbovecAddon();\n }\n console.log(` \u2022 enableArchitecture: ${config.enableArchitecture}`);\n console.log(` \u2022 cavemanMode: ${cavemanMode}`);\n console.log(` \u2022 shellCompressionLevel: ${shellCompressionLevel}`);\n console.log(` \u2022 enableMemory: ${enableMemory}`);\n console.log(` \u2022 enableDocs: ${enableDocs}`);\n console.log(` \u2022 enableData: ${enableData}`);\n console.log(` \u2022 enableSecurity: ${enableSecurity}`);\n console.log(` \u2022 enablePatterns: ${enablePatterns}`);\n } else {\n shouldOfferIndex = true;\n const patch = await promptConfigOptions(rl);\n await updateConfig(cwd, patch);\n cavemanMode = patch.cavemanMode ?? 'off';\n shellCompressionLevel = patch.shellCompressionLevel ?? 'normal';\n enableMemory = patch.enableMemory ?? false;\n enableDocs = patch.enableDocs ?? false;\n enableData = patch.enableData ?? false;\n enableSecurity = patch.enableSecurity ?? false;\n enablePatterns = patch.enablePatterns ?? false;\n enableArchitecture = patch.enableArchitecture ?? false;\n enableWatchmen = patch.enableWatchmen ?? false;\n watchmenSynthesisMode = patch.watchmenSynthesisMode ?? 'local';\n enableWiki = patch.enableWiki ?? false;\n wikiSynthesisMode = (patch as any).wikiSynthesisMode ?? 'agent';\n wikiLocalModel = (patch as any).wikiLocalModel ?? 'onnx-community/gemma-4-E4B-it-ONNX';\n enableCodeHealth = patch.enableCodeHealth ?? false;\n enableAdvancedAnalysis = patch.enableAdvancedAnalysis ?? false;\n enableAgentUtils = patch.enableAgentUtils ?? false;\n trackCallSites = patch.trackCallSites ?? false;\n typesenseDashboard = patch.typesenseDashboard;\n qdrantDashboard = patch.qdrantDashboard;\n\n console.log(`\\n Configuration saved to ${cwd}/.kirograph/config.json`);\n console.log(` \u2022 enableEmbeddings: ${patch.enableEmbeddings}`);\n if ('embeddingModel' in patch) {\n console.log(` \u2022 embeddingModel: ${patch.embeddingModel} ${dim}(${patch.embeddingDim}-dim)${reset}`);\n }\n if (patch.enableEmbeddings) {\n console.log(` \u2022 semanticEngine: ${patch.semanticEngine}`);\n if (patch.semanticEngine === 'sqlite-vec') {\n console.log(`\\n Installing sqlite-vec dependencies...`);\n const result = spawnSync('npm', ['install', 'better-sqlite3', 'sqlite-vec'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 better-sqlite3 and sqlite-vec installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install better-sqlite3 sqlite-vec`);\n }\n } else if (patch.semanticEngine === 'orama') {\n console.log(`\\n Installing Orama dependencies...`);\n const result = spawnSync('npm', ['install', '@orama/orama', '@orama/plugin-data-persistence'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 @orama/orama and @orama/plugin-data-persistence installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install @orama/orama @orama/plugin-data-persistence`);\n }\n } else if (patch.semanticEngine === 'pglite') {\n console.log(`\\n Installing PGlite dependencies...`);\n const result = spawnSync('npm', ['install', '@electric-sql/pglite'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 @electric-sql/pglite installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install @electric-sql/pglite`);\n }\n } else if (patch.semanticEngine === 'lancedb') {\n console.log(`\\n Installing LanceDB dependencies...`);\n const result = spawnSync('npm', ['install', '@lancedb/lancedb'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 @lancedb/lancedb installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install @lancedb/lancedb`);\n }\n } else if (patch.semanticEngine === 'qdrant') {\n console.log(`\\n Installing Qdrant dependencies...`);\n const result = spawnSync('npm', ['install', 'qdrant-local'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 qdrant-local installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install qdrant-local`);\n }\n } else if (patch.semanticEngine === 'typesense') {\n console.log(`\\n Installing Typesense dependencies...`);\n const result = spawnSync('npm', ['install', 'typesense'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 typesense installed`);\n console.log(` \u2139 The Typesense binary (~37MB) will be auto-downloaded on first index run.`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install typesense`);\n }\n } else if (patch.semanticEngine === 'turboquant') {\n console.log(`\\n Installing TurboQuant dependencies...`);\n const result = spawnSync('npm', ['install', 'turboquant-js'], { stdio: 'inherit', shell: true });\n if (result.status === 0) {\n console.log(` \u2713 turboquant-js installed`);\n } else {\n console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);\n console.warn(` npm install turboquant-js`);\n }\n } else if (patch.semanticEngine === 'turbovec') {\n _installTurbovecAddon();\n }\n }\n console.log(` \u2022 extractDocstrings: ${patch.extractDocstrings}`);\n console.log(` \u2022 trackCallSites: ${patch.trackCallSites}`);\n console.log(` \u2022 enableArchitecture: ${patch.enableArchitecture}`);\n console.log(` \u2022 cavemanMode: ${cavemanMode}`);\n console.log(` \u2022 shellCompressionLevel: ${shellCompressionLevel}`);\n console.log(` \u2022 enableMemory: ${enableMemory}`);\n console.log(` \u2022 enableDocs: ${enableDocs}`);\n console.log(` \u2022 enableData: ${enableData}`);\n console.log(` \u2022 enableSecurity: ${enableSecurity}`);\n console.log(` \u2022 enablePatterns: ${enablePatterns}`);\n\n // Install optional data format deps if enableData is on\n if (enableData) {\n if ((patch as any).dataInstallExcel) {\n console.log(`\\n Installing xlsx...`);\n const xlsxResult = spawnSync('npm', ['install', 'xlsx'], { stdio: 'inherit', shell: true });\n if (xlsxResult.status === 0) {\n console.log(` \u2713 xlsx installed`);\n } else {\n console.warn(` \u2717 npm install failed. Run manually: npm install xlsx`);\n }\n }\n if ((patch as any).dataInstallParquet) {\n console.log(`\\n Installing parquetjs-lite...`);\n const pqResult = spawnSync('npm', ['install', 'parquetjs-lite'], { stdio: 'inherit', shell: true });\n if (pqResult.status === 0) {\n console.log(` \u2713 parquetjs-lite installed`);\n } else {\n console.warn(` \u2717 npm install failed. Run manually: npm install parquetjs-lite`);\n }\n }\n if ((patch as any).dataInstallPdf) {\n console.log(`\\n Installing @firecrawl/pdf-inspector...`);\n const pdfResult = spawnSync('npm', ['install', '--save-optional', '@firecrawl/pdf-inspector'], { stdio: 'inherit', shell: true });\n if (pdfResult.status === 0) {\n console.log(` \u2713 @firecrawl/pdf-inspector installed`);\n } else {\n console.warn(` \u2717 npm install failed. Run manually: npm install --save-optional @firecrawl/pdf-inspector`);\n }\n }\n }\n\n if (enablePatterns) {\n console.log(`\\n Installing @ast-grep/napi...`);\n const astGrepResult = spawnSync('npm', ['install', '@ast-grep/napi', '--save-optional'], {\n stdio: 'inherit',\n shell: true,\n });\n if (astGrepResult.status === 0) {\n console.log(` \u2713 @ast-grep/napi installed`);\n\n // Install tree-sitter grammar packages for languages beyond the built-in\n // JS/TS/HTML/CSS set. These are optional \u2014 missing packages are silently\n // skipped at runtime, so a failed install here isn't fatal.\n const langPackages = [\n '@ast-grep/lang-go',\n '@ast-grep/lang-python',\n '@ast-grep/lang-java',\n '@ast-grep/lang-rust',\n '@ast-grep/lang-c',\n '@ast-grep/lang-cpp',\n '@ast-grep/lang-csharp',\n '@ast-grep/lang-kotlin',\n '@ast-grep/lang-swift',\n '@ast-grep/lang-ruby',\n '@ast-grep/lang-php',\n '@ast-grep/lang-bash',\n '@ast-grep/lang-scala',\n '@ast-grep/lang-dart',\n '@ast-grep/lang-lua',\n '@ast-grep/lang-elixir',\n '@ast-grep/lang-haskell',\n ];\n const langResult = spawnSync('npm', ['install', ...langPackages, '--save-optional'], {\n stdio: 'inherit',\n shell: true,\n });\n if (langResult.status === 0) {\n console.log(` \u2713 @ast-grep language grammars installed`);\n } else {\n console.warn(` \u2717 Language grammar install failed. Pattern matching will be limited to JS/TS/HTML/CSS.`);\n console.warn(` Run manually: npm install ${langPackages.join(' ')}`);\n }\n } else {\n console.warn(` \u2717 @ast-grep/napi install failed. Run manually: npm install @ast-grep/napi`);\n console.warn(` KiroGraph will continue but kirograph pattern and kirograph_live_search will be unavailable.`);\n }\n }\n }\n\n installer.installLate(cwd, cavemanMode, shellCompressionLevel, enableMemory, enableDocs, enableData, enableSecurity, enableArchitecture, enablePatterns, enableWatchmen, watchmenSynthesisMode, enableWiki, wikiSynthesisMode, wikiLocalModel, enableCodeHealth, enableAdvancedAnalysis, enableAgentUtils, trackCallSites, kiroHookFormat);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n console.error(`\\n \u2717 Failed to write configuration: ${reason}`);\n process.exit(1);\n }\n\n // 5. Pre-download Qdrant UI before indexing so Qdrant starts with static content dir\n if (qdrantDashboard) {\n await ensureQdrantUI(cwd);\n }\n\n // 6. Optionally init + index\n const doIndex = shouldOfferIndex && (opts.yes || await askToggle(rl, 'Initialize and index this project now?', 'Creates .kirograph/ and indexes all source files. Takes a few seconds for small projects, longer for large ones.'));\n if (doIndex) {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n\n const fileBytes = new Map<string, { loaded: number; total: number }>();\n const modelProgress = (file: string, loaded: number, total: number, done: boolean): void => {\n const entry = fileBytes.get(file) ?? { loaded: 0, total: 0 };\n if (total > 0) entry.total = total;\n entry.loaded = done ? entry.total : loaded;\n fileBytes.set(file, entry);\n\n // Only count files where we know the size (content-length was present)\n const knownFiles = Array.from(fileBytes.values()).filter(f => f.total > 0);\n const totalLoaded = knownFiles.reduce((s, f) => s + f.loaded, 0);\n const totalBytes = knownFiles.reduce((s, f) => s + f.total, 0);\n const pct = totalBytes > 0 ? Math.min((totalLoaded / totalBytes) * 100, 100) : 0;\n\n const filled = Math.round(pct / 5);\n const bar = '\u2588'.repeat(filled) + '\u2591'.repeat(20 - filled);\n const mb = (totalLoaded / 1024 / 1024).toFixed(1);\n const totalMb = (totalBytes / 1024 / 1024).toFixed(1);\n process.stdout.write(`\\r [${bar}] ${pct.toFixed(0).padStart(3)}% ${mb} / ${totalMb} MB `);\n };\n\n // Suppress noisy internal warnings from @huggingface/transformers during download\n const originalStderrWrite = process.stderr.write.bind(process.stderr);\n const stderrFilter = (chunk: unknown, ...args: unknown[]): boolean => {\n const str = typeof chunk === 'string' ? chunk : String(chunk);\n if (str.includes('content-length') || str.includes('dtype not specified')) return true;\n return (originalStderrWrite as (...a: unknown[]) => boolean)(chunk, ...args);\n };\n process.stderr.write = stderrFilter as typeof process.stderr.write;\n\n let cg;\n try {\n if (!KiroGraph.isInitialized(cwd)) {\n process.stdout.write(' Downloading embedding model\u2026\\n');\n cg = await KiroGraph.init(cwd, undefined, modelProgress);\n process.stdout.write('\\n');\n console.log(' \u2713 Created .kirograph/');\n } else {\n cg = await KiroGraph.open(cwd, modelProgress);\n if (fileBytes.size > 0) process.stdout.write('\\n');\n }\n } finally {\n process.stderr.write = originalStderrWrite;\n }\n console.log(' Indexing...');\n const result = await cg.indexAll({ onProgress: renderIndexProgress });\n process.stdout.write('\\n');\n console.log(` \u2713 Indexed ${result.filesIndexed} files, ${result.nodesCreated} symbols, ${result.edgesCreated} edges`);\n cg.close();\n\n if (typesenseDashboard) {\n const dashboardServer = await openTypesenseDashboard(cwd);\n console.log(` ${dim}Press Ctrl+C to stop the dashboard server when done.${reset}`);\n await new Promise<void>(resolve => {\n process.on('SIGINT', () => {\n if (dashboardServer) {\n dashboardServer.close(() => resolve());\n } else {\n resolve();\n }\n });\n });\n return; // rl.close() handled in finally\n }\n\n if (qdrantDashboard) {\n await openQdrantDashboard(cwd);\n }\n }\n\n installer.printNextSteps(cwd);\n } finally {\n rl.close();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -58,6 +58,7 @@ function buildAgentInstructions(cavemanModeOrOpts) {
|
|
|
58
58
|
const enableData = opts.enableData ?? false;
|
|
59
59
|
const enableSecurity = opts.enableSecurity ?? false;
|
|
60
60
|
const enablePatterns = opts.enablePatterns ?? false;
|
|
61
|
+
const enableWiki = opts.enableWiki ?? false;
|
|
61
62
|
let content = `# KiroGraph
|
|
62
63
|
|
|
63
64
|
KiroGraph builds a local semantic knowledge graph of this codebase. When the \`kirograph\` MCP server is available, prefer its tools over broad grep/glob/file-read exploration.
|
|
@@ -82,7 +83,7 @@ KiroGraph builds a local semantic knowledge graph of this codebase. When the \`k
|
|
|
82
83
|
| Any unexpected cross-module coupling? | \`kirograph_surprising\` |
|
|
83
84
|
| What changed since the last snapshot? | \`kirograph_diff\` |
|
|
84
85
|
${enableArchitecture ? "| What packages/layers exist? | `kirograph_architecture` |\n| How coupled is package X? | `kirograph_coupling` |\n| What does package X depend on? | `kirograph_package` |\n" : ""}
|
|
85
|
-
${enableCompression ? "| Run a command with token savings | `kirograph_exec` |\n| Check token savings stats | `kirograph_gain` |\n" : ""}${enableMemory ? "| Search past decisions/patterns | `kirograph_mem_search` |\n| Store an observation | `kirograph_mem_store` |\n" : ""}${enableDocs ? "| Find a doc section | `kirograph_docs_search` |\n| Get doc table of contents | `kirograph_docs_toc` |\n" : ""}${enableData ? "| What datasets are indexed? | `kirograph_data_list` |\n| Query rows with filters | `kirograph_data_query` |\n| Aggregate data server-side | `kirograph_data_aggregate` |\n" : ""}${enableSecurity ? "| Are there vulnerable dependencies? | `kirograph_security` |\n| Which CVEs affect my project? | `kirograph_vulns` |\n| Is this vulnerability reachable? | `kirograph_reachability` |\n| What licenses do my deps use? | `kirograph_licenses` |\n| Are dependencies outdated? | `kirograph_staleness` |\n" : ""}${enablePatterns ? "| Find structural code patterns? | `kirograph_live_search` |\n| Browse SAST rules | `kirograph pattern --list` |\n" : ""}
|
|
86
|
+
${enableCompression ? "| Run a command with token savings | `kirograph_exec` |\n| Check token savings stats | `kirograph_gain` |\n" : ""}${enableMemory ? "| Search past decisions/patterns | `kirograph_mem_search` |\n| Store an observation | `kirograph_mem_store` |\n" : ""}${enableDocs ? "| Find a doc section | `kirograph_docs_search` |\n| Get doc table of contents | `kirograph_docs_toc` |\n" : ""}${enableData ? "| What datasets are indexed? | `kirograph_data_list` |\n| Query rows with filters | `kirograph_data_query` |\n| Aggregate data server-side | `kirograph_data_aggregate` |\n" : ""}${enableSecurity ? "| Are there vulnerable dependencies? | `kirograph_security` |\n| Which CVEs affect my project? | `kirograph_vulns` |\n| Is this vulnerability reachable? | `kirograph_reachability` |\n| What licenses do my deps use? | `kirograph_licenses` |\n| Are dependencies outdated? | `kirograph_staleness` |\n" : ""}${enablePatterns ? "| Find structural code patterns? | `kirograph_live_search` |\n| Browse SAST rules | `kirograph pattern --list` |\n" : ""}${enableWiki ? "| Look up project knowledge | `kirograph_wiki_search` |\n| Update wiki with new knowledge | `kirograph_wiki_ingest` + `kirograph_wiki_apply_diff` |\n" : ""}
|
|
86
87
|
## Tool selection
|
|
87
88
|
|
|
88
89
|
- Start code tasks with \`kirograph_context\`.
|
|
@@ -228,6 +229,31 @@ production deploy, or when the user asks about security/compliance.
|
|
|
228
229
|
**EPSS scores:** >= 0.5 = patch immediately; 0.1\u20130.5 = elevated risk; < 0.1 = low probability.
|
|
229
230
|
|
|
230
231
|
**Workflow:** \`kirograph_security\` \u2192 \`kirograph_vulns --verdict affected\` \u2192 \`kirograph_reachability <cve>\` \u2192 fix \u2192 \`kirograph_vulns --refresh\`
|
|
232
|
+
`;
|
|
233
|
+
}
|
|
234
|
+
if (enableWiki) {
|
|
235
|
+
content += `
|
|
236
|
+
## Wiki
|
|
237
|
+
|
|
238
|
+
KiroGraph maintains a structured LLM wiki \u2014 a set of markdown pages that compound knowledge
|
|
239
|
+
across sessions. Consult it before starting a complex task, and update it after sessions that
|
|
240
|
+
produce durable knowledge.
|
|
241
|
+
|
|
242
|
+
**Available tools:**
|
|
243
|
+
- \`kirograph_wiki_search\` \u2014 full-text search over wiki pages
|
|
244
|
+
- \`kirograph_wiki_page\` \u2014 retrieve a page by slug
|
|
245
|
+
- \`kirograph_wiki_list\` \u2014 list all pages
|
|
246
|
+
- \`kirograph_wiki_ingest\` \u2014 build an ingest prompt for a source text
|
|
247
|
+
- \`kirograph_wiki_apply_diff\` \u2014 apply a WIKI_DIFF to create or update pages
|
|
248
|
+
- \`kirograph_wiki_lint\` \u2014 health check: broken links, orphans, contradictions
|
|
249
|
+
|
|
250
|
+
**Ingest workflow (two-tool):**
|
|
251
|
+
1. \`kirograph_wiki_ingest(source: "...", sourceName: "...")\` \u2014 get the structured prompt
|
|
252
|
+
2. Generate a \`WIKI_DIFF_START ... WIKI_DIFF_END\` block from the prompt
|
|
253
|
+
3. \`kirograph_wiki_apply_diff(diff: "...")\` \u2014 apply it; review conflicts in the response
|
|
254
|
+
|
|
255
|
+
**When to consult:** Before starting complex work, search for relevant wiki pages.
|
|
256
|
+
**When to update:** After sessions with architecture decisions, API contracts, or process knowledge.
|
|
231
257
|
`;
|
|
232
258
|
}
|
|
233
259
|
if (enablePatterns) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/installer/instructions.ts"],
|
|
4
|
-
"sourcesContent": ["import { CAVEMAN_RULES, CavemanMode } from './caveman';\n\nexport interface InstructionOptions {\n cavemanMode?: CavemanMode | 'off';\n shellCompressionLevel?: 'off' | 'normal' | 'aggressive' | 'ultra';\n enableArchitecture?: boolean;\n enableMemory?: boolean;\n enableDocs?: boolean;\n enableData?: boolean;\n enableSecurity?: boolean;\n enablePatterns?: boolean;\n hasHooks?: boolean;\n}\n\nconst LEVEL_DESCRIPTIONS: Record<string, string> = {\n normal: 'Balanced: removes noise, keeps structure.',\n aggressive: 'Compact: groups by category, limits output.',\n ultra: 'Maximum compression: counts and summaries only.',\n};\n\nconst LEVEL_EXAMPLES: Record<string, string> = {\n normal: `\\`\\`\\`\nkirograph_exec(command: \"git status\")\nkirograph_exec(command: \"npm test\")\nkirograph_exec(command: \"cargo build\")\nkirograph_exec(command: \"ls -la src/\")\n\\`\\`\\``,\n aggressive: `\\`\\`\\`\nkirograph_exec(command: \"git status\", level: \"aggressive\")\nkirograph_exec(command: \"npm test\", level: \"aggressive\")\nkirograph_exec(command: \"eslint .\", level: \"aggressive\")\nkirograph_exec(command: \"find . -name '*.ts'\", level: \"aggressive\")\n\\`\\`\\``,\n ultra: `\\`\\`\\`\nkirograph_exec(command: \"git status\", level: \"ultra\")\nkirograph_exec(command: \"npm test\", level: \"ultra\")\nkirograph_exec(command: \"docker ps\", level: \"ultra\")\nkirograph_exec(command: \"ls -la src/\", level: \"ultra\")\n\\`\\`\\``,\n};\n\nexport function buildAgentInstructions(cavemanModeOrOpts?: CavemanMode | 'off' | InstructionOptions): string {\n // Support both old signature (cavemanMode string) and new signature (options object)\n const opts: InstructionOptions = typeof cavemanModeOrOpts === 'object' && cavemanModeOrOpts !== null\n ? cavemanModeOrOpts\n : { cavemanMode: cavemanModeOrOpts ?? undefined };\n\n const cavemanMode = opts.cavemanMode;\n const enableCompression = opts.shellCompressionLevel && opts.shellCompressionLevel !== 'off';\n const shellCompressionLevel = opts.shellCompressionLevel ?? 'normal';\n const enableArchitecture = opts.enableArchitecture ?? false;\n const enableMemory = opts.enableMemory ?? false;\n const enableDocs = opts.enableDocs ?? false;\n const enableData = opts.enableData ?? false;\n const enableSecurity = opts.enableSecurity ?? false;\n const enablePatterns = opts.enablePatterns ?? false;\n\n let content = `# KiroGraph\n\nKiroGraph builds a local semantic knowledge graph of this codebase. When the \\`kirograph\\` MCP server is available, prefer its tools over broad grep/glob/file-read exploration.\n\n## Quick decision guide\n\n| Question | Tool |\n|----------|------|\n| Where do I start on this task? | \\`kirograph_context\\` |\n| What is this symbol / show me its code | \\`kirograph_node\\` with \\`includeCode: true\\` |\n| Find a symbol by name | \\`kirograph_search\\` |\n| Who calls function X? | \\`kirograph_callers\\` |\n| What does function X call? | \\`kirograph_callees\\` |\n| What breaks if I change X? | \\`kirograph_impact\\` |\n| How are X and Y connected? | \\`kirograph_path\\` |\n| What extends / implements this type? | \\`kirograph_type_hierarchy\\` |\n| Which code is never called? | \\`kirograph_dead_code\\` |\n| Are there import cycles? | \\`kirograph_circular_deps\\` |\n| What files are indexed? | \\`kirograph_files\\` |\n| Is the index healthy? | \\`kirograph_status\\` |\n| What are the most critical symbols? | \\`kirograph_hotspots\\` |\n| Any unexpected cross-module coupling? | \\`kirograph_surprising\\` |\n| What changed since the last snapshot? | \\`kirograph_diff\\` |\n${enableArchitecture ? '| What packages/layers exist? | `kirograph_architecture` |\\n| How coupled is package X? | `kirograph_coupling` |\\n| What does package X depend on? | `kirograph_package` |\\n' : ''}\n${enableCompression ? '| Run a command with token savings | `kirograph_exec` |\\n| Check token savings stats | `kirograph_gain` |\\n' : ''}${enableMemory ? '| Search past decisions/patterns | `kirograph_mem_search` |\\n| Store an observation | `kirograph_mem_store` |\\n' : ''}${enableDocs ? '| Find a doc section | `kirograph_docs_search` |\\n| Get doc table of contents | `kirograph_docs_toc` |\\n' : ''}${enableData ? '| What datasets are indexed? | `kirograph_data_list` |\\n| Query rows with filters | `kirograph_data_query` |\\n| Aggregate data server-side | `kirograph_data_aggregate` |\\n' : ''}${enableSecurity ? '| Are there vulnerable dependencies? | `kirograph_security` |\\n| Which CVEs affect my project? | `kirograph_vulns` |\\n| Is this vulnerability reachable? | `kirograph_reachability` |\\n| What licenses do my deps use? | `kirograph_licenses` |\\n| Are dependencies outdated? | `kirograph_staleness` |\\n' : ''}${enablePatterns ? '| Find structural code patterns? | `kirograph_live_search` |\\n| Browse SAST rules | `kirograph pattern --list` |\\n' : ''}\n## Tool selection\n\n- Start code tasks with \\`kirograph_context\\`.\n- Find symbols by name with \\`kirograph_search\\`.\n- Inspect a symbol with \\`kirograph_node\\`; set \\`includeCode: true\\` only when source is needed.\n- Trace call flow with \\`kirograph_callers\\` and \\`kirograph_callees\\`.\n- Check blast radius before edits with \\`kirograph_impact\\`.\n- Use \\`kirograph_path\\` to explain how two symbols connect.\n- Use \\`kirograph_type_hierarchy\\` for inheritance/interface questions.\n- Use \\`kirograph_files\\` to inspect indexed file structure.\n- Use \\`kirograph_status\\` if results seem stale or incomplete.\n- Use \\`kirograph_architecture\\`, \\`kirograph_coupling\\`, and \\`kirograph_package\\` for package/layer questions when architecture analysis is enabled.\n- Use \\`kirograph_hotspots\\`, \\`kirograph_surprising\\`, and \\`kirograph_diff\\` for refactor planning and review.\n\n## Workflow\n\n1. Call \\`kirograph_context\\` for orientation.\n2. Drill into specific symbols with \\`kirograph_node\\`.\n3. Use graph traversal tools before reading unrelated files.\n4. Fall back to normal filesystem tools only when the graph is missing, stale, or lacks the needed detail.\n\nIf \\`.kirograph/\\` does not exist, ask whether to run \\`kirograph init --index\\`.\n`;\n\n // Shell compression section\n if (enableCompression) {\n const level = shellCompressionLevel as 'normal' | 'aggressive' | 'ultra';\n content += `\n## Shell Compression (\\`kirograph_exec\\`)\n\nWhen running shell commands, prefer \\`kirograph_exec\\` over raw shell execution for:\n- **git** operations (status, log, diff, push, pull, commit, add, fetch, branch)\n- **GitHub CLI** (gh pr list/view, gh issue list, gh run list)\n- **test runners** (jest, vitest, pytest, cargo test, go test, rspec, minitest, playwright)\n- **linters/build** (eslint, tsc, ruff, clippy, cargo build, prettier, biome, golangci-lint, rubocop, next build)\n- **file listings** (ls, find, tree)\n- **search** (grep, rg/ripgrep: grouped by file)\n- **diff** (diff file1 file2: condensed context)\n- **docker/k8s** (docker ps, images, logs, compose ps, kubectl pods, logs, services)\n- **package managers** (npm/pnpm install/list, pip list/install, bundle install, prisma generate)\n- **AWS CLI** (sts, ec2, lambda, logs, cloudformation, dynamodb, iam, s3, ecs, sqs, sns)\n- **network** (curl, wget: strip progress bars and headers)\n\nThis saves 60-90% of tokens compared to raw output.\n\nCompression level: **${level}**: ${LEVEL_DESCRIPTIONS[level]}\n\n${LEVEL_EXAMPLES[level]}\n\n**Important:** Error details are always preserved. Failed commands show full diagnostic output regardless of level.\n\n**Do NOT re-run commands:** When \\`kirograph_exec\\` returns a result, treat it as the final answer. Never re-run the same command with raw shell execution to \"get more details.\" The compressed output preserves all essential information. If you genuinely need something missing from the output, explain what's missing before making a second call.\n\nUse \\`kirograph_gain\\` to check token savings statistics.\n`;\n }\n\n // Memory section\n if (enableMemory) {\n content += `\n## Memory\n\nKiroGraph has persistent memory. Use \\`kirograph_mem_search\\` to recall past decisions,\nerrors, and patterns before making changes. Use \\`kirograph_mem_store\\` to save important\nobservations (architecture decisions, bug root causes, patterns discovered).\n\nMemory is searchable via hybrid FTS + vector search. Observations are automatically\nlinked to code symbols in the graph and surface in \\`kirograph_context\\` and\n\\`kirograph_impact\\` results when relevant.\n\n**When to store:** After fixing a bug, making an architecture decision, discovering a pattern,\nencountering a non-obvious error, or learning something about the codebase that future sessions\nshould know. Keep observations concise \u2014 one fact per store call.\n`;\n }\n\n // Architecture section\n if (enableArchitecture) {\n content += `\n## Architecture\n\nKiroGraph analyzes the package structure and layer dependencies of the codebase.\n\n- \\`kirograph_architecture\\` \u2014 full package graph, detected layers (api/service/data/ui/shared), dependency edges\n- \\`kirograph_coupling\\` \u2014 Ca (afferent), Ce (efferent), instability per package; high Ca = load-bearing, high Ce = volatile\n- \\`kirograph_package\\` \u2014 drill into a single package: coupling metrics, deps, dependents, files\n\nUse \\`kirograph_architecture\\` for architectural questions instead of reading directory trees.\nHigh Ca + low instability = risky to change interface. High Ce + high instability = safe to refactor internals.\n`;\n }\n\n // Documentation section\n if (enableDocs) {\n content += `\n## Documentation\n\nKiroGraph indexes project documentation by heading structure. Use \\`kirograph_docs_search\\`\nto find relevant sections instead of reading entire files.\n\n- \\`kirograph_docs_toc\\` \u2014 table of contents for a file or the whole project\n- \\`kirograph_docs_search\\` \u2014 search sections by query\n- \\`kirograph_docs_section\\` \u2014 retrieve full section content by ID\n- \\`kirograph_docs_outline\\` \u2014 heading hierarchy for a single file\n- \\`kirograph_docs_refs\\` \u2014 code \u2194 doc cross-references\n\nBefore reading a doc file directly, try \\`kirograph_docs_search\\` or \\`kirograph_docs_outline\\` first.\n`;\n }\n\n // Data section\n if (enableData) {\n content += `\n## Data\n\nKiroGraph indexes tabular data files (CSV, TSV, JSONL, JSON, Excel, Parquet).\n\n- \\`kirograph_data_list\\` \u2014 list all indexed datasets\n- \\`kirograph_data_describe\\` \u2014 schema profile: column names, types, cardinality, samples\n- \\`kirograph_data_query\\` \u2014 filtered row retrieval (eq, gt, contains, in, between)\n- \\`kirograph_data_aggregate\\` \u2014 server-side GROUP BY: count, sum, avg, min, max\n\nUse \\`kirograph_data_describe\\` before reading a data file. Use \\`kirograph_data_query\\` with\nfilters instead of loading all rows. Use \\`kirograph_data_aggregate\\` for statistics.\nThis saves 95-99% of tokens compared to reading raw data files.\n`;\n }\n\n // Security section\n if (enableSecurity) {\n content += `\n## Security\n\nKiroGraph scans dependency manifests across 14 ecosystems for known vulnerabilities, performs\ncall-graph reachability analysis, tracks EPSS exploitation probability, checks license\ncompliance, and monitors dependency staleness.\n\n**Available tools:**\n- \\`kirograph_security\\` \u2014 overview: dep count, CVE count, verdict breakdown, stale warnings\n- \\`kirograph_vulns\\` \u2014 list CVEs with severity, EPSS score, reachability verdict, fix suggestion\n- \\`kirograph_reachability\\` \u2014 call paths, entry points, affected layers for one CVE or package\n- \\`kirograph_licenses\\` \u2014 list dependency licenses; flag policy violations\n- \\`kirograph_staleness\\` \u2014 identify outdated dependencies (staleness score 0.0\u20131.0)\n- \\`kirograph_sbom\\` / \\`kirograph_vex\\` \u2014 export CycloneDX 1.5 SBOM and VEX documents\n- \\`kirograph_vuln_add\\` \u2014 manually register a private/internal CVE\n\n**Proactive triggers:** Run \\`kirograph_security\\` when a dependency is added/updated, before a\nproduction deploy, or when the user asks about security/compliance.\n\n**Interpreting verdicts:**\n- \\`affected\\` \u2014 a call path exists from an entry point to the vulnerable code. Act on this.\n- \\`not_affected\\` \u2014 no reachable path found. Strong signal: likely safe.\n- \\`under_investigation\\` \u2014 unresolved symbols in traversal. Treat with caution.\n\n**EPSS scores:** >= 0.5 = patch immediately; 0.1\u20130.5 = elevated risk; < 0.1 = low probability.\n\n**Workflow:** \\`kirograph_security\\` \u2192 \\`kirograph_vulns --verdict affected\\` \u2192 \\`kirograph_reachability <cve>\\` \u2192 fix \u2192 \\`kirograph_vulns --refresh\\`\n`;\n }\n\n // Pattern matching section\n if (enablePatterns) {\n content += `\n## Pattern Search\n\nKiroGraph supports AST structural pattern search via \\`kirograph_live_search\\` (only available when \\`enablePatterns: true\\` and \\`@ast-grep/napi\\` is installed).\n\n- \\`kirograph_live_search\\` \u2014 find any structural code pattern across the indexed file list\n- \\`kirograph pattern --list\\` \u2014 browse 10 bundled SAST rules (SQL injection, eval, path traversal, etc.)\n- \\`kirograph pattern --library <id>\\` \u2014 run a specific library rule\n\nUse \\`kirograph_live_search\\` when you need to find patterns that can't be expressed as symbol names: anonymous functions, specific code structures, or security anti-patterns.\n`;\n }\n\n // Session hygiene for tools without hooks\n if (!opts.hasHooks) {\n content += `\n## Session Hygiene\n\nThis tool does not have automatic sync hooks. To keep the index fresh:\n- Run \\`kirograph sync\\` at the **start** of each session if files changed outside the agent.\n- Run \\`kirograph sync\\` at the **end** of each session after making changes.\n- If results from graph tools seem stale, run \\`kirograph sync\\` before retrying.\n${enableMemory ? '- Store important observations with `kirograph_mem_store` before ending your session.\\n' : ''}`;\n }\n\n // Caveman mode\n const caveman = cavemanMode && cavemanMode !== 'off' ? CAVEMAN_RULES[cavemanMode] : null;\n if (caveman) {\n content = content.trimEnd() + '\\n\\n' + caveman + '\\n';\n }\n\n return content;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA2C;
|
|
4
|
+
"sourcesContent": ["import { CAVEMAN_RULES, CavemanMode } from './caveman';\n\nexport interface InstructionOptions {\n cavemanMode?: CavemanMode | 'off';\n shellCompressionLevel?: 'off' | 'normal' | 'aggressive' | 'ultra';\n enableArchitecture?: boolean;\n enableMemory?: boolean;\n enableDocs?: boolean;\n enableData?: boolean;\n enableSecurity?: boolean;\n enablePatterns?: boolean;\n enableWiki?: boolean;\n hasHooks?: boolean;\n}\n\nconst LEVEL_DESCRIPTIONS: Record<string, string> = {\n normal: 'Balanced: removes noise, keeps structure.',\n aggressive: 'Compact: groups by category, limits output.',\n ultra: 'Maximum compression: counts and summaries only.',\n};\n\nconst LEVEL_EXAMPLES: Record<string, string> = {\n normal: `\\`\\`\\`\nkirograph_exec(command: \"git status\")\nkirograph_exec(command: \"npm test\")\nkirograph_exec(command: \"cargo build\")\nkirograph_exec(command: \"ls -la src/\")\n\\`\\`\\``,\n aggressive: `\\`\\`\\`\nkirograph_exec(command: \"git status\", level: \"aggressive\")\nkirograph_exec(command: \"npm test\", level: \"aggressive\")\nkirograph_exec(command: \"eslint .\", level: \"aggressive\")\nkirograph_exec(command: \"find . -name '*.ts'\", level: \"aggressive\")\n\\`\\`\\``,\n ultra: `\\`\\`\\`\nkirograph_exec(command: \"git status\", level: \"ultra\")\nkirograph_exec(command: \"npm test\", level: \"ultra\")\nkirograph_exec(command: \"docker ps\", level: \"ultra\")\nkirograph_exec(command: \"ls -la src/\", level: \"ultra\")\n\\`\\`\\``,\n};\n\nexport function buildAgentInstructions(cavemanModeOrOpts?: CavemanMode | 'off' | InstructionOptions): string {\n // Support both old signature (cavemanMode string) and new signature (options object)\n const opts: InstructionOptions = typeof cavemanModeOrOpts === 'object' && cavemanModeOrOpts !== null\n ? cavemanModeOrOpts\n : { cavemanMode: cavemanModeOrOpts ?? undefined };\n\n const cavemanMode = opts.cavemanMode;\n const enableCompression = opts.shellCompressionLevel && opts.shellCompressionLevel !== 'off';\n const shellCompressionLevel = opts.shellCompressionLevel ?? 'normal';\n const enableArchitecture = opts.enableArchitecture ?? false;\n const enableMemory = opts.enableMemory ?? false;\n const enableDocs = opts.enableDocs ?? false;\n const enableData = opts.enableData ?? false;\n const enableSecurity = opts.enableSecurity ?? false;\n const enablePatterns = opts.enablePatterns ?? false;\n const enableWiki = opts.enableWiki ?? false;\n\n let content = `# KiroGraph\n\nKiroGraph builds a local semantic knowledge graph of this codebase. When the \\`kirograph\\` MCP server is available, prefer its tools over broad grep/glob/file-read exploration.\n\n## Quick decision guide\n\n| Question | Tool |\n|----------|------|\n| Where do I start on this task? | \\`kirograph_context\\` |\n| What is this symbol / show me its code | \\`kirograph_node\\` with \\`includeCode: true\\` |\n| Find a symbol by name | \\`kirograph_search\\` |\n| Who calls function X? | \\`kirograph_callers\\` |\n| What does function X call? | \\`kirograph_callees\\` |\n| What breaks if I change X? | \\`kirograph_impact\\` |\n| How are X and Y connected? | \\`kirograph_path\\` |\n| What extends / implements this type? | \\`kirograph_type_hierarchy\\` |\n| Which code is never called? | \\`kirograph_dead_code\\` |\n| Are there import cycles? | \\`kirograph_circular_deps\\` |\n| What files are indexed? | \\`kirograph_files\\` |\n| Is the index healthy? | \\`kirograph_status\\` |\n| What are the most critical symbols? | \\`kirograph_hotspots\\` |\n| Any unexpected cross-module coupling? | \\`kirograph_surprising\\` |\n| What changed since the last snapshot? | \\`kirograph_diff\\` |\n${enableArchitecture ? '| What packages/layers exist? | `kirograph_architecture` |\\n| How coupled is package X? | `kirograph_coupling` |\\n| What does package X depend on? | `kirograph_package` |\\n' : ''}\n${enableCompression ? '| Run a command with token savings | `kirograph_exec` |\\n| Check token savings stats | `kirograph_gain` |\\n' : ''}${enableMemory ? '| Search past decisions/patterns | `kirograph_mem_search` |\\n| Store an observation | `kirograph_mem_store` |\\n' : ''}${enableDocs ? '| Find a doc section | `kirograph_docs_search` |\\n| Get doc table of contents | `kirograph_docs_toc` |\\n' : ''}${enableData ? '| What datasets are indexed? | `kirograph_data_list` |\\n| Query rows with filters | `kirograph_data_query` |\\n| Aggregate data server-side | `kirograph_data_aggregate` |\\n' : ''}${enableSecurity ? '| Are there vulnerable dependencies? | `kirograph_security` |\\n| Which CVEs affect my project? | `kirograph_vulns` |\\n| Is this vulnerability reachable? | `kirograph_reachability` |\\n| What licenses do my deps use? | `kirograph_licenses` |\\n| Are dependencies outdated? | `kirograph_staleness` |\\n' : ''}${enablePatterns ? '| Find structural code patterns? | `kirograph_live_search` |\\n| Browse SAST rules | `kirograph pattern --list` |\\n' : ''}${enableWiki ? '| Look up project knowledge | `kirograph_wiki_search` |\\n| Update wiki with new knowledge | `kirograph_wiki_ingest` + `kirograph_wiki_apply_diff` |\\n' : ''}\n## Tool selection\n\n- Start code tasks with \\`kirograph_context\\`.\n- Find symbols by name with \\`kirograph_search\\`.\n- Inspect a symbol with \\`kirograph_node\\`; set \\`includeCode: true\\` only when source is needed.\n- Trace call flow with \\`kirograph_callers\\` and \\`kirograph_callees\\`.\n- Check blast radius before edits with \\`kirograph_impact\\`.\n- Use \\`kirograph_path\\` to explain how two symbols connect.\n- Use \\`kirograph_type_hierarchy\\` for inheritance/interface questions.\n- Use \\`kirograph_files\\` to inspect indexed file structure.\n- Use \\`kirograph_status\\` if results seem stale or incomplete.\n- Use \\`kirograph_architecture\\`, \\`kirograph_coupling\\`, and \\`kirograph_package\\` for package/layer questions when architecture analysis is enabled.\n- Use \\`kirograph_hotspots\\`, \\`kirograph_surprising\\`, and \\`kirograph_diff\\` for refactor planning and review.\n\n## Workflow\n\n1. Call \\`kirograph_context\\` for orientation.\n2. Drill into specific symbols with \\`kirograph_node\\`.\n3. Use graph traversal tools before reading unrelated files.\n4. Fall back to normal filesystem tools only when the graph is missing, stale, or lacks the needed detail.\n\nIf \\`.kirograph/\\` does not exist, ask whether to run \\`kirograph init --index\\`.\n`;\n\n // Shell compression section\n if (enableCompression) {\n const level = shellCompressionLevel as 'normal' | 'aggressive' | 'ultra';\n content += `\n## Shell Compression (\\`kirograph_exec\\`)\n\nWhen running shell commands, prefer \\`kirograph_exec\\` over raw shell execution for:\n- **git** operations (status, log, diff, push, pull, commit, add, fetch, branch)\n- **GitHub CLI** (gh pr list/view, gh issue list, gh run list)\n- **test runners** (jest, vitest, pytest, cargo test, go test, rspec, minitest, playwright)\n- **linters/build** (eslint, tsc, ruff, clippy, cargo build, prettier, biome, golangci-lint, rubocop, next build)\n- **file listings** (ls, find, tree)\n- **search** (grep, rg/ripgrep: grouped by file)\n- **diff** (diff file1 file2: condensed context)\n- **docker/k8s** (docker ps, images, logs, compose ps, kubectl pods, logs, services)\n- **package managers** (npm/pnpm install/list, pip list/install, bundle install, prisma generate)\n- **AWS CLI** (sts, ec2, lambda, logs, cloudformation, dynamodb, iam, s3, ecs, sqs, sns)\n- **network** (curl, wget: strip progress bars and headers)\n\nThis saves 60-90% of tokens compared to raw output.\n\nCompression level: **${level}**: ${LEVEL_DESCRIPTIONS[level]}\n\n${LEVEL_EXAMPLES[level]}\n\n**Important:** Error details are always preserved. Failed commands show full diagnostic output regardless of level.\n\n**Do NOT re-run commands:** When \\`kirograph_exec\\` returns a result, treat it as the final answer. Never re-run the same command with raw shell execution to \"get more details.\" The compressed output preserves all essential information. If you genuinely need something missing from the output, explain what's missing before making a second call.\n\nUse \\`kirograph_gain\\` to check token savings statistics.\n`;\n }\n\n // Memory section\n if (enableMemory) {\n content += `\n## Memory\n\nKiroGraph has persistent memory. Use \\`kirograph_mem_search\\` to recall past decisions,\nerrors, and patterns before making changes. Use \\`kirograph_mem_store\\` to save important\nobservations (architecture decisions, bug root causes, patterns discovered).\n\nMemory is searchable via hybrid FTS + vector search. Observations are automatically\nlinked to code symbols in the graph and surface in \\`kirograph_context\\` and\n\\`kirograph_impact\\` results when relevant.\n\n**When to store:** After fixing a bug, making an architecture decision, discovering a pattern,\nencountering a non-obvious error, or learning something about the codebase that future sessions\nshould know. Keep observations concise \u2014 one fact per store call.\n`;\n }\n\n // Architecture section\n if (enableArchitecture) {\n content += `\n## Architecture\n\nKiroGraph analyzes the package structure and layer dependencies of the codebase.\n\n- \\`kirograph_architecture\\` \u2014 full package graph, detected layers (api/service/data/ui/shared), dependency edges\n- \\`kirograph_coupling\\` \u2014 Ca (afferent), Ce (efferent), instability per package; high Ca = load-bearing, high Ce = volatile\n- \\`kirograph_package\\` \u2014 drill into a single package: coupling metrics, deps, dependents, files\n\nUse \\`kirograph_architecture\\` for architectural questions instead of reading directory trees.\nHigh Ca + low instability = risky to change interface. High Ce + high instability = safe to refactor internals.\n`;\n }\n\n // Documentation section\n if (enableDocs) {\n content += `\n## Documentation\n\nKiroGraph indexes project documentation by heading structure. Use \\`kirograph_docs_search\\`\nto find relevant sections instead of reading entire files.\n\n- \\`kirograph_docs_toc\\` \u2014 table of contents for a file or the whole project\n- \\`kirograph_docs_search\\` \u2014 search sections by query\n- \\`kirograph_docs_section\\` \u2014 retrieve full section content by ID\n- \\`kirograph_docs_outline\\` \u2014 heading hierarchy for a single file\n- \\`kirograph_docs_refs\\` \u2014 code \u2194 doc cross-references\n\nBefore reading a doc file directly, try \\`kirograph_docs_search\\` or \\`kirograph_docs_outline\\` first.\n`;\n }\n\n // Data section\n if (enableData) {\n content += `\n## Data\n\nKiroGraph indexes tabular data files (CSV, TSV, JSONL, JSON, Excel, Parquet).\n\n- \\`kirograph_data_list\\` \u2014 list all indexed datasets\n- \\`kirograph_data_describe\\` \u2014 schema profile: column names, types, cardinality, samples\n- \\`kirograph_data_query\\` \u2014 filtered row retrieval (eq, gt, contains, in, between)\n- \\`kirograph_data_aggregate\\` \u2014 server-side GROUP BY: count, sum, avg, min, max\n\nUse \\`kirograph_data_describe\\` before reading a data file. Use \\`kirograph_data_query\\` with\nfilters instead of loading all rows. Use \\`kirograph_data_aggregate\\` for statistics.\nThis saves 95-99% of tokens compared to reading raw data files.\n`;\n }\n\n // Security section\n if (enableSecurity) {\n content += `\n## Security\n\nKiroGraph scans dependency manifests across 14 ecosystems for known vulnerabilities, performs\ncall-graph reachability analysis, tracks EPSS exploitation probability, checks license\ncompliance, and monitors dependency staleness.\n\n**Available tools:**\n- \\`kirograph_security\\` \u2014 overview: dep count, CVE count, verdict breakdown, stale warnings\n- \\`kirograph_vulns\\` \u2014 list CVEs with severity, EPSS score, reachability verdict, fix suggestion\n- \\`kirograph_reachability\\` \u2014 call paths, entry points, affected layers for one CVE or package\n- \\`kirograph_licenses\\` \u2014 list dependency licenses; flag policy violations\n- \\`kirograph_staleness\\` \u2014 identify outdated dependencies (staleness score 0.0\u20131.0)\n- \\`kirograph_sbom\\` / \\`kirograph_vex\\` \u2014 export CycloneDX 1.5 SBOM and VEX documents\n- \\`kirograph_vuln_add\\` \u2014 manually register a private/internal CVE\n\n**Proactive triggers:** Run \\`kirograph_security\\` when a dependency is added/updated, before a\nproduction deploy, or when the user asks about security/compliance.\n\n**Interpreting verdicts:**\n- \\`affected\\` \u2014 a call path exists from an entry point to the vulnerable code. Act on this.\n- \\`not_affected\\` \u2014 no reachable path found. Strong signal: likely safe.\n- \\`under_investigation\\` \u2014 unresolved symbols in traversal. Treat with caution.\n\n**EPSS scores:** >= 0.5 = patch immediately; 0.1\u20130.5 = elevated risk; < 0.1 = low probability.\n\n**Workflow:** \\`kirograph_security\\` \u2192 \\`kirograph_vulns --verdict affected\\` \u2192 \\`kirograph_reachability <cve>\\` \u2192 fix \u2192 \\`kirograph_vulns --refresh\\`\n`;\n }\n\n // Wiki section\n if (enableWiki) {\n content += `\n## Wiki\n\nKiroGraph maintains a structured LLM wiki \u2014 a set of markdown pages that compound knowledge\nacross sessions. Consult it before starting a complex task, and update it after sessions that\nproduce durable knowledge.\n\n**Available tools:**\n- \\`kirograph_wiki_search\\` \u2014 full-text search over wiki pages\n- \\`kirograph_wiki_page\\` \u2014 retrieve a page by slug\n- \\`kirograph_wiki_list\\` \u2014 list all pages\n- \\`kirograph_wiki_ingest\\` \u2014 build an ingest prompt for a source text\n- \\`kirograph_wiki_apply_diff\\` \u2014 apply a WIKI_DIFF to create or update pages\n- \\`kirograph_wiki_lint\\` \u2014 health check: broken links, orphans, contradictions\n\n**Ingest workflow (two-tool):**\n1. \\`kirograph_wiki_ingest(source: \"...\", sourceName: \"...\")\\` \u2014 get the structured prompt\n2. Generate a \\`WIKI_DIFF_START ... WIKI_DIFF_END\\` block from the prompt\n3. \\`kirograph_wiki_apply_diff(diff: \"...\")\\` \u2014 apply it; review conflicts in the response\n\n**When to consult:** Before starting complex work, search for relevant wiki pages.\n**When to update:** After sessions with architecture decisions, API contracts, or process knowledge.\n`;\n }\n\n // Pattern matching section\n if (enablePatterns) {\n content += `\n## Pattern Search\n\nKiroGraph supports AST structural pattern search via \\`kirograph_live_search\\` (only available when \\`enablePatterns: true\\` and \\`@ast-grep/napi\\` is installed).\n\n- \\`kirograph_live_search\\` \u2014 find any structural code pattern across the indexed file list\n- \\`kirograph pattern --list\\` \u2014 browse 10 bundled SAST rules (SQL injection, eval, path traversal, etc.)\n- \\`kirograph pattern --library <id>\\` \u2014 run a specific library rule\n\nUse \\`kirograph_live_search\\` when you need to find patterns that can't be expressed as symbol names: anonymous functions, specific code structures, or security anti-patterns.\n`;\n }\n\n // Session hygiene for tools without hooks\n if (!opts.hasHooks) {\n content += `\n## Session Hygiene\n\nThis tool does not have automatic sync hooks. To keep the index fresh:\n- Run \\`kirograph sync\\` at the **start** of each session if files changed outside the agent.\n- Run \\`kirograph sync\\` at the **end** of each session after making changes.\n- If results from graph tools seem stale, run \\`kirograph sync\\` before retrying.\n${enableMemory ? '- Store important observations with `kirograph_mem_store` before ending your session.\\n' : ''}`;\n }\n\n // Caveman mode\n const caveman = cavemanMode && cavemanMode !== 'off' ? CAVEMAN_RULES[cavemanMode] : null;\n if (caveman) {\n content = content.trimEnd() + '\\n\\n' + caveman + '\\n';\n }\n\n return content;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -28,23 +28,56 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var mcp_exports = {};
|
|
30
30
|
__export(mcp_exports, {
|
|
31
|
-
|
|
31
|
+
updateMcpAutoApprove: () => updateMcpAutoApprove,
|
|
32
|
+
writeMcpConfig: () => writeMcpConfig,
|
|
33
|
+
writeMcpConfigFinal: () => writeMcpConfigFinal
|
|
32
34
|
});
|
|
33
35
|
module.exports = __toCommonJS(mcp_exports);
|
|
34
36
|
var path = __toESM(require("path"));
|
|
35
37
|
var import_common = require("./common");
|
|
36
|
-
|
|
38
|
+
var import_tool_names = require("../../mcp/tool-names");
|
|
39
|
+
function computeAutoApprove(features) {
|
|
40
|
+
if (!features) return import_common.KIROGRAPH_TOOLS;
|
|
41
|
+
const hidden = /* @__PURE__ */ new Set();
|
|
42
|
+
for (const [flag, names] of Object.entries(import_tool_names.FEATURE_TOOL_SETS)) {
|
|
43
|
+
if (features[flag] === false) {
|
|
44
|
+
for (const n of names) hidden.add(n);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return import_common.KIROGRAPH_TOOLS.filter((n) => !hidden.has(n));
|
|
48
|
+
}
|
|
49
|
+
function writeMcpConfig(kiroDir, projectRoot) {
|
|
37
50
|
const mcpPath = path.join(kiroDir, "settings", "mcp.json");
|
|
51
|
+
const args = projectRoot ? [...import_common.KIROGRAPH_MCP_ARGS, "--path", projectRoot] : import_common.KIROGRAPH_MCP_ARGS;
|
|
38
52
|
(0, import_common.writeMcpServersConfig)(mcpPath, {
|
|
39
53
|
command: import_common.KIROGRAPH_COMMAND,
|
|
40
|
-
args
|
|
54
|
+
args,
|
|
41
55
|
disabled: false,
|
|
42
56
|
autoApprove: import_common.KIROGRAPH_TOOLS
|
|
43
57
|
});
|
|
44
58
|
console.log(` \u2713 MCP server registered in ${mcpPath}`);
|
|
45
59
|
}
|
|
60
|
+
function updateMcpAutoApprove(kiroDir, features) {
|
|
61
|
+
const mcpPath = path.join(kiroDir, "settings", "mcp.json");
|
|
62
|
+
const existing = (0, import_common.readJson)(mcpPath);
|
|
63
|
+
if (!existing.mcpServers?.kirograph) return;
|
|
64
|
+
existing.mcpServers.kirograph.autoApprove = computeAutoApprove(features);
|
|
65
|
+
(0, import_common.writeJson)(mcpPath, existing);
|
|
66
|
+
}
|
|
67
|
+
function writeMcpConfigFinal(kiroDir, projectRoot, features) {
|
|
68
|
+
const mcpPath = path.join(kiroDir, "settings", "mcp.json");
|
|
69
|
+
(0, import_common.overwriteMcpServersConfig)(mcpPath, {
|
|
70
|
+
command: import_common.KIROGRAPH_COMMAND,
|
|
71
|
+
args: [...import_common.KIROGRAPH_MCP_ARGS, "--path", projectRoot],
|
|
72
|
+
disabled: false,
|
|
73
|
+
autoApprove: computeAutoApprove(features)
|
|
74
|
+
});
|
|
75
|
+
console.log(` \u2713 MCP server registered in ${mcpPath}`);
|
|
76
|
+
}
|
|
46
77
|
// Annotate the CommonJS export names for ESM import in node:
|
|
47
78
|
0 && (module.exports = {
|
|
48
|
-
|
|
79
|
+
updateMcpAutoApprove,
|
|
80
|
+
writeMcpConfig,
|
|
81
|
+
writeMcpConfigFinal
|
|
49
82
|
});
|
|
50
83
|
//# sourceMappingURL=mcp.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/installer/mcp.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph Installer \u2014 MCP server registration\n */\n\nimport * as path from 'path';\nimport { KIROGRAPH_COMMAND, KIROGRAPH_MCP_ARGS, KIROGRAPH_TOOLS, writeMcpServersConfig } from './common';\n\nexport function writeMcpConfig(kiroDir: string): void {\n const mcpPath = path.join(kiroDir, 'settings', 'mcp.json');\n writeMcpServersConfig(mcpPath, {\n command: KIROGRAPH_COMMAND,\n args: KIROGRAPH_MCP_ARGS,\n disabled: false,\n autoApprove:
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,WAAsB;AACtB,
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph Installer \u2014 MCP server registration\n */\n\nimport * as path from 'path';\nimport { KIROGRAPH_COMMAND, KIROGRAPH_MCP_ARGS, KIROGRAPH_TOOLS, writeMcpServersConfig, overwriteMcpServersConfig, readJson, writeJson } from './common';\nimport { FEATURE_TOOL_SETS } from '../../mcp/tool-names';\n\nexport interface McpFeatureFlags {\n enableArchitecture?: boolean;\n enableMemory?: boolean;\n enableDocs?: boolean;\n enableData?: boolean;\n enableSecurity?: boolean;\n enablePatterns?: boolean;\n enableWiki?: boolean;\n enableCodeHealth?: boolean;\n enableAdvancedAnalysis?: boolean;\n enableAgentUtils?: boolean;\n enableShellExec?: boolean;\n trackCallSites?: boolean;\n}\n\nfunction computeAutoApprove(features?: McpFeatureFlags): string[] {\n if (!features) return KIROGRAPH_TOOLS;\n const hidden = new Set<string>();\n for (const [flag, names] of Object.entries(FEATURE_TOOL_SETS)) {\n if ((features as Record<string, boolean | undefined>)[flag] === false) {\n for (const n of names) hidden.add(n);\n }\n }\n return KIROGRAPH_TOOLS.filter(n => !hidden.has(n));\n}\n\nexport function writeMcpConfig(kiroDir: string, projectRoot?: string): void {\n const mcpPath = path.join(kiroDir, 'settings', 'mcp.json');\n const args = projectRoot\n ? [...KIROGRAPH_MCP_ARGS, '--path', projectRoot]\n : KIROGRAPH_MCP_ARGS;\n writeMcpServersConfig(mcpPath, {\n command: KIROGRAPH_COMMAND,\n args,\n disabled: false,\n autoApprove: KIROGRAPH_TOOLS,\n });\n console.log(` \u2713 MCP server registered in ${mcpPath}`);\n}\n\n/** Called after feature prompts to update autoApprove to match enabled features. */\nexport function updateMcpAutoApprove(kiroDir: string, features: McpFeatureFlags): void {\n const mcpPath = path.join(kiroDir, 'settings', 'mcp.json');\n const existing = readJson(mcpPath);\n if (!existing.mcpServers?.kirograph) return;\n existing.mcpServers.kirograph.autoApprove = computeAutoApprove(features);\n writeJson(mcpPath, existing);\n}\n\n/**\n * Write the final MCP config with the correct autoApprove in one atomic write.\n * Always overwrites any existing entry \u2014 no intermediate \"all tools\" state.\n * Call this from installLate where feature flags are known.\n */\nexport function writeMcpConfigFinal(kiroDir: string, projectRoot: string, features: McpFeatureFlags): void {\n const mcpPath = path.join(kiroDir, 'settings', 'mcp.json');\n overwriteMcpServersConfig(mcpPath, {\n command: KIROGRAPH_COMMAND,\n args: [...KIROGRAPH_MCP_ARGS, '--path', projectRoot],\n disabled: false,\n autoApprove: computeAutoApprove(features),\n });\n console.log(` \u2713 MCP server registered in ${mcpPath}`);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,WAAsB;AACtB,oBAA8I;AAC9I,wBAAkC;AAiBlC,SAAS,mBAAmB,UAAsC;AAChE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,mCAAiB,GAAG;AAC7D,QAAK,SAAiD,IAAI,MAAM,OAAO;AACrE,iBAAW,KAAK,MAAO,QAAO,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AACA,SAAO,8BAAgB,OAAO,OAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AACnD;AAEO,SAAS,eAAe,SAAiB,aAA4B;AAC1E,QAAM,UAAU,KAAK,KAAK,SAAS,YAAY,UAAU;AACzD,QAAM,OAAO,cACT,CAAC,GAAG,kCAAoB,UAAU,WAAW,IAC7C;AACJ,2CAAsB,SAAS;AAAA,IAC7B,SAAS;AAAA,IACT;AAAA,IACA,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,UAAQ,IAAI,qCAAgC,OAAO,EAAE;AACvD;AAGO,SAAS,qBAAqB,SAAiB,UAAiC;AACrF,QAAM,UAAU,KAAK,KAAK,SAAS,YAAY,UAAU;AACzD,QAAM,eAAW,wBAAS,OAAO;AACjC,MAAI,CAAC,SAAS,YAAY,UAAW;AACrC,WAAS,WAAW,UAAU,cAAc,mBAAmB,QAAQ;AACvE,+BAAU,SAAS,QAAQ;AAC7B;AAOO,SAAS,oBAAoB,SAAiB,aAAqB,UAAiC;AACzG,QAAM,UAAU,KAAK,KAAK,SAAS,YAAY,UAAU;AACzD,+CAA0B,SAAS;AAAA,IACjC,SAAS;AAAA,IACT,MAAM,CAAC,GAAG,kCAAoB,UAAU,WAAW;AAAA,IACnD,UAAU;AAAA,IACV,aAAa,mBAAmB,QAAQ;AAAA,EAC1C,CAAC;AACD,UAAQ,IAAI,qCAAgC,OAAO,EAAE;AACvD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -55,9 +55,9 @@ async function askBool(rl, question, description, defaultYes = true) {
|
|
|
55
55
|
}
|
|
56
56
|
async function askToggle(rl, label, description, defaultEnabled = true) {
|
|
57
57
|
return arrowSelect(rl, label, [
|
|
58
|
-
{ value:
|
|
59
|
-
{ value:
|
|
60
|
-
], defaultEnabled ?
|
|
58
|
+
{ value: false, label: "no", description: "Skip" },
|
|
59
|
+
{ value: true, label: "yes", description }
|
|
60
|
+
], defaultEnabled ? 1 : 0);
|
|
61
61
|
}
|
|
62
62
|
async function askString(rl, question, description, defaultValue) {
|
|
63
63
|
console.log(`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/installer/prompts.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph Installer \u2014 interactive prompt helpers\n */\n\nimport * as readline from 'readline';\n\n// \u2500\u2500 ANSI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 const violet = '\\x1b[38;5;99m';\nexport const reset = '\\x1b[0m';\nexport const dim = '\\x1b[2m';\nconst bold = '\\x1b[1m';\nconst green = '\\x1b[32m';\nconst yellow = '\\x1b[33m';\nconst cyan = '\\x1b[36m';\n\n// \u2500\u2500 Primitives \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 ask(rl: readline.Interface, question: string): Promise<string> {\n return new Promise(resolve => rl.question(question, resolve));\n}\n\n/**\n * Prompt a yes/no question, re-prompting on invalid input.\n * Accepts: \"\" (use default), \"y\", \"Y\", \"n\", \"N\".\n */\nexport async function askBool(\n rl: readline.Interface,\n question: string,\n description: string,\n defaultYes = true,\n): Promise<boolean> {\n const hint = defaultYes ? 'Y/n' : 'y/N';\n console.log(`\\n ${dim}${description}${reset}`);\n while (true) {\n const raw = await ask(rl, ` ${violet}${question}${reset} ${dim}(${hint})${reset} `);\n if (raw === '') return defaultYes;\n if (raw === 'y' || raw === 'Y') return true;\n if (raw === 'n' || raw === 'N') return false;\n console.log(` Please enter y or n.`);\n }\n}\n\n/**\n * Interactive enable/disable toggle using arrow keys.\n * More visual alternative to askBool.\n */\nexport async function askToggle(\n rl: readline.Interface,\n label: string,\n description: string,\n defaultEnabled = true,\n): Promise<boolean> {\n return arrowSelect<boolean>(rl, label, [\n { value:
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,MAAM,SAAS;AACf,MAAM,QAAS;AACf,MAAM,MAAS;AACtB,MAAM,OAAgB;AACtB,MAAM,QAAgB;AACtB,MAAM,SAAgB;AACtB,MAAM,OAAgB;AAIf,SAAS,IAAI,IAAwB,UAAmC;AAC7E,SAAO,IAAI,QAAQ,aAAW,GAAG,SAAS,UAAU,OAAO,CAAC;AAC9D;AAMA,eAAsB,QACpB,IACA,UACA,aACA,aAAa,MACK;AAClB,QAAM,OAAO,aAAa,QAAQ;AAClC,UAAQ,IAAI;AAAA,IAAO,GAAG,GAAG,WAAW,GAAG,KAAK,EAAE;AAC9C,SAAO,MAAM;AACX,UAAM,MAAM,MAAM,IAAI,IAAI,KAAK,MAAM,GAAG,QAAQ,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG;AACnF,QAAI,QAAQ,GAAI,QAAO;AACvB,QAAI,QAAQ,OAAO,QAAQ,IAAK,QAAO;AACvC,QAAI,QAAQ,OAAO,QAAQ,IAAK,QAAO;AACvC,YAAQ,IAAI,wBAAwB;AAAA,EACtC;AACF;AAMA,eAAsB,UACpB,IACA,OACA,aACA,iBAAiB,MACC;AAClB,SAAO,YAAqB,IAAI,OAAO;AAAA,IACrC,EAAE,OAAO,
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph Installer \u2014 interactive prompt helpers\n */\n\nimport * as readline from 'readline';\n\n// \u2500\u2500 ANSI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 const violet = '\\x1b[38;5;99m';\nexport const reset = '\\x1b[0m';\nexport const dim = '\\x1b[2m';\nconst bold = '\\x1b[1m';\nconst green = '\\x1b[32m';\nconst yellow = '\\x1b[33m';\nconst cyan = '\\x1b[36m';\n\n// \u2500\u2500 Primitives \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 ask(rl: readline.Interface, question: string): Promise<string> {\n return new Promise(resolve => rl.question(question, resolve));\n}\n\n/**\n * Prompt a yes/no question, re-prompting on invalid input.\n * Accepts: \"\" (use default), \"y\", \"Y\", \"n\", \"N\".\n */\nexport async function askBool(\n rl: readline.Interface,\n question: string,\n description: string,\n defaultYes = true,\n): Promise<boolean> {\n const hint = defaultYes ? 'Y/n' : 'y/N';\n console.log(`\\n ${dim}${description}${reset}`);\n while (true) {\n const raw = await ask(rl, ` ${violet}${question}${reset} ${dim}(${hint})${reset} `);\n if (raw === '') return defaultYes;\n if (raw === 'y' || raw === 'Y') return true;\n if (raw === 'n' || raw === 'N') return false;\n console.log(` Please enter y or n.`);\n }\n}\n\n/**\n * Interactive enable/disable toggle using arrow keys.\n * More visual alternative to askBool.\n */\nexport async function askToggle(\n rl: readline.Interface,\n label: string,\n description: string,\n defaultEnabled = true,\n): Promise<boolean> {\n return arrowSelect<boolean>(rl, label, [\n { value: false, label: 'no', description: 'Skip' },\n { value: true, label: 'yes', description },\n ], defaultEnabled ? 1 : 0);\n}\n\n/**\n * Prompt for a string value, returning the default on empty input.\n */\nexport async function askString(\n rl: readline.Interface,\n question: string,\n description: string,\n defaultValue: string,\n): Promise<string> {\n console.log(`\\n ${dim}${description}${reset}`);\n const raw = await ask(rl, ` ${violet}${question}${reset} ${dim}(${defaultValue})${reset} `);\n return raw === '' ? defaultValue : raw;\n}\n\n/**\n * Print a styled section header with an icon.\n */\nexport function printSection(icon: string, title: string): void {\n console.log(`\\n ${violet}${bold}${icon} ${title}${reset}`);\n console.log(` ${violet}${'\u2500'.repeat(title.length + 4)}${reset}`);\n}\n\n/**\n * Print a separator line.\n */\nexport function printSeparator(): void {\n console.log(`\\n ${dim}${'\u00B7'.repeat(50)}${reset}`);\n}\n\n/**\n * Print a feature summary line.\n */\nexport function printFeature(enabled: boolean, label: string): void {\n const icon = enabled ? `${green}\u2713${reset}` : `${dim}\u2717${reset}`;\n const text = enabled ? label : `${dim}${label}${reset}`;\n console.log(` ${icon} ${text}`);\n}\n\n/**\n * Interactive arrow-key selection menu.\n * Temporarily pauses the readline interface to take over raw stdin,\n * then resumes it when done so subsequent prompts work normally.\n */\nexport async function arrowSelect<T>(\n rl: readline.Interface,\n label: string,\n options: Array<{ value: T; label: string; description: string }>,\n defaultIndex = 0,\n): Promise<T> {\n const CURSOR_UP = '\\x1b[A';\n const CURSOR_DOWN = '\\x1b[B';\n const CLEAR_LINE = '\\x1b[2K\\x1b[G';\n\n function descLineCount(desc: string): number {\n const termWidth = process.stdout.columns || 80;\n return Math.max(1, Math.ceil((desc.length + 4) / termWidth));\n }\n\n let selected = defaultIndex;\n let prevDescLines = descLineCount(options[defaultIndex]!.description);\n\n function render(first: boolean) {\n if (!first) {\n process.stdout.write(`\\x1b[${options.length + prevDescLines}A`);\n }\n for (let i = 0; i < options.length; i++) {\n const active = i === selected;\n const cursor = active ? `${green}${bold}\u276F${reset}` : ' ';\n const text = active ? `${bold}${options[i]!.label}${reset}` : `${dim}${options[i]!.label}${reset}`;\n process.stdout.write(`${CLEAR_LINE} ${cursor} ${text}\\n`);\n }\n const desc = options[selected]!.description;\n process.stdout.write(`${CLEAR_LINE} ${dim}${desc}${reset}\\n`);\n prevDescLines = descLineCount(desc);\n }\n\n return new Promise(resolve => {\n console.log(`\\n ${violet}${label}${reset}`);\n render(true);\n\n rl.pause();\n const stdin = process.stdin;\n const wasTTY = stdin.isTTY;\n if (wasTTY) stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n function onData(key: string) {\n if (key === CURSOR_UP || key === '\\x1b[A') {\n selected = (selected - 1 + options.length) % options.length;\n render(false);\n } else if (key === CURSOR_DOWN || key === '\\x1b[B') {\n selected = (selected + 1) % options.length;\n render(false);\n } else if (key === '\\r' || key === '\\n' || key === ' ') {\n stdin.removeListener('data', onData);\n if (wasTTY) stdin.setRawMode(false);\n stdin.pause();\n rl.resume();\n // Clear all rendered lines (options + desc + label + blank line before label)\n const totalLines = options.length + prevDescLines + 2;\n process.stdout.write(`\\x1b[${options.length + prevDescLines}A`); // go up to first option\n process.stdout.write(`\\x1b[1A`); // go up past label\n process.stdout.write(`\\x1b[1A`); // go up past blank line\n for (let i = 0; i < totalLines; i++) {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n process.stdout.write(`\\x1b[${totalLines}A`);\n process.stdout.write(`${CLEAR_LINE} ${green}${bold}\u2713${reset} ${label} ${green}${bold}${options[selected]!.label}${reset}\\n`);\n resolve(options[selected]!.value);\n } else if (key === '\\x03') {\n stdin.removeListener('data', onData);\n if (wasTTY) stdin.setRawMode(false);\n process.exit(1);\n }\n }\n\n stdin.on('data', onData);\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|