kirograph 0.27.1 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +35 -2
  2. package/dist/bin/commands/annotations.js +56 -0
  3. package/dist/bin/commands/annotations.js.map +7 -0
  4. package/dist/bin/commands/ast-rewrite.js +55 -0
  5. package/dist/bin/commands/ast-rewrite.js.map +7 -0
  6. package/dist/bin/commands/bench.js +103 -0
  7. package/dist/bin/commands/bench.js.map +7 -0
  8. package/dist/bin/commands/branch.js +133 -0
  9. package/dist/bin/commands/branch.js.map +7 -0
  10. package/dist/bin/commands/callees.js +76 -0
  11. package/dist/bin/commands/callees.js.map +7 -0
  12. package/dist/bin/commands/callers.js +76 -0
  13. package/dist/bin/commands/callers.js.map +7 -0
  14. package/dist/bin/commands/changelog.js +55 -0
  15. package/dist/bin/commands/changelog.js.map +7 -0
  16. package/dist/bin/commands/circular-deps.js +68 -0
  17. package/dist/bin/commands/circular-deps.js.map +7 -0
  18. package/dist/bin/commands/commit-context.js +55 -0
  19. package/dist/bin/commands/commit-context.js.map +7 -0
  20. package/dist/bin/commands/complexity.js +60 -0
  21. package/dist/bin/commands/complexity.js.map +7 -0
  22. package/dist/bin/commands/cost.js +146 -0
  23. package/dist/bin/commands/cost.js.map +7 -0
  24. package/dist/bin/commands/dependency-depth.js +55 -0
  25. package/dist/bin/commands/dependency-depth.js.map +7 -0
  26. package/dist/bin/commands/diff-context.js +55 -0
  27. package/dist/bin/commands/diff-context.js.map +7 -0
  28. package/dist/bin/commands/distribution.js +56 -0
  29. package/dist/bin/commands/distribution.js.map +7 -0
  30. package/dist/bin/commands/doc-coverage.js +56 -0
  31. package/dist/bin/commands/doc-coverage.js.map +7 -0
  32. package/dist/bin/commands/doctor.js +202 -0
  33. package/dist/bin/commands/doctor.js.map +7 -0
  34. package/dist/bin/commands/dsm.js +56 -0
  35. package/dist/bin/commands/dsm.js.map +7 -0
  36. package/dist/bin/commands/gini.js +55 -0
  37. package/dist/bin/commands/gini.js.map +7 -0
  38. package/dist/bin/commands/god-class.js +56 -0
  39. package/dist/bin/commands/god-class.js.map +7 -0
  40. package/dist/bin/commands/health.js +55 -0
  41. package/dist/bin/commands/health.js.map +7 -0
  42. package/dist/bin/commands/help.js +224 -45
  43. package/dist/bin/commands/help.js.map +2 -2
  44. package/dist/bin/commands/impact.js +76 -0
  45. package/dist/bin/commands/impact.js.map +7 -0
  46. package/dist/bin/commands/inheritance-depth.js +56 -0
  47. package/dist/bin/commands/inheritance-depth.js.map +7 -0
  48. package/dist/bin/commands/insert-at.js +55 -0
  49. package/dist/bin/commands/insert-at.js.map +7 -0
  50. package/dist/bin/commands/largest.js +56 -0
  51. package/dist/bin/commands/largest.js.map +7 -0
  52. package/dist/bin/commands/manifest.js +158 -0
  53. package/dist/bin/commands/manifest.js.map +7 -0
  54. package/dist/bin/commands/module-api.js +57 -0
  55. package/dist/bin/commands/module-api.js.map +7 -0
  56. package/dist/bin/commands/monitor.js +91 -0
  57. package/dist/bin/commands/monitor.js.map +7 -0
  58. package/dist/bin/commands/multi-replace.js +66 -0
  59. package/dist/bin/commands/multi-replace.js.map +7 -0
  60. package/dist/bin/commands/pr-context.js +55 -0
  61. package/dist/bin/commands/pr-context.js.map +7 -0
  62. package/dist/bin/commands/query.js +19 -1
  63. package/dist/bin/commands/query.js.map +3 -3
  64. package/dist/bin/commands/rank.js +56 -0
  65. package/dist/bin/commands/rank.js.map +7 -0
  66. package/dist/bin/commands/read.js +1 -1
  67. package/dist/bin/commands/read.js.map +2 -2
  68. package/dist/bin/commands/recursion.js +56 -0
  69. package/dist/bin/commands/recursion.js.map +7 -0
  70. package/dist/bin/commands/rename-preview.js +56 -0
  71. package/dist/bin/commands/rename-preview.js.map +7 -0
  72. package/dist/bin/commands/session.js +60 -0
  73. package/dist/bin/commands/session.js.map +7 -0
  74. package/dist/bin/commands/simplify-scan.js +56 -0
  75. package/dist/bin/commands/simplify-scan.js.map +7 -0
  76. package/dist/bin/commands/str-replace.js +55 -0
  77. package/dist/bin/commands/str-replace.js.map +7 -0
  78. package/dist/bin/commands/test-coverage.js +59 -0
  79. package/dist/bin/commands/test-coverage.js.map +7 -0
  80. package/dist/bin/commands/test-map.js +56 -0
  81. package/dist/bin/commands/test-map.js.map +7 -0
  82. package/dist/bin/commands/test-risk.js +59 -0
  83. package/dist/bin/commands/test-risk.js.map +7 -0
  84. package/dist/bin/commands/type-hierarchy.js +76 -0
  85. package/dist/bin/commands/type-hierarchy.js.map +7 -0
  86. package/dist/bin/commands/unused-imports.js +55 -0
  87. package/dist/bin/commands/unused-imports.js.map +7 -0
  88. package/dist/bin/commands/upgrade.js +78 -0
  89. package/dist/bin/commands/upgrade.js.map +7 -0
  90. package/dist/bin/installer/common.js +19 -9
  91. package/dist/bin/installer/common.js.map +2 -2
  92. package/dist/bin/installer/config-prompt.js +147 -12
  93. package/dist/bin/installer/config-prompt.js.map +3 -3
  94. package/dist/bin/installer/index.js +62 -6
  95. package/dist/bin/installer/index.js.map +2 -2
  96. package/dist/bin/installer/instructions.js +14 -25
  97. package/dist/bin/installer/instructions.js.map +2 -2
  98. package/dist/bin/installer/mcp.js.map +2 -2
  99. package/dist/bin/installer/steering.js +569 -100
  100. package/dist/bin/installer/steering.js.map +2 -2
  101. package/dist/bin/installer/targets/aider.js +3 -3
  102. package/dist/bin/installer/targets/aider.js.map +2 -2
  103. package/dist/bin/installer/targets/amp.js +3 -3
  104. package/dist/bin/installer/targets/amp.js.map +2 -2
  105. package/dist/bin/installer/targets/antigravity.js +4 -4
  106. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  107. package/dist/bin/installer/targets/augment.js +3 -3
  108. package/dist/bin/installer/targets/augment.js.map +2 -2
  109. package/dist/bin/installer/targets/claude.js +3 -3
  110. package/dist/bin/installer/targets/claude.js.map +2 -2
  111. package/dist/bin/installer/targets/cline.js +4 -4
  112. package/dist/bin/installer/targets/cline.js.map +2 -2
  113. package/dist/bin/installer/targets/codex.js +4 -4
  114. package/dist/bin/installer/targets/codex.js.map +2 -2
  115. package/dist/bin/installer/targets/continue.js +4 -4
  116. package/dist/bin/installer/targets/continue.js.map +2 -2
  117. package/dist/bin/installer/targets/copilot-cli.js +4 -4
  118. package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
  119. package/dist/bin/installer/targets/copilot.js +4 -4
  120. package/dist/bin/installer/targets/copilot.js.map +2 -2
  121. package/dist/bin/installer/targets/cursor.js +5 -5
  122. package/dist/bin/installer/targets/cursor.js.map +2 -2
  123. package/dist/bin/installer/targets/devin.js +4 -4
  124. package/dist/bin/installer/targets/devin.js.map +2 -2
  125. package/dist/bin/installer/targets/gemini-cli.js +4 -4
  126. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  127. package/dist/bin/installer/targets/generic.js +2 -2
  128. package/dist/bin/installer/targets/generic.js.map +2 -2
  129. package/dist/bin/installer/targets/goose.js +3 -4
  130. package/dist/bin/installer/targets/goose.js.map +3 -3
  131. package/dist/bin/installer/targets/index.js.map +1 -1
  132. package/dist/bin/installer/targets/junie.js +4 -4
  133. package/dist/bin/installer/targets/junie.js.map +2 -2
  134. package/dist/bin/installer/targets/kilo.js +4 -4
  135. package/dist/bin/installer/targets/kilo.js.map +2 -2
  136. package/dist/bin/installer/targets/kiro.js +27 -3
  137. package/dist/bin/installer/targets/kiro.js.map +2 -2
  138. package/dist/bin/installer/targets/opencode.js +3 -3
  139. package/dist/bin/installer/targets/opencode.js.map +2 -2
  140. package/dist/bin/installer/targets/openhands.js +3 -3
  141. package/dist/bin/installer/targets/openhands.js.map +2 -2
  142. package/dist/bin/installer/targets/qoder.js +2 -2
  143. package/dist/bin/installer/targets/qoder.js.map +2 -2
  144. package/dist/bin/installer/targets/qwen.js +2 -2
  145. package/dist/bin/installer/targets/qwen.js.map +2 -2
  146. package/dist/bin/installer/targets/replit.js +3 -3
  147. package/dist/bin/installer/targets/replit.js.map +2 -2
  148. package/dist/bin/installer/targets/roo.js +4 -4
  149. package/dist/bin/installer/targets/roo.js.map +2 -2
  150. package/dist/bin/installer/targets/tabnine.js +3 -3
  151. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  152. package/dist/bin/installer/targets/trae.js +3 -3
  153. package/dist/bin/installer/targets/trae.js.map +2 -2
  154. package/dist/bin/installer/targets/warp.js +4 -4
  155. package/dist/bin/installer/targets/warp.js.map +2 -2
  156. package/dist/bin/installer/targets/windsurf.js +4 -4
  157. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  158. package/dist/bin/kirograph.js +83 -1
  159. package/dist/bin/kirograph.js.map +3 -3
  160. package/dist/config.js +30 -8
  161. package/dist/config.js.map +2 -2
  162. package/dist/core/branch-manager.js +111 -0
  163. package/dist/core/branch-manager.js.map +7 -0
  164. package/dist/core/pipeline.js +3 -3
  165. package/dist/core/pipeline.js.map +2 -2
  166. package/dist/data/pixelrag-bridge.js +93 -0
  167. package/dist/data/pixelrag-bridge.js.map +7 -0
  168. package/dist/data/pixelrag-manager.js +416 -0
  169. package/dist/data/pixelrag-manager.js.map +7 -0
  170. package/dist/db/database.js +34 -7
  171. package/dist/db/database.js.map +2 -2
  172. package/dist/db/schema.sql +7 -1
  173. package/dist/extraction/complexity.js +116 -0
  174. package/dist/extraction/complexity.js.map +7 -0
  175. package/dist/extraction/extractor.js +52 -1
  176. package/dist/extraction/extractor.js.map +2 -2
  177. package/dist/graph/git-context.js +229 -0
  178. package/dist/graph/git-context.js.map +7 -0
  179. package/dist/index.js +4 -2
  180. package/dist/index.js.map +2 -2
  181. package/dist/mcp/cache.js +1 -1
  182. package/dist/mcp/cache.js.map +2 -2
  183. package/dist/mcp/handler.js +446 -0
  184. package/dist/mcp/handler.js.map +7 -0
  185. package/dist/mcp/handlers/architecture.js +297 -0
  186. package/dist/mcp/handlers/architecture.js.map +7 -0
  187. package/dist/mcp/handlers/branch.js +175 -0
  188. package/dist/mcp/handlers/branch.js.map +7 -0
  189. package/dist/mcp/handlers/code-health.js +563 -0
  190. package/dist/mcp/handlers/code-health.js.map +7 -0
  191. package/dist/mcp/handlers/complexity.js +267 -0
  192. package/dist/mcp/handlers/complexity.js.map +7 -0
  193. package/dist/mcp/handlers/core.js +611 -0
  194. package/dist/mcp/handlers/core.js.map +7 -0
  195. package/dist/mcp/handlers/data.js +337 -0
  196. package/dist/mcp/handlers/data.js.map +7 -0
  197. package/dist/mcp/handlers/docs.js +159 -0
  198. package/dist/mcp/handlers/docs.js.map +7 -0
  199. package/dist/mcp/handlers/edit-primitives.js +200 -0
  200. package/dist/mcp/handlers/edit-primitives.js.map +7 -0
  201. package/dist/mcp/handlers/git-context.js +286 -0
  202. package/dist/mcp/handlers/git-context.js.map +7 -0
  203. package/dist/mcp/handlers/memory.js +363 -0
  204. package/dist/mcp/handlers/memory.js.map +7 -0
  205. package/dist/mcp/handlers/patterns.js +310 -0
  206. package/dist/mcp/handlers/patterns.js.map +7 -0
  207. package/dist/mcp/handlers/security.js +699 -0
  208. package/dist/mcp/handlers/security.js.map +7 -0
  209. package/dist/mcp/handlers/utils.js +97 -0
  210. package/dist/mcp/handlers/utils.js.map +7 -0
  211. package/dist/mcp/handlers/watchmen.js +104 -0
  212. package/dist/mcp/handlers/watchmen.js.map +7 -0
  213. package/dist/mcp/handlers/wiki.js +242 -0
  214. package/dist/mcp/handlers/wiki.js.map +7 -0
  215. package/dist/mcp/server.js +72 -3
  216. package/dist/mcp/server.js.map +2 -2
  217. package/dist/mcp/tool-names.js +136 -10
  218. package/dist/mcp/tool-names.js.map +2 -2
  219. package/dist/mcp/tools.js +846 -3019
  220. package/dist/mcp/tools.js.map +3 -3
  221. package/dist/types.js.map +2 -2
  222. package/package.json +36 -10
package/README.md CHANGED
@@ -51,10 +51,39 @@ The result is fewer tool calls, less context used, and faster responses on compl
51
51
  | <h4>Token Optimization</h4> | |
52
52
  | 🗜️ **Shell Compression (KiroGraph-RTK opt-in module)** | Token-optimized command output (git, tests, linters, docker, AWS) — 60-90% savings |
53
53
  | 🪨 **Caveman Mode (KiroGraph-Caveman opt-in module)** 🪨 | Agent prose compression (lite → ultra) — fewer tokens on explanations without touching code |
54
+ | 📦 **General-purpose Compression (`kirograph_compress`, opt-in)** | On-demand compression tool for arbitrary text. Two engines: rtk-style structural filters for shell output (command-hinted), caveman grammar for prose. Five levels (lite → ultra). Reports inline savings. Inspired by [headroom](https://github.com/chopratejas/headroom). |
55
+ | 📥 **File Read Cache + CCR (`kirograph_read` / `kirograph_retrieve`, opt-in)** | `kirograph_read` caches files on first read — unchanged files return a ~13-token marker on subsequent reads. `kirograph_retrieve` (CCR) recovers the cached full content without a filesystem re-read. Prefix-stable markers enable KV cache hits on conversation context. Inspired by [lean-ctx](https://github.com/yvgude/lean-ctx) and [headroom](https://github.com/chopratejas/headroom). |
54
56
  | 📈 **Token Analytics (KiroGraph-Gain core module)** | Track cumulative savings from graph tools and shell compression over time |
55
57
  | <h4>Integration (KiroGraph-Integration core module)</h4> | |
56
58
  | 🔌 **Multi-tool Support** | Native Kiro + 32 experimental targets (Cursor, Copilot, Claude Code, Codex, Windsurf, Cline, and more) |
57
59
 
60
+ ## MCP Tool List Token Budget
61
+
62
+ Each enabled flag adds tools to the model context on every MCP call. Total with all flags: **126 tools · ~6,240 tok**.
63
+
64
+ | Flag | Tools | ~Tokens |
65
+ |------|------:|--------:|
66
+ | core (always-on) | 3 | ~170 |
67
+ | `enableNavigation` | 3 | ~120 |
68
+ | `enableMemory` | 16 | ~746 |
69
+ | `enableSecurity` | 15 | ~675 |
70
+ | `enableData` | 10 | ~519 |
71
+ | `enableWiki` | 10 | ~319 |
72
+ | `enableCodeHealth` | 25 | ~935 |
73
+ | `enableDocs` | 5 | ~241 |
74
+ | `enableAgentUtils` | 4 | ~278 |
75
+ | `enableArchitecture` | 5 | ~205 |
76
+ | `enableWatchmen` | 3 | ~140 |
77
+ | `enablePatterns` | 3 | ~93 |
78
+ | `trackCallSites` | 2 | ~84 |
79
+ | `enableGitContext` | 7 | ~410 |
80
+ | `enableComplexity` | 5 | ~660 |
81
+ | `enableEditPrimitives` | 5 | ~280 |
82
+ | `enableBranch` | 3 | ~300 |
83
+ | `enableShellExec` | 1 | ~71 |
84
+ | `enableGeneralCompression` | 1 | ~68 |
85
+ | **Total** | **126** | **~6,240** |
86
+
58
87
  ## Quick Start
59
88
 
60
89
  ```bash
@@ -152,9 +181,11 @@ KiroGraph is inspired by [CodeGraph](https://github.com/colbymchenry/codegraph)
152
181
  - [rtk](https://github.com/rtk-ai/rtk) by [rtk-ai](https://github.com/rtk-ai): the shell compression module's command-family approach and token-optimized output patterns.
153
182
  - [code-review-graph](https://github.com/tirth8205/code-review-graph) by [Tirth Kanani](https://github.com/tirth8205): community detection, execution flow tracing, refactoring tools, and multi-platform auto-detection patterns.
154
183
  - [lean-ctx](https://github.com/yvgude/lean-ctx) by [Yves Gugger](https://github.com/yvgude): file read caching, multiple read modes, and context budget governance concepts.
184
+ - [headroom](https://github.com/chopratejas/headroom) by [Tejas Chopra](https://github.com/chopratejas): the CCR (Cached Content Retrieval) pattern (`kirograph_retrieve`), dual-engine on-demand compression (`kirograph_compress`), and KV cache prefix stability via deterministic marker strings.
155
185
  - [turboquant-js](https://github.com/danilodevhub/turboquant-js) by [Danilo Dev](https://github.com/danilodevhub): the TurboQuant engine — TypeScript implementation of Google's Walsh-Hadamard + Lloyd-Max quantization algorithm used for embedding compression.
156
186
  - [turbovec](https://github.com/RyanCodrai/turbovec) by [Ryan Codrai](https://github.com/RyanCodrai): the TurboVec engine — Rust implementation of TurboQuant with SIMD acceleration, exposed to Node.js via a napi-rs native addon.
157
187
  - [pdf-inspector](https://github.com/firecrawl/pdf-inspector) by [Firecrawl](https://github.com/firecrawl): the PDF parser used in the data module — pure Rust, no OCR, no network, prebuilt binaries for linux-x64 and macOS ARM64.
188
+ - [tokensave](https://tokensave.dev): gap-close roadmap inspiration — code quality tools (complexity, god class, recursion, doc coverage), git workflow context tools (diff_context, commit_context, test_map), atomic edit primitives, multi-branch indexing, per-call token metrics, and MCP protocol annotations (`readOnlyHint`, `alwaysLoad`).
158
189
 
159
190
  ### Contributors
160
191
 
@@ -163,7 +194,7 @@ KiroGraph is inspired by [CodeGraph](https://github.com/colbymchenry/codegraph)
163
194
 
164
195
  ## How It Compares
165
196
 
166
- KiroGraph combines capabilities from 13 separate projects into one integrated MCP server:
197
+ KiroGraph combines capabilities from 14 separate projects into one integrated MCP server:
167
198
 
168
199
  | Capability | Inspired by | What KiroGraph adds |
169
200
  |-----------|-------------|---------------------|
@@ -177,11 +208,13 @@ KiroGraph combines capabilities from 13 separate projects into one integrated MC
177
208
  | PDF parsing | [pdf-inspector](https://github.com/firecrawl/pdf-inspector) | Pure Rust, no OCR/network, prebuilt binaries, piped into data module |
178
209
  | Shell compression | [rtk](https://github.com/rtk-ai/rtk) | Integrated as MCP tool, no separate binary |
179
210
  | Prose compression | [caveman](https://github.com/JuliusBrussee/caveman) | Multi-level (lite/full/ultra) via steering |
211
+ | On-demand compression + CCR | [headroom](https://github.com/chopratejas/headroom) | Dual-engine (rtk shell + caveman prose) via `kirograph_compress`; CCR pattern via `kirograph_retrieve`; KV-cache prefix stability |
180
212
  | Embedding compression | [turboquant-js](https://github.com/danilodevhub/turboquant-js) | 9 engine options, SIMD Rust variant, 20–30× RAM savings |
181
213
  | SIMD vector search | [turbovec](https://github.com/RyanCodrai/turbovec) | NEON on ARM64, AVX-512BW on x86, auto-built by installer |
182
214
  | Context layer | [lean-ctx](https://github.com/yvgude/lean-ctx) | File caching, read modes, budget governance |
215
+ | Gap-close roadmap | [tokensave](https://tokensave.dev) | Code quality metrics, git context tools, atomic edit primitives, multi-branch indexing |
183
216
 
184
- See the [full comparison](docs/guide/comparison.md) for a detailed feature matrix against CodeGraph, code-review-graph, jCodeMunch, and others.
217
+ See the [full comparison](docs/guide/comparison.md) for a detailed feature matrix against CodeGraph, code-review-graph, jCodeMunch, tokensave, and others.
185
218
 
186
219
  ## Star History
187
220
 
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var annotations_exports = {};
30
+ __export(annotations_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(annotations_exports);
34
+ var path = __toESM(require("path"));
35
+ async function runTool(target, toolName, args) {
36
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
37
+ const { ToolHandler } = await Promise.resolve().then(() => require("../../mcp/handler.js"));
38
+ const cg = await KiroGraph.open(target);
39
+ const handler = new ToolHandler(cg);
40
+ const result = await handler.handle(toolName, { ...args, projectPath: target });
41
+ cg.close();
42
+ const text = result.content.map((c) => c.text).join("");
43
+ console.log(text);
44
+ }
45
+ function register(program) {
46
+ program.command("annotations [projectPath]").description("Decorator/attribute histogram across the codebase").option("--decorator <name>", "Filter by decorator name").option("--limit <n>", "Max results", "20").action(async (projectPath, opts) => {
47
+ const target = path.resolve(projectPath ?? process.cwd());
48
+ const limit = parseInt(opts.limit) || 20;
49
+ await runTool(target, "kirograph_annotations", { decorator: opts.decorator, limit });
50
+ });
51
+ }
52
+ // Annotate the CommonJS export names for ESM import in node:
53
+ 0 && (module.exports = {
54
+ register
55
+ });
56
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/annotations.ts"],
4
+ "sourcesContent": ["import * as path from 'path';\nimport { Command } from 'commander';\nimport { dim, reset, violet, bold } from '../ui';\n\nasync function runTool(target: string, toolName: string, args: Record<string, unknown>): Promise<void> {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const { ToolHandler } = (await Promise.resolve().then(() => require('../../mcp/handler.js'))) as any;\n const cg = await KiroGraph.open(target);\n const handler = new ToolHandler(cg);\n const result = await handler.handle(toolName, { ...args, projectPath: target });\n cg.close();\n const text: string = result.content.map((c: any) => c.text).join('');\n console.log(text);\n}\n\nexport function register(program: Command): void {\n program\n .command('annotations [projectPath]')\n .description('Decorator/attribute histogram across the codebase')\n .option('--decorator <name>', 'Filter by decorator name')\n .option('--limit <n>', 'Max results', '20')\n .action(async (projectPath: string | undefined, opts: { decorator?: string; limit: string }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const limit = parseInt(opts.limit) || 20;\n await runTool(target, 'kirograph_annotations', { decorator: opts.decorator, limit });\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAsB;AAItB,eAAe,QAAQ,QAAgB,UAAkB,MAA8C;AACrG,QAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,QAAM,EAAE,YAAY,IAAK,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,sBAAsB,CAAC;AAC3F,QAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,QAAM,UAAU,IAAI,YAAY,EAAE;AAClC,QAAM,SAAS,MAAM,QAAQ,OAAO,UAAU,EAAE,GAAG,MAAM,aAAa,OAAO,CAAC;AAC9E,KAAG,MAAM;AACT,QAAM,OAAe,OAAO,QAAQ,IAAI,CAAC,MAAW,EAAE,IAAI,EAAE,KAAK,EAAE;AACnE,UAAQ,IAAI,IAAI;AAClB;AAEO,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,2BAA2B,EACnC,YAAY,mDAAmD,EAC/D,OAAO,sBAAsB,0BAA0B,EACvD,OAAO,eAAe,eAAe,IAAI,EACzC,OAAO,OAAO,aAAiC,SAAgD;AAC9F,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,QAAQ,SAAS,KAAK,KAAK,KAAK;AACtC,UAAM,QAAQ,QAAQ,yBAAyB,EAAE,WAAW,KAAK,WAAW,MAAM,CAAC;AAAA,EACrF,CAAC;AACL;",
6
+ "names": []
7
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var ast_rewrite_exports = {};
30
+ __export(ast_rewrite_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(ast_rewrite_exports);
34
+ var path = __toESM(require("path"));
35
+ async function runTool(target, toolName, args) {
36
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
37
+ const { ToolHandler } = await Promise.resolve().then(() => require("../../mcp/handler.js"));
38
+ const cg = await KiroGraph.open(target);
39
+ const handler = new ToolHandler(cg);
40
+ const result = await handler.handle(toolName, { ...args, projectPath: target });
41
+ cg.close();
42
+ const text = result.content.map((c) => c.text).join("");
43
+ console.log(text);
44
+ }
45
+ function register(program) {
46
+ program.command("ast-rewrite <file> <pattern> <rewrite> [projectPath]").description("Structural rewrite via ast-grep (requires ast-grep on PATH)").action(async (file, pattern, rewrite, projectPath) => {
47
+ const target = path.resolve(projectPath ?? process.cwd());
48
+ await runTool(target, "kirograph_ast_grep_rewrite", { file, pattern, rewrite });
49
+ });
50
+ }
51
+ // Annotate the CommonJS export names for ESM import in node:
52
+ 0 && (module.exports = {
53
+ register
54
+ });
55
+ //# sourceMappingURL=ast-rewrite.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/ast-rewrite.ts"],
4
+ "sourcesContent": ["import * as path from 'path';\nimport { Command } from 'commander';\nimport { dim, reset, violet, bold } from '../ui';\n\nasync function runTool(target: string, toolName: string, args: Record<string, unknown>): Promise<void> {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const { ToolHandler } = (await Promise.resolve().then(() => require('../../mcp/handler.js'))) as any;\n const cg = await KiroGraph.open(target);\n const handler = new ToolHandler(cg);\n const result = await handler.handle(toolName, { ...args, projectPath: target });\n cg.close();\n const text: string = result.content.map((c: any) => c.text).join('');\n console.log(text);\n}\n\nexport function register(program: Command): void {\n program\n .command('ast-rewrite <file> <pattern> <rewrite> [projectPath]')\n .description('Structural rewrite via ast-grep (requires ast-grep on PATH)')\n .action(async (file: string, pattern: string, rewrite: string, projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n await runTool(target, 'kirograph_ast_grep_rewrite', { file, pattern, rewrite });\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAsB;AAItB,eAAe,QAAQ,QAAgB,UAAkB,MAA8C;AACrG,QAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,QAAM,EAAE,YAAY,IAAK,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,sBAAsB,CAAC;AAC3F,QAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,QAAM,UAAU,IAAI,YAAY,EAAE;AAClC,QAAM,SAAS,MAAM,QAAQ,OAAO,UAAU,EAAE,GAAG,MAAM,aAAa,OAAO,CAAC;AAC9E,KAAG,MAAM;AACT,QAAM,OAAe,OAAO,QAAQ,IAAI,CAAC,MAAW,EAAE,IAAI,EAAE,KAAK,EAAE;AACnE,UAAQ,IAAI,IAAI;AAClB;AAEO,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,sDAAsD,EAC9D,YAAY,6DAA6D,EACzE,OAAO,OAAO,MAAc,SAAiB,SAAiB,gBAAoC;AACjG,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,QAAQ,QAAQ,8BAA8B,EAAE,MAAM,SAAS,QAAQ,CAAC;AAAA,EAChF,CAAC;AACL;",
6
+ "names": []
7
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var bench_exports = {};
30
+ __export(bench_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(bench_exports);
34
+ var path = __toESM(require("path"));
35
+ var fs = __toESM(require("fs"));
36
+ var import_ui = require("../ui");
37
+ const BENCH_QUERIES = [
38
+ { label: "context:large-task", tool: "context", task: "Understand the main entry point and core data flow" },
39
+ { label: "context:small-task", tool: "context", task: "Find authentication logic" },
40
+ { label: "search:function", tool: "search", query: "handle" }
41
+ ];
42
+ function register(program) {
43
+ program.command("bench [projectPath]").description("Quick token-efficiency benchmark on the current project").option("--quiet", "Output only the summary line").action(async (projectPath, opts) => {
44
+ const target = path.resolve(projectPath ?? process.cwd());
45
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
46
+ if (!KiroGraph.isInitialized(target)) {
47
+ console.error("Project not indexed. Run: kirograph index");
48
+ process.exit(1);
49
+ }
50
+ const cg = await KiroGraph.open(target);
51
+ const allNodes = cg.getAllNodes();
52
+ const sourceFiles = [...new Set(allNodes.map((n) => n.filePath))];
53
+ let naiveTokens = 0;
54
+ for (const fp of sourceFiles) {
55
+ try {
56
+ const fullPath = path.join(target, fp);
57
+ naiveTokens += Math.round(fs.statSync(fullPath).size / 4);
58
+ } catch {
59
+ }
60
+ }
61
+ if (!opts.quiet) {
62
+ console.log("\n KiroGraph Local Bench");
63
+ console.log(" " + import_ui.dim + sourceFiles.length + " source files, ~" + naiveTokens.toLocaleString() + " naive tokens" + import_ui.reset);
64
+ console.log("");
65
+ }
66
+ let totalGraphTokens = 0;
67
+ let queryCount = 0;
68
+ for (const q of BENCH_QUERIES) {
69
+ const start = Date.now();
70
+ let responseText = "";
71
+ try {
72
+ if (q.tool === "context") {
73
+ const ctx = await cg.buildContext(q.task, { maxNodes: 20, includeCode: true });
74
+ responseText = ctx.summary + ctx.entryPoints.map((n) => n.name).join(" ");
75
+ for (const [, code] of ctx.codeSnippets) responseText += code;
76
+ } else {
77
+ const results = cg.searchNodes(q.query, void 0, 20);
78
+ responseText = results.map((r) => r.node.name + " " + r.node.filePath).join("\n");
79
+ }
80
+ } catch {
81
+ }
82
+ const graphTok = Math.round(responseText.length / 4);
83
+ totalGraphTokens += graphTok;
84
+ queryCount++;
85
+ const ms = Date.now() - start;
86
+ if (!opts.quiet) {
87
+ const savings = naiveTokens > 0 ? Math.round((1 - graphTok / naiveTokens) * 100) : 0;
88
+ console.log(" " + q.label + ": " + graphTok + " tok (" + savings + "% savings, " + ms + "ms)");
89
+ }
90
+ }
91
+ cg.close();
92
+ const avgTok = Math.round(totalGraphTokens / queryCount);
93
+ const avgSavings = naiveTokens > 0 ? Math.round((1 - avgTok / naiveTokens) * 100) : 0;
94
+ console.log("");
95
+ console.log(" avg " + avgSavings + "% token savings vs naive file reading");
96
+ console.log("");
97
+ });
98
+ }
99
+ // Annotate the CommonJS export names for ESM import in node:
100
+ 0 && (module.exports = {
101
+ register
102
+ });
103
+ //# sourceMappingURL=bench.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/bench.ts"],
4
+ "sourcesContent": ["import * as path from 'path';\nimport * as fs from 'fs';\nimport { Command } from 'commander';\nimport { dim, reset } from '../ui';\n\nconst BENCH_QUERIES = [\n { label: 'context:large-task', tool: 'context', task: 'Understand the main entry point and core data flow' },\n { label: 'context:small-task', tool: 'context', task: 'Find authentication logic' },\n { label: 'search:function', tool: 'search', query: 'handle' },\n];\n\nexport function register(program: Command): void {\n program.command('bench [projectPath]')\n .description('Quick token-efficiency benchmark on the current project')\n .option('--quiet', 'Output only the summary line')\n .action(async (projectPath: string | undefined, opts: { quiet?: boolean }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error('Project not indexed. Run: kirograph index');\n process.exit(1);\n }\n const cg = await KiroGraph.open(target);\n\n // Estimate naive token cost: sum all source file sizes / 4\n const allNodes = cg.getAllNodes();\n const sourceFiles = [...new Set(allNodes.map((n: any) => n.filePath as string))];\n let naiveTokens = 0;\n for (const fp of sourceFiles) {\n try {\n const fullPath = path.join(target, fp);\n naiveTokens += Math.round(fs.statSync(fullPath).size / 4);\n } catch { /* skip */ }\n }\n\n if (!opts.quiet) {\n console.log('\\n KiroGraph Local Bench');\n console.log(' ' + dim + sourceFiles.length + ' source files, ~' + naiveTokens.toLocaleString() + ' naive tokens' + reset);\n console.log('');\n }\n\n let totalGraphTokens = 0;\n let queryCount = 0;\n for (const q of BENCH_QUERIES) {\n const start = Date.now();\n let responseText = '';\n try {\n if (q.tool === 'context') {\n const ctx = await cg.buildContext(q.task as string, { maxNodes: 20, includeCode: true });\n responseText = ctx.summary + ctx.entryPoints.map((n: any) => n.name).join(' ');\n for (const [, code] of ctx.codeSnippets) responseText += code;\n } else {\n const results = cg.searchNodes(q.query as string, undefined, 20);\n responseText = results.map((r: any) => r.node.name + ' ' + r.node.filePath).join('\\n');\n }\n } catch { /* skip */ }\n const graphTok = Math.round(responseText.length / 4);\n totalGraphTokens += graphTok;\n queryCount++;\n const ms = Date.now() - start;\n if (!opts.quiet) {\n const savings = naiveTokens > 0 ? Math.round((1 - graphTok / naiveTokens) * 100) : 0;\n console.log(' ' + q.label + ': ' + graphTok + ' tok (' + savings + '% savings, ' + ms + 'ms)');\n }\n }\n cg.close();\n\n const avgTok = Math.round(totalGraphTokens / queryCount);\n const avgSavings = naiveTokens > 0 ? Math.round((1 - avgTok / naiveTokens) * 100) : 0;\n console.log('');\n console.log(' avg ' + avgSavings + '% token savings vs naive file reading');\n console.log('');\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var branch_exports = {};
30
+ __export(branch_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(branch_exports);
34
+ var path = __toESM(require("path"));
35
+ async function runTool(target, toolName, args) {
36
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
37
+ const { ToolHandler } = await Promise.resolve().then(() => require("../../mcp/handler.js"));
38
+ const cg = await KiroGraph.open(target);
39
+ const handler = new ToolHandler(cg);
40
+ const result = await handler.handle(toolName, { ...args, projectPath: target });
41
+ cg.close();
42
+ const text = result.content.map((c) => c.text).join("");
43
+ console.log(text);
44
+ }
45
+ async function getBranchManager() {
46
+ try {
47
+ return await Promise.resolve().then(() => require("../../core/branch-manager.js"));
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+ function register(program) {
53
+ const branch = program.command("branch").description("Multi-branch graph management");
54
+ branch.command("list [projectPath]").description("List tracked branches").action(async (projectPath) => {
55
+ const target = path.resolve(projectPath ?? process.cwd());
56
+ const bm = await getBranchManager();
57
+ if (!bm) {
58
+ console.error(" Branch manager not available in this build.");
59
+ process.exit(1);
60
+ }
61
+ const branches = bm.listTrackedBranches(target);
62
+ const current = bm.getCurrentGitBranch(target);
63
+ if (branches.length === 0) {
64
+ console.log(" No tracked branches. Use: kirograph branch add [name]");
65
+ return;
66
+ }
67
+ console.log(" Tracked branches (current git branch: " + current + "):");
68
+ for (const b of branches) {
69
+ const size = b.sizeBytes > 1048576 ? (b.sizeBytes / 1048576).toFixed(1) + " MB" : Math.round(b.sizeBytes / 1024) + " KB";
70
+ const sync = new Date(b.mtimeMs).toISOString().slice(0, 19);
71
+ console.log(" * " + b.name + " " + size + " synced " + sync);
72
+ }
73
+ });
74
+ branch.command("add [branchName] [projectPath]").description("Start tracking a branch").action(async (branchName, projectPath) => {
75
+ const target = path.resolve(projectPath ?? process.cwd());
76
+ const bm = await getBranchManager();
77
+ if (!bm) {
78
+ console.error(" Branch manager not available in this build.");
79
+ process.exit(1);
80
+ }
81
+ const name = branchName ?? bm.getCurrentGitBranch(target);
82
+ try {
83
+ const r = bm.addBranch(target, name);
84
+ if (r.created) {
85
+ console.log(" Tracking branch " + name + " \u2192 " + r.dbPath);
86
+ console.log(" Run kirograph sync to populate.");
87
+ } else {
88
+ console.log(" Already tracking branch: " + name);
89
+ }
90
+ } catch (err) {
91
+ console.error(" Error: " + err.message);
92
+ process.exit(1);
93
+ }
94
+ });
95
+ branch.command("remove <branchName> [projectPath]").description("Stop tracking a branch").action(async (branchName, projectPath) => {
96
+ const target = path.resolve(projectPath ?? process.cwd());
97
+ const bm = await getBranchManager();
98
+ if (!bm) {
99
+ console.error(" Branch manager not available in this build.");
100
+ process.exit(1);
101
+ }
102
+ const removed = bm.removeBranch(target, branchName);
103
+ console.log(removed ? " Removed branch: " + branchName : " Branch not tracked: " + branchName);
104
+ });
105
+ branch.command("gc [projectPath]").description("Remove DBs for deleted git branches").action(async (projectPath) => {
106
+ const target = path.resolve(projectPath ?? process.cwd());
107
+ const bm = await getBranchManager();
108
+ if (!bm) {
109
+ console.error(" Branch manager not available in this build.");
110
+ process.exit(1);
111
+ }
112
+ const removed = bm.gcBranches(target);
113
+ if (removed.length === 0) {
114
+ console.log(" Nothing to clean up.");
115
+ return;
116
+ }
117
+ for (const name of removed) console.log(" Removed: " + name);
118
+ console.log(" Cleaned " + removed.length + " branch(es).");
119
+ });
120
+ branch.command("diff <branchA> [branchB] [projectPath]").description("Diff symbols between two tracked branches").action(async (branchA, branchB, projectPath) => {
121
+ const target = path.resolve(projectPath ?? process.cwd());
122
+ await runTool(target, "kirograph_branch_diff", { branchA, branchB: branchB ?? "main" });
123
+ });
124
+ branch.command("search <query> <branchName> [projectPath]").description("Search symbols in a tracked branch").action(async (query, branchName, projectPath) => {
125
+ const target = path.resolve(projectPath ?? process.cwd());
126
+ await runTool(target, "kirograph_branch_search", { query, branch: branchName });
127
+ });
128
+ }
129
+ // Annotate the CommonJS export names for ESM import in node:
130
+ 0 && (module.exports = {
131
+ register
132
+ });
133
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/branch.ts"],
4
+ "sourcesContent": ["import * as path from 'path';\nimport { Command } from 'commander';\n\nasync function runTool(target: string, toolName: string, args: Record<string, unknown>): Promise<void> {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const { ToolHandler } = (await Promise.resolve().then(() => require('../../mcp/handler.js'))) as any;\n const cg = await KiroGraph.open(target);\n const handler = new ToolHandler(cg);\n const result = await handler.handle(toolName, { ...args, projectPath: target });\n cg.close();\n const text: string = result.content.map((c: any) => c.text).join('');\n console.log(text);\n}\n\nasync function getBranchManager() {\n try {\n return await Promise.resolve().then(() => require('../../core/branch-manager.js')) as any;\n } catch {\n return null;\n }\n}\n\nexport function register(program: Command): void {\n const branch = program.command('branch').description('Multi-branch graph management');\n\n branch.command('list [projectPath]').description('List tracked branches').action(async (projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const bm = await getBranchManager();\n if (!bm) {\n console.error(' Branch manager not available in this build.');\n process.exit(1);\n }\n const branches = bm.listTrackedBranches(target);\n const current = bm.getCurrentGitBranch(target);\n if (branches.length === 0) {\n console.log(' No tracked branches. Use: kirograph branch add [name]');\n return;\n }\n console.log(' Tracked branches (current git branch: ' + current + '):');\n for (const b of branches) {\n const size = b.sizeBytes > 1048576 ? (b.sizeBytes / 1048576).toFixed(1) + ' MB' : Math.round(b.sizeBytes / 1024) + ' KB';\n const sync = new Date(b.mtimeMs).toISOString().slice(0, 19);\n console.log(' * ' + b.name + ' ' + size + ' synced ' + sync);\n }\n });\n\n branch.command('add [branchName] [projectPath]').description('Start tracking a branch').action(async (branchName: string | undefined, projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const bm = await getBranchManager();\n if (!bm) {\n console.error(' Branch manager not available in this build.');\n process.exit(1);\n }\n const name = branchName ?? bm.getCurrentGitBranch(target);\n try {\n const r = bm.addBranch(target, name);\n if (r.created) {\n console.log(' Tracking branch ' + name + ' \u2192 ' + r.dbPath);\n console.log(' Run kirograph sync to populate.');\n } else {\n console.log(' Already tracking branch: ' + name);\n }\n } catch (err: any) {\n console.error(' Error: ' + err.message);\n process.exit(1);\n }\n });\n\n branch.command('remove <branchName> [projectPath]').description('Stop tracking a branch').action(async (branchName: string, projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const bm = await getBranchManager();\n if (!bm) {\n console.error(' Branch manager not available in this build.');\n process.exit(1);\n }\n const removed = bm.removeBranch(target, branchName);\n console.log(removed ? ' Removed branch: ' + branchName : ' Branch not tracked: ' + branchName);\n });\n\n branch.command('gc [projectPath]').description('Remove DBs for deleted git branches').action(async (projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const bm = await getBranchManager();\n if (!bm) {\n console.error(' Branch manager not available in this build.');\n process.exit(1);\n }\n const removed = bm.gcBranches(target);\n if (removed.length === 0) { console.log(' Nothing to clean up.'); return; }\n for (const name of removed) console.log(' Removed: ' + name);\n console.log(' Cleaned ' + removed.length + ' branch(es).');\n });\n\n branch.command('diff <branchA> [branchB] [projectPath]').description('Diff symbols between two tracked branches').action(async (branchA: string, branchB: string | undefined, projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n await runTool(target, 'kirograph_branch_diff', { branchA, branchB: branchB ?? 'main' });\n });\n\n branch.command('search <query> <branchName> [projectPath]').description('Search symbols in a tracked branch').action(async (query: string, branchName: string, projectPath: string | undefined) => {\n const target = path.resolve(projectPath ?? process.cwd());\n await runTool(target, 'kirograph_branch_search', { query, branch: branchName });\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var callees_exports = {};
30
+ __export(callees_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(callees_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_ui = require("../ui");
36
+ function register(program) {
37
+ program.command("callees <symbol>").description("List symbols called by a given function or method").option("--limit <n>", "Max results (default: 20)", "20").option("-j, --json", "Output as JSON").option("-p, --path <path>", "Project path").action(async (symbol, opts) => {
38
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
39
+ const target = path.resolve(opts.path ?? process.cwd());
40
+ const cg = await KiroGraph.open(target);
41
+ const results = cg.searchNodes(symbol, void 0, 5);
42
+ if (results.length === 0) {
43
+ console.error(` \u2716 Symbol "${symbol}" not found in index.`);
44
+ cg.close();
45
+ process.exit(1);
46
+ }
47
+ const node = results[0].node;
48
+ const limit = Math.max(1, Math.min(100, parseInt(opts.limit) || 20));
49
+ const callees = await cg.getCallees(node.id, limit);
50
+ if (opts.json) {
51
+ console.log(JSON.stringify({ symbol: node.name, callees }));
52
+ cg.close();
53
+ return;
54
+ }
55
+ if (callees.length === 0) {
56
+ console.log(`
57
+ ${import_ui.dim}\`${node.name}\` doesn't call any indexed symbols.${import_ui.reset}
58
+ `);
59
+ cg.close();
60
+ return;
61
+ }
62
+ console.log(`
63
+ ${import_ui.violet}${import_ui.bold}\`${node.name}\` calls${import_ui.reset} ${import_ui.dim}(${callees.length})${import_ui.reset}
64
+ `);
65
+ for (const n of callees) {
66
+ console.log(` ${import_ui.violet}${n.name}${import_ui.reset} ${import_ui.dim}${n.kind} ${n.filePath}:${n.startLine}${import_ui.reset}`);
67
+ }
68
+ console.log();
69
+ cg.close();
70
+ });
71
+ }
72
+ // Annotate the CommonJS export names for ESM import in node:
73
+ 0 && (module.exports = {
74
+ register
75
+ });
76
+ //# sourceMappingURL=callees.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/callees.ts"],
4
+ "sourcesContent": ["import * as path from 'path';\nimport { Command } from 'commander';\nimport { bold, dim, reset, violet } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('callees <symbol>')\n .description('List symbols called by a given function or method')\n .option('--limit <n>', 'Max results (default: 20)', '20')\n .option('-j, --json', 'Output as JSON')\n .option('-p, --path <path>', 'Project path')\n .action(async (symbol: string, opts: { limit: string; json?: boolean; path?: string }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(opts.path ?? process.cwd());\n const cg = await KiroGraph.open(target);\n\n const results = cg.searchNodes(symbol, undefined, 5);\n if (results.length === 0) {\n console.error(` \u2716 Symbol \"${symbol}\" not found in index.`);\n cg.close(); process.exit(1);\n }\n\n const node = results[0].node;\n const limit = Math.max(1, Math.min(100, parseInt(opts.limit) || 20));\n const callees = await cg.getCallees(node.id, limit);\n\n if (opts.json) {\n console.log(JSON.stringify({ symbol: node.name, callees }));\n cg.close(); return;\n }\n\n if (callees.length === 0) {\n console.log(`\\n ${dim}\\`${node.name}\\` doesn't call any indexed symbols.${reset}\\n`);\n cg.close(); return;\n }\n\n console.log(`\\n ${violet}${bold}\\`${node.name}\\` calls${reset} ${dim}(${callees.length})${reset}\\n`);\n for (const n of callees) {\n console.log(` ${violet}${n.name}${reset} ${dim}${n.kind} ${n.filePath}:${n.startLine}${reset}`);\n }\n console.log();\n cg.close();\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAsB;AAEtB,gBAAyC;AAElC,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,kBAAkB,EAC1B,YAAY,mDAAmD,EAC/D,OAAO,eAAe,6BAA6B,IAAI,EACvD,OAAO,cAAc,gBAAgB,EACrC,OAAO,qBAAqB,cAAc,EAC1C,OAAO,OAAO,QAAgB,SAA2D;AACxF,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,QAAQ,IAAI,CAAC;AACtD,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AAEtC,UAAM,UAAU,GAAG,YAAY,QAAQ,QAAW,CAAC;AACnD,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,MAAM,oBAAe,MAAM,uBAAuB;AAC1D,SAAG,MAAM;AAAG,cAAQ,KAAK,CAAC;AAAA,IAC5B;AAEA,UAAM,OAAO,QAAQ,CAAC,EAAE;AACxB,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS,KAAK,KAAK,KAAK,EAAE,CAAC;AACnE,UAAM,UAAU,MAAM,GAAG,WAAW,KAAK,IAAI,KAAK;AAElD,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,KAAK,MAAM,QAAQ,CAAC,CAAC;AAC1D,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI;AAAA,IAAO,aAAG,KAAK,KAAK,IAAI,uCAAuC,eAAK;AAAA,CAAI;AACpF,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,YAAQ,IAAI;AAAA,IAAO,gBAAM,GAAG,cAAI,KAAK,KAAK,IAAI,WAAW,eAAK,KAAK,aAAG,IAAI,QAAQ,MAAM,IAAI,eAAK;AAAA,CAAI;AACrG,eAAW,KAAK,SAAS;AACvB,cAAQ,IAAI,KAAK,gBAAM,GAAG,EAAE,IAAI,GAAG,eAAK,KAAK,aAAG,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,SAAS,GAAG,eAAK,EAAE;AAAA,IACnG;AACA,YAAQ,IAAI;AACZ,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
6
+ "names": []
7
+ }