kirograph 0.12.2 → 0.13.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.
Files changed (92) hide show
  1. package/README.md +197 -87
  2. package/dist/architecture/layers/index.js +9 -1
  3. package/dist/architecture/layers/index.js.map +2 -2
  4. package/dist/architecture/layers/ocaml.js +105 -0
  5. package/dist/architecture/layers/ocaml.js.map +7 -0
  6. package/dist/architecture/layers/scala.js +120 -0
  7. package/dist/architecture/layers/scala.js.map +7 -0
  8. package/dist/architecture/layers/solidity.js +105 -0
  9. package/dist/architecture/layers/solidity.js.map +7 -0
  10. package/dist/architecture/layers/vue.js +111 -0
  11. package/dist/architecture/layers/vue.js.map +7 -0
  12. package/dist/architecture/manifest/elm.js +91 -0
  13. package/dist/architecture/manifest/elm.js.map +7 -0
  14. package/dist/architecture/manifest/index.js +13 -2
  15. package/dist/architecture/manifest/index.js.map +2 -2
  16. package/dist/architecture/manifest/ocaml.js +166 -0
  17. package/dist/architecture/manifest/ocaml.js.map +7 -0
  18. package/dist/architecture/manifest/scala.js +117 -0
  19. package/dist/architecture/manifest/scala.js.map +7 -0
  20. package/dist/bin/commands/caveman.js +12 -0
  21. package/dist/bin/commands/caveman.js.map +2 -2
  22. package/dist/bin/commands/help.js +6 -4
  23. package/dist/bin/commands/help.js.map +2 -2
  24. package/dist/bin/commands/install.js +8 -2
  25. package/dist/bin/commands/install.js.map +2 -2
  26. package/dist/bin/commands/serve.js +2 -2
  27. package/dist/bin/commands/serve.js.map +2 -2
  28. package/dist/bin/commands/uninit.js +65 -41
  29. package/dist/bin/commands/uninit.js.map +2 -2
  30. package/dist/bin/installer/cli-agent.js +5 -25
  31. package/dist/bin/installer/cli-agent.js.map +2 -2
  32. package/dist/bin/installer/common.js +154 -0
  33. package/dist/bin/installer/common.js.map +7 -0
  34. package/dist/bin/installer/hooks.js +21 -1
  35. package/dist/bin/installer/hooks.js.map +2 -2
  36. package/dist/bin/installer/index.js +99 -86
  37. package/dist/bin/installer/index.js.map +2 -2
  38. package/dist/bin/installer/instructions.js +60 -0
  39. package/dist/bin/installer/instructions.js.map +7 -0
  40. package/dist/bin/installer/mcp.js +6 -36
  41. package/dist/bin/installer/mcp.js.map +2 -2
  42. package/dist/bin/installer/targets/claude.js +79 -0
  43. package/dist/bin/installer/targets/claude.js.map +7 -0
  44. package/dist/bin/installer/targets/codex.js +77 -0
  45. package/dist/bin/installer/targets/codex.js.map +7 -0
  46. package/dist/bin/installer/targets/index.js +57 -0
  47. package/dist/bin/installer/targets/index.js.map +7 -0
  48. package/dist/bin/installer/targets/kiro.js +61 -0
  49. package/dist/bin/installer/targets/kiro.js.map +7 -0
  50. package/dist/bin/kirograph.js +1 -1
  51. package/dist/extraction/extractor.js +65 -2
  52. package/dist/extraction/extractor.js.map +2 -2
  53. package/dist/extraction/grammars.js +22 -0
  54. package/dist/extraction/grammars.js.map +2 -2
  55. package/dist/extraction/languages.js +39 -1
  56. package/dist/extraction/languages.js.map +2 -2
  57. package/dist/extraction/wasm/tree-sitter-hcl.wasm +0 -0
  58. package/dist/extraction/wasm/tree-sitter-scss.wasm +0 -0
  59. package/dist/frameworks/amplify.js +175 -0
  60. package/dist/frameworks/amplify.js.map +7 -0
  61. package/dist/frameworks/angular.js +132 -0
  62. package/dist/frameworks/angular.js.map +7 -0
  63. package/dist/frameworks/ansible.js +151 -0
  64. package/dist/frameworks/ansible.js.map +7 -0
  65. package/dist/frameworks/cloudformation.js +148 -0
  66. package/dist/frameworks/cloudformation.js.map +7 -0
  67. package/dist/frameworks/docker.js +149 -0
  68. package/dist/frameworks/docker.js.map +7 -0
  69. package/dist/frameworks/iac.js +401 -0
  70. package/dist/frameworks/iac.js.map +7 -0
  71. package/dist/frameworks/index.js +81 -3
  72. package/dist/frameworks/index.js.map +3 -3
  73. package/dist/frameworks/kubernetes.js +176 -0
  74. package/dist/frameworks/kubernetes.js.map +7 -0
  75. package/dist/frameworks/pulumi.js +93 -0
  76. package/dist/frameworks/pulumi.js.map +7 -0
  77. package/dist/frameworks/scala.js +124 -0
  78. package/dist/frameworks/scala.js.map +7 -0
  79. package/dist/frameworks/solidity.js +93 -0
  80. package/dist/frameworks/solidity.js.map +7 -0
  81. package/dist/frameworks/terraform.js +278 -0
  82. package/dist/frameworks/terraform.js.map +7 -0
  83. package/dist/frameworks/vue.js +163 -0
  84. package/dist/frameworks/vue.js.map +7 -0
  85. package/dist/graph/queries.js +1 -1
  86. package/dist/graph/queries.js.map +1 -1
  87. package/dist/mcp/tool-names.js +48 -0
  88. package/dist/mcp/tool-names.js.map +7 -0
  89. package/dist/mcp/tools.js +3 -0
  90. package/dist/mcp/tools.js.map +2 -2
  91. package/dist/types.js.map +2 -2
  92. package/package.json +2 -2
@@ -50,7 +50,27 @@ const FILE_PATTERNS = [
50
50
  "**/*.kt",
51
51
  "**/*.dart",
52
52
  "**/*.ex",
53
- "**/*.exs"
53
+ "**/*.exs",
54
+ "**/*.scala",
55
+ "**/*.sc",
56
+ "**/*.lua",
57
+ "**/*.zig",
58
+ "**/*.sh",
59
+ "**/*.bash",
60
+ "**/*.ml",
61
+ "**/*.mli",
62
+ "**/*.elm",
63
+ "**/*.sol",
64
+ "**/*.vue",
65
+ "**/*.m",
66
+ "**/*.yaml",
67
+ "**/*.yml",
68
+ "**/*.tf",
69
+ "**/*.tfvars",
70
+ "**/*.css",
71
+ "**/*.scss",
72
+ "**/*.sass",
73
+ "**/*.html"
54
74
  ];
55
75
  const HOOKS = [
56
76
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/installer/hooks.ts"],
4
- "sourcesContent": ["/**\n * KiroGraph Installer \u2014 Kiro hook file management\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { logWarn } from '../../errors';\n\n// \u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst FILE_PATTERNS = [\n '**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx',\n '**/*.py', '**/*.go', '**/*.rs', '**/*.java',\n '**/*.cs', '**/*.rb', '**/*.php', '**/*.swift',\n '**/*.kt', '**/*.dart',\n '**/*.ex', '**/*.exs',\n];\n\nconst HOOKS: Array<{ filename: string; hook: object }> = [\n {\n filename: 'kirograph-mark-dirty-on-save.json',\n hook: {\n name: 'KiroGraph Mark Dirty on Save',\n version: '1.0.0',\n description: 'Mark the KiroGraph index as dirty when source files are saved. Sync is deferred to agent idle.',\n when: { type: 'fileEdited', patterns: FILE_PATTERNS },\n then: { type: 'runCommand', command: 'kirograph mark-dirty 2>/dev/null || true' },\n },\n },\n {\n filename: 'kirograph-mark-dirty-on-create.json',\n hook: {\n name: 'KiroGraph Mark Dirty on Create',\n version: '1.0.0',\n description: 'Mark the KiroGraph index as dirty when source files are created.',\n when: { type: 'fileCreated', patterns: FILE_PATTERNS },\n then: { type: 'runCommand', command: 'kirograph mark-dirty 2>/dev/null || true' },\n },\n },\n {\n filename: 'kirograph-sync-on-delete.json',\n hook: {\n name: 'KiroGraph Sync on Delete',\n version: '1.0.0',\n description: 'Remove deleted files from the KiroGraph index immediately.',\n when: { type: 'fileDeleted', patterns: FILE_PATTERNS },\n then: { type: 'runCommand', command: 'kirograph sync-if-dirty 2>/dev/null || true' },\n },\n },\n {\n filename: 'kirograph-sync-if-dirty.json',\n hook: {\n name: 'KiroGraph Deferred Sync',\n version: '1.0.0',\n description: 'Sync the KiroGraph index when the agent is idle and a dirty marker is present. Batches multiple rapid saves into one sync.',\n when: { type: 'agentStop' },\n then: { type: 'runCommand', command: 'kirograph sync-if-dirty --quiet 2>/dev/null || true' },\n },\n },\n];\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction ensureDir(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nfunction writeJson(p: string, data: unknown): void {\n fs.writeFileSync(p, JSON.stringify(data, null, 2) + '\\n');\n}\n\nfunction migrateOnIdleHooks(hooksDir: string): void {\n if (!fs.existsSync(hooksDir)) return;\n let files: string[];\n try {\n files = fs.readdirSync(hooksDir).filter(f => f.endsWith('.json'));\n } catch {\n return;\n }\n for (const file of files) {\n const filePath = path.join(hooksDir, file);\n let raw: string;\n try {\n raw = fs.readFileSync(filePath, 'utf8');\n } catch {\n logWarn(`KiroGraph installer: could not read hook file ${filePath}`);\n continue;\n }\n let obj: any;\n try {\n obj = JSON.parse(raw);\n } catch {\n logWarn(`KiroGraph installer: could not parse hook file ${filePath}`);\n continue;\n }\n if (obj?.when?.type === 'onIdle') {\n obj.when.type = 'agentStop';\n try {\n fs.writeFileSync(filePath, JSON.stringify(obj, null, 2) + '\\n');\n } catch {\n logWarn(`KiroGraph installer: could not write migrated hook file ${filePath}`);\n }\n }\n }\n}\n\n// \u2500\u2500 Public \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function writeHooks(kiroDir: string): void {\n const hooksDir = path.join(kiroDir, 'hooks');\n ensureDir(hooksDir);\n\n migrateOnIdleHooks(hooksDir);\n\n const oldHooks = ['kirograph-sync-on-save.json', 'kirograph-sync-on-create.json'];\n for (const old of oldHooks) {\n const p = path.join(hooksDir, old);\n if (fs.existsSync(p)) fs.unlinkSync(p);\n }\n\n for (const { filename, hook } of HOOKS) {\n writeJson(path.join(hooksDir, filename), hook);\n }\n\n console.log(` \u2713 Auto-sync hooks written to ${hooksDir}`);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * KiroGraph Installer \u2014 Kiro hook file management\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { logWarn } from '../../errors';\n\n// \u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst FILE_PATTERNS = [\n '**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx',\n '**/*.py', '**/*.go', '**/*.rs', '**/*.java',\n '**/*.cs', '**/*.rb', '**/*.php', '**/*.swift',\n '**/*.kt', '**/*.dart',\n '**/*.ex', '**/*.exs',\n '**/*.scala', '**/*.sc', '**/*.lua', '**/*.zig',\n '**/*.sh', '**/*.bash', '**/*.ml', '**/*.mli',\n '**/*.elm', '**/*.sol', '**/*.vue', '**/*.m',\n '**/*.yaml', '**/*.yml',\n '**/*.tf', '**/*.tfvars',\n '**/*.css', '**/*.scss', '**/*.sass',\n '**/*.html',\n];\n\nconst HOOKS: Array<{ filename: string; hook: object }> = [\n {\n filename: 'kirograph-mark-dirty-on-save.json',\n hook: {\n name: 'KiroGraph Mark Dirty on Save',\n version: '1.0.0',\n description: 'Mark the KiroGraph index as dirty when source files are saved. Sync is deferred to agent idle.',\n when: { type: 'fileEdited', patterns: FILE_PATTERNS },\n then: { type: 'runCommand', command: 'kirograph mark-dirty 2>/dev/null || true' },\n },\n },\n {\n filename: 'kirograph-mark-dirty-on-create.json',\n hook: {\n name: 'KiroGraph Mark Dirty on Create',\n version: '1.0.0',\n description: 'Mark the KiroGraph index as dirty when source files are created.',\n when: { type: 'fileCreated', patterns: FILE_PATTERNS },\n then: { type: 'runCommand', command: 'kirograph mark-dirty 2>/dev/null || true' },\n },\n },\n {\n filename: 'kirograph-sync-on-delete.json',\n hook: {\n name: 'KiroGraph Sync on Delete',\n version: '1.0.0',\n description: 'Remove deleted files from the KiroGraph index immediately.',\n when: { type: 'fileDeleted', patterns: FILE_PATTERNS },\n then: { type: 'runCommand', command: 'kirograph sync-if-dirty 2>/dev/null || true' },\n },\n },\n {\n filename: 'kirograph-sync-if-dirty.json',\n hook: {\n name: 'KiroGraph Deferred Sync',\n version: '1.0.0',\n description: 'Sync the KiroGraph index when the agent is idle and a dirty marker is present. Batches multiple rapid saves into one sync.',\n when: { type: 'agentStop' },\n then: { type: 'runCommand', command: 'kirograph sync-if-dirty --quiet 2>/dev/null || true' },\n },\n },\n];\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction ensureDir(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nfunction writeJson(p: string, data: unknown): void {\n fs.writeFileSync(p, JSON.stringify(data, null, 2) + '\\n');\n}\n\nfunction migrateOnIdleHooks(hooksDir: string): void {\n if (!fs.existsSync(hooksDir)) return;\n let files: string[];\n try {\n files = fs.readdirSync(hooksDir).filter(f => f.endsWith('.json'));\n } catch {\n return;\n }\n for (const file of files) {\n const filePath = path.join(hooksDir, file);\n let raw: string;\n try {\n raw = fs.readFileSync(filePath, 'utf8');\n } catch {\n logWarn(`KiroGraph installer: could not read hook file ${filePath}`);\n continue;\n }\n let obj: any;\n try {\n obj = JSON.parse(raw);\n } catch {\n logWarn(`KiroGraph installer: could not parse hook file ${filePath}`);\n continue;\n }\n if (obj?.when?.type === 'onIdle') {\n obj.when.type = 'agentStop';\n try {\n fs.writeFileSync(filePath, JSON.stringify(obj, null, 2) + '\\n');\n } catch {\n logWarn(`KiroGraph installer: could not write migrated hook file ${filePath}`);\n }\n }\n }\n}\n\n// \u2500\u2500 Public \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function writeHooks(kiroDir: string): void {\n const hooksDir = path.join(kiroDir, 'hooks');\n ensureDir(hooksDir);\n\n migrateOnIdleHooks(hooksDir);\n\n const oldHooks = ['kirograph-sync-on-save.json', 'kirograph-sync-on-create.json'];\n for (const old of oldHooks) {\n const p = path.join(hooksDir, old);\n if (fs.existsSync(p)) fs.unlinkSync(p);\n }\n\n for (const { filename, hook } of HOOKS) {\n writeJson(path.join(hooksDir, filename), hook);\n }\n\n console.log(` \u2713 Auto-sync hooks written to ${hooksDir}`);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -31,8 +31,9 @@ __export(installer_exports, {
31
31
  runInstaller: () => runInstaller
32
32
  });
33
33
  module.exports = __toCommonJS(installer_exports);
34
- var path = __toESM(require("path"));
35
34
  var readline = __toESM(require("readline"));
35
+ var fs = __toESM(require("fs"));
36
+ var path = __toESM(require("path"));
36
37
  var import_child_process = require("child_process");
37
38
  var import_config = require("../../config");
38
39
  var import_banner = require("../banner");
@@ -40,120 +41,133 @@ var import_progress = require("../progress");
40
41
  var import_ui = require("../ui");
41
42
  var import_prompts = require("./prompts");
42
43
  var import_config_prompt = require("./config-prompt");
43
- var import_mcp = require("./mcp");
44
- var import_hooks = require("./hooks");
45
- var import_steering = require("./steering");
46
- var import_cli_agent = require("./cli-agent");
47
44
  var import_dashboard = require("./dashboard");
48
45
  var import_qdrant_dashboard = require("./qdrant-dashboard");
49
- async function runInstaller() {
46
+ var import_targets = require("./targets");
47
+ async function runInstaller(target = "kiro") {
50
48
  (0, import_banner.printBanner)();
51
49
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
52
50
  try {
53
51
  const cwd = process.cwd();
54
- const kiroDir = path.join(cwd, ".kiro");
52
+ const installer = (0, import_targets.getTargetInstaller)(target);
55
53
  console.log(` Workspace: ${cwd}
56
54
  `);
57
- const proceed = await (0, import_prompts.ask)(rl, " Install KiroGraph for this Kiro workspace? (Y/n) ");
55
+ const proceed = await (0, import_prompts.ask)(rl, ` Install KiroGraph for ${installer.label}? (Y/n) `);
58
56
  if (proceed.toLowerCase() === "n") {
59
57
  console.log(" Cancelled.");
60
58
  rl.close();
61
59
  return;
62
60
  }
63
61
  console.log();
64
- (0, import_mcp.writeMcpConfig)(kiroDir);
65
- (0, import_hooks.writeHooks)(kiroDir);
66
- const patch = await (0, import_config_prompt.promptConfigOptions)(rl);
62
+ installer.installEarly(cwd);
63
+ const alreadyInitialized = fs.existsSync(path.join(cwd, ".kirograph"));
64
+ let cavemanMode = "off";
65
+ let shouldOfferIndex = false;
66
+ let typesenseDashboard = false;
67
+ let qdrantDashboard = false;
67
68
  try {
68
- await (0, import_config.updateConfig)(cwd, patch);
69
- console.log(`
69
+ if (alreadyInitialized) {
70
+ const config = await (0, import_config.loadConfig)(cwd);
71
+ cavemanMode = config.cavemanMode ?? "off";
72
+ console.log(` \u2713 Reusing existing KiroGraph data in ${cwd}/.kirograph/`);
73
+ console.log(` \u2022 semanticEngine: ${config.semanticEngine}`);
74
+ console.log(` \u2022 enableEmbeddings: ${config.enableEmbeddings}`);
75
+ console.log(` \u2022 enableArchitecture: ${config.enableArchitecture}`);
76
+ console.log(` \u2022 cavemanMode: ${cavemanMode}`);
77
+ } else {
78
+ shouldOfferIndex = true;
79
+ const patch = await (0, import_config_prompt.promptConfigOptions)(rl);
80
+ await (0, import_config.updateConfig)(cwd, patch);
81
+ cavemanMode = patch.cavemanMode ?? "off";
82
+ typesenseDashboard = patch.typesenseDashboard;
83
+ qdrantDashboard = patch.qdrantDashboard;
84
+ console.log(`
70
85
  Configuration saved to ${cwd}/.kirograph/config.json`);
71
- console.log(` \u2022 enableEmbeddings: ${patch.enableEmbeddings}`);
72
- if ("embeddingModel" in patch) {
73
- console.log(` \u2022 embeddingModel: ${patch.embeddingModel} ${import_ui.dim}(${patch.embeddingDim}-dim)${import_ui.reset}`);
74
- }
75
- if (patch.enableEmbeddings) {
76
- console.log(` \u2022 semanticEngine: ${patch.semanticEngine}`);
77
- if (patch.semanticEngine === "sqlite-vec") {
78
- console.log(`
86
+ console.log(` \u2022 enableEmbeddings: ${patch.enableEmbeddings}`);
87
+ if ("embeddingModel" in patch) {
88
+ console.log(` \u2022 embeddingModel: ${patch.embeddingModel} ${import_ui.dim}(${patch.embeddingDim}-dim)${import_ui.reset}`);
89
+ }
90
+ if (patch.enableEmbeddings) {
91
+ console.log(` \u2022 semanticEngine: ${patch.semanticEngine}`);
92
+ if (patch.semanticEngine === "sqlite-vec") {
93
+ console.log(`
79
94
  Installing sqlite-vec dependencies...`);
80
- const result = (0, import_child_process.spawnSync)("npm", ["install", "better-sqlite3", "sqlite-vec"], { stdio: "inherit", shell: true });
81
- if (result.status === 0) {
82
- console.log(` \u2713 better-sqlite3 and sqlite-vec installed`);
83
- } else {
84
- console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
85
- console.warn(` npm install better-sqlite3 sqlite-vec`);
86
- }
87
- } else if (patch.semanticEngine === "orama") {
88
- console.log(`
95
+ const result = (0, import_child_process.spawnSync)("npm", ["install", "better-sqlite3", "sqlite-vec"], { stdio: "inherit", shell: true });
96
+ if (result.status === 0) {
97
+ console.log(` \u2713 better-sqlite3 and sqlite-vec installed`);
98
+ } else {
99
+ console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
100
+ console.warn(` npm install better-sqlite3 sqlite-vec`);
101
+ }
102
+ } else if (patch.semanticEngine === "orama") {
103
+ console.log(`
89
104
  Installing Orama dependencies...`);
90
- const result = (0, import_child_process.spawnSync)("npm", ["install", "@orama/orama", "@orama/plugin-data-persistence"], { stdio: "inherit", shell: true });
91
- if (result.status === 0) {
92
- console.log(` \u2713 @orama/orama and @orama/plugin-data-persistence installed`);
93
- } else {
94
- console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
95
- console.warn(` npm install @orama/orama @orama/plugin-data-persistence`);
96
- }
97
- } else if (patch.semanticEngine === "pglite") {
98
- console.log(`
105
+ const result = (0, import_child_process.spawnSync)("npm", ["install", "@orama/orama", "@orama/plugin-data-persistence"], { stdio: "inherit", shell: true });
106
+ if (result.status === 0) {
107
+ console.log(` \u2713 @orama/orama and @orama/plugin-data-persistence installed`);
108
+ } else {
109
+ console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
110
+ console.warn(` npm install @orama/orama @orama/plugin-data-persistence`);
111
+ }
112
+ } else if (patch.semanticEngine === "pglite") {
113
+ console.log(`
99
114
  Installing PGlite dependencies...`);
100
- const result = (0, import_child_process.spawnSync)("npm", ["install", "@electric-sql/pglite"], { stdio: "inherit", shell: true });
101
- if (result.status === 0) {
102
- console.log(` \u2713 @electric-sql/pglite installed`);
103
- } else {
104
- console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
105
- console.warn(` npm install @electric-sql/pglite`);
106
- }
107
- } else if (patch.semanticEngine === "lancedb") {
108
- console.log(`
115
+ const result = (0, import_child_process.spawnSync)("npm", ["install", "@electric-sql/pglite"], { stdio: "inherit", shell: true });
116
+ if (result.status === 0) {
117
+ console.log(` \u2713 @electric-sql/pglite installed`);
118
+ } else {
119
+ console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
120
+ console.warn(` npm install @electric-sql/pglite`);
121
+ }
122
+ } else if (patch.semanticEngine === "lancedb") {
123
+ console.log(`
109
124
  Installing LanceDB dependencies...`);
110
- const result = (0, import_child_process.spawnSync)("npm", ["install", "@lancedb/lancedb"], { stdio: "inherit", shell: true });
111
- if (result.status === 0) {
112
- console.log(` \u2713 @lancedb/lancedb installed`);
113
- } else {
114
- console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
115
- console.warn(` npm install @lancedb/lancedb`);
116
- }
117
- } else if (patch.semanticEngine === "qdrant") {
118
- console.log(`
125
+ const result = (0, import_child_process.spawnSync)("npm", ["install", "@lancedb/lancedb"], { stdio: "inherit", shell: true });
126
+ if (result.status === 0) {
127
+ console.log(` \u2713 @lancedb/lancedb installed`);
128
+ } else {
129
+ console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
130
+ console.warn(` npm install @lancedb/lancedb`);
131
+ }
132
+ } else if (patch.semanticEngine === "qdrant") {
133
+ console.log(`
119
134
  Installing Qdrant dependencies...`);
120
- const result = (0, import_child_process.spawnSync)("npm", ["install", "qdrant-local"], { stdio: "inherit", shell: true });
121
- if (result.status === 0) {
122
- console.log(` \u2713 qdrant-local installed`);
123
- } else {
124
- console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
125
- console.warn(` npm install qdrant-local`);
126
- }
127
- } else if (patch.semanticEngine === "typesense") {
128
- console.log(`
135
+ const result = (0, import_child_process.spawnSync)("npm", ["install", "qdrant-local"], { stdio: "inherit", shell: true });
136
+ if (result.status === 0) {
137
+ console.log(` \u2713 qdrant-local installed`);
138
+ } else {
139
+ console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
140
+ console.warn(` npm install qdrant-local`);
141
+ }
142
+ } else if (patch.semanticEngine === "typesense") {
143
+ console.log(`
129
144
  Installing Typesense dependencies...`);
130
- const result = (0, import_child_process.spawnSync)("npm", ["install", "typesense"], { stdio: "inherit", shell: true });
131
- if (result.status === 0) {
132
- console.log(` \u2713 typesense installed`);
133
- console.log(` \u2139 The Typesense binary (~37MB) will be auto-downloaded on first index run.`);
134
- } else {
135
- console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
136
- console.warn(` npm install typesense`);
145
+ const result = (0, import_child_process.spawnSync)("npm", ["install", "typesense"], { stdio: "inherit", shell: true });
146
+ if (result.status === 0) {
147
+ console.log(` \u2713 typesense installed`);
148
+ console.log(` \u2139 The Typesense binary (~37MB) will be auto-downloaded on first index run.`);
149
+ } else {
150
+ console.warn(` \u2717 npm install failed (exit ${result.status}). Run manually:`);
151
+ console.warn(` npm install typesense`);
152
+ }
137
153
  }
138
154
  }
155
+ console.log(` \u2022 extractDocstrings: ${patch.extractDocstrings}`);
156
+ console.log(` \u2022 trackCallSites: ${patch.trackCallSites}`);
157
+ console.log(` \u2022 enableArchitecture: ${patch.enableArchitecture}`);
158
+ console.log(` \u2022 cavemanMode: ${cavemanMode}`);
139
159
  }
140
- console.log(` \u2022 extractDocstrings: ${patch.extractDocstrings}`);
141
- console.log(` \u2022 trackCallSites: ${patch.trackCallSites}`);
142
- console.log(` \u2022 enableArchitecture: ${patch.enableArchitecture}`);
143
- console.log(` \u2022 cavemanMode: ${patch.cavemanMode ?? "off"}`);
144
- (0, import_steering.writeSteering)(kiroDir, patch.cavemanMode ?? "off");
145
- (0, import_cli_agent.writeCliAgent)(kiroDir);
160
+ installer.installLate(cwd, cavemanMode);
146
161
  } catch (err) {
147
162
  const reason = err instanceof Error ? err.message : String(err);
148
163
  console.error(`
149
164
  \u2717 Failed to write configuration: ${reason}`);
150
165
  process.exit(1);
151
166
  }
152
- if (patch.qdrantDashboard) {
167
+ if (qdrantDashboard) {
153
168
  await (0, import_qdrant_dashboard.ensureQdrantUI)(cwd);
154
169
  }
155
- const doIndex = await (0, import_prompts.ask)(rl, "\n Initialize and index this project now? (Y/n) ");
156
- if (doIndex.toLowerCase() !== "n") {
170
+ if (shouldOfferIndex && (await (0, import_prompts.ask)(rl, "\n Initialize and index this project now? (Y/n) ")).toLowerCase() !== "n") {
157
171
  const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
158
172
  const fileBytes = /* @__PURE__ */ new Map();
159
173
  const modelProgress = (file, loaded, total, done) => {
@@ -197,7 +211,7 @@ async function runInstaller() {
197
211
  process.stdout.write("\n");
198
212
  console.log(` \u2713 Indexed ${result.filesIndexed} files, ${result.nodesCreated} symbols, ${result.edgesCreated} edges`);
199
213
  cg.close();
200
- if (patch.typesenseDashboard) {
214
+ if (typesenseDashboard) {
201
215
  const dashboardServer = await (0, import_dashboard.openTypesenseDashboard)(cwd);
202
216
  console.log(` ${import_ui.dim}Press Ctrl+C to stop the dashboard server when done.${import_ui.reset}`);
203
217
  await new Promise((resolve) => {
@@ -211,12 +225,11 @@ async function runInstaller() {
211
225
  });
212
226
  return;
213
227
  }
214
- if (patch.qdrantDashboard) {
228
+ if (qdrantDashboard) {
215
229
  await (0, import_qdrant_dashboard.openQdrantDashboard)(cwd);
216
230
  }
217
231
  }
218
- console.log("\n Done! Restart Kiro IDE for the MCP server to load.");
219
- console.log(' For Kiro CLI, use the "kirograph" agent: kiro-cli --agent kirograph\n');
232
+ installer.printNextSteps(cwd);
220
233
  } finally {
221
234
  rl.close();
222
235
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/installer/index.ts"],
4
- "sourcesContent": ["/**\n * KiroGraph Installer for Kiro\n *\n * Wires up:\n * 1. .kiro/settings/mcp.json \u2014 registers the MCP server (IDE + CLI)\n * 2. .kiro/hooks/*.json \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 path from 'path';\nimport * as readline from 'readline';\nimport { spawnSync } from 'child_process';\nimport { updateConfig } from '../../config';\nimport { printBanner } from '../banner';\nimport { renderIndexProgress } from '../progress';\nimport { dim, reset } from '../ui';\nimport { ask } from './prompts';\nimport { promptConfigOptions } from './config-prompt';\nimport { writeMcpConfig } from './mcp';\nimport { writeHooks } from './hooks';\nimport { writeSteering } from './steering';\nimport { writeCliAgent } from './cli-agent';\nimport { openTypesenseDashboard } from './dashboard';\nimport { ensureQdrantUI, openQdrantDashboard } from './qdrant-dashboard';\n\nexport async function runInstaller(): 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 kiroDir = path.join(cwd, '.kiro');\n\n console.log(` Workspace: ${cwd}\\n`);\n\n const proceed = await ask(rl, ' Install KiroGraph for this Kiro workspace? (Y/n) ');\n if (proceed.toLowerCase() === 'n') { console.log(' Cancelled.'); rl.close(); return; }\n console.log();\n\n // 1. MCP config\n writeMcpConfig(kiroDir);\n\n // 2. IDE hooks\n writeHooks(kiroDir);\n\n // 3. Steering written after config prompt (needs cavemanMode) \u2014 deferred below\n\n // 3b. Prompt for config options and persist\n const patch = await promptConfigOptions(rl);\n try {\n await updateConfig(cwd, patch);\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 }\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: ${patch.cavemanMode ?? 'off'}`);\n\n // 3. Steering + CLI agent \u2014 written here so they include cavemanMode\n writeSteering(kiroDir, patch.cavemanMode ?? 'off');\n\n // 4. CLI agent config\n writeCliAgent(kiroDir);\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 (patch.qdrantDashboard) {\n await ensureQdrantUI(cwd);\n }\n\n // 6. Optionally init + index\n const doIndex = await ask(rl, '\\n Initialize and index this project now? (Y/n) ');\n if (doIndex.toLowerCase() !== 'n') {\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 (patch.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 (patch.qdrantDashboard) {\n await openQdrantDashboard(cwd);\n }\n }\n\n console.log('\\n Done! Restart Kiro IDE for the MCP server to load.');\n console.log(' For Kiro CLI, use the \"kirograph\" agent: kiro-cli --agent kirograph\\n');\n } finally {\n rl.close();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * KiroGraph Installer\n *\n * The default target wires up Kiro:\n * 1. .kiro/settings/mcp.json \u2014 registers the MCP server (IDE + CLI)\n * 2. .kiro/hooks/*.json \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 } 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\nexport async function runInstaller(target: InstallTarget = 'kiro'): 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 const proceed = await ask(rl, ` Install KiroGraph for ${installer.label}? (Y/n) `);\n if (proceed.toLowerCase() === 'n') { console.log(' Cancelled.'); rl.close(); return; }\n console.log();\n\n installer.installEarly(cwd);\n\n const alreadyInitialized = fs.existsSync(path.join(cwd, '.kirograph'));\n let cavemanMode: CavemanMode | 'off' = 'off';\n let 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 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 console.log(` \u2022 enableArchitecture: ${config.enableArchitecture}`);\n console.log(` \u2022 cavemanMode: ${cavemanMode}`);\n } else {\n shouldOfferIndex = true;\n const patch = await promptConfigOptions(rl);\n await updateConfig(cwd, patch);\n cavemanMode = patch.cavemanMode ?? 'off';\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 }\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 }\n\n installer.installLate(cwd, cavemanMode);\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 if (shouldOfferIndex && (await ask(rl, '\\n Initialize and index this project now? (Y/n) ')).toLowerCase() !== 'n') {\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,qBAAoB;AACpB,2BAAoC;AACpC,uBAAuC;AACvC,8BAAoD;AAEpD,qBAAmC;AAGnC,eAAsB,aAAa,SAAwB,QAAuB;AAChF,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,UAAM,UAAU,UAAM,oBAAI,IAAI,2BAA2B,UAAU,KAAK,UAAU;AAClF,QAAI,QAAQ,YAAY,MAAM,KAAK;AAAE,cAAQ,IAAI,cAAc;AAAG,SAAG,MAAM;AAAG;AAAA,IAAQ;AACtF,YAAQ,IAAI;AAEZ,cAAU,aAAa,GAAG;AAE1B,UAAM,qBAAqB,GAAG,WAAW,KAAK,KAAK,KAAK,YAAY,CAAC;AACrE,QAAI,cAAmC;AACvC,QAAI,mBAAmB;AACvB,QAAI,qBAAqB;AACzB,QAAI,kBAAkB;AAEtB,QAAI;AACF,UAAI,oBAAoB;AACtB,cAAM,SAAS,UAAM,0BAAW,GAAG;AACnC,sBAAc,OAAO,eAAe;AACpC,gBAAQ,IAAI,+CAA0C,GAAG,cAAc;AACvE,gBAAQ,IAAI,4BAAuB,OAAO,cAAc,EAAE;AAC1D,gBAAQ,IAAI,8BAAyB,OAAO,gBAAgB,EAAE;AAC9D,gBAAQ,IAAI,gCAA2B,OAAO,kBAAkB,EAAE;AAClE,gBAAQ,IAAI,yBAAoB,WAAW,EAAE;AAAA,MAC/C,OAAO;AACL,2BAAmB;AACnB,cAAM,QAAQ,UAAM,0CAAoB,EAAE;AAC1C,kBAAM,4BAAa,KAAK,KAAK;AAC7B,sBAAc,MAAM,eAAe;AACnC,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;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;AAAA,MAC/C;AAEA,gBAAU,YAAY,KAAK,WAAW;AAAA,IACxC,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,QAAI,qBAAqB,UAAM,oBAAI,IAAI,mDAAmD,GAAG,YAAY,MAAM,KAAK;AAClH,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;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,60 @@
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 instructions_exports = {};
20
+ __export(instructions_exports, {
21
+ buildAgentInstructions: () => buildAgentInstructions
22
+ });
23
+ module.exports = __toCommonJS(instructions_exports);
24
+ var import_caveman = require("./caveman");
25
+ function buildAgentInstructions(cavemanMode) {
26
+ const content = `# KiroGraph
27
+
28
+ KiroGraph builds a local semantic knowledge graph of this codebase. When the \`kirograph\` MCP server is available, prefer its tools over broad grep/glob/file-read exploration.
29
+
30
+ ## Tool selection
31
+
32
+ - Start code tasks with \`kirograph_context\`.
33
+ - Find symbols by name with \`kirograph_search\`.
34
+ - Inspect a symbol with \`kirograph_node\`; set \`includeCode: true\` only when source is needed.
35
+ - Trace call flow with \`kirograph_callers\` and \`kirograph_callees\`.
36
+ - Check blast radius before edits with \`kirograph_impact\`.
37
+ - Use \`kirograph_path\` to explain how two symbols connect.
38
+ - Use \`kirograph_type_hierarchy\` for inheritance/interface questions.
39
+ - Use \`kirograph_files\` to inspect indexed file structure.
40
+ - Use \`kirograph_status\` if results seem stale or incomplete.
41
+ - Use \`kirograph_architecture\`, \`kirograph_coupling\`, and \`kirograph_package\` for package/layer questions when architecture analysis is enabled.
42
+ - Use \`kirograph_hotspots\`, \`kirograph_surprising\`, and \`kirograph_diff\` for refactor planning and review.
43
+
44
+ ## Workflow
45
+
46
+ 1. Call \`kirograph_context\` for orientation.
47
+ 2. Drill into specific symbols with \`kirograph_node\`.
48
+ 3. Use graph traversal tools before reading unrelated files.
49
+ 4. Fall back to normal filesystem tools only when the graph is missing, stale, or lacks the needed detail.
50
+
51
+ If \`.kirograph/\` does not exist, ask whether to run \`kirograph init --index\`.
52
+ `;
53
+ const caveman = cavemanMode && cavemanMode !== "off" ? import_caveman.CAVEMAN_RULES[cavemanMode] : null;
54
+ return caveman ? content.trimEnd() + "\n\n" + caveman + "\n" : content;
55
+ }
56
+ // Annotate the CommonJS export names for ESM import in node:
57
+ 0 && (module.exports = {
58
+ buildAgentInstructions
59
+ });
60
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/installer/instructions.ts"],
4
+ "sourcesContent": ["import { CAVEMAN_RULES, CavemanMode } from './caveman';\n\nexport function buildAgentInstructions(cavemanMode?: CavemanMode | 'off'): string {\n const content = `# KiroGraph\n\nKiroGraph builds a local semantic knowledge graph of this codebase. When the \\`kirograph\\` MCP server is available, prefer its tools over broad grep/glob/file-read exploration.\n\n## Tool selection\n\n- Start code tasks with \\`kirograph_context\\`.\n- Find symbols by name with \\`kirograph_search\\`.\n- Inspect a symbol with \\`kirograph_node\\`; set \\`includeCode: true\\` only when source is needed.\n- Trace call flow with \\`kirograph_callers\\` and \\`kirograph_callees\\`.\n- Check blast radius before edits with \\`kirograph_impact\\`.\n- Use \\`kirograph_path\\` to explain how two symbols connect.\n- Use \\`kirograph_type_hierarchy\\` for inheritance/interface questions.\n- Use \\`kirograph_files\\` to inspect indexed file structure.\n- Use \\`kirograph_status\\` if results seem stale or incomplete.\n- Use \\`kirograph_architecture\\`, \\`kirograph_coupling\\`, and \\`kirograph_package\\` for package/layer questions when architecture analysis is enabled.\n- Use \\`kirograph_hotspots\\`, \\`kirograph_surprising\\`, and \\`kirograph_diff\\` for refactor planning and review.\n\n## Workflow\n\n1. Call \\`kirograph_context\\` for orientation.\n2. Drill into specific symbols with \\`kirograph_node\\`.\n3. Use graph traversal tools before reading unrelated files.\n4. Fall back to normal filesystem tools only when the graph is missing, stale, or lacks the needed detail.\n\nIf \\`.kirograph/\\` does not exist, ask whether to run \\`kirograph init --index\\`.\n`;\n\n const caveman = cavemanMode && cavemanMode !== 'off' ? CAVEMAN_RULES[cavemanMode] : null;\n return caveman ? content.trimEnd() + '\\n\\n' + caveman + '\\n' : content;\n}\n\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA2C;AAEpC,SAAS,uBAAuB,aAA2C;AAChF,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BhB,QAAM,UAAU,eAAe,gBAAgB,QAAQ,6BAAc,WAAW,IAAI;AACpF,SAAO,UAAU,QAAQ,QAAQ,IAAI,SAAS,UAAU,OAAO;AACjE;",
6
+ "names": []
7
+ }
@@ -31,46 +31,16 @@ __export(mcp_exports, {
31
31
  writeMcpConfig: () => writeMcpConfig
32
32
  });
33
33
  module.exports = __toCommonJS(mcp_exports);
34
- var fs = __toESM(require("fs"));
35
34
  var path = __toESM(require("path"));
36
- function ensureDir(p) {
37
- fs.mkdirSync(p, { recursive: true });
38
- }
39
- function readJson(p) {
40
- try {
41
- return JSON.parse(fs.readFileSync(p, "utf8"));
42
- } catch {
43
- return {};
44
- }
45
- }
46
- function writeJson(p, data) {
47
- fs.writeFileSync(p, JSON.stringify(data, null, 2) + "\n");
48
- }
35
+ var import_common = require("./common");
49
36
  function writeMcpConfig(kiroDir) {
50
37
  const mcpPath = path.join(kiroDir, "settings", "mcp.json");
51
- ensureDir(path.dirname(mcpPath));
52
- const existing = readJson(mcpPath);
53
- existing.mcpServers = existing.mcpServers ?? {};
54
- existing.mcpServers.kirograph = {
55
- command: "kirograph",
56
- args: ["serve", "--mcp"],
38
+ (0, import_common.writeMcpServersConfig)(mcpPath, {
39
+ command: import_common.KIROGRAPH_COMMAND,
40
+ args: import_common.KIROGRAPH_MCP_ARGS,
57
41
  disabled: false,
58
- autoApprove: [
59
- "kirograph_search",
60
- "kirograph_context",
61
- "kirograph_callers",
62
- "kirograph_callees",
63
- "kirograph_impact",
64
- "kirograph_node",
65
- "kirograph_status",
66
- "kirograph_files",
67
- "kirograph_dead_code",
68
- "kirograph_circular_deps",
69
- "kirograph_path",
70
- "kirograph_type_hierarchy"
71
- ]
72
- };
73
- writeJson(mcpPath, existing);
42
+ autoApprove: import_common.KIROGRAPH_TOOLS
43
+ });
74
44
  console.log(` \u2713 MCP server registered in ${mcpPath}`);
75
45
  }
76
46
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/installer/mcp.ts"],
4
- "sourcesContent": ["/**\n * KiroGraph Installer \u2014 MCP server registration\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nfunction ensureDir(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nfunction readJson(p: string): any {\n try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return {}; }\n}\n\nfunction writeJson(p: string, data: unknown): void {\n fs.writeFileSync(p, JSON.stringify(data, null, 2) + '\\n');\n}\n\nexport function writeMcpConfig(kiroDir: string): void {\n const mcpPath = path.join(kiroDir, 'settings', 'mcp.json');\n ensureDir(path.dirname(mcpPath));\n const existing = readJson(mcpPath);\n existing.mcpServers = existing.mcpServers ?? {};\n existing.mcpServers.kirograph = {\n command: 'kirograph',\n args: ['serve', '--mcp'],\n disabled: false,\n autoApprove: [\n 'kirograph_search',\n 'kirograph_context',\n 'kirograph_callers',\n 'kirograph_callees',\n 'kirograph_impact',\n 'kirograph_node',\n 'kirograph_status',\n 'kirograph_files',\n 'kirograph_dead_code',\n 'kirograph_circular_deps',\n 'kirograph_path',\n 'kirograph_type_hierarchy',\n ],\n };\n writeJson(mcpPath, existing);\n console.log(` \u2713 MCP server registered in ${mcpPath}`);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,SAAoB;AACpB,WAAsB;AAEtB,SAAS,UAAU,GAAiB;AAClC,KAAG,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACrC;AAEA,SAAS,SAAS,GAAgB;AAChC,MAAI;AAAE,WAAO,KAAK,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;AAAA,EAAG,QAAQ;AAAE,WAAO,CAAC;AAAA,EAAG;AAC5E;AAEA,SAAS,UAAU,GAAW,MAAqB;AACjD,KAAG,cAAc,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAC1D;AAEO,SAAS,eAAe,SAAuB;AACpD,QAAM,UAAU,KAAK,KAAK,SAAS,YAAY,UAAU;AACzD,YAAU,KAAK,QAAQ,OAAO,CAAC;AAC/B,QAAM,WAAW,SAAS,OAAO;AACjC,WAAS,aAAa,SAAS,cAAc,CAAC;AAC9C,WAAS,WAAW,YAAY;AAAA,IAC9B,SAAS;AAAA,IACT,MAAM,CAAC,SAAS,OAAO;AAAA,IACvB,UAAU;AAAA,IACV,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,YAAU,SAAS,QAAQ;AAC3B,UAAQ,IAAI,qCAAgC,OAAO,EAAE;AACvD;",
4
+ "sourcesContent": ["/**\n * KiroGraph Installer \u2014 MCP server registration\n */\n\nimport * as path from 'path';\nimport { KIROGRAPH_COMMAND, KIROGRAPH_MCP_ARGS, KIROGRAPH_TOOLS, writeMcpServersConfig } from './common';\n\nexport function writeMcpConfig(kiroDir: string): void {\n const mcpPath = path.join(kiroDir, 'settings', 'mcp.json');\n writeMcpServersConfig(mcpPath, {\n command: KIROGRAPH_COMMAND,\n args: KIROGRAPH_MCP_ARGS,\n disabled: false,\n autoApprove: KIROGRAPH_TOOLS,\n });\n console.log(` \u2713 MCP server registered in ${mcpPath}`);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,WAAsB;AACtB,oBAA8F;AAEvF,SAAS,eAAe,SAAuB;AACpD,QAAM,UAAU,KAAK,KAAK,SAAS,YAAY,UAAU;AACzD,2CAAsB,SAAS;AAAA,IAC7B,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AACD,UAAQ,IAAI,qCAAgC,OAAO,EAAE;AACvD;",
6
6
  "names": []
7
7
  }