kirograph 0.27.0 → 0.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/commands/help.js +8 -3
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/hook.js +242 -0
- package/dist/bin/commands/hook.js.map +7 -0
- package/dist/bin/commands/init.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +8 -2
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/index.js +12 -4
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/kirograph.js +3 -1
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/hooks/import-prompt.js +75 -0
- package/dist/hooks/import-prompt.js.map +7 -0
- package/dist/hooks/manager.js +124 -0
- package/dist/hooks/manager.js.map +7 -0
- package/dist/hooks/prompt.js +296 -0
- package/dist/hooks/prompt.js.map +7 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/installer/config-prompt.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * KiroGraph Installer \u2014 configuration prompting\n */\n\nimport * as readline from 'readline';\nimport { KiroGraphConfig } from '../../config';\ntype CavemanMode = 'lite' | 'full' | 'ultra';\nimport { ask, askToggle, arrowSelect, printSection, printSeparator, dim, reset, violet } from './prompts';\nexport type ConfigPatch = Pick<KiroGraphConfig, 'enableEmbeddings' | 'useVecIndex' | 'semanticEngine' | 'turboquantMemDocs' | 'turboquantBits' | 'turbovecMemDocs' | 'turbovecBits' | 'typesenseDashboard' | 'qdrantDashboard' | 'extractDocstrings' | 'trackCallSites' | 'enableArchitecture' | 'cavemanMode' | 'shellCompressionLevel' | 'enableMemory' | 'enableWatchmen' | 'watchmenThreshold' | 'watchmenSynthesisMode' | 'watchmenLocalModel' | 'enableDocs' | 'docsContextLimit' | 'enableData' | 'dataContextLimit' | 'enableSecurity' | 'enablePatterns' | 'enableWiki' | 'wikiSynthesisMode' | 'wikiLocalModel' | 'enableCodeHealth' | 'enableAdvancedAnalysis' | 'enableAgentUtils'> & { embeddingModel?: string; embeddingDim?: number };\nexport type SemanticEngine = KiroGraphConfig['semanticEngine'];\n\nexport const DEFAULT_EMBEDDING_MODEL = 'nomic-ai/nomic-embed-text-v1.5';\n\n/** Well-known embedding models with their output dimensions. */\nconst PRESET_MODELS = [\n {\n value: 'nomic-ai/nomic-embed-text-v1.5',\n label: 'nomic-embed-text-v1.5',\n dim: 768,\n description: '768-dim \u00B7 ~130MB \u00B7 Best quality for code search (recommended)',\n },\n {\n value: 'onnx-community/embeddinggemma-300m-ONNX',\n label: 'embeddinggemma-300m',\n dim: 768,\n description: '768-dim \u00B7 ~300MB \u00B7 Google Gemma-based, multilingual, 2048-token context',\n },\n {\n value: 'Xenova/all-MiniLM-L6-v2',\n label: 'all-MiniLM-L6-v2',\n dim: 384,\n description: '384-dim \u00B7 ~23MB \u00B7 Fast and lightweight, lower accuracy',\n },\n {\n value: 'BAAI/bge-base-en-v1.5',\n label: 'bge-base-en-v1.5',\n dim: 768,\n description: '768-dim \u00B7 ~110MB \u00B7 Strong general-purpose alternative to nomic',\n },\n {\n value: '__other__',\n label: 'Other',\n dim: 768,\n description: 'Enter a custom HuggingFace model ID and embedding dimension',\n },\n] as const;\n\nexport async function promptConfigOptions(rl: readline.Interface): Promise<ConfigPatch> {\n // \u2500\u2500 Semantic Search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n printSection('\uD83D\uDD0D', 'Semantic Search');\n\n const enableEmbeddings = await askToggle(\n rl,\n 'Semantic embeddings (similarity search):',\n 'Enables natural-language code search via vector embeddings. A local model (~130MB) is downloaded on first use.',\n );\n\n const patch: ConfigPatch = { enableEmbeddings, useVecIndex: false, semanticEngine: 'cosine', turboquantMemDocs: false, turboquantBits: 3, turbovecMemDocs: false, turbovecBits: 4, typesenseDashboard: false, qdrantDashboard: false, extractDocstrings: false, trackCallSites: false, enableArchitecture: false, cavemanMode: 'off', shellCompressionLevel: 'normal', enableMemory: false, enableWatchmen: false, watchmenThreshold: 5, watchmenSynthesisMode: 'local', watchmenLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX', enableDocs: false, docsContextLimit: 0, enableData: false, dataContextLimit: 0, enableSecurity: false, enablePatterns: false, enableWiki: false, wikiSynthesisMode: 'agent', wikiLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX', enableCodeHealth: false, enableAdvancedAnalysis: false, enableAgentUtils: false };\n\n if (enableEmbeddings) {\n // \u2500\u2500 Model selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const modelChoice = await arrowSelect<string>(\n rl,\n 'Embedding model:',\n PRESET_MODELS.map(m => ({ value: m.value, label: m.label, description: m.description })),\n );\n\n let embeddingModel: string;\n let embeddingDim: number;\n\n if (modelChoice === '__other__') {\n console.log(`\\n ${dim}Enter a HuggingFace model ID in the format org/model-name.${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Model identifier:${reset} `)).trim();\n if (raw.includes('/')) { embeddingModel = raw; break; }\n console.log(` Expected a HuggingFace model ID in the format org/model-name (e.g. nomic-ai/nomic-embed-text-v1.5).`);\n }\n console.log(`\\n ${dim}Enter the embedding output dimension for this model (check the model card on HuggingFace).${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Embedding dimension (e.g. 768, 384):${reset} `)).trim();\n const n = parseInt(raw, 10);\n if (!isNaN(n) && n > 0) { embeddingDim = n; break; }\n console.log(` Expected a positive integer (e.g. 768, 384, 1536).`);\n }\n } else {\n const preset = PRESET_MODELS.find(m => m.value === modelChoice)!;\n embeddingModel = preset.value;\n embeddingDim = preset.dim;\n }\n\n patch.embeddingModel = embeddingModel;\n patch.embeddingDim = embeddingDim;\n\n // \u2500\u2500 Engine selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const semanticEngine = await arrowSelect<SemanticEngine>(rl, 'Vector search engine:', [\n { value: 'cosine', label: 'cosine', description: 'In-process cosine similarity. No extra deps. Best for small/medium projects.' },\n { value: 'turboquant', label: 'turboquant', description: 'ANN index, zero native deps. Compresses embeddings 20\u201330\u00D7 (Google TurboQuant). ANN without native binaries \u2014 ideal for CI, ARM, restricted envs. Optional: npm install turboquant-js.' },\n { value: 'turbovec', label: 'turbovec', description: 'ANN search via Rust/SIMD (napi-rs). Same TurboQuant algorithm but NEON on ARM and AVX-512BW on x86 \u2014 faster than turboquant-js at the cost of a one-time Rust build. Requires Rust toolchain. Build: cd native/turbovec-node && npm install && npm run build.' },\n { value: 'sqlite-vec', label: 'sqlite-vec', description: 'ANN index. Sub-linear search. Best for large codebases. Needs: better-sqlite3, sqlite-vec (native).' },\n { value: 'orama', label: 'orama', description: 'Hybrid search (full-text + vector). Pure JS. Needs: @orama/orama, @orama/plugin-data-persistence.' },\n { value: 'pglite', label: 'pglite', description: 'Hybrid search via PostgreSQL + pgvector. Exact results. Pure WASM. Needs: @electric-sql/pglite.' },\n { value: 'lancedb', label: 'lancedb', description: 'ANN search via LanceDB (Apache Lance columnar format). Pure JS. Needs: @lancedb/lancedb.' },\n { value: 'qdrant', label: 'qdrant', description: 'ANN search via Qdrant embedded binary (HNSW index, Cosine). Needs: qdrant-local.' },\n { value: 'typesense', label: 'typesense', description: 'ANN search via Typesense (auto-downloaded binary, HNSW, Cosine). Needs: typesense.' },\n ]);\n patch.semanticEngine = semanticEngine;\n patch.useVecIndex = semanticEngine === 'sqlite-vec';\n\n // TurboQuant for memory & docs: offer when cosine or turboquant is the code-node engine\n if (semanticEngine === 'cosine' || semanticEngine === 'turboquant') {\n patch.turboquantMemDocs = await askToggle(rl,\n 'TurboQuant for memory & docs search (optional):',\n 'Replaces the default linear cosine scan in memory observations and doc sections with a compressed ANN index \u2014 no native deps required. Most useful when you accumulate many observations or large doc sets (1 000+ entries).',\n false,\n );\n }\n\n // TurboVec bit width\n if (semanticEngine === 'turbovec') {\n patch.turbovecBits = await arrowSelect<number>(rl, 'TurboVec bits per coordinate:', [\n { value: 4, label: '4 bits (recommended)', description: 'Best quality, ~19\u00D7 compression vs raw Float32. Default.' },\n { value: 3, label: '3 bits', description: 'Balanced \u2014 ~25\u00D7 compression, slight quality drop.' },\n { value: 2, label: '2 bits', description: 'Highest compression (~38\u00D7), lowest accuracy.' },\n ]);\n patch.turbovecMemDocs = await askToggle(rl,\n 'TurboVec for memory & docs search (optional):',\n 'Replaces the default linear cosine scan in memory observations and doc sections with the TurboVec ANN index. Requires the addon to be built.',\n false,\n );\n }\n\n if (semanticEngine === 'typesense') {\n patch.typesenseDashboard = await askToggle(rl,\n 'Typesense dashboard:',\n 'Serves the Typesense Dashboard locally and opens it in your browser after indexing completes.',\n false,\n );\n }\n\n if (semanticEngine === 'qdrant') {\n patch.qdrantDashboard = await askToggle(rl,\n 'Qdrant dashboard:',\n 'Downloads the Qdrant Web UI (first time only) and opens it in your browser after indexing completes.',\n false,\n );\n }\n }\n\n // \u2500\u2500 Graph Features \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCCA', 'Graph Features');\n\n patch.extractDocstrings = await askToggle(rl,\n 'Docstring extraction:',\n 'Enriches symbol metadata and improves context quality. Slightly increases indexing time.',\n false,\n );\n\n patch.trackCallSites = await askToggle(rl,\n 'Call site tracking (caller/callee graph):',\n 'Enables kirograph_callers and kirograph_callees MCP tools. Increases index size.',\n false,\n );\n\n patch.enableArchitecture = await askToggle(rl,\n 'Architecture analysis (packages + layers):',\n 'Detects packages from manifests and architectural layers. Enables kirograph_architecture, kirograph_coupling, kirograph_package.',\n false,\n );\n\n if (patch.enableArchitecture) {\n patch.enableAdvancedAnalysis = await askToggle(rl,\n 'Advanced graph analysis (type hierarchies, flows, communities, refactor):',\n 'Enables kirograph_type_hierarchy, kirograph_flows, kirograph_communities, kirograph_refactor. Most useful alongside architecture analysis.',\n false,\n );\n }\n\n // \u2500\u2500 Graph Tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCCA', 'Graph Tools');\n\n patch.enableCodeHealth = await askToggle(rl,\n 'Code health tools (hotspots, dead code, change tracking):',\n 'Enables kirograph_hotspots, kirograph_surprising, kirograph_diff, kirograph_dead_code, kirograph_circular_deps.',\n false,\n );\n\n patch.enableAgentUtils = await askToggle(rl,\n 'Agent utilities (file caching, budget tracking):',\n 'Enables kirograph_read, kirograph_gain, kirograph_budget.',\n false,\n );\n\n // \u2500\u2500 Security \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDD12', 'Security');\n\n patch.enableSecurity = await askToggle(rl,\n 'Security analysis (vulnerability scanning + reachability):',\n 'Scans dependency manifests for known vulnerabilities and performs reachability analysis. Requires Architecture analysis (will be auto-enabled). Enables kirograph_security, kirograph_vulns, kirograph_sbom, kirograph_vex, kirograph_reachability MCP tools.',\n false,\n );\n\n if (patch.enableSecurity && !patch.enableArchitecture) {\n patch.enableArchitecture = true;\n console.log(' \u2139 Architecture analysis auto-enabled (required by Security module)');\n }\n\n // \u2500\u2500 Pattern Matching \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDD0D', 'Pattern Matching');\n\n patch.enablePatterns = await askToggle(rl,\n 'Precise SAST with ast-grep?',\n 'Runs AST structural pattern matching during indexing using @ast-grep/napi (~15MB native binding). Unlike heuristic symbol-name analysis, matches real code structure \u2014 precise SQL injection, path traversal, eval detection. Requires @ast-grep/napi (will be installed automatically if you answer yes).',\n false,\n );\n\n // \u2500\u2500 Documentation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCD6', 'Documentation');\n\n (patch as any).enableDocs = await askToggle(rl,\n 'Documentation indexing (section-level retrieval):',\n 'Indexes docs by heading structure. Enables kirograph_docs_toc, kirograph_docs_search, kirograph_docs_section, kirograph_docs_outline, kirograph_docs_refs.',\n false,\n );\n\n if ((patch as any).enableDocs) {\n const contextChoice = await arrowSelect<number>(rl, 'Include doc sections in kirograph_context results?', [\n { value: 0, label: '0 (disabled)', description: 'Docs stay separate \u2014 use kirograph_docs_* tools explicitly (recommended)' },\n { value: 3, label: '3 sections', description: 'Include up to 3 relevant doc sections in context results' },\n { value: 5, label: '5 sections', description: 'Include up to 5 relevant doc sections in context results' },\n { value: 10, label: '10 sections', description: 'Include up to 10 relevant doc sections in context results' },\n ]);\n (patch as any).docsContextLimit = contextChoice;\n }\n\n // \u2500\u2500 Data \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCCA', 'Data');\n\n (patch as any).enableData = await askToggle(rl,\n 'Tabular data indexing (CSV/TSV/JSONL/JSON/Excel/Parquet):',\n 'Indexes data files for structured querying. Enables kirograph_data_list, kirograph_data_describe, kirograph_data_query, kirograph_data_aggregate, kirograph_data_search.',\n false,\n );\n\n if ((patch as any).enableData) {\n (patch as any).dataInstallExcel = await askToggle(rl,\n 'Install Excel support (xlsx package)?',\n 'Required for .xlsx/.xls files. CSV/TSV/JSONL/JSON are always supported without extra deps.',\n false,\n );\n\n (patch as any).dataInstallParquet = await askToggle(rl,\n 'Install Parquet support (parquetjs-lite package)?',\n 'Required for .parquet files. CSV/TSV/JSONL/JSON are always supported without extra deps.',\n false,\n );\n\n (patch as any).dataInstallPdf = await askToggle(rl,\n 'Install PDF support (@firecrawl/pdf-inspector package)?',\n 'Required for .pdf files. Rust/NAPI binary \u2014 prebuilts for linux-x64 and macOS ARM64.',\n false,\n );\n\n const contextChoice = await arrowSelect<number>(rl, 'Include dataset schemas in kirograph_context results?', [\n { value: 0, label: '0 (disabled)', description: 'Data stays separate \u2014 use kirograph_data_* tools explicitly (recommended)' },\n { value: 2, label: '2 datasets', description: 'Include up to 2 relevant dataset schemas in context results' },\n { value: 5, label: '5 datasets', description: 'Include up to 5 relevant dataset schemas in context results' },\n ]);\n (patch as any).dataContextLimit = contextChoice;\n }\n\n // \u2500\u2500 Agent Behavior \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83E\uDD16', 'Agent Behavior');\n\n const cavemanChoice = await arrowSelect(rl, 'Communication style (caveman mode):', [\n { value: 'off', label: 'off', description: 'Normal responses \u2014 no compression' },\n { value: 'lite', label: 'lite', description: 'Compact, no filler, full sentences' },\n { value: 'full', label: 'full', description: 'Fragments, no articles, short synonyms' },\n { value: 'ultra', label: 'ultra', description: 'Max compression, abbreviations, \u2192 for causality' },\n ]);\n patch.cavemanMode = cavemanChoice as CavemanMode | 'off';\n\n const compressionChoice = await arrowSelect(rl, 'Shell compression (kirograph_exec):', [\n { value: 'off', label: 'off', description: 'Disables kirograph_exec entirely' },\n { value: 'normal', label: 'normal', description: 'Balanced: removes noise, keeps structure (recommended)' },\n { value: 'aggressive', label: 'aggressive', description: 'More compact: groups by category, limits output' },\n { value: 'ultra', label: 'ultra', description: 'Maximum compression: counts and summaries only' },\n ]);\n patch.shellCompressionLevel = compressionChoice as KiroGraphConfig['shellCompressionLevel'];\n if (compressionChoice === 'off') {\n console.log(' \u2139 kirograph_exec disabled (shell compression is off)');\n }\n\n // \u2500\u2500 Memory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83E\uDDE0', 'Memory');\n\n patch.enableMemory = await askToggle(rl,\n 'Persistent memory (cross-session observations):',\n 'Stores decisions, errors, and patterns across sessions. Compressed (if caveman is on), linked to code symbols, searchable via kirograph_mem_* tools. Zero LLM tokens on write.',\n false,\n );\n\n if (patch.enableMemory) {\n patch.enableWatchmen = await askToggle(rl,\n 'Watchmen (auto-synthesize workspace briefs from memory):',\n 'When enough observations accumulate (default: 5), synthesizes them into .kiro/steering/kirograph-watchmen.md, CLAUDE.md, AGENTS.md, or the equivalent for your tool.',\n false,\n );\n\n if (patch.enableWatchmen) {\n // \u2500\u2500 Synthesis mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const synthesisMode = await arrowSelect<KiroGraphConfig['watchmenSynthesisMode']>(\n rl,\n 'Watchmen synthesis mode:',\n [\n {\n value: 'local',\n label: 'Local model',\n description: 'Runs a local HuggingFace model via @huggingface/transformers. Zero API cost, no data leaves your machine. Model downloaded once to ~/.kirograph/models/. Works for all tools via runCommand hook.',\n },\n {\n value: 'agent',\n label: 'Active agent',\n description: '\u26A0 Kiro only. Uses the active Kiro agent to synthesize. Consumes API tokens/credits on every synthesis. Not supported for other tools.',\n },\n ],\n );\n patch.watchmenSynthesisMode = synthesisMode;\n\n if (synthesisMode === 'local') {\n // \u2500\u2500 Local model selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const LOCAL_MODELS = [\n {\n value: 'onnx-community/gemma-4-E4B-it-ONNX',\n label: 'Gemma 4 E4B (recommended)',\n description: '~3\u20134 GB \u00B7 Google DeepMind Gemma 4 \u00B7 4.5B params \u00B7 128K context \u00B7 Best quality \u00B7 Apache 2.0',\n },\n {\n value: 'onnx-community/Qwen2.5-1.5B-Instruct',\n label: 'Qwen2.5-1.5B',\n description: '~1.5 GB \u00B7 Lighter option if RAM is limited \u00B7 Acceptable quality',\n },\n {\n value: 'HuggingFaceTB/SmolLM2-1.7B-Instruct',\n label: 'SmolLM2-1.7B',\n description: '~1.7 GB \u00B7 HuggingFace compact model \u00B7 Good at following structured formats',\n },\n {\n value: '__other__',\n label: 'Other',\n description: 'Enter a custom HuggingFace model ID (must have ONNX weights on onnx-community)',\n },\n ] as const;\n\n const modelChoice = await arrowSelect<string>(rl, 'Local synthesis model:', LOCAL_MODELS.map(m => ({ value: m.value, label: m.label, description: m.description })));\n\n if (modelChoice === '__other__') {\n console.log(`\\n ${dim}Enter a HuggingFace model ID (e.g. onnx-community/gemma-4-E4B-it-ONNX).${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Model identifier:${reset} `)).trim();\n if (raw.includes('/')) { patch.watchmenLocalModel = raw; break; }\n console.log(` Expected a HuggingFace model ID in the format org/model-name.`);\n }\n } else {\n patch.watchmenLocalModel = modelChoice;\n }\n }\n }\n }\n\n // \u2500\u2500 Wiki \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCD6', 'Wiki');\n\n patch.enableWiki = await askToggle(rl,\n 'LLM Wiki (Karpathy-style structured knowledge base):',\n 'Maintains a set of markdown pages that compound knowledge across sessions. Supports search, ingest (two-tool flow), conflict resolution, and health checks via kirograph_wiki_* tools.',\n false,\n );\n\n if (patch.enableWiki) {\n const wikiMode = await arrowSelect<KiroGraphConfig['wikiSynthesisMode']>(\n rl,\n 'Wiki synthesis mode:',\n [\n {\n value: 'agent',\n label: 'Active agent (recommended)',\n description: 'Uses the active LLM agent to generate WIKI_DIFF blocks. Works with any AI tool. Consumes API tokens on ingest.',\n },\n {\n value: 'local',\n label: 'Local model',\n description: 'Runs a local HuggingFace model to generate diffs. Zero API cost, no data leaves your machine. Same infra as Watchmen.',\n },\n ],\n );\n patch.wikiSynthesisMode = wikiMode;\n\n if (wikiMode === 'local') {\n // \u2500\u2500 Local model selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const WIKI_LOCAL_MODELS = [\n {\n value: 'onnx-community/gemma-4-E4B-it-ONNX',\n label: 'Gemma 4 E4B (recommended)',\n description: '~3\u20134 GB \u00B7 Google DeepMind Gemma 4 \u00B7 4.5B params \u00B7 128K context \u00B7 Best quality \u00B7 Apache 2.0',\n },\n {\n value: 'onnx-community/Qwen2.5-1.5B-Instruct',\n label: 'Qwen2.5-1.5B',\n description: '~1.5 GB \u00B7 Lighter option if RAM is limited \u00B7 Acceptable quality',\n },\n {\n value: 'HuggingFaceTB/SmolLM2-1.7B-Instruct',\n label: 'SmolLM2-1.7B',\n description: '~1.7 GB \u00B7 HuggingFace compact model \u00B7 Good at following structured formats',\n },\n {\n value: '__other__',\n label: 'Other',\n description: 'Enter a custom HuggingFace model ID (must have ONNX weights on onnx-community)',\n },\n ] as const;\n\n const wikiModelChoice = await arrowSelect<string>(rl, 'Local wiki synthesis model:', WIKI_LOCAL_MODELS.map(m => ({ value: m.value, label: m.label, description: m.description })));\n\n if (wikiModelChoice === '__other__') {\n console.log(`\\n ${dim}Enter a HuggingFace model ID (e.g. onnx-community/gemma-4-E4B-it-ONNX).${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Model identifier:${reset} `)).trim();\n if (raw.includes('/')) { patch.wikiLocalModel = raw; break; }\n console.log(` Expected a HuggingFace model ID in the format org/model-name.`);\n }\n } else {\n patch.wikiLocalModel = wikiModelChoice;\n }\n }\n }\n\n return patch;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,qBAA8F;
|
|
4
|
+
"sourcesContent": ["/**\n * KiroGraph Installer \u2014 configuration prompting\n */\n\nimport * as readline from 'readline';\nimport { KiroGraphConfig } from '../../config';\ntype CavemanMode = 'lite' | 'full' | 'ultra';\nimport { ask, askToggle, arrowSelect, printSection, printSeparator, dim, reset, violet } from './prompts';\nimport { promptImportGlobalHookSelection } from '../../hooks/import-prompt';\n\nexport interface PromptConfigOptions {\n projectRoot?: string;\n offerHookImport?: boolean;\n}\nexport type ConfigPatch = Pick<KiroGraphConfig, 'enableEmbeddings' | 'useVecIndex' | 'semanticEngine' | 'turboquantMemDocs' | 'turboquantBits' | 'turbovecMemDocs' | 'turbovecBits' | 'typesenseDashboard' | 'qdrantDashboard' | 'extractDocstrings' | 'trackCallSites' | 'enableArchitecture' | 'cavemanMode' | 'shellCompressionLevel' | 'enableMemory' | 'enableWatchmen' | 'watchmenThreshold' | 'watchmenSynthesisMode' | 'watchmenLocalModel' | 'enableDocs' | 'docsContextLimit' | 'enableData' | 'dataContextLimit' | 'enableSecurity' | 'enablePatterns' | 'enableWiki' | 'wikiSynthesisMode' | 'wikiLocalModel' | 'enableCodeHealth' | 'enableAdvancedAnalysis' | 'enableAgentUtils'> & { embeddingModel?: string; embeddingDim?: number };\nexport type SemanticEngine = KiroGraphConfig['semanticEngine'];\n\nexport const DEFAULT_EMBEDDING_MODEL = 'nomic-ai/nomic-embed-text-v1.5';\n\n/** Well-known embedding models with their output dimensions. */\nconst PRESET_MODELS = [\n {\n value: 'nomic-ai/nomic-embed-text-v1.5',\n label: 'nomic-embed-text-v1.5',\n dim: 768,\n description: '768-dim \u00B7 ~130MB \u00B7 Best quality for code search (recommended)',\n },\n {\n value: 'onnx-community/embeddinggemma-300m-ONNX',\n label: 'embeddinggemma-300m',\n dim: 768,\n description: '768-dim \u00B7 ~300MB \u00B7 Google Gemma-based, multilingual, 2048-token context',\n },\n {\n value: 'Xenova/all-MiniLM-L6-v2',\n label: 'all-MiniLM-L6-v2',\n dim: 384,\n description: '384-dim \u00B7 ~23MB \u00B7 Fast and lightweight, lower accuracy',\n },\n {\n value: 'BAAI/bge-base-en-v1.5',\n label: 'bge-base-en-v1.5',\n dim: 768,\n description: '768-dim \u00B7 ~110MB \u00B7 Strong general-purpose alternative to nomic',\n },\n {\n value: '__other__',\n label: 'Other',\n dim: 768,\n description: 'Enter a custom HuggingFace model ID and embedding dimension',\n },\n] as const;\n\nexport async function promptConfigOptions(\n rl: readline.Interface,\n opts: PromptConfigOptions = {},\n): Promise<{ patch: ConfigPatch; hooksToImport: string[] | null }> {\n // \u2500\u2500 Semantic Search \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n printSection('\uD83D\uDD0D', 'Semantic Search');\n\n const enableEmbeddings = await askToggle(\n rl,\n 'Semantic embeddings (similarity search):',\n 'Enables natural-language code search via vector embeddings. A local model (~130MB) is downloaded on first use.',\n );\n\n const patch: ConfigPatch = { enableEmbeddings, useVecIndex: false, semanticEngine: 'cosine', turboquantMemDocs: false, turboquantBits: 3, turbovecMemDocs: false, turbovecBits: 4, typesenseDashboard: false, qdrantDashboard: false, extractDocstrings: false, trackCallSites: false, enableArchitecture: false, cavemanMode: 'off', shellCompressionLevel: 'normal', enableMemory: false, enableWatchmen: false, watchmenThreshold: 5, watchmenSynthesisMode: 'local', watchmenLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX', enableDocs: false, docsContextLimit: 0, enableData: false, dataContextLimit: 0, enableSecurity: false, enablePatterns: false, enableWiki: false, wikiSynthesisMode: 'agent', wikiLocalModel: 'onnx-community/gemma-4-E4B-it-ONNX', enableCodeHealth: false, enableAdvancedAnalysis: false, enableAgentUtils: false };\n\n if (enableEmbeddings) {\n // \u2500\u2500 Model selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const modelChoice = await arrowSelect<string>(\n rl,\n 'Embedding model:',\n PRESET_MODELS.map(m => ({ value: m.value, label: m.label, description: m.description })),\n );\n\n let embeddingModel: string;\n let embeddingDim: number;\n\n if (modelChoice === '__other__') {\n console.log(`\\n ${dim}Enter a HuggingFace model ID in the format org/model-name.${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Model identifier:${reset} `)).trim();\n if (raw.includes('/')) { embeddingModel = raw; break; }\n console.log(` Expected a HuggingFace model ID in the format org/model-name (e.g. nomic-ai/nomic-embed-text-v1.5).`);\n }\n console.log(`\\n ${dim}Enter the embedding output dimension for this model (check the model card on HuggingFace).${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Embedding dimension (e.g. 768, 384):${reset} `)).trim();\n const n = parseInt(raw, 10);\n if (!isNaN(n) && n > 0) { embeddingDim = n; break; }\n console.log(` Expected a positive integer (e.g. 768, 384, 1536).`);\n }\n } else {\n const preset = PRESET_MODELS.find(m => m.value === modelChoice)!;\n embeddingModel = preset.value;\n embeddingDim = preset.dim;\n }\n\n patch.embeddingModel = embeddingModel;\n patch.embeddingDim = embeddingDim;\n\n // \u2500\u2500 Engine selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const semanticEngine = await arrowSelect<SemanticEngine>(rl, 'Vector search engine:', [\n { value: 'cosine', label: 'cosine', description: 'In-process cosine similarity. No extra deps. Best for small/medium projects.' },\n { value: 'turboquant', label: 'turboquant', description: 'ANN index, zero native deps. Compresses embeddings 20\u201330\u00D7 (Google TurboQuant). ANN without native binaries \u2014 ideal for CI, ARM, restricted envs. Optional: npm install turboquant-js.' },\n { value: 'turbovec', label: 'turbovec', description: 'ANN search via Rust/SIMD (napi-rs). Same TurboQuant algorithm but NEON on ARM and AVX-512BW on x86 \u2014 faster than turboquant-js at the cost of a one-time Rust build. Requires Rust toolchain. Build: cd native/turbovec-node && npm install && npm run build.' },\n { value: 'sqlite-vec', label: 'sqlite-vec', description: 'ANN index. Sub-linear search. Best for large codebases. Needs: better-sqlite3, sqlite-vec (native).' },\n { value: 'orama', label: 'orama', description: 'Hybrid search (full-text + vector). Pure JS. Needs: @orama/orama, @orama/plugin-data-persistence.' },\n { value: 'pglite', label: 'pglite', description: 'Hybrid search via PostgreSQL + pgvector. Exact results. Pure WASM. Needs: @electric-sql/pglite.' },\n { value: 'lancedb', label: 'lancedb', description: 'ANN search via LanceDB (Apache Lance columnar format). Pure JS. Needs: @lancedb/lancedb.' },\n { value: 'qdrant', label: 'qdrant', description: 'ANN search via Qdrant embedded binary (HNSW index, Cosine). Needs: qdrant-local.' },\n { value: 'typesense', label: 'typesense', description: 'ANN search via Typesense (auto-downloaded binary, HNSW, Cosine). Needs: typesense.' },\n ]);\n patch.semanticEngine = semanticEngine;\n patch.useVecIndex = semanticEngine === 'sqlite-vec';\n\n // TurboQuant for memory & docs: offer when cosine or turboquant is the code-node engine\n if (semanticEngine === 'cosine' || semanticEngine === 'turboquant') {\n patch.turboquantMemDocs = await askToggle(rl,\n 'TurboQuant for memory & docs search (optional):',\n 'Replaces the default linear cosine scan in memory observations and doc sections with a compressed ANN index \u2014 no native deps required. Most useful when you accumulate many observations or large doc sets (1 000+ entries).',\n false,\n );\n }\n\n // TurboVec bit width\n if (semanticEngine === 'turbovec') {\n patch.turbovecBits = await arrowSelect<number>(rl, 'TurboVec bits per coordinate:', [\n { value: 4, label: '4 bits (recommended)', description: 'Best quality, ~19\u00D7 compression vs raw Float32. Default.' },\n { value: 3, label: '3 bits', description: 'Balanced \u2014 ~25\u00D7 compression, slight quality drop.' },\n { value: 2, label: '2 bits', description: 'Highest compression (~38\u00D7), lowest accuracy.' },\n ]);\n patch.turbovecMemDocs = await askToggle(rl,\n 'TurboVec for memory & docs search (optional):',\n 'Replaces the default linear cosine scan in memory observations and doc sections with the TurboVec ANN index. Requires the addon to be built.',\n false,\n );\n }\n\n if (semanticEngine === 'typesense') {\n patch.typesenseDashboard = await askToggle(rl,\n 'Typesense dashboard:',\n 'Serves the Typesense Dashboard locally and opens it in your browser after indexing completes.',\n false,\n );\n }\n\n if (semanticEngine === 'qdrant') {\n patch.qdrantDashboard = await askToggle(rl,\n 'Qdrant dashboard:',\n 'Downloads the Qdrant Web UI (first time only) and opens it in your browser after indexing completes.',\n false,\n );\n }\n }\n\n // \u2500\u2500 Graph Features \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCCA', 'Graph Features');\n\n patch.extractDocstrings = await askToggle(rl,\n 'Docstring extraction:',\n 'Enriches symbol metadata and improves context quality. Slightly increases indexing time.',\n false,\n );\n\n patch.trackCallSites = await askToggle(rl,\n 'Call site tracking (caller/callee graph):',\n 'Enables kirograph_callers and kirograph_callees MCP tools. Increases index size.',\n false,\n );\n\n patch.enableArchitecture = await askToggle(rl,\n 'Architecture analysis (packages + layers):',\n 'Detects packages from manifests and architectural layers. Enables kirograph_architecture, kirograph_coupling, kirograph_package.',\n false,\n );\n\n if (patch.enableArchitecture) {\n patch.enableAdvancedAnalysis = await askToggle(rl,\n 'Advanced graph analysis (type hierarchies, flows, communities, refactor):',\n 'Enables kirograph_type_hierarchy, kirograph_flows, kirograph_communities, kirograph_refactor. Most useful alongside architecture analysis.',\n false,\n );\n }\n\n // \u2500\u2500 Graph Tools \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCCA', 'Graph Tools');\n\n patch.enableCodeHealth = await askToggle(rl,\n 'Code health tools (hotspots, dead code, change tracking):',\n 'Enables kirograph_hotspots, kirograph_surprising, kirograph_diff, kirograph_dead_code, kirograph_circular_deps.',\n false,\n );\n\n patch.enableAgentUtils = await askToggle(rl,\n 'Agent utilities (file caching, budget tracking):',\n 'Enables kirograph_read, kirograph_gain, kirograph_budget.',\n false,\n );\n\n // \u2500\u2500 Security \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDD12', 'Security');\n\n patch.enableSecurity = await askToggle(rl,\n 'Security analysis (vulnerability scanning + reachability):',\n 'Scans dependency manifests for known vulnerabilities and performs reachability analysis. Requires Architecture analysis (will be auto-enabled). Enables kirograph_security, kirograph_vulns, kirograph_sbom, kirograph_vex, kirograph_reachability MCP tools.',\n false,\n );\n\n if (patch.enableSecurity && !patch.enableArchitecture) {\n patch.enableArchitecture = true;\n console.log(' \u2139 Architecture analysis auto-enabled (required by Security module)');\n }\n\n // \u2500\u2500 Pattern Matching \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDD0D', 'Pattern Matching');\n\n patch.enablePatterns = await askToggle(rl,\n 'Precise SAST with ast-grep?',\n 'Runs AST structural pattern matching during indexing using @ast-grep/napi (~15MB native binding). Unlike heuristic symbol-name analysis, matches real code structure \u2014 precise SQL injection, path traversal, eval detection. Requires @ast-grep/napi (will be installed automatically if you answer yes).',\n false,\n );\n\n // \u2500\u2500 Documentation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCD6', 'Documentation');\n\n (patch as any).enableDocs = await askToggle(rl,\n 'Documentation indexing (section-level retrieval):',\n 'Indexes docs by heading structure. Enables kirograph_docs_toc, kirograph_docs_search, kirograph_docs_section, kirograph_docs_outline, kirograph_docs_refs.',\n false,\n );\n\n if ((patch as any).enableDocs) {\n const contextChoice = await arrowSelect<number>(rl, 'Include doc sections in kirograph_context results?', [\n { value: 0, label: '0 (disabled)', description: 'Docs stay separate \u2014 use kirograph_docs_* tools explicitly (recommended)' },\n { value: 3, label: '3 sections', description: 'Include up to 3 relevant doc sections in context results' },\n { value: 5, label: '5 sections', description: 'Include up to 5 relevant doc sections in context results' },\n { value: 10, label: '10 sections', description: 'Include up to 10 relevant doc sections in context results' },\n ]);\n (patch as any).docsContextLimit = contextChoice;\n }\n\n // \u2500\u2500 Data \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCCA', 'Data');\n\n (patch as any).enableData = await askToggle(rl,\n 'Tabular data indexing (CSV/TSV/JSONL/JSON/Excel/Parquet):',\n 'Indexes data files for structured querying. Enables kirograph_data_list, kirograph_data_describe, kirograph_data_query, kirograph_data_aggregate, kirograph_data_search.',\n false,\n );\n\n if ((patch as any).enableData) {\n (patch as any).dataInstallExcel = await askToggle(rl,\n 'Install Excel support (xlsx package)?',\n 'Required for .xlsx/.xls files. CSV/TSV/JSONL/JSON are always supported without extra deps.',\n false,\n );\n\n (patch as any).dataInstallParquet = await askToggle(rl,\n 'Install Parquet support (parquetjs-lite package)?',\n 'Required for .parquet files. CSV/TSV/JSONL/JSON are always supported without extra deps.',\n false,\n );\n\n (patch as any).dataInstallPdf = await askToggle(rl,\n 'Install PDF support (@firecrawl/pdf-inspector package)?',\n 'Required for .pdf files. Rust/NAPI binary \u2014 prebuilts for linux-x64 and macOS ARM64.',\n false,\n );\n\n const contextChoice = await arrowSelect<number>(rl, 'Include dataset schemas in kirograph_context results?', [\n { value: 0, label: '0 (disabled)', description: 'Data stays separate \u2014 use kirograph_data_* tools explicitly (recommended)' },\n { value: 2, label: '2 datasets', description: 'Include up to 2 relevant dataset schemas in context results' },\n { value: 5, label: '5 datasets', description: 'Include up to 5 relevant dataset schemas in context results' },\n ]);\n (patch as any).dataContextLimit = contextChoice;\n }\n\n // \u2500\u2500 Agent Behavior \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83E\uDD16', 'Agent Behavior');\n\n const cavemanChoice = await arrowSelect(rl, 'Communication style (caveman mode):', [\n { value: 'off', label: 'off', description: 'Normal responses \u2014 no compression' },\n { value: 'lite', label: 'lite', description: 'Compact, no filler, full sentences' },\n { value: 'full', label: 'full', description: 'Fragments, no articles, short synonyms' },\n { value: 'ultra', label: 'ultra', description: 'Max compression, abbreviations, \u2192 for causality' },\n ]);\n patch.cavemanMode = cavemanChoice as CavemanMode | 'off';\n\n const compressionChoice = await arrowSelect(rl, 'Shell compression (kirograph_exec):', [\n { value: 'off', label: 'off', description: 'Disables kirograph_exec entirely' },\n { value: 'normal', label: 'normal', description: 'Balanced: removes noise, keeps structure (recommended)' },\n { value: 'aggressive', label: 'aggressive', description: 'More compact: groups by category, limits output' },\n { value: 'ultra', label: 'ultra', description: 'Maximum compression: counts and summaries only' },\n ]);\n patch.shellCompressionLevel = compressionChoice as KiroGraphConfig['shellCompressionLevel'];\n if (compressionChoice === 'off') {\n console.log(' \u2139 kirograph_exec disabled (shell compression is off)');\n }\n\n let hooksToImport: string[] | null = null;\n if (opts.offerHookImport && opts.projectRoot) {\n printSection('\uD83E\uDE9D', 'Hooks');\n hooksToImport = await promptImportGlobalHookSelection();\n }\n\n // \u2500\u2500 Memory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83E\uDDE0', 'Memory');\n\n patch.enableMemory = await askToggle(rl,\n 'Persistent memory (cross-session observations):',\n 'Stores decisions, errors, and patterns across sessions. Compressed (if caveman is on), linked to code symbols, searchable via kirograph_mem_* tools. Zero LLM tokens on write.',\n false,\n );\n\n if (patch.enableMemory) {\n patch.enableWatchmen = await askToggle(rl,\n 'Watchmen (auto-synthesize workspace briefs from memory):',\n 'When enough observations accumulate (default: 5), synthesizes them into .kiro/steering/kirograph-watchmen.md, CLAUDE.md, AGENTS.md, or the equivalent for your tool.',\n false,\n );\n\n if (patch.enableWatchmen) {\n // \u2500\u2500 Synthesis mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const synthesisMode = await arrowSelect<KiroGraphConfig['watchmenSynthesisMode']>(\n rl,\n 'Watchmen synthesis mode:',\n [\n {\n value: 'local',\n label: 'Local model',\n description: 'Runs a local HuggingFace model via @huggingface/transformers. Zero API cost, no data leaves your machine. Model downloaded once to ~/.kirograph/models/. Works for all tools via runCommand hook.',\n },\n {\n value: 'agent',\n label: 'Active agent',\n description: '\u26A0 Kiro only. Uses the active Kiro agent to synthesize. Consumes API tokens/credits on every synthesis. Not supported for other tools.',\n },\n ],\n );\n patch.watchmenSynthesisMode = synthesisMode;\n\n if (synthesisMode === 'local') {\n // \u2500\u2500 Local model selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const LOCAL_MODELS = [\n {\n value: 'onnx-community/gemma-4-E4B-it-ONNX',\n label: 'Gemma 4 E4B (recommended)',\n description: '~3\u20134 GB \u00B7 Google DeepMind Gemma 4 \u00B7 4.5B params \u00B7 128K context \u00B7 Best quality \u00B7 Apache 2.0',\n },\n {\n value: 'onnx-community/Qwen2.5-1.5B-Instruct',\n label: 'Qwen2.5-1.5B',\n description: '~1.5 GB \u00B7 Lighter option if RAM is limited \u00B7 Acceptable quality',\n },\n {\n value: 'HuggingFaceTB/SmolLM2-1.7B-Instruct',\n label: 'SmolLM2-1.7B',\n description: '~1.7 GB \u00B7 HuggingFace compact model \u00B7 Good at following structured formats',\n },\n {\n value: '__other__',\n label: 'Other',\n description: 'Enter a custom HuggingFace model ID (must have ONNX weights on onnx-community)',\n },\n ] as const;\n\n const modelChoice = await arrowSelect<string>(rl, 'Local synthesis model:', LOCAL_MODELS.map(m => ({ value: m.value, label: m.label, description: m.description })));\n\n if (modelChoice === '__other__') {\n console.log(`\\n ${dim}Enter a HuggingFace model ID (e.g. onnx-community/gemma-4-E4B-it-ONNX).${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Model identifier:${reset} `)).trim();\n if (raw.includes('/')) { patch.watchmenLocalModel = raw; break; }\n console.log(` Expected a HuggingFace model ID in the format org/model-name.`);\n }\n } else {\n patch.watchmenLocalModel = modelChoice;\n }\n }\n }\n }\n\n // \u2500\u2500 Wiki \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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 printSection('\uD83D\uDCD6', 'Wiki');\n\n patch.enableWiki = await askToggle(rl,\n 'LLM Wiki (Karpathy-style structured knowledge base):',\n 'Maintains a set of markdown pages that compound knowledge across sessions. Supports search, ingest (two-tool flow), conflict resolution, and health checks via kirograph_wiki_* tools.',\n false,\n );\n\n if (patch.enableWiki) {\n const wikiMode = await arrowSelect<KiroGraphConfig['wikiSynthesisMode']>(\n rl,\n 'Wiki synthesis mode:',\n [\n {\n value: 'agent',\n label: 'Active agent (recommended)',\n description: 'Uses the active LLM agent to generate WIKI_DIFF blocks. Works with any AI tool. Consumes API tokens on ingest.',\n },\n {\n value: 'local',\n label: 'Local model',\n description: 'Runs a local HuggingFace model to generate diffs. Zero API cost, no data leaves your machine. Same infra as Watchmen.',\n },\n ],\n );\n patch.wikiSynthesisMode = wikiMode;\n\n if (wikiMode === 'local') {\n // \u2500\u2500 Local model selection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const WIKI_LOCAL_MODELS = [\n {\n value: 'onnx-community/gemma-4-E4B-it-ONNX',\n label: 'Gemma 4 E4B (recommended)',\n description: '~3\u20134 GB \u00B7 Google DeepMind Gemma 4 \u00B7 4.5B params \u00B7 128K context \u00B7 Best quality \u00B7 Apache 2.0',\n },\n {\n value: 'onnx-community/Qwen2.5-1.5B-Instruct',\n label: 'Qwen2.5-1.5B',\n description: '~1.5 GB \u00B7 Lighter option if RAM is limited \u00B7 Acceptable quality',\n },\n {\n value: 'HuggingFaceTB/SmolLM2-1.7B-Instruct',\n label: 'SmolLM2-1.7B',\n description: '~1.7 GB \u00B7 HuggingFace compact model \u00B7 Good at following structured formats',\n },\n {\n value: '__other__',\n label: 'Other',\n description: 'Enter a custom HuggingFace model ID (must have ONNX weights on onnx-community)',\n },\n ] as const;\n\n const wikiModelChoice = await arrowSelect<string>(rl, 'Local wiki synthesis model:', WIKI_LOCAL_MODELS.map(m => ({ value: m.value, label: m.label, description: m.description })));\n\n if (wikiModelChoice === '__other__') {\n console.log(`\\n ${dim}Enter a HuggingFace model ID (e.g. onnx-community/gemma-4-E4B-it-ONNX).${reset}`);\n while (true) {\n const raw = (await ask(rl, ` ${violet}Model identifier:${reset} `)).trim();\n if (raw.includes('/')) { patch.wikiLocalModel = raw; break; }\n console.log(` Expected a HuggingFace model ID in the format org/model-name.`);\n }\n } else {\n patch.wikiLocalModel = wikiModelChoice;\n }\n }\n }\n\n return { patch, hooksToImport };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -44,6 +44,7 @@ var import_config_prompt = require("./config-prompt");
|
|
|
44
44
|
var import_dashboard = require("./dashboard");
|
|
45
45
|
var import_qdrant_dashboard = require("./qdrant-dashboard");
|
|
46
46
|
var import_targets = require("./targets");
|
|
47
|
+
var import_import_prompt = require("../../hooks/import-prompt");
|
|
47
48
|
function _findRustc() {
|
|
48
49
|
const inPath = (0, import_child_process.spawnSync)("rustc", ["--version"], { encoding: "utf8", shell: true });
|
|
49
50
|
if (inPath.status === 0) return "rustc";
|
|
@@ -146,6 +147,7 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
146
147
|
let shouldOfferIndex = false;
|
|
147
148
|
let typesenseDashboard = false;
|
|
148
149
|
let qdrantDashboard = false;
|
|
150
|
+
let hooksToImport = null;
|
|
149
151
|
try {
|
|
150
152
|
if (alreadyInitialized) {
|
|
151
153
|
const config = await (0, import_config.loadConfig)(cwd);
|
|
@@ -201,7 +203,12 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
201
203
|
console.log(` \u2022 enablePatterns: ${enablePatterns}`);
|
|
202
204
|
} else {
|
|
203
205
|
shouldOfferIndex = true;
|
|
204
|
-
const
|
|
206
|
+
const promptResult = await (0, import_config_prompt.promptConfigOptions)(rl, {
|
|
207
|
+
projectRoot: cwd,
|
|
208
|
+
offerHookImport: target === "kiro" && !opts.yes
|
|
209
|
+
});
|
|
210
|
+
const patch = promptResult.patch;
|
|
211
|
+
hooksToImport = promptResult.hooksToImport;
|
|
205
212
|
await (0, import_config.updateConfig)(cwd, patch);
|
|
206
213
|
cavemanMode = patch.cavemanMode ?? "off";
|
|
207
214
|
shellCompressionLevel = patch.shellCompressionLevel ?? "normal";
|
|
@@ -392,6 +399,9 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
392
399
|
}
|
|
393
400
|
}
|
|
394
401
|
installer.installLate(cwd, cavemanMode, shellCompressionLevel, enableMemory, enableDocs, enableData, enableSecurity, enableArchitecture, enablePatterns, enableWatchmen, watchmenSynthesisMode, enableWiki, wikiSynthesisMode, wikiLocalModel, enableCodeHealth, enableAdvancedAnalysis, enableAgentUtils, trackCallSites, kiroHookFormat);
|
|
402
|
+
if (target === "kiro" && hooksToImport && hooksToImport.length > 0) {
|
|
403
|
+
(0, import_import_prompt.applyImportedGlobalHooks)(cwd, hooksToImport);
|
|
404
|
+
}
|
|
395
405
|
} catch (err) {
|
|
396
406
|
const reason = err instanceof Error ? err.message : String(err);
|
|
397
407
|
console.error(`
|
|
@@ -458,9 +468,7 @@ async function runInstaller(target = "kiro", opts = {}) {
|
|
|
458
468
|
}
|
|
459
469
|
});
|
|
460
470
|
});
|
|
461
|
-
|
|
462
|
-
}
|
|
463
|
-
if (qdrantDashboard) {
|
|
471
|
+
} else if (qdrantDashboard) {
|
|
464
472
|
await (0, import_qdrant_dashboard.openQdrantDashboard)(cwd);
|
|
465
473
|
}
|
|
466
474
|
}
|
|
@@ -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, 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,eAA0B;AAC1B,SAAoB;AACpB,WAAsB;AACtB,2BAA0B;AAC1B,oBAAyC;AACzC,oBAA4B;AAC5B,sBAAoC;AACpC,gBAA2B;AAC3B,qBAA4C;AAC5C,2BAAoC;AACpC,uBAAuC;AACvC,8BAAoD;AAEpD,qBAAmC;AAGnC,SAAS,aAA4B;AAEnC,QAAM,aAAS,gCAAU,SAAS,CAAC,WAAW,GAAG,EAAE,UAAU,QAAQ,OAAO,KAAK,CAAC;AAClF,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,OAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI,eAAe;AAC5D,QAAM,aAAa,KAAK,KAAK,MAAM,UAAU,OAAO,OAAO;AAC3D,MAAI,GAAG,WAAW,UAAU,EAAG,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,wBAA8B;AACrC,QAAM,YAAY,KAAK,KAAK,WAAW,MAAM,MAAM,MAAM,UAAU,eAAe;AAClF,QAAM,WAAW,GAAG,WAAW,SAAS,KACtC,GAAG,YAAY,SAAS,EAAE,KAAK,OAAK,EAAE,WAAW,gBAAgB,KAAK,EAAE,SAAS,OAAO,CAAC;AAE3F,MAAI,UAAU;AACZ,YAAQ,IAAI,4CAAuC;AACnD;AAAA,EACF;AAGA,MAAI,QAAQ,WAAW;AACvB,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI;AAAA,qDAAwD;AACpE,UAAM,YAAY,QAAQ,aAAa;AACvC,QAAI,WAAW;AACb,cAAQ,KAAK,gEAA2D;AACxE,cAAQ,KAAK,mFAAmF;AAChG;AAAA,IACF;AACA,UAAM,aAAS;AAAA,MACb;AAAA,MACA,CAAC,MAAM,0FAA0F;AAAA,MACjG,EAAE,OAAO,WAAW,OAAO,MAAM;AAAA,IACnC;AACA,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,KAAK,0EAAqE;AAClF,cAAQ,KAAK,mEAAmE;AAChF;AAAA,IACF;AACA,YAAQ,WAAW;AACnB,QAAI,CAAC,OAAO;AACV,cAAQ,KAAK,+FAA0F;AACvG;AAAA,IACF;AACA,YAAQ,IAAI,gCAAuB,gCAAU,OAAO,CAAC,WAAW,GAAG,EAAE,UAAU,OAAO,CAAC,EAAE,QAAQ,KAAK,CAAC,EAAE;AAAA,EAC3G,OAAO;AACL,YAAQ,IAAI,sBAAa,gCAAU,OAAO,CAAC,WAAW,GAAG,EAAE,UAAU,OAAO,CAAC,EAAE,QAAQ,KAAK,CAAC,EAAE;AAAA,EACjG;AAGA,MAAI,CAAC,QAAQ,IAAI,MAAM,SAAS,QAAQ,GAAG;AACzC,UAAM,OAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI,eAAe;AAC5D,YAAQ,IAAI,OAAO,GAAG,KAAK,KAAK,MAAM,UAAU,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAAA,EAClF;AAEA,UAAQ,IAAI;AAAA,wDAA2D;AACvE,UAAQ,IAAI,+CAA+C;AAE3D,QAAM,iBAAa,gCAAU,OAAO,CAAC,SAAS,GAAG,EAAE,KAAK,WAAW,OAAO,WAAW,OAAO,KAAK,CAAC;AAClG,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,KAAK,qDAAgD;AAC7D;AAAA,EACF;AAEA,QAAM,YAAQ,gCAAU,OAAO,CAAC,OAAO,OAAO,GAAG,EAAE,KAAK,WAAW,OAAO,WAAW,OAAO,KAAK,CAAC;AAClG,MAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,oCAA+B;AAAA,EAC7C,OAAO;AACL,YAAQ,KAAK,+BAA0B,MAAM,MAAM,kBAAkB;AACrE,YAAQ,KAAK,6DAA6D;AAAA,EAC5E;AACF;AAEA,eAAsB,aAAa,SAAwB,QAAQ,OAA0B,CAAC,GAAkB;AAC9G,iCAAY;AAEZ,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAEpF,MAAI;AACF,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,gBAAY,mCAAmB,MAAM;AAE3C,YAAQ,IAAI,gBAAgB,GAAG;AAAA,CAAI;AAEnC,YAAQ,IAAI;AAGZ,QAAI,iBAAqC;AACzC,QAAI,WAAW,QAAQ;AACrB,uBAAiB,UAAM,4BAAgC,IAAI,4CAA4C;AAAA,QACrG,EAAE,OAAO,aAAa,OAAO,sBAAsB,aAAa,kDAAkD;AAAA,QAClH,EAAE,OAAO,MAAa,OAAO,iBAAsB,aAAa,oDAAoD;AAAA,MACtH,GAAG,CAAC;AAAA,IACN;AAEA,cAAU,aAAa,KAAK,cAAc;AAE1C,UAAM,qBAAqB,GAAG,WAAW,KAAK,KAAK,KAAK,YAAY,CAAC;AACrE,QAAI,cAAmC;AACvC,QAAI,wBAAmE;AACvE,QAAI,eAAe;AACnB,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,iBAAiB;AACrB,QAAI,iBAAiB;AACrB,QAAI,qBAAqB;AACzB,QAAI,iBAAiB;AACrB,QAAI,wBAA2C;AAC/C,QAAI,aAAa;AACjB,QAAI,oBAAuC;AAC3C,QAAI,iBAAiB;AACrB,QAAI,mBAAmB;AACvB,QAAI,yBAAyB;AAC7B,QAAI,mBAAmB;AACvB,QAAI,iBAAiB;AACrB,QAAI,mBAAmB;AACvB,QAAI,qBAAqB;AACzB,QAAI,kBAAkB;AAEtB,QAAI;AACF,UAAI,oBAAoB;AACtB,cAAM,SAAS,UAAM,0BAAW,GAAG;AACnC,sBAAc,OAAO,eAAe;AACpC,gCAAwB,OAAO,yBAAyB;AACxD,uBAAe,OAAO,gBAAgB;AACtC,qBAAa,OAAO,cAAc;AAClC,qBAAc,OAAe,cAAc;AAC3C,yBAAkB,OAAe,kBAAkB;AACnD,yBAAiB,OAAO,kBAAkB;AAC1C,gCAAwB,OAAO,yBAAyB;AACxD,yBAAkB,OAAe,kBAAkB;AACnD,6BAAqB,OAAO,sBAAsB;AAClD,qBAAa,OAAO,cAAc;AAClC,4BAAoB,OAAO,qBAAqB;AAChD,yBAAiB,OAAO,kBAAkB;AAC1C,2BAAmB,OAAO,oBAAoB;AAC9C,iCAAyB,OAAO,0BAA0B;AAC1D,2BAAmB,OAAO,oBAAoB;AAC9C,yBAAiB,OAAO,kBAAkB;AAC1C,gBAAQ,IAAI,+CAA0C,GAAG,cAAc;AACvE,gBAAQ,IAAI,4BAAuB,OAAO,cAAc,EAAE;AAC1D,gBAAQ,IAAI,8BAAyB,OAAO,gBAAgB,EAAE;AAC9D,YAAI,OAAO,oBAAoB,OAAO,mBAAmB,cAAc;AACrE,cAAI,cAAc;AAClB,cAAI;AAAE,oBAAQ,eAAe;AAAG,0BAAc;AAAA,UAAM,QAAQ;AAAA,UAAsB;AAClF,cAAI,CAAC,aAAa;AAChB,oBAAQ,IAAI;AAAA,wCAA2C;AACvD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,eAAe,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAC/F,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,kCAA6B;AAAA,YAC3C,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,+BAA+B;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO,oBAAoB,OAAO,mBAAmB,YAAY;AACnE,gCAAsB;AAAA,QACxB;AACA,gBAAQ,IAAI,gCAA2B,OAAO,kBAAkB,EAAE;AAClE,gBAAQ,IAAI,yBAAoB,WAAW,EAAE;AAC7C,gBAAQ,IAAI,mCAA8B,qBAAqB,EAAE;AACjE,gBAAQ,IAAI,0BAAqB,YAAY,EAAE;AAC/C,gBAAQ,IAAI,wBAAmB,UAAU,EAAE;AAC3C,gBAAQ,IAAI,wBAAmB,UAAU,EAAE;AAC3C,gBAAQ,IAAI,4BAAuB,cAAc,EAAE;AACnD,gBAAQ,IAAI,4BAAuB,cAAc,EAAE;AAAA,MACrD,OAAO;AACL,2BAAmB;AACnB,cAAM,QAAQ,UAAM,0CAAoB,EAAE;AAC1C,kBAAM,4BAAa,KAAK,KAAK;AAC7B,sBAAc,MAAM,eAAe;AACnC,gCAAwB,MAAM,yBAAyB;AACvD,uBAAe,MAAM,gBAAgB;AACrC,qBAAa,MAAM,cAAc;AACjC,qBAAa,MAAM,cAAc;AACjC,yBAAiB,MAAM,kBAAkB;AACzC,yBAAiB,MAAM,kBAAkB;AACzC,6BAAqB,MAAM,sBAAsB;AACjD,yBAAiB,MAAM,kBAAkB;AACzC,gCAAwB,MAAM,yBAAyB;AACvD,qBAAa,MAAM,cAAc;AACjC,4BAAqB,MAAc,qBAAqB;AACxD,yBAAkB,MAAc,kBAAkB;AAClD,2BAAmB,MAAM,oBAAoB;AAC7C,iCAAyB,MAAM,0BAA0B;AACzD,2BAAmB,MAAM,oBAAoB;AAC7C,yBAAiB,MAAM,kBAAkB;AACzC,6BAAqB,MAAM;AAC3B,0BAAkB,MAAM;AAExB,gBAAQ,IAAI;AAAA,2BAA8B,GAAG,yBAAyB;AACtE,gBAAQ,IAAI,8BAAyB,MAAM,gBAAgB,EAAE;AAC7D,YAAI,oBAAoB,OAAO;AAC7B,kBAAQ,IAAI,4BAAuB,MAAM,cAAc,KAAK,aAAG,IAAI,MAAM,YAAY,QAAQ,eAAK,EAAE;AAAA,QACtG;AACA,YAAI,MAAM,kBAAkB;AAC1B,kBAAQ,IAAI,4BAAuB,MAAM,cAAc,EAAE;AACzD,cAAI,MAAM,mBAAmB,cAAc;AACzC,oBAAQ,IAAI;AAAA,wCAA2C;AACvD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,kBAAkB,YAAY,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAC9G,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,kDAA6C;AAAA,YAC3D,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,2CAA2C;AAAA,YAC1D;AAAA,UACF,WAAW,MAAM,mBAAmB,SAAS;AAC3C,oBAAQ,IAAI;AAAA,mCAAsC;AAClD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,gBAAgB,gCAAgC,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAChI,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,oEAA+D;AAAA,YAC7E,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,6DAA6D;AAAA,YAC5E;AAAA,UACF,WAAW,MAAM,mBAAmB,UAAU;AAC5C,oBAAQ,IAAI;AAAA,oCAAuC;AACnD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,sBAAsB,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AACtG,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,yCAAoC;AAAA,YAClD,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,sCAAsC;AAAA,YACrD;AAAA,UACF,WAAW,MAAM,mBAAmB,WAAW;AAC7C,oBAAQ,IAAI;AAAA,qCAAwC;AACpD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,kBAAkB,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAClG,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,qCAAgC;AAAA,YAC9C,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,kCAAkC;AAAA,YACjD;AAAA,UACF,WAAW,MAAM,mBAAmB,UAAU;AAC5C,oBAAQ,IAAI;AAAA,oCAAuC;AACnD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,cAAc,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAC9F,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,iCAA4B;AAAA,YAC1C,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,8BAA8B;AAAA,YAC7C;AAAA,UACF,WAAW,MAAM,mBAAmB,aAAa;AAC/C,oBAAQ,IAAI;AAAA,uCAA0C;AACtD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,WAAW,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAC3F,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,8BAAyB;AACrC,sBAAQ,IAAI,oFAA+E;AAAA,YAC7F,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,2BAA2B;AAAA,YAC1C;AAAA,UACF,WAAW,MAAM,mBAAmB,cAAc;AAChD,oBAAQ,IAAI;AAAA,wCAA2C;AACvD,kBAAM,aAAS,gCAAU,OAAO,CAAC,WAAW,eAAe,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAC/F,gBAAI,OAAO,WAAW,GAAG;AACvB,sBAAQ,IAAI,kCAA6B;AAAA,YAC3C,OAAO;AACL,sBAAQ,KAAK,qCAAgC,OAAO,MAAM,kBAAkB;AAC5E,sBAAQ,KAAK,+BAA+B;AAAA,YAC9C;AAAA,UACF,WAAW,MAAM,mBAAmB,YAAY;AAC9C,kCAAsB;AAAA,UACxB;AAAA,QACF;AACA,gBAAQ,IAAI,+BAA0B,MAAM,iBAAiB,EAAE;AAC/D,gBAAQ,IAAI,4BAAuB,MAAM,cAAc,EAAE;AACzD,gBAAQ,IAAI,gCAA2B,MAAM,kBAAkB,EAAE;AACjE,gBAAQ,IAAI,yBAAoB,WAAW,EAAE;AAC7C,gBAAQ,IAAI,mCAA8B,qBAAqB,EAAE;AACjE,gBAAQ,IAAI,0BAAqB,YAAY,EAAE;AAC/C,gBAAQ,IAAI,wBAAmB,UAAU,EAAE;AAC3C,gBAAQ,IAAI,wBAAmB,UAAU,EAAE;AAC3C,gBAAQ,IAAI,4BAAuB,cAAc,EAAE;AACnD,gBAAQ,IAAI,4BAAuB,cAAc,EAAE;AAGnD,YAAI,YAAY;AACd,cAAK,MAAc,kBAAkB;AACnC,oBAAQ,IAAI;AAAA,qBAAwB;AACpC,kBAAM,iBAAa,gCAAU,OAAO,CAAC,WAAW,MAAM,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAC1F,gBAAI,WAAW,WAAW,GAAG;AAC3B,sBAAQ,IAAI,yBAAoB;AAAA,YAClC,OAAO;AACL,sBAAQ,KAAK,6DAAwD;AAAA,YACvE;AAAA,UACF;AACA,cAAK,MAAc,oBAAoB;AACrC,oBAAQ,IAAI;AAAA,+BAAkC;AAC9C,kBAAM,eAAW,gCAAU,OAAO,CAAC,WAAW,gBAAgB,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAClG,gBAAI,SAAS,WAAW,GAAG;AACzB,sBAAQ,IAAI,mCAA8B;AAAA,YAC5C,OAAO;AACL,sBAAQ,KAAK,uEAAkE;AAAA,YACjF;AAAA,UACF;AACA,cAAK,MAAc,gBAAgB;AACjC,oBAAQ,IAAI;AAAA,yCAA4C;AACxD,kBAAM,gBAAY,gCAAU,OAAO,CAAC,WAAW,mBAAmB,0BAA0B,GAAG,EAAE,OAAO,WAAW,OAAO,KAAK,CAAC;AAChI,gBAAI,UAAU,WAAW,GAAG;AAC1B,sBAAQ,IAAI,6CAAwC;AAAA,YACtD,OAAO;AACL,sBAAQ,KAAK,iGAA4F;AAAA,YAC3G;AAAA,UACF;AAAA,QACF;AAEA,YAAI,gBAAgB;AAClB,kBAAQ,IAAI;AAAA,+BAAkC;AAC9C,gBAAM,oBAAgB,gCAAU,OAAO,CAAC,WAAW,kBAAkB,iBAAiB,GAAG;AAAA,YACvF,OAAO;AAAA,YACP,OAAO;AAAA,UACT,CAAC;AACD,cAAI,cAAc,WAAW,GAAG;AAC9B,oBAAQ,IAAI,mCAA8B;AAK1C,kBAAM,eAAe;AAAA,cACnB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,kBAAM,iBAAa,gCAAU,OAAO,CAAC,WAAW,GAAG,cAAc,iBAAiB,GAAG;AAAA,cACnF,OAAO;AAAA,cACP,OAAO;AAAA,YACT,CAAC;AACD,gBAAI,WAAW,WAAW,GAAG;AAC3B,sBAAQ,IAAI,gDAA2C;AAAA,YACzD,OAAO;AACL,sBAAQ,KAAK,+FAA0F;AACvG,sBAAQ,KAAK,iCAAiC,aAAa,KAAK,GAAG,CAAC,EAAE;AAAA,YACxE;AAAA,UACF,OAAO;AACL,oBAAQ,KAAK,kFAA6E;AAC1F,oBAAQ,KAAK,gGAAgG;AAAA,UAC/G;AAAA,QACF;AAAA,MACF;AAEA,gBAAU,YAAY,KAAK,aAAa,uBAAuB,cAAc,YAAY,YAAY,gBAAgB,oBAAoB,gBAAgB,gBAAgB,uBAAuB,YAAY,mBAAmB,gBAAgB,kBAAkB,wBAAwB,kBAAkB,gBAAgB,cAAc;AAAA,IAC3U,SAAS,KAAK;AACZ,YAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,cAAQ,MAAM;AAAA,0CAAwC,MAAM,EAAE;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,iBAAiB;AACnB,gBAAM,wCAAe,GAAG;AAAA,IAC1B;AAGA,UAAM,UAAU,qBAAqB,KAAK,OAAO,UAAM,0BAAU,IAAI,0CAA0C,kHAAkH;AACjO,QAAI,SAAS;AACX,YAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAElF,YAAM,YAAY,oBAAI,IAA+C;AACrE,YAAM,gBAAgB,CAAC,MAAc,QAAgB,OAAe,SAAwB;AAC1F,cAAM,QAAQ,UAAU,IAAI,IAAI,KAAK,EAAE,QAAQ,GAAG,OAAO,EAAE;AAC3D,YAAI,QAAQ,EAAG,OAAM,QAAQ;AAC7B,cAAM,SAAS,OAAO,MAAM,QAAQ;AACpC,kBAAU,IAAI,MAAM,KAAK;AAGzB,cAAM,aAAa,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,QAAQ,CAAC;AACzE,cAAM,cAAc,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AAC/D,cAAM,aAAa,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC;AAC7D,cAAM,MAAM,aAAa,IAAI,KAAK,IAAK,cAAc,aAAc,KAAK,GAAG,IAAI;AAE/E,cAAM,SAAS,KAAK,MAAM,MAAM,CAAC;AACjC,cAAM,MAAM,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK,MAAM;AACvD,cAAM,MAAM,cAAc,OAAO,MAAM,QAAQ,CAAC;AAChD,cAAM,WAAW,aAAa,OAAO,MAAM,QAAQ,CAAC;AACpD,gBAAQ,OAAO,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,OAAO,QAAQ;AAAA,MAC9F;AAGA,YAAM,sBAAsB,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;AACpE,YAAM,eAAe,CAAC,UAAmB,SAA6B;AACpE,cAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAC5D,YAAI,IAAI,SAAS,gBAAgB,KAAK,IAAI,SAAS,qBAAqB,EAAG,QAAO;AAClF,eAAQ,oBAAqD,OAAO,GAAG,IAAI;AAAA,MAC7E;AACA,cAAQ,OAAO,QAAQ;AAEvB,UAAI;AACJ,UAAI;AACF,YAAI,CAAC,UAAU,cAAc,GAAG,GAAG;AACjC,kBAAQ,OAAO,MAAM,uCAAkC;AACvD,eAAK,MAAM,UAAU,KAAK,KAAK,QAAW,aAAa;AACvD,kBAAQ,OAAO,MAAM,IAAI;AACzB,kBAAQ,IAAI,8BAAyB;AAAA,QACvC,OAAO;AACL,eAAK,MAAM,UAAU,KAAK,KAAK,aAAa;AAC5C,cAAI,UAAU,OAAO,EAAG,SAAQ,OAAO,MAAM,IAAI;AAAA,QACnD;AAAA,MACF,UAAE;AACA,gBAAQ,OAAO,QAAQ;AAAA,MACzB;AACA,cAAQ,IAAI,eAAe;AAC3B,YAAM,SAAS,MAAM,GAAG,SAAS,EAAE,YAAY,oCAAoB,CAAC;AACpE,cAAQ,OAAO,MAAM,IAAI;AACzB,cAAQ,IAAI,oBAAe,OAAO,YAAY,WAAW,OAAO,YAAY,aAAa,OAAO,YAAY,QAAQ;AACpH,SAAG,MAAM;AAET,UAAI,oBAAoB;AACtB,cAAM,kBAAkB,UAAM,yCAAuB,GAAG;AACxD,gBAAQ,IAAI,KAAK,aAAG,uDAAuD,eAAK,EAAE;AAClF,cAAM,IAAI,QAAc,aAAW;AACjC,kBAAQ,GAAG,UAAU,MAAM;AACzB,gBAAI,iBAAiB;AACnB,8BAAgB,MAAM,MAAM,QAAQ,CAAC;AAAA,YACvC,OAAO;AACL,sBAAQ;AAAA,YACV;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AACD;AAAA,MACF;AAEA,UAAI,iBAAiB;AACnB,kBAAM,6CAAoB,GAAG;AAAA,MAC/B;AAAA,IACF;AAEA,cAAU,eAAe,GAAG;AAAA,EAC9B,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;",
|
|
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';\nimport { applyImportedGlobalHooks } from '../../hooks/import-prompt';\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 let hooksToImport: string[] | null = null;\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 promptResult = await promptConfigOptions(rl, {\n projectRoot: cwd,\n offerHookImport: target === 'kiro' && !opts.yes,\n });\n const patch = promptResult.patch;\n hooksToImport = promptResult.hooksToImport;\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 if (target === 'kiro' && hooksToImport && hooksToImport.length > 0) {\n applyImportedGlobalHooks(cwd, hooksToImport);\n }\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 } else 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
|
}
|
package/dist/bin/kirograph.js
CHANGED
|
@@ -57,6 +57,7 @@ var import_supply_chain = require("./commands/supply-chain");
|
|
|
57
57
|
var import_dep_confusion = require("./commands/dep-confusion");
|
|
58
58
|
var import_remediation = require("./commands/remediation");
|
|
59
59
|
var import_pattern = require("./commands/pattern");
|
|
60
|
+
var import_hook = require("./commands/hook");
|
|
60
61
|
var import_wiki = require("./commands/wiki");
|
|
61
62
|
process.on("uncaughtException", (err) => {
|
|
62
63
|
const msg = err?.message ?? String(err);
|
|
@@ -86,7 +87,7 @@ process.on("uncaughtException", (err) => {
|
|
|
86
87
|
process.exit(1);
|
|
87
88
|
});
|
|
88
89
|
const program = new import_commander.Command();
|
|
89
|
-
program.name("kirograph").description("Semantic code knowledge graph for Kiro").version("0.27.
|
|
90
|
+
program.name("kirograph").description("Semantic code knowledge graph for Kiro").version("0.27.1").addHelpCommand(true).hook("preAction", (thisCommand) => {
|
|
90
91
|
const name = thisCommand.name();
|
|
91
92
|
if (name === "init") (0, import_banner.printBanner)();
|
|
92
93
|
});
|
|
@@ -144,6 +145,7 @@ const securityCmd = (0, import_security.register)(program);
|
|
|
144
145
|
(0, import_dep_confusion.register)(program);
|
|
145
146
|
(0, import_remediation.register)(program);
|
|
146
147
|
(0, import_pattern.register)(program);
|
|
148
|
+
(0, import_hook.register)(program);
|
|
147
149
|
(0, import_wiki.register)(program);
|
|
148
150
|
program.command("help").description("Show interactive help").action(() => {
|
|
149
151
|
if (process.stdout.isTTY) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/bin/kirograph.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n/**\n * KiroGraph CLI\n */\n\nimport { Command } from 'commander';\nimport { printBanner } from './banner';\nimport { printColoredHelp, printInteractiveHelp, register as registerHelp } from './commands/help';\nimport { register as registerInit } from './commands/init';\nimport { register as registerUninit } from './commands/uninit';\nimport { register as registerIndex } from './commands/index';\nimport { register as registerSync } from './commands/sync';\nimport { register as registerStatus } from './commands/status';\nimport { register as registerQuery } from './commands/query';\nimport { register as registerFiles } from './commands/files';\nimport { register as registerContext } from './commands/context';\nimport { register as registerAffected } from './commands/affected';\nimport { register as registerMarkDirty } from './commands/mark-dirty';\nimport { register as registerSyncIfDirty } from './commands/sync-if-dirty';\nimport { register as registerUnlock } from './commands/unlock';\nimport { register as registerInstall } from './commands/install';\nimport { register as registerServe } from './commands/serve';\nimport { register as registerDashboard } from './commands/dashboard';\nimport { register as registerArchitecture } from './commands/architecture';\nimport { register as registerCoupling } from './commands/coupling';\nimport { register as registerPackage } from './commands/package';\nimport { register as registerCaveman } from './commands/caveman';\nimport { register as registerDeadCode } from './commands/dead-code';\nimport { register as registerHotspots } from './commands/hotspots';\nimport { register as registerSurprising } from './commands/surprising';\nimport { register as registerSnapshot } from './commands/snapshot';\nimport { register as registerPath } from './commands/path';\nimport { register as registerExport } from './commands/export';\nimport { register as registerGain } from './commands/gain';\nimport { register as registerCompression } from './commands/compression';\nimport { register as registerExec } from './commands/exec';\nimport { register as registerMemory } from './commands/memory';\nimport { register as registerDocs } from './commands/docs';\nimport { register as registerData } from './commands/data';\nimport { register as registerBenchmark } from './commands/benchmark';\nimport { register as registerFlows } from './commands/flows';\nimport { register as registerCommunities } from './commands/communities';\nimport { register as registerRefactor } from './commands/refactor';\nimport { register as registerRead } from './commands/read';\nimport { register as registerBudget } from './commands/budget';\nimport { register as registerSecurity } from './commands/security';\nimport { register as registerSbom } from './commands/sbom';\nimport { register as registerVex } from './commands/vex';\nimport { register as registerVulns } from './commands/vulns';\nimport { register as registerReachability } from './commands/reachability';\nimport { register as registerStaleness } from './commands/staleness';\nimport { register as registerLicenses } from './commands/licenses';\nimport { register as registerSecurityExport } from './commands/security-export';\nimport { register as registerVulnSuppress } from './commands/vuln-suppress';\nimport { register as registerAttackSurface } from './commands/attack-surface';\nimport { register as registerSecuritySecrets } from './commands/security-secrets';\nimport { register as registerSecurityFlows } from './commands/security-flows';\nimport { register as registerSecurityCiReport } from './commands/security-ci-report';\nimport { register as registerSupplyChain } from './commands/supply-chain';\nimport { register as registerDepConfusion } from './commands/dep-confusion';\nimport { register as registerRemediation } from './commands/remediation';\nimport { register as registerPattern } from './commands/pattern';\nimport { register as registerWiki } from './commands/wiki';\n\n// \u2500\u2500 Global error handler for WASM runtime crashes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// node-sqlite3-wasm calls process.abort() when it hits a fatal error (e.g.\n// database is locked by another process). This produces a raw \"Aborted()\"\n// message with no context. We intercept it here to print a clear explanation\n// before the process exits.\nprocess.on('uncaughtException', (err: Error) => {\n const msg = err?.message ?? String(err);\n const isWasmAbort = msg.includes('Aborted(') || msg.includes('RuntimeError') || (err as any)?.constructor?.name === 'RuntimeError';\n\n if (isWasmAbort) {\n process.stderr.write([\n '',\n ' \u2716 KiroGraph crashed: SQLite WASM runtime aborted.',\n '',\n ' Most likely cause: another process (e.g. the Kiro MCP server) is',\n ' holding the database open while indexing is running.',\n '',\n ' How to fix:',\n ' 1. Close Kiro IDE (or disable the kirograph MCP server) before indexing',\n ' 2. Run: kirograph unlock',\n ' 3. Then retry: kirograph index',\n '',\n ' If the problem persists, delete the lock manually:',\n ' del .kirograph\\\\kirograph.db.lock (Windows)',\n ' rm -rf .kirograph/kirograph.db.lock (macOS/Linux)',\n '',\n ].join('\\n'));\n process.exit(1);\n }\n\n // Not a WASM crash \u2014 re-throw as normal\n process.stderr.write(`Uncaught error: ${msg}\\n`);\n process.exit(1);\n});\n\ndeclare const __CLI_VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name('kirograph')\n .description('Semantic code knowledge graph for Kiro')\n .version(__CLI_VERSION__)\n .addHelpCommand(true)\n .hook('preAction', (thisCommand) => {\n const name = thisCommand.name();\n if (name === 'init') printBanner();\n });\n\nregisterInstall(program);\nregisterInit(program);\nregisterUninit(program);\nregisterIndex(program);\nregisterSync(program);\nregisterSyncIfDirty(program);\nregisterMarkDirty(program);\nregisterStatus(program);\nregisterQuery(program);\nregisterContext(program);\nregisterFiles(program);\nregisterAffected(program);\nregisterUnlock(program);\nregisterServe(program);\nregisterDashboard(program);\nregisterArchitecture(program);\nregisterCoupling(program);\nregisterPackage(program);\nregisterCaveman(program);\nregisterDeadCode(program);\nregisterHotspots(program);\nregisterSurprising(program);\nregisterSnapshot(program);\nregisterPath(program);\nregisterExport(program);\nregisterGain(program);\nregisterCompression(program);\nregisterExec(program);\nregisterMemory(program);\nregisterDocs(program);\nregisterData(program);\nregisterBenchmark(program);\nregisterFlows(program);\nregisterCommunities(program);\nregisterRefactor(program);\nregisterRead(program);\nregisterBudget(program);\nconst securityCmd = registerSecurity(program);\nregisterSbom(program);\nregisterVex(program);\nregisterVulns(program);\nregisterReachability(program);\nregisterStaleness(program);\nregisterLicenses(program);\nregisterSecurityExport(securityCmd);\nregisterSecuritySecrets(securityCmd);\nregisterSecurityFlows(securityCmd);\nregisterSecurityCiReport(securityCmd);\nregisterVulnSuppress(program);\nregisterAttackSurface(program);\nregisterSupplyChain(program);\nregisterDepConfusion(program);\nregisterRemediation(program);\nregisterPattern(program);\nregisterWiki(program);\n\n// Register the help command for `kirograph help`\nprogram\n .command('help')\n .description('Show interactive help')\n .action(() => {\n if (process.stdout.isTTY) {\n printInteractiveHelp();\n } else {\n printBanner();\n printColoredHelp();\n process.exit(0);\n }\n });\n\nregisterHelp(program);\n\n// Show interactive help when called with no arguments\nif (process.argv.length === 2) {\n if (process.stdout.isTTY) {\n printInteractiveHelp();\n } else {\n printBanner();\n printColoredHelp();\n process.exit(0);\n }\n} else if (process.argv.includes('--help') || process.argv.includes('-h')) {\n // Intercept --help before Commander to avoid process.exit\n if (process.stdout.isTTY) {\n printInteractiveHelp();\n } else {\n printBanner();\n printColoredHelp();\n process.exit(0);\n }\n} else {\n program.parse(process.argv);\n}\n"],
|
|
5
|
-
"mappings": ";;AAKA,uBAAwB;AACxB,oBAA4B;AAC5B,kBAAiF;AACjF,kBAAyC;AACzC,oBAA2C;AAC3C,sBAA0C;AAC1C,kBAAyC;AACzC,oBAA2C;AAC3C,mBAA0C;AAC1C,mBAA0C;AAC1C,qBAA4C;AAC5C,sBAA6C;AAC7C,wBAA8C;AAC9C,2BAAgD;AAChD,oBAA2C;AAC3C,qBAA4C;AAC5C,mBAA0C;AAC1C,uBAA8C;AAC9C,0BAAiD;AACjD,sBAA6C;AAC7C,qBAA4C;AAC5C,qBAA4C;AAC5C,uBAA6C;AAC7C,sBAA6C;AAC7C,wBAA+C;AAC/C,sBAA6C;AAC7C,kBAAyC;AACzC,oBAA2C;AAC3C,kBAAyC;AACzC,yBAAgD;AAChD,kBAAyC;AACzC,oBAA2C;AAC3C,kBAAyC;AACzC,kBAAyC;AACzC,uBAA8C;AAC9C,mBAA0C;AAC1C,yBAAgD;AAChD,sBAA6C;AAC7C,kBAAyC;AACzC,oBAA2C;AAC3C,sBAA6C;AAC7C,kBAAyC;AACzC,iBAAwC;AACxC,mBAA0C;AAC1C,0BAAiD;AACjD,uBAA8C;AAC9C,sBAA6C;AAC7C,6BAAmD;AACnD,2BAAiD;AACjD,4BAAkD;AAClD,8BAAoD;AACpD,4BAAkD;AAClD,gCAAqD;AACrD,0BAAgD;AAChD,2BAAiD;AACjD,yBAAgD;AAChD,qBAA4C;AAC5C,kBAAyC;AAQzC,QAAQ,GAAG,qBAAqB,CAAC,QAAe;AAC9C,QAAM,MAAM,KAAK,WAAW,OAAO,GAAG;AACtC,QAAM,cAAc,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,cAAc,KAAM,KAAa,aAAa,SAAS;AAEpH,MAAI,aAAa;AACf,YAAQ,OAAO,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI,CAAC;AACZ,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,UAAQ,OAAO,MAAM,mBAAmB,GAAG;AAAA,CAAI;AAC/C,UAAQ,KAAK,CAAC;AAChB,CAAC;AAID,MAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,WAAW,EAChB,YAAY,wCAAwC,EACpD,QAAQ,QAAe,EACvB,eAAe,IAAI,EACnB,KAAK,aAAa,CAAC,gBAAgB;AAClC,QAAM,OAAO,YAAY,KAAK;AAC9B,MAAI,SAAS,OAAQ,gCAAY;AACnC,CAAC;AAAA,IAEH,eAAAA,UAAgB,OAAO;AAAA,IACvB,YAAAC,UAAa,OAAO;AAAA,IACpB,cAAAC,UAAe,OAAO;AAAA,IACtB,gBAAAC,UAAc,OAAO;AAAA,IACrB,YAAAC,UAAa,OAAO;AAAA,IACpB,qBAAAC,UAAoB,OAAO;AAAA,IAC3B,kBAAAC,UAAkB,OAAO;AAAA,IACzB,cAAAC,UAAe,OAAO;AAAA,IACtB,aAAAC,UAAc,OAAO;AAAA,IACrB,eAAAC,UAAgB,OAAO;AAAA,IACvB,aAAAC,UAAc,OAAO;AAAA,IACrB,gBAAAC,UAAiB,OAAO;AAAA,IACxB,cAAAC,UAAe,OAAO;AAAA,IACtB,aAAAC,UAAc,OAAO;AAAA,IACrB,iBAAAC,UAAkB,OAAO;AAAA,IACzB,oBAAAC,UAAqB,OAAO;AAAA,IAC5B,gBAAAC,UAAiB,OAAO;AAAA,IACxB,eAAAC,UAAgB,OAAO;AAAA,IACvB,eAAAC,UAAgB,OAAO;AAAA,IACvB,iBAAAC,UAAiB,OAAO;AAAA,IACxB,gBAAAC,UAAiB,OAAO;AAAA,IACxB,kBAAAC,UAAmB,OAAO;AAAA,IAC1B,gBAAAC,UAAiB,OAAO;AAAA,IACxB,YAAAC,UAAa,OAAO;AAAA,IACpB,cAAAC,UAAe,OAAO;AAAA,IACtB,YAAAC,UAAa,OAAO;AAAA,IACpB,mBAAAC,UAAoB,OAAO;AAAA,IAC3B,YAAAC,UAAa,OAAO;AAAA,IACpB,cAAAC,UAAe,OAAO;AAAA,IACtB,YAAAC,UAAa,OAAO;AAAA,IACpB,YAAAC,UAAa,OAAO;AAAA,IACpB,iBAAAC,UAAkB,OAAO;AAAA,IACzB,aAAAC,UAAc,OAAO;AAAA,IACrB,mBAAAC,UAAoB,OAAO;AAAA,IAC3B,gBAAAC,UAAiB,OAAO;AAAA,IACxB,YAAAC,UAAa,OAAO;AAAA,IACpB,cAAAC,UAAe,OAAO;AACtB,MAAM,kBAAc,gBAAAC,UAAiB,OAAO;AAAA,IAC5C,YAAAC,UAAa,OAAO;AAAA,IACpB,WAAAC,UAAY,OAAO;AAAA,IACnB,aAAAC,UAAc,OAAO;AAAA,IACrB,oBAAAC,UAAqB,OAAO;AAAA,IAC5B,iBAAAC,UAAkB,OAAO;AAAA,IACzB,gBAAAC,UAAiB,OAAO;AAAA,IACxB,uBAAAC,UAAuB,WAAW;AAAA,IAClC,wBAAAC,UAAwB,WAAW;AAAA,IACnC,sBAAAC,UAAsB,WAAW;AAAA,IACjC,0BAAAC,UAAyB,WAAW;AAAA,IACpC,qBAAAC,UAAqB,OAAO;AAAA,IAC5B,sBAAAC,UAAsB,OAAO;AAAA,IAC7B,oBAAAC,UAAoB,OAAO;AAAA,IAC3B,qBAAAC,UAAqB,OAAO;AAAA,IAC5B,mBAAAC,UAAoB,OAAO;AAAA,IAC3B,eAAAC,UAAgB,OAAO;AAAA,IACvB,YAAAC,UAAa,OAAO;AAGpB,QACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,OAAO,MAAM;AACZ,MAAI,QAAQ,OAAO,OAAO;AACxB,0CAAqB;AAAA,EACvB,OAAO;AACL,mCAAY;AACZ,sCAAiB;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAAA,IAEH,YAAAC,UAAa,OAAO;AAGpB,IAAI,QAAQ,KAAK,WAAW,GAAG;AAC7B,MAAI,QAAQ,OAAO,OAAO;AACxB,0CAAqB;AAAA,EACvB,OAAO;AACL,mCAAY;AACZ,sCAAiB;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,WAAW,QAAQ,KAAK,SAAS,QAAQ,KAAK,QAAQ,KAAK,SAAS,IAAI,GAAG;AAEzE,MAAI,QAAQ,OAAO,OAAO;AACxB,0CAAqB;AAAA,EACvB,OAAO;AACL,mCAAY;AACZ,sCAAiB;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,OAAO;AACL,UAAQ,MAAM,QAAQ,IAAI;AAC5B;",
|
|
6
|
-
"names": ["registerInstall", "registerInit", "registerUninit", "registerIndex", "registerSync", "registerSyncIfDirty", "registerMarkDirty", "registerStatus", "registerQuery", "registerContext", "registerFiles", "registerAffected", "registerUnlock", "registerServe", "registerDashboard", "registerArchitecture", "registerCoupling", "registerPackage", "registerCaveman", "registerDeadCode", "registerHotspots", "registerSurprising", "registerSnapshot", "registerPath", "registerExport", "registerGain", "registerCompression", "registerExec", "registerMemory", "registerDocs", "registerData", "registerBenchmark", "registerFlows", "registerCommunities", "registerRefactor", "registerRead", "registerBudget", "registerSecurity", "registerSbom", "registerVex", "registerVulns", "registerReachability", "registerStaleness", "registerLicenses", "registerSecurityExport", "registerSecuritySecrets", "registerSecurityFlows", "registerSecurityCiReport", "registerVulnSuppress", "registerAttackSurface", "registerSupplyChain", "registerDepConfusion", "registerRemediation", "registerPattern", "registerWiki", "registerHelp"]
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * KiroGraph CLI\n */\n\nimport { Command } from 'commander';\nimport { printBanner } from './banner';\nimport { printColoredHelp, printInteractiveHelp, register as registerHelp } from './commands/help';\nimport { register as registerInit } from './commands/init';\nimport { register as registerUninit } from './commands/uninit';\nimport { register as registerIndex } from './commands/index';\nimport { register as registerSync } from './commands/sync';\nimport { register as registerStatus } from './commands/status';\nimport { register as registerQuery } from './commands/query';\nimport { register as registerFiles } from './commands/files';\nimport { register as registerContext } from './commands/context';\nimport { register as registerAffected } from './commands/affected';\nimport { register as registerMarkDirty } from './commands/mark-dirty';\nimport { register as registerSyncIfDirty } from './commands/sync-if-dirty';\nimport { register as registerUnlock } from './commands/unlock';\nimport { register as registerInstall } from './commands/install';\nimport { register as registerServe } from './commands/serve';\nimport { register as registerDashboard } from './commands/dashboard';\nimport { register as registerArchitecture } from './commands/architecture';\nimport { register as registerCoupling } from './commands/coupling';\nimport { register as registerPackage } from './commands/package';\nimport { register as registerCaveman } from './commands/caveman';\nimport { register as registerDeadCode } from './commands/dead-code';\nimport { register as registerHotspots } from './commands/hotspots';\nimport { register as registerSurprising } from './commands/surprising';\nimport { register as registerSnapshot } from './commands/snapshot';\nimport { register as registerPath } from './commands/path';\nimport { register as registerExport } from './commands/export';\nimport { register as registerGain } from './commands/gain';\nimport { register as registerCompression } from './commands/compression';\nimport { register as registerExec } from './commands/exec';\nimport { register as registerMemory } from './commands/memory';\nimport { register as registerDocs } from './commands/docs';\nimport { register as registerData } from './commands/data';\nimport { register as registerBenchmark } from './commands/benchmark';\nimport { register as registerFlows } from './commands/flows';\nimport { register as registerCommunities } from './commands/communities';\nimport { register as registerRefactor } from './commands/refactor';\nimport { register as registerRead } from './commands/read';\nimport { register as registerBudget } from './commands/budget';\nimport { register as registerSecurity } from './commands/security';\nimport { register as registerSbom } from './commands/sbom';\nimport { register as registerVex } from './commands/vex';\nimport { register as registerVulns } from './commands/vulns';\nimport { register as registerReachability } from './commands/reachability';\nimport { register as registerStaleness } from './commands/staleness';\nimport { register as registerLicenses } from './commands/licenses';\nimport { register as registerSecurityExport } from './commands/security-export';\nimport { register as registerVulnSuppress } from './commands/vuln-suppress';\nimport { register as registerAttackSurface } from './commands/attack-surface';\nimport { register as registerSecuritySecrets } from './commands/security-secrets';\nimport { register as registerSecurityFlows } from './commands/security-flows';\nimport { register as registerSecurityCiReport } from './commands/security-ci-report';\nimport { register as registerSupplyChain } from './commands/supply-chain';\nimport { register as registerDepConfusion } from './commands/dep-confusion';\nimport { register as registerRemediation } from './commands/remediation';\nimport { register as registerPattern } from './commands/pattern';\nimport { register as registerHook } from './commands/hook';\nimport { register as registerWiki } from './commands/wiki';\n\n// \u2500\u2500 Global error handler for WASM runtime crashes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// node-sqlite3-wasm calls process.abort() when it hits a fatal error (e.g.\n// database is locked by another process). This produces a raw \"Aborted()\"\n// message with no context. We intercept it here to print a clear explanation\n// before the process exits.\nprocess.on('uncaughtException', (err: Error) => {\n const msg = err?.message ?? String(err);\n const isWasmAbort = msg.includes('Aborted(') || msg.includes('RuntimeError') || (err as any)?.constructor?.name === 'RuntimeError';\n\n if (isWasmAbort) {\n process.stderr.write([\n '',\n ' \u2716 KiroGraph crashed: SQLite WASM runtime aborted.',\n '',\n ' Most likely cause: another process (e.g. the Kiro MCP server) is',\n ' holding the database open while indexing is running.',\n '',\n ' How to fix:',\n ' 1. Close Kiro IDE (or disable the kirograph MCP server) before indexing',\n ' 2. Run: kirograph unlock',\n ' 3. Then retry: kirograph index',\n '',\n ' If the problem persists, delete the lock manually:',\n ' del .kirograph\\\\kirograph.db.lock (Windows)',\n ' rm -rf .kirograph/kirograph.db.lock (macOS/Linux)',\n '',\n ].join('\\n'));\n process.exit(1);\n }\n\n // Not a WASM crash \u2014 re-throw as normal\n process.stderr.write(`Uncaught error: ${msg}\\n`);\n process.exit(1);\n});\n\ndeclare const __CLI_VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name('kirograph')\n .description('Semantic code knowledge graph for Kiro')\n .version(__CLI_VERSION__)\n .addHelpCommand(true)\n .hook('preAction', (thisCommand) => {\n const name = thisCommand.name();\n if (name === 'init') printBanner();\n });\n\nregisterInstall(program);\nregisterInit(program);\nregisterUninit(program);\nregisterIndex(program);\nregisterSync(program);\nregisterSyncIfDirty(program);\nregisterMarkDirty(program);\nregisterStatus(program);\nregisterQuery(program);\nregisterContext(program);\nregisterFiles(program);\nregisterAffected(program);\nregisterUnlock(program);\nregisterServe(program);\nregisterDashboard(program);\nregisterArchitecture(program);\nregisterCoupling(program);\nregisterPackage(program);\nregisterCaveman(program);\nregisterDeadCode(program);\nregisterHotspots(program);\nregisterSurprising(program);\nregisterSnapshot(program);\nregisterPath(program);\nregisterExport(program);\nregisterGain(program);\nregisterCompression(program);\nregisterExec(program);\nregisterMemory(program);\nregisterDocs(program);\nregisterData(program);\nregisterBenchmark(program);\nregisterFlows(program);\nregisterCommunities(program);\nregisterRefactor(program);\nregisterRead(program);\nregisterBudget(program);\nconst securityCmd = registerSecurity(program);\nregisterSbom(program);\nregisterVex(program);\nregisterVulns(program);\nregisterReachability(program);\nregisterStaleness(program);\nregisterLicenses(program);\nregisterSecurityExport(securityCmd);\nregisterSecuritySecrets(securityCmd);\nregisterSecurityFlows(securityCmd);\nregisterSecurityCiReport(securityCmd);\nregisterVulnSuppress(program);\nregisterAttackSurface(program);\nregisterSupplyChain(program);\nregisterDepConfusion(program);\nregisterRemediation(program);\nregisterPattern(program);\nregisterHook(program);\nregisterWiki(program);\n\n// Register the help command for `kirograph help`\nprogram\n .command('help')\n .description('Show interactive help')\n .action(() => {\n if (process.stdout.isTTY) {\n printInteractiveHelp();\n } else {\n printBanner();\n printColoredHelp();\n process.exit(0);\n }\n });\n\nregisterHelp(program);\n\n// Show interactive help when called with no arguments\nif (process.argv.length === 2) {\n if (process.stdout.isTTY) {\n printInteractiveHelp();\n } else {\n printBanner();\n printColoredHelp();\n process.exit(0);\n }\n} else if (process.argv.includes('--help') || process.argv.includes('-h')) {\n // Intercept --help before Commander to avoid process.exit\n if (process.stdout.isTTY) {\n printInteractiveHelp();\n } else {\n printBanner();\n printColoredHelp();\n process.exit(0);\n }\n} else {\n program.parse(process.argv);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["registerInstall", "registerInit", "registerUninit", "registerIndex", "registerSync", "registerSyncIfDirty", "registerMarkDirty", "registerStatus", "registerQuery", "registerContext", "registerFiles", "registerAffected", "registerUnlock", "registerServe", "registerDashboard", "registerArchitecture", "registerCoupling", "registerPackage", "registerCaveman", "registerDeadCode", "registerHotspots", "registerSurprising", "registerSnapshot", "registerPath", "registerExport", "registerGain", "registerCompression", "registerExec", "registerMemory", "registerDocs", "registerData", "registerBenchmark", "registerFlows", "registerCommunities", "registerRefactor", "registerRead", "registerBudget", "registerSecurity", "registerSbom", "registerVex", "registerVulns", "registerReachability", "registerStaleness", "registerLicenses", "registerSecurityExport", "registerSecuritySecrets", "registerSecurityFlows", "registerSecurityCiReport", "registerVulnSuppress", "registerAttackSurface", "registerSupplyChain", "registerDepConfusion", "registerRemediation", "registerPattern", "registerHook", "registerWiki", "registerHelp"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var import_prompt_exports = {};
|
|
20
|
+
__export(import_prompt_exports, {
|
|
21
|
+
applyImportedGlobalHooks: () => applyImportedGlobalHooks,
|
|
22
|
+
promptImportGlobalHookSelection: () => promptImportGlobalHookSelection
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(import_prompt_exports);
|
|
25
|
+
var import_manager = require("./manager");
|
|
26
|
+
var import_prompt = require("./prompt");
|
|
27
|
+
const green = "\x1B[32m";
|
|
28
|
+
const reset = "\x1B[0m";
|
|
29
|
+
async function promptImportGlobalHookSelection() {
|
|
30
|
+
let globalDir;
|
|
31
|
+
try {
|
|
32
|
+
globalDir = (0, import_manager.getGlobalHooksDir)();
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const globalHooks = (0, import_manager.listHooks)(globalDir);
|
|
37
|
+
if (globalHooks.length === 0) return null;
|
|
38
|
+
const choice = await (0, import_prompt.singleChoice)("Import global hooks?", [
|
|
39
|
+
{ label: "None", value: "none" },
|
|
40
|
+
{ label: "All", value: "all" },
|
|
41
|
+
{ label: "Select specific hooks", value: "select" }
|
|
42
|
+
]);
|
|
43
|
+
if (choice === "all") {
|
|
44
|
+
return globalHooks.map((h) => h.filename);
|
|
45
|
+
}
|
|
46
|
+
if (choice === "select") {
|
|
47
|
+
const options = globalHooks.map((h) => ({
|
|
48
|
+
label: h.displayName,
|
|
49
|
+
value: h.filename,
|
|
50
|
+
description: h.description
|
|
51
|
+
}));
|
|
52
|
+
const selected = await (0, import_prompt.multiSelect)("Select hooks to import:", options);
|
|
53
|
+
return selected.length > 0 ? selected : null;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function applyImportedGlobalHooks(projectRoot, filenames) {
|
|
58
|
+
if (filenames.length === 0) return;
|
|
59
|
+
const globalDir = (0, import_manager.getGlobalHooksDir)();
|
|
60
|
+
const globalHooks = (0, import_manager.listHooks)(globalDir);
|
|
61
|
+
const workspaceHooksDir = (0, import_manager.getWorkspaceHooksDir)(projectRoot);
|
|
62
|
+
(0, import_manager.ensureDir)(workspaceHooksDir);
|
|
63
|
+
const copied = (0, import_manager.copyHooks)(globalDir, workspaceHooksDir, filenames);
|
|
64
|
+
console.log(` ${green}\u2713${reset} Imported ${copied.length} hook${copied.length === 1 ? "" : "s"}:`);
|
|
65
|
+
for (const f of copied) {
|
|
66
|
+
const hook = globalHooks.find((h) => h.filename === f);
|
|
67
|
+
console.log(` ${hook?.displayName ?? f}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
71
|
+
0 && (module.exports = {
|
|
72
|
+
applyImportedGlobalHooks,
|
|
73
|
+
promptImportGlobalHookSelection
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=import-prompt.js.map
|