kirograph 0.27.0 → 0.27.2

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 (101) hide show
  1. package/README.md +27 -1
  2. package/dist/bin/commands/callees.js +76 -0
  3. package/dist/bin/commands/callees.js.map +7 -0
  4. package/dist/bin/commands/callers.js +76 -0
  5. package/dist/bin/commands/callers.js.map +7 -0
  6. package/dist/bin/commands/circular-deps.js +68 -0
  7. package/dist/bin/commands/circular-deps.js.map +7 -0
  8. package/dist/bin/commands/help.js +8 -3
  9. package/dist/bin/commands/help.js.map +2 -2
  10. package/dist/bin/commands/hook.js +242 -0
  11. package/dist/bin/commands/hook.js.map +7 -0
  12. package/dist/bin/commands/impact.js +76 -0
  13. package/dist/bin/commands/impact.js.map +7 -0
  14. package/dist/bin/commands/init.js.map +2 -2
  15. package/dist/bin/commands/type-hierarchy.js +76 -0
  16. package/dist/bin/commands/type-hierarchy.js.map +7 -0
  17. package/dist/bin/installer/common.js +15 -9
  18. package/dist/bin/installer/common.js.map +2 -2
  19. package/dist/bin/installer/config-prompt.js +16 -4
  20. package/dist/bin/installer/config-prompt.js.map +2 -2
  21. package/dist/bin/installer/index.js +37 -5
  22. package/dist/bin/installer/index.js.map +2 -2
  23. package/dist/bin/installer/instructions.js +14 -21
  24. package/dist/bin/installer/instructions.js.map +2 -2
  25. package/dist/bin/installer/mcp.js.map +2 -2
  26. package/dist/bin/installer/steering.js +38 -0
  27. package/dist/bin/installer/steering.js.map +2 -2
  28. package/dist/bin/installer/targets/aider.js +3 -3
  29. package/dist/bin/installer/targets/aider.js.map +2 -2
  30. package/dist/bin/installer/targets/amp.js +3 -3
  31. package/dist/bin/installer/targets/amp.js.map +2 -2
  32. package/dist/bin/installer/targets/antigravity.js +4 -4
  33. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  34. package/dist/bin/installer/targets/augment.js +3 -3
  35. package/dist/bin/installer/targets/augment.js.map +2 -2
  36. package/dist/bin/installer/targets/claude.js +3 -3
  37. package/dist/bin/installer/targets/claude.js.map +2 -2
  38. package/dist/bin/installer/targets/cline.js +4 -4
  39. package/dist/bin/installer/targets/cline.js.map +2 -2
  40. package/dist/bin/installer/targets/codex.js +4 -4
  41. package/dist/bin/installer/targets/codex.js.map +2 -2
  42. package/dist/bin/installer/targets/continue.js +4 -4
  43. package/dist/bin/installer/targets/continue.js.map +2 -2
  44. package/dist/bin/installer/targets/copilot-cli.js +4 -4
  45. package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
  46. package/dist/bin/installer/targets/copilot.js +4 -4
  47. package/dist/bin/installer/targets/copilot.js.map +2 -2
  48. package/dist/bin/installer/targets/cursor.js +5 -5
  49. package/dist/bin/installer/targets/cursor.js.map +2 -2
  50. package/dist/bin/installer/targets/devin.js +4 -4
  51. package/dist/bin/installer/targets/devin.js.map +2 -2
  52. package/dist/bin/installer/targets/gemini-cli.js +4 -4
  53. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  54. package/dist/bin/installer/targets/generic.js +2 -2
  55. package/dist/bin/installer/targets/generic.js.map +2 -2
  56. package/dist/bin/installer/targets/goose.js +3 -4
  57. package/dist/bin/installer/targets/goose.js.map +3 -3
  58. package/dist/bin/installer/targets/index.js.map +1 -1
  59. package/dist/bin/installer/targets/junie.js +4 -4
  60. package/dist/bin/installer/targets/junie.js.map +2 -2
  61. package/dist/bin/installer/targets/kilo.js +4 -4
  62. package/dist/bin/installer/targets/kilo.js.map +2 -2
  63. package/dist/bin/installer/targets/kiro.js +23 -3
  64. package/dist/bin/installer/targets/kiro.js.map +2 -2
  65. package/dist/bin/installer/targets/opencode.js +3 -3
  66. package/dist/bin/installer/targets/opencode.js.map +2 -2
  67. package/dist/bin/installer/targets/openhands.js +3 -3
  68. package/dist/bin/installer/targets/openhands.js.map +2 -2
  69. package/dist/bin/installer/targets/qoder.js +2 -2
  70. package/dist/bin/installer/targets/qoder.js.map +2 -2
  71. package/dist/bin/installer/targets/qwen.js +2 -2
  72. package/dist/bin/installer/targets/qwen.js.map +2 -2
  73. package/dist/bin/installer/targets/replit.js +3 -3
  74. package/dist/bin/installer/targets/replit.js.map +2 -2
  75. package/dist/bin/installer/targets/roo.js +4 -4
  76. package/dist/bin/installer/targets/roo.js.map +2 -2
  77. package/dist/bin/installer/targets/tabnine.js +3 -3
  78. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  79. package/dist/bin/installer/targets/trae.js +3 -3
  80. package/dist/bin/installer/targets/trae.js.map +2 -2
  81. package/dist/bin/installer/targets/warp.js +4 -4
  82. package/dist/bin/installer/targets/warp.js.map +2 -2
  83. package/dist/bin/installer/targets/windsurf.js +4 -4
  84. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  85. package/dist/bin/kirograph.js +13 -1
  86. package/dist/bin/kirograph.js.map +3 -3
  87. package/dist/config.js +4 -0
  88. package/dist/config.js.map +2 -2
  89. package/dist/hooks/import-prompt.js +75 -0
  90. package/dist/hooks/import-prompt.js.map +7 -0
  91. package/dist/hooks/manager.js +124 -0
  92. package/dist/hooks/manager.js.map +7 -0
  93. package/dist/hooks/prompt.js +296 -0
  94. package/dist/hooks/prompt.js.map +7 -0
  95. package/dist/mcp/cache.js +1 -1
  96. package/dist/mcp/cache.js.map +2 -2
  97. package/dist/mcp/tool-names.js +43 -4
  98. package/dist/mcp/tool-names.js.map +2 -2
  99. package/dist/mcp/tools.js +774 -182
  100. package/dist/mcp/tools.js.map +3 -3
  101. package/package.json +1 -1
package/README.md CHANGED
@@ -51,10 +51,34 @@ 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: **92 tools · ~4,367 tok**.
63
+
64
+ | Flag | Tools | ~Tokens |
65
+ |------|------:|--------:|
66
+ | core (always-on) | 8 | ~472 |
67
+ | `enableMemory` | 16 | ~746 |
68
+ | `enableSecurity` | 15 | ~675 |
69
+ | `enableData` | 10 | ~519 |
70
+ | `enableWiki` | 10 | ~319 |
71
+ | `enableCodeHealth` | 7 | ~309 |
72
+ | `enableAgentUtils` | 4 | ~278 |
73
+ | `enableAdvancedAnalysis` | 4 | ~210 |
74
+ | `enableArchitecture` | 3 | ~142 |
75
+ | `enableWatchmen` | 3 | ~140 |
76
+ | `enablePatterns` | 3 | ~93 |
77
+ | `trackCallSites` | 2 | ~84 |
78
+ | `enableShellExec` | 1 | ~71 |
79
+ | `enableGeneralCompression` | 1 | ~68 |
80
+ | **Total** | **92** | **~4,367** |
81
+
58
82
  ## Quick Start
59
83
 
60
84
  ```bash
@@ -152,6 +176,7 @@ KiroGraph is inspired by [CodeGraph](https://github.com/colbymchenry/codegraph)
152
176
  - [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
177
  - [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
178
  - [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.
179
+ - [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
180
  - [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
181
  - [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
182
  - [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.
@@ -163,7 +188,7 @@ KiroGraph is inspired by [CodeGraph](https://github.com/colbymchenry/codegraph)
163
188
 
164
189
  ## How It Compares
165
190
 
166
- KiroGraph combines capabilities from 13 separate projects into one integrated MCP server:
191
+ KiroGraph combines capabilities from 14 separate projects into one integrated MCP server:
167
192
 
168
193
  | Capability | Inspired by | What KiroGraph adds |
169
194
  |-----------|-------------|---------------------|
@@ -177,6 +202,7 @@ KiroGraph combines capabilities from 13 separate projects into one integrated MC
177
202
  | PDF parsing | [pdf-inspector](https://github.com/firecrawl/pdf-inspector) | Pure Rust, no OCR/network, prebuilt binaries, piped into data module |
178
203
  | Shell compression | [rtk](https://github.com/rtk-ai/rtk) | Integrated as MCP tool, no separate binary |
179
204
  | Prose compression | [caveman](https://github.com/JuliusBrussee/caveman) | Multi-level (lite/full/ultra) via steering |
205
+ | 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
206
  | Embedding compression | [turboquant-js](https://github.com/danilodevhub/turboquant-js) | 9 engine options, SIMD Rust variant, 20–30× RAM savings |
181
207
  | SIMD vector search | [turbovec](https://github.com/RyanCodrai/turbovec) | NEON on ARM64, AVX-512BW on x86, auto-built by installer |
182
208
  | Context layer | [lean-ctx](https://github.com/yvgude/lean-ctx) | File caching, read modes, budget governance |
@@ -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
+ }
@@ -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 callers_exports = {};
30
+ __export(callers_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(callers_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_ui = require("../ui");
36
+ function register(program) {
37
+ program.command("callers <symbol>").description("List symbols that call 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 callers = await cg.getCallers(node.id, limit);
50
+ if (opts.json) {
51
+ console.log(JSON.stringify({ symbol: node.name, callers }));
52
+ cg.close();
53
+ return;
54
+ }
55
+ if (callers.length === 0) {
56
+ console.log(`
57
+ ${import_ui.dim}No callers found for \`${node.name}\`.${import_ui.reset}
58
+ `);
59
+ cg.close();
60
+ return;
61
+ }
62
+ console.log(`
63
+ ${import_ui.violet}${import_ui.bold}Callers of \`${node.name}\`${import_ui.reset} ${import_ui.dim}(${callers.length})${import_ui.reset}
64
+ `);
65
+ for (const n of callers) {
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=callers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/callers.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('callers <symbol>')\n .description('List symbols that call 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 callers = await cg.getCallers(node.id, limit);\n\n if (opts.json) {\n console.log(JSON.stringify({ symbol: node.name, callers }));\n cg.close(); return;\n }\n\n if (callers.length === 0) {\n console.log(`\\n ${dim}No callers found for \\`${node.name}\\`.${reset}\\n`);\n cg.close(); return;\n }\n\n console.log(`\\n ${violet}${bold}Callers of \\`${node.name}\\`${reset} ${dim}(${callers.length})${reset}\\n`);\n for (const n of callers) {\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,0BAA0B,KAAK,IAAI,MAAM,eAAK;AAAA,CAAI;AACxE,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,YAAQ,IAAI;AAAA,IAAO,gBAAM,GAAG,cAAI,gBAAgB,KAAK,IAAI,KAAK,eAAK,KAAK,aAAG,IAAI,QAAQ,MAAM,IAAI,eAAK;AAAA,CAAI;AAC1G,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
+ }
@@ -0,0 +1,68 @@
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 circular_deps_exports = {};
30
+ __export(circular_deps_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(circular_deps_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_ui = require("../ui");
36
+ function register(program) {
37
+ program.command("circular-deps [projectPath]").description("Find circular dependency cycles in the codebase").option("-j, --json", "Output as JSON").action(async (projectPath, opts) => {
38
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
39
+ const target = path.resolve(projectPath ?? process.cwd());
40
+ const cg = await KiroGraph.open(target);
41
+ const cycles = cg.findCircularDependencies();
42
+ if (opts.json) {
43
+ console.log(JSON.stringify({ cycles }));
44
+ cg.close();
45
+ return;
46
+ }
47
+ if (cycles.length === 0) {
48
+ console.log(`
49
+ ${import_ui.dim}No circular dependencies found.${import_ui.reset}
50
+ `);
51
+ cg.close();
52
+ return;
53
+ }
54
+ console.log(`
55
+ ${import_ui.violet}${import_ui.bold}Circular Dependencies${import_ui.reset} ${import_ui.dim}(${cycles.length} cycle(s))${import_ui.reset}
56
+ `);
57
+ for (let i = 0; i < cycles.length; i++) {
58
+ console.log(` ${import_ui.dim}Cycle ${i + 1}:${import_ui.reset} ${cycles[i].map((s) => `${import_ui.violet}${s}${import_ui.reset}`).join(` ${import_ui.dim}\u2192${import_ui.reset} `)}`);
59
+ }
60
+ console.log();
61
+ cg.close();
62
+ });
63
+ }
64
+ // Annotate the CommonJS export names for ESM import in node:
65
+ 0 && (module.exports = {
66
+ register
67
+ });
68
+ //# sourceMappingURL=circular-deps.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/circular-deps.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('circular-deps [projectPath]')\n .description('Find circular dependency cycles in the codebase')\n .option('-j, --json', 'Output as JSON')\n .action(async (projectPath: string | undefined, opts: { json?: boolean }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(projectPath ?? process.cwd());\n const cg = await KiroGraph.open(target);\n\n const cycles = cg.findCircularDependencies();\n\n if (opts.json) {\n console.log(JSON.stringify({ cycles }));\n cg.close(); return;\n }\n\n if (cycles.length === 0) {\n console.log(`\\n ${dim}No circular dependencies found.${reset}\\n`);\n cg.close(); return;\n }\n\n console.log(`\\n ${violet}${bold}Circular Dependencies${reset} ${dim}(${cycles.length} cycle(s))${reset}\\n`);\n for (let i = 0; i < cycles.length; i++) {\n console.log(` ${dim}Cycle ${i + 1}:${reset} ${cycles[i].map(s => `${violet}${s}${reset}`).join(` ${dim}\u2192${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,6BAA6B,EACrC,YAAY,iDAAiD,EAC7D,OAAO,cAAc,gBAAgB,EACrC,OAAO,OAAO,aAAiC,SAA6B;AAC3E,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AAEtC,UAAM,SAAS,GAAG,yBAAyB;AAE3C,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC;AACtC,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,IAAI;AAAA,IAAO,aAAG,kCAAkC,eAAK;AAAA,CAAI;AACjE,SAAG,MAAM;AAAG;AAAA,IACd;AAEA,YAAQ,IAAI;AAAA,IAAO,gBAAM,GAAG,cAAI,wBAAwB,eAAK,KAAK,aAAG,IAAI,OAAO,MAAM,aAAa,eAAK;AAAA,CAAI;AAC5G,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAQ,IAAI,KAAK,aAAG,SAAS,IAAI,CAAC,IAAI,eAAK,IAAI,OAAO,CAAC,EAAE,IAAI,OAAK,GAAG,gBAAM,GAAG,CAAC,GAAG,eAAK,EAAE,EAAE,KAAK,IAAI,aAAG,SAAI,eAAK,GAAG,CAAC,EAAE;AAAA,IACxH;AACA,YAAQ,IAAI;AACZ,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
6
+ "names": []
7
+ }
@@ -43,14 +43,17 @@ const GROUPS = [
43
43
  icon: "\u{1F527}",
44
44
  title: "Setup",
45
45
  commands: [
46
- { name: "install", desc: "Wire up MCP/instructions for an agent workspace", opts: ["--target <t> kiro | cursor | claude | windsurf | ..."] },
46
+ { name: "install", desc: "Wire up MCP/instructions for an agent workspace", opts: ["--target <t> kiro | cursor | claude | windsurf | ...", "Kiro install: prompts to import global hooks"] },
47
47
  { name: "init", args: "[path]", desc: "Initialize KiroGraph in a project", opts: ["-i, --index Index immediately after init"] },
48
- { name: "uninit", args: "[path]", desc: "Remove KiroGraph from a project", opts: ["--force Skip confirmation", '--target <t> Target to clean up (or "all")'] }
48
+ { name: "uninit", args: "[path]", desc: "Remove KiroGraph from a project", opts: ["--force Skip confirmation", '--target <t> Target to clean up (or "all")'] },
49
+ { name: "hook", desc: "Manage global Kiro hooks in ~/.kirograph/hooks/", opts: ["save [path] Save workspace hooks to global store", "import [path] Import global hooks into workspace", "list List saved global hooks", "--all Save or import all without prompting (save/import)"] }
49
50
  ],
50
51
  examples: [
51
52
  ["kirograph install", "Wire up Kiro MCP + hooks + steering"],
52
53
  ["kirograph install --target cursor", "Wire up Cursor MCP + rules + hooks"],
53
- ["kirograph init --index", "Init and immediately index"]
54
+ ["kirograph init --index", "Init and immediately index"],
55
+ ["kirograph hook save", "Save workspace hooks to your global library"],
56
+ ["kirograph hook import", "Import global hooks into this project"]
54
57
  ]
55
58
  },
56
59
  {
@@ -423,6 +426,8 @@ ${c.bold}${c.paleLavender}USAGE${c.reset}`);
423
426
  ["kirograph install --target claude", "Wire up Claude Code MCP + project memory"],
424
427
  ["kirograph install --target codex", "Install Codex project instructions and print MCP config"],
425
428
  ["kirograph init --index", "Init and immediately index the project"],
429
+ ["kirograph hook save", "Save workspace hooks to ~/.kirograph/hooks/"],
430
+ ["kirograph hook import", "Import global hooks into .kiro/hooks/"],
426
431
  ["kirograph sync", "Incremental sync of changed files"]
427
432
  ]
428
433
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/commands/help.ts"],
4
- "sourcesContent": ["import { Command } from 'commander';\nimport { printBanner } from '../banner';\n\ntype CommandEntry = { name: string; args?: string; desc: string; opts?: string[] };\ntype Group = { icon: string; title: string; commands: CommandEntry[]; examples: [string, string][] };\n\nconst c = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n violet: '\\x1b[38;5;99m',\n purple: '\\x1b[38;5;135m',\n lavender: '\\x1b[38;5;141m',\n paleLavender: '\\x1b[38;5;183m',\n gray: '\\x1b[90m',\n brown: '\\x1b[38;5;130m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n underline: '\\x1b[4m',\n};\n\nconst GROUPS: Group[] = [\n {\n icon: '\uD83D\uDD27', title: 'Setup',\n commands: [\n { name: 'install', desc: 'Wire up MCP/instructions for an agent workspace', opts: ['--target <t> kiro | cursor | claude | windsurf | ...'] },\n { name: 'init', args: '[path]', desc: 'Initialize KiroGraph in a project', opts: ['-i, --index Index immediately after init'] },\n { name: 'uninit', args: '[path]', desc: 'Remove KiroGraph from a project', opts: ['--force Skip confirmation', '--target <t> Target to clean up (or \"all\")'] },\n ],\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering'],\n ['kirograph install --target cursor', 'Wire up Cursor MCP + rules + hooks'],\n ['kirograph init --index', 'Init and immediately index'],\n ],\n },\n {\n icon: '\uD83D\uDCE6', title: 'Indexing',\n commands: [\n { name: 'index', args: '[path]', desc: 'Full re-index of a project', opts: ['--force Force re-index all files'] },\n { name: 'sync', args: '[path]', desc: 'Incremental sync of changed files', opts: ['--files <f> Specific files to sync'] },\n { name: 'sync-if-dirty', args: '[path]', desc: 'Sync only if a dirty marker is present', opts: ['-q, --quiet Suppress output'] },\n { name: 'mark-dirty', args: '[path]', desc: 'Write a dirty marker for deferred sync' },\n { name: 'unlock', args: '[path]', desc: 'Force-release a stale lock file' },\n ],\n examples: [\n ['kirograph sync', 'Incremental sync of changed files'],\n ['kirograph index --force', 'Force full re-index'],\n ],\n },\n {\n icon: '\uD83D\uDD0D', title: 'Search',\n commands: [\n { name: 'status', args: '[path]', desc: 'Show index statistics and health' },\n { name: 'query', args: '<search>', desc: 'Search for symbols by name', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'context', args: '<task>', desc: 'Build relevant code context for a task', opts: ['--max-nodes <n> Max symbols', '--no-code Exclude code', '--format <f> markdown | json'] },\n { name: 'files', args: '[path]', desc: 'Show project file structure', opts: ['--format <f> tree | flat | grouped | compact', '--filter <p> Directory prefix', '--pattern <g> Glob'] },\n { name: 'path', args: '<from> <to>', desc: 'Shortest path between two symbols' },\n { name: 'affected', args: '[files...]', desc: 'Find test files affected by changes', opts: ['--stdin Read from stdin', '-d <n> Depth', '-q Quiet'] },\n ],\n examples: [\n ['kirograph query useState', 'Find symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get context for a task'],\n ['kirograph path LoginController Pool', 'How are these connected?'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from git diff'],\n ],\n },\n {\n icon: '\uD83D\uDCCA', title: 'Insights',\n commands: [\n { name: 'hotspots', args: '[path]', desc: 'Most-connected symbols by edge degree', opts: ['--limit <n> Max results', '--format <f> table | json'] },\n { name: 'surprising', args: '[path]', desc: 'Non-obvious cross-file connections', opts: ['--limit <n> Max results'] },\n { name: 'dead-code', args: '[path]', desc: 'Unreferenced unexported symbols', opts: ['--limit <n> Max results'] },\n { name: 'snapshot', desc: 'Save/list/diff graph snapshots', opts: ['save [label]', 'list', 'diff [label] --format summary|full|json'] },\n { name: 'export', desc: 'Interactive graph dashboard', opts: ['build [path] Generate HTML', 'start [path] Generate and open'] },\n ],\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph snapshot save pre-refactor', 'Save before a refactor'],\n ['kirograph snapshot diff pre-refactor', 'See what changed'],\n ['kirograph export start', 'Open the graph dashboard'],\n ],\n },\n {\n icon: '\uD83C\uDFDB\uFE0F', title: 'Architecture',\n commands: [\n { name: 'architecture', args: '[path]', desc: 'Package graph and layer map', opts: ['--packages Packages only', '--layers Layers only'] },\n { name: 'coupling', args: '[path]', desc: 'Coupling metrics per package', opts: ['--sort <s> instability | ca | ce | name', '--package <n> Detail view'] },\n { name: 'package', args: '<name>', desc: 'Inspect a package', opts: ['--no-files Omit file list'] },\n ],\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Packages ranked by instability'],\n ['kirograph package src/auth', 'Inspect the auth package'],\n ],\n },\n {\n icon: '\uD83E\uDDE0', title: 'Memory',\n commands: [\n { name: 'mem search', args: '<query>', desc: 'Search past observations', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'mem store', args: '<text>', desc: 'Store an observation', opts: ['--kind <k> decision | error | pattern | architecture | note'] },\n { name: 'mem timeline', desc: 'List recent sessions and observations' },\n { name: 'mem status', desc: 'Memory health dashboard' },\n { name: 'mem prune', desc: 'Remove old observations', opts: ['--older-than <d> Duration (e.g. 90d)'] },\n { name: 'mem export', desc: 'Export observations', opts: ['--format <f> jsonl | md'] },\n { name: 'mem reembed', desc: 'Re-embed after model change' },\n { name: 'mem lint', desc: 'Health check and auto-repair', opts: ['--fix Auto-fix issues'] },\n ],\n examples: [\n ['kirograph mem search \"auth decision\"', 'Search for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph mem timeline', 'See recent sessions'],\n ],\n },\n {\n icon: '\uD83D\uDD12', title: 'Security',\n commands: [\n { name: 'security', args: '[path]', desc: 'Security overview: vulnerabilities, verdicts, stale-data warnings' },\n { name: 'vulns', args: '[path]', desc: 'List vulnerabilities with reachability verdicts and severity',\n opts: [\n '--severity <level> Filter by severity: critical, high, medium, low',\n '--verdict <verdict> Filter by verdict: affected, not_affected, under_investigation',\n '--refresh Trigger fresh vulnerability enrichment before listing',\n '--add <cveId> Manually register a CVE (requires --package and --version)',\n ],\n },\n { name: 'reachability', args: '<target>', desc: 'Check reachability for a CVE or dependency: verdict, call paths, impact' },\n { name: 'vuln suppress', args: '<cveId>', desc: 'Mark a CVE as suppressed (false positive or accepted risk)',\n opts: [\n '--reason <text> Reason for suppression',\n '--expires <date> Expiry date (e.g. 2026-12-31)',\n ],\n },\n { name: 'vuln unsuppress', args: '<cveId>', desc: 'Remove a suppression' },\n { name: 'vuln suppressions', desc: 'List all active suppressions', opts: ['--format json JSON output'] },\n { name: 'licenses', args: '[path]', desc: 'Show dependency licenses and check against policy (deny/warn lists)',\n opts: [\n '--policy Show only policy violations',\n '--deny <patterns> Override deny list (comma-separated SPDX patterns)',\n '--warn <patterns> Override warn list (comma-separated SPDX patterns)',\n '--format json JSON output',\n ],\n },\n { name: 'vex', args: '[path]', desc: 'Export a VEX document (Vulnerability Exploitability eXchange)', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'sbom', args: '[path]', desc: 'Export a Software Bill of Materials', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'staleness', args: '[path]', desc: 'Check dependency freshness \u2014 packages behind their latest version',\n opts: [\n '--threshold <n> Show only packages with staleness_score >= n (default: 0.3)',\n '--refresh Fetch latest version info from registries before listing',\n '--format <fmt> table | json',\n ],\n },\n { name: 'security export', args: '[path]', desc: 'Generate HTML security dashboard', opts: ['--output <file> Output path', '--open Open in browser'] },\n { name: 'security secrets', args: '[path]', desc: 'Scan for hardcoded secrets with call-graph blast radius', opts: ['--include-tests Include test files', '--severity <s> Filter level', '--format json'] },\n { name: 'security flows', args: '[path]', desc: 'SAST-lite: detect dangerous data flows (SQL injection, eval, path traversal, etc.)', opts: ['--type sql|eval|deserialize|path|all', '--format json'] },\n { name: 'security ci-report', args: '[path]', desc: 'Generate CI/CD security report (JSON, SARIF for GitHub, or text)', opts: ['--format json|sarif|text', '--fail-on affected|any|critical', '--output <file>'] },\n { name: 'attack-surface', args: '[path]', desc: 'Map attack surface: routes \u2192 vulnerable deps with hop count and auth status', opts: ['--limit <n>', '--public-only', '--format json'] },\n { name: 'supply-chain', args: '[path]', desc: 'Supply chain health: OpenSSF Scorecard, maintainer count, abandoned packages', opts: ['--threshold critical|high|medium', '--refresh', '--format json'] },\n { name: 'dep-confusion', args: '[path]', desc: 'Detect dependency confusion: internal packages that exist in public registries', opts: ['--format json'] },\n { name: 'remediation', args: '[path]', desc: 'Remediation SLA tracking: days open, fix available since, overdue alerts', opts: ['--overdue-only', '--format json'] },\n { name: 'pattern', args: '[pattern]', desc: 'AST structural search: live pattern search or library rule runner',\n opts: [\n '--list Show all bundled SAST rules',\n '--library <id> Run a specific library rule',\n '--lang <l> Language filter (js, ts, python, go, ...)',\n '--format json JSON output',\n ],\n },\n ],\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities with severity and verdict'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Show only vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV before listing'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph security export --open', 'Generate and open HTML security dashboard'],\n ['kirograph security secrets', 'Scan for hardcoded secrets with call-graph blast radius'],\n ['kirograph security flows', 'Detect dangerous data flows (SQL injection, eval, etc.)'],\n ['kirograph security ci-report --format sarif --output results.sarif', 'SARIF report for GitHub Security tab'],\n ['kirograph attack-surface --public-only', 'Show public routes reaching vulnerable deps'],\n ['kirograph supply-chain --threshold high', 'Show high-risk supply chain findings'],\n ['kirograph dep-confusion', 'Detect dependency confusion attack vectors'],\n ['kirograph remediation --overdue-only', 'Show CVEs past their remediation SLA'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls'],\n ['kirograph pattern --list', 'Show all bundled SAST rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run the dangerous-eval library rule'],\n ],\n },\n {\n icon: '\u2699\uFE0F', title: 'Agent',\n commands: [\n { name: 'caveman', args: '[mode]', desc: 'Communication style (off | lite | full | ultra)' },\n { name: 'compression', args: '[level]', desc: 'Shell compression level (off | normal | aggressive | ultra)' },\n { name: 'exec', args: '<cmd>', desc: 'Run command with token-optimized output', opts: ['-l <level> Compression level', '-t <sec> Timeout'] },\n { name: 'gain', desc: 'Token savings statistics', opts: ['--graph ASCII chart', '--history Recent commands', '--daily Day breakdown'] },\n { name: 'serve', desc: 'Start the MCP server', opts: ['--mcp Run as stdio MCP', '--path <p> Project path'] },\n ],\n examples: [\n ['kirograph caveman lite', 'Enable lite caveman mode'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ],\n },\n];\n\nfunction renderGroup(group: Group, highlightIdx: number): string[] {\n const lines: string[] = [];\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}COMMANDS${c.reset} ${c.dim}\u2191\u2193 select \u00B7 enter to copy \u00B7 q quit${c.reset}`);\n lines.push('');\n\n for (let i = 0; i < group.commands.length; i++) {\n const cmd = group.commands[i]!;\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const isHighlighted = i === highlightIdx;\n const prefix = isHighlighted ? `${c.green}${c.bold}\u276F${c.reset} ` : ' ';\n const namePart = isHighlighted\n ? `${c.bold}${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.bold + cmd.args + c.reset : ''}`\n : `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n lines.push(`${prefix}${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n if (cmd.opts) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n lines.push(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n\n if (group.examples.length > 0) {\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}EXAMPLES${c.reset}`);\n lines.push('');\n for (const [ex, desc] of group.examples) {\n lines.push(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n lines.push(` ${c.dim}${desc}${c.reset}`);\n }\n }\n\n return lines;\n}\n\nfunction renderTabs(selectedIdx: number): string {\n return GROUPS.map((g, i) => {\n if (i === selectedIdx) {\n return `${c.bold}${c.violet}${c.underline}${g.icon} ${g.title}${c.reset}`;\n }\n return `${c.dim}${g.icon} ${g.title}${c.reset}`;\n }).join(' ');\n}\n\n/**\n * Interactive tabbed help \u2014 left/right for tabs, up/down for commands, enter to copy.\n */\nexport function printInteractiveHelp(): void {\n const CLEAR_LINE = '\\x1b[2K\\x1b[G';\n let selectedTab = 0;\n let selectedCmd = 0;\n let prevLineCount = 0;\n\n function render(first: boolean) {\n if (!first && prevLineCount > 0) {\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n for (let i = 0; i < prevLineCount; i++) {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n }\n\n const lines: string[] = [];\n lines.push('');\n lines.push(` ${renderTabs(selectedTab)}`);\n lines.push(` ${c.dim}\u2190 \u2192 tabs \u00B7 \u2191 \u2193 commands \u00B7 enter to use \u00B7 q quit${c.reset}`);\n lines.push(...renderGroup(GROUPS[selectedTab]!, selectedCmd));\n lines.push('');\n\n for (const line of lines) {\n process.stdout.write(`${CLEAR_LINE}${line}\\n`);\n }\n prevLineCount = lines.length;\n }\n\n printBanner();\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset} ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}`);\n\n render(true);\n\n // Enter raw mode for interactive navigation\n const stdin = process.stdin;\n if (!stdin.isTTY) {\n // Non-interactive: just print all groups\n for (let i = 1; i < GROUPS.length; i++) {\n const lines = renderGroup(GROUPS[i]!, -1);\n for (const line of lines) console.log(line);\n }\n return;\n }\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n function cleanup() {\n stdin.removeListener('data', onData);\n stdin.setRawMode(false);\n stdin.pause();\n }\n\n function onData(key: string) {\n // Arrow keys and other escape sequences start with \\x1b[\n if (key.startsWith('\\x1b[')) {\n if (key === '\\x1b[C') { // right arrow \u2014 next tab\n selectedTab = (selectedTab + 1) % GROUPS.length;\n selectedCmd = 0;\n render(false);\n } else if (key === '\\x1b[D') { // left arrow \u2014 prev tab\n selectedTab = (selectedTab - 1 + GROUPS.length) % GROUPS.length;\n selectedCmd = 0;\n render(false);\n } else if (key === '\\x1b[B') { // down arrow \u2014 next command\n const maxCmd = GROUPS[selectedTab]!.commands.length - 1;\n selectedCmd = Math.min(selectedCmd + 1, maxCmd);\n render(false);\n } else if (key === '\\x1b[A') { // up arrow \u2014 prev command\n selectedCmd = Math.max(selectedCmd - 1, 0);\n render(false);\n }\n // Ignore other escape sequences\n return;\n }\n\n if (key === '\\r' || key === '\\n') { // enter \u2014 copy command to terminal\n cleanup();\n const cmd = GROUPS[selectedTab]!.commands[selectedCmd]!;\n const fullCmd = `kirograph ${cmd.name}${cmd.args ? ' ' + cmd.args : ''}`;\n // Clear the interactive UI and print the command\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n for (let i = 0; i < prevLineCount; i++) {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n console.log(`\\n ${c.green}${c.bold}$${c.reset} ${fullCmd}\\n`);\n process.exit(0);\n } else if (key === 'q' || key === '\\x03') { // q, ctrl+c\n cleanup();\n console.log();\n process.exit(0);\n }\n }\n\n stdin.on('data', onData);\n}\n\n/**\n * Non-interactive full help (for piping, --help flag).\n */\nexport function printColoredHelp(): void {\n\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset}`);\n console.log(` ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}\\n`);\n\n for (const group of GROUPS) {\n console.log(`${c.bold}${c.paleLavender}${group.icon} ${group.title.toUpperCase()}${c.reset}\\n`);\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n for (const cmd of group.commands) {\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const namePart = `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n console.log(` ${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n if (cmd.opts) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n console.log(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n console.log();\n }\n\n console.log(`${c.bold}${c.paleLavender}GLOBAL FLAGS${c.reset}\\n`);\n console.log(` ${c.purple}-h, --help${c.reset} ${c.gray}Show this help${c.reset}`);\n console.log(` ${c.purple}-V, --version${c.reset} ${c.gray}Show version number${c.reset}\\n`);\n\n\n console.log(`${c.bold}${c.paleLavender}EXAMPLES${c.reset}\\n`);\n\n const exampleGroups: Array<{ title: string; examples: [string, string][] }> = [\n {\n title: '\uD83D\uDD27 Setup & indexing',\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering for the current workspace'],\n ['kirograph install --target claude', 'Wire up Claude Code MCP + project memory'],\n ['kirograph install --target codex', 'Install Codex project instructions and print MCP config'],\n ['kirograph init --index', 'Init and immediately index the project'],\n ['kirograph sync', 'Incremental sync of changed files'],\n ],\n },\n {\n title: '\uD83D\uDD0D Search & exploration',\n examples: [\n ['kirograph query useState', 'Find all symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get relevant code context for a task'],\n ['kirograph files --format grouped', 'Show files grouped by directory'],\n ['kirograph path LoginController DatabasePool', 'Find how two symbols are connected'],\n ['kirograph affected src/auth.ts', 'Find tests affected by a change'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from a git diff'],\n ['kirograph export start', 'Open the interactive graph dashboard in the browser'],\n ['kirograph export build -o /tmp/graph', 'Export the dashboard to a custom directory'],\n ],\n },\n {\n title: '\uD83D\uDCCA Graph insights',\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph surprising', 'Find unexpected cross-module connections'],\n ['kirograph dead-code', 'Find unreferenced unexported symbols'],\n ['kirograph snapshot save pre-refactor', 'Save a named snapshot before a refactor'],\n ['kirograph snapshot diff pre-refactor', 'Diff current graph vs the named snapshot'],\n ],\n },\n {\n title: '\uD83C\uDFDB\uFE0F Architecture',\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Show packages ranked by instability'],\n ['kirograph package src/auth', 'Inspect the auth package'],\n ],\n },\n {\n title: '\uD83D\uDD12 Security',\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV then list'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln suppress CVE-2024-1234 --expires 2026-12-31', 'Suppress with expiry date'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls (requires enablePatterns: true)'],\n ['kirograph pattern --list', 'Show all bundled SAST pattern rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run a specific library rule'],\n ],\n },\n {\n title: '\u2699\uFE0F Agent',\n examples: [\n ['kirograph caveman full', 'Enable full caveman mode for the agent'],\n ['kirograph caveman off', 'Disable caveman mode'],\n ['kirograph compression aggressive', 'Set compression to aggressive level'],\n ['kirograph compression off', 'Disable compression hook (tool still available)'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph exec --level ultra npm test', 'Run tests with ultra compression'],\n ['kirograph exec --raw cargo build', 'Show raw vs compressed comparison'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ['kirograph mem search \"auth decision\"', 'Search memory for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph data list', 'List all indexed datasets'],\n ['kirograph data describe tests-fixtures-users', 'Show schema and column profiles'],\n ['kirograph data query orders --filter status:eq:shipped --limit 10', 'Query rows with filters'],\n ['kirograph data aggregate orders --group-by region --metric sum:amount', 'Server-side aggregation'],\n ['kirograph serve --mcp', 'Start the MCP server'],\n ],\n },\n ];\n\n for (const eg of exampleGroups) {\n console.log(` ${c.dim}${eg.title}${c.reset}`);\n for (const [ex, desc] of eg.examples) {\n console.log(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n console.log(` ${c.dim}${desc}${c.reset}`);\n }\n console.log();\n }\n}\n\nexport function register(program: Command): void {\n program.configureHelp({ formatHelp: () => '' });\n program.addHelpText('afterAll', '');\n // Disable Commander's built-in --help to prevent process.exit\n program.helpOption(false);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport { printBanner } from '../banner';\n\ntype CommandEntry = { name: string; args?: string; desc: string; opts?: string[] };\ntype Group = { icon: string; title: string; commands: CommandEntry[]; examples: [string, string][] };\n\nconst c = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n violet: '\\x1b[38;5;99m',\n purple: '\\x1b[38;5;135m',\n lavender: '\\x1b[38;5;141m',\n paleLavender: '\\x1b[38;5;183m',\n gray: '\\x1b[90m',\n brown: '\\x1b[38;5;130m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n underline: '\\x1b[4m',\n};\n\nconst GROUPS: Group[] = [\n {\n icon: '\uD83D\uDD27', title: 'Setup',\n commands: [\n { name: 'install', desc: 'Wire up MCP/instructions for an agent workspace', opts: ['--target <t> kiro | cursor | claude | windsurf | ...', 'Kiro install: prompts to import global hooks'] },\n { name: 'init', args: '[path]', desc: 'Initialize KiroGraph in a project', opts: ['-i, --index Index immediately after init'] },\n { name: 'uninit', args: '[path]', desc: 'Remove KiroGraph from a project', opts: ['--force Skip confirmation', '--target <t> Target to clean up (or \"all\")'] },\n { name: 'hook', desc: 'Manage global Kiro hooks in ~/.kirograph/hooks/', opts: ['save [path] Save workspace hooks to global store', 'import [path] Import global hooks into workspace', 'list List saved global hooks', '--all Save or import all without prompting (save/import)'] },\n ],\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering'],\n ['kirograph install --target cursor', 'Wire up Cursor MCP + rules + hooks'],\n ['kirograph init --index', 'Init and immediately index'],\n ['kirograph hook save', 'Save workspace hooks to your global library'],\n ['kirograph hook import', 'Import global hooks into this project'],\n ],\n },\n {\n icon: '\uD83D\uDCE6', title: 'Indexing',\n commands: [\n { name: 'index', args: '[path]', desc: 'Full re-index of a project', opts: ['--force Force re-index all files'] },\n { name: 'sync', args: '[path]', desc: 'Incremental sync of changed files', opts: ['--files <f> Specific files to sync'] },\n { name: 'sync-if-dirty', args: '[path]', desc: 'Sync only if a dirty marker is present', opts: ['-q, --quiet Suppress output'] },\n { name: 'mark-dirty', args: '[path]', desc: 'Write a dirty marker for deferred sync' },\n { name: 'unlock', args: '[path]', desc: 'Force-release a stale lock file' },\n ],\n examples: [\n ['kirograph sync', 'Incremental sync of changed files'],\n ['kirograph index --force', 'Force full re-index'],\n ],\n },\n {\n icon: '\uD83D\uDD0D', title: 'Search',\n commands: [\n { name: 'status', args: '[path]', desc: 'Show index statistics and health' },\n { name: 'query', args: '<search>', desc: 'Search for symbols by name', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'context', args: '<task>', desc: 'Build relevant code context for a task', opts: ['--max-nodes <n> Max symbols', '--no-code Exclude code', '--format <f> markdown | json'] },\n { name: 'files', args: '[path]', desc: 'Show project file structure', opts: ['--format <f> tree | flat | grouped | compact', '--filter <p> Directory prefix', '--pattern <g> Glob'] },\n { name: 'path', args: '<from> <to>', desc: 'Shortest path between two symbols' },\n { name: 'affected', args: '[files...]', desc: 'Find test files affected by changes', opts: ['--stdin Read from stdin', '-d <n> Depth', '-q Quiet'] },\n ],\n examples: [\n ['kirograph query useState', 'Find symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get context for a task'],\n ['kirograph path LoginController Pool', 'How are these connected?'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from git diff'],\n ],\n },\n {\n icon: '\uD83D\uDCCA', title: 'Insights',\n commands: [\n { name: 'hotspots', args: '[path]', desc: 'Most-connected symbols by edge degree', opts: ['--limit <n> Max results', '--format <f> table | json'] },\n { name: 'surprising', args: '[path]', desc: 'Non-obvious cross-file connections', opts: ['--limit <n> Max results'] },\n { name: 'dead-code', args: '[path]', desc: 'Unreferenced unexported symbols', opts: ['--limit <n> Max results'] },\n { name: 'snapshot', desc: 'Save/list/diff graph snapshots', opts: ['save [label]', 'list', 'diff [label] --format summary|full|json'] },\n { name: 'export', desc: 'Interactive graph dashboard', opts: ['build [path] Generate HTML', 'start [path] Generate and open'] },\n ],\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph snapshot save pre-refactor', 'Save before a refactor'],\n ['kirograph snapshot diff pre-refactor', 'See what changed'],\n ['kirograph export start', 'Open the graph dashboard'],\n ],\n },\n {\n icon: '\uD83C\uDFDB\uFE0F', title: 'Architecture',\n commands: [\n { name: 'architecture', args: '[path]', desc: 'Package graph and layer map', opts: ['--packages Packages only', '--layers Layers only'] },\n { name: 'coupling', args: '[path]', desc: 'Coupling metrics per package', opts: ['--sort <s> instability | ca | ce | name', '--package <n> Detail view'] },\n { name: 'package', args: '<name>', desc: 'Inspect a package', opts: ['--no-files Omit file list'] },\n ],\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Packages ranked by instability'],\n ['kirograph package src/auth', 'Inspect the auth package'],\n ],\n },\n {\n icon: '\uD83E\uDDE0', title: 'Memory',\n commands: [\n { name: 'mem search', args: '<query>', desc: 'Search past observations', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'mem store', args: '<text>', desc: 'Store an observation', opts: ['--kind <k> decision | error | pattern | architecture | note'] },\n { name: 'mem timeline', desc: 'List recent sessions and observations' },\n { name: 'mem status', desc: 'Memory health dashboard' },\n { name: 'mem prune', desc: 'Remove old observations', opts: ['--older-than <d> Duration (e.g. 90d)'] },\n { name: 'mem export', desc: 'Export observations', opts: ['--format <f> jsonl | md'] },\n { name: 'mem reembed', desc: 'Re-embed after model change' },\n { name: 'mem lint', desc: 'Health check and auto-repair', opts: ['--fix Auto-fix issues'] },\n ],\n examples: [\n ['kirograph mem search \"auth decision\"', 'Search for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph mem timeline', 'See recent sessions'],\n ],\n },\n {\n icon: '\uD83D\uDD12', title: 'Security',\n commands: [\n { name: 'security', args: '[path]', desc: 'Security overview: vulnerabilities, verdicts, stale-data warnings' },\n { name: 'vulns', args: '[path]', desc: 'List vulnerabilities with reachability verdicts and severity',\n opts: [\n '--severity <level> Filter by severity: critical, high, medium, low',\n '--verdict <verdict> Filter by verdict: affected, not_affected, under_investigation',\n '--refresh Trigger fresh vulnerability enrichment before listing',\n '--add <cveId> Manually register a CVE (requires --package and --version)',\n ],\n },\n { name: 'reachability', args: '<target>', desc: 'Check reachability for a CVE or dependency: verdict, call paths, impact' },\n { name: 'vuln suppress', args: '<cveId>', desc: 'Mark a CVE as suppressed (false positive or accepted risk)',\n opts: [\n '--reason <text> Reason for suppression',\n '--expires <date> Expiry date (e.g. 2026-12-31)',\n ],\n },\n { name: 'vuln unsuppress', args: '<cveId>', desc: 'Remove a suppression' },\n { name: 'vuln suppressions', desc: 'List all active suppressions', opts: ['--format json JSON output'] },\n { name: 'licenses', args: '[path]', desc: 'Show dependency licenses and check against policy (deny/warn lists)',\n opts: [\n '--policy Show only policy violations',\n '--deny <patterns> Override deny list (comma-separated SPDX patterns)',\n '--warn <patterns> Override warn list (comma-separated SPDX patterns)',\n '--format json JSON output',\n ],\n },\n { name: 'vex', args: '[path]', desc: 'Export a VEX document (Vulnerability Exploitability eXchange)', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'sbom', args: '[path]', desc: 'Export a Software Bill of Materials', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'staleness', args: '[path]', desc: 'Check dependency freshness \u2014 packages behind their latest version',\n opts: [\n '--threshold <n> Show only packages with staleness_score >= n (default: 0.3)',\n '--refresh Fetch latest version info from registries before listing',\n '--format <fmt> table | json',\n ],\n },\n { name: 'security export', args: '[path]', desc: 'Generate HTML security dashboard', opts: ['--output <file> Output path', '--open Open in browser'] },\n { name: 'security secrets', args: '[path]', desc: 'Scan for hardcoded secrets with call-graph blast radius', opts: ['--include-tests Include test files', '--severity <s> Filter level', '--format json'] },\n { name: 'security flows', args: '[path]', desc: 'SAST-lite: detect dangerous data flows (SQL injection, eval, path traversal, etc.)', opts: ['--type sql|eval|deserialize|path|all', '--format json'] },\n { name: 'security ci-report', args: '[path]', desc: 'Generate CI/CD security report (JSON, SARIF for GitHub, or text)', opts: ['--format json|sarif|text', '--fail-on affected|any|critical', '--output <file>'] },\n { name: 'attack-surface', args: '[path]', desc: 'Map attack surface: routes \u2192 vulnerable deps with hop count and auth status', opts: ['--limit <n>', '--public-only', '--format json'] },\n { name: 'supply-chain', args: '[path]', desc: 'Supply chain health: OpenSSF Scorecard, maintainer count, abandoned packages', opts: ['--threshold critical|high|medium', '--refresh', '--format json'] },\n { name: 'dep-confusion', args: '[path]', desc: 'Detect dependency confusion: internal packages that exist in public registries', opts: ['--format json'] },\n { name: 'remediation', args: '[path]', desc: 'Remediation SLA tracking: days open, fix available since, overdue alerts', opts: ['--overdue-only', '--format json'] },\n { name: 'pattern', args: '[pattern]', desc: 'AST structural search: live pattern search or library rule runner',\n opts: [\n '--list Show all bundled SAST rules',\n '--library <id> Run a specific library rule',\n '--lang <l> Language filter (js, ts, python, go, ...)',\n '--format json JSON output',\n ],\n },\n ],\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities with severity and verdict'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Show only vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV before listing'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph security export --open', 'Generate and open HTML security dashboard'],\n ['kirograph security secrets', 'Scan for hardcoded secrets with call-graph blast radius'],\n ['kirograph security flows', 'Detect dangerous data flows (SQL injection, eval, etc.)'],\n ['kirograph security ci-report --format sarif --output results.sarif', 'SARIF report for GitHub Security tab'],\n ['kirograph attack-surface --public-only', 'Show public routes reaching vulnerable deps'],\n ['kirograph supply-chain --threshold high', 'Show high-risk supply chain findings'],\n ['kirograph dep-confusion', 'Detect dependency confusion attack vectors'],\n ['kirograph remediation --overdue-only', 'Show CVEs past their remediation SLA'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls'],\n ['kirograph pattern --list', 'Show all bundled SAST rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run the dangerous-eval library rule'],\n ],\n },\n {\n icon: '\u2699\uFE0F', title: 'Agent',\n commands: [\n { name: 'caveman', args: '[mode]', desc: 'Communication style (off | lite | full | ultra)' },\n { name: 'compression', args: '[level]', desc: 'Shell compression level (off | normal | aggressive | ultra)' },\n { name: 'exec', args: '<cmd>', desc: 'Run command with token-optimized output', opts: ['-l <level> Compression level', '-t <sec> Timeout'] },\n { name: 'gain', desc: 'Token savings statistics', opts: ['--graph ASCII chart', '--history Recent commands', '--daily Day breakdown'] },\n { name: 'serve', desc: 'Start the MCP server', opts: ['--mcp Run as stdio MCP', '--path <p> Project path'] },\n ],\n examples: [\n ['kirograph caveman lite', 'Enable lite caveman mode'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ],\n },\n];\n\nfunction renderGroup(group: Group, highlightIdx: number): string[] {\n const lines: string[] = [];\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}COMMANDS${c.reset} ${c.dim}\u2191\u2193 select \u00B7 enter to copy \u00B7 q quit${c.reset}`);\n lines.push('');\n\n for (let i = 0; i < group.commands.length; i++) {\n const cmd = group.commands[i]!;\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const isHighlighted = i === highlightIdx;\n const prefix = isHighlighted ? `${c.green}${c.bold}\u276F${c.reset} ` : ' ';\n const namePart = isHighlighted\n ? `${c.bold}${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.bold + cmd.args + c.reset : ''}`\n : `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n lines.push(`${prefix}${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n if (cmd.opts) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n lines.push(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n\n if (group.examples.length > 0) {\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}EXAMPLES${c.reset}`);\n lines.push('');\n for (const [ex, desc] of group.examples) {\n lines.push(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n lines.push(` ${c.dim}${desc}${c.reset}`);\n }\n }\n\n return lines;\n}\n\nfunction renderTabs(selectedIdx: number): string {\n return GROUPS.map((g, i) => {\n if (i === selectedIdx) {\n return `${c.bold}${c.violet}${c.underline}${g.icon} ${g.title}${c.reset}`;\n }\n return `${c.dim}${g.icon} ${g.title}${c.reset}`;\n }).join(' ');\n}\n\n/**\n * Interactive tabbed help \u2014 left/right for tabs, up/down for commands, enter to copy.\n */\nexport function printInteractiveHelp(): void {\n const CLEAR_LINE = '\\x1b[2K\\x1b[G';\n let selectedTab = 0;\n let selectedCmd = 0;\n let prevLineCount = 0;\n\n function render(first: boolean) {\n if (!first && prevLineCount > 0) {\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n for (let i = 0; i < prevLineCount; i++) {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n }\n\n const lines: string[] = [];\n lines.push('');\n lines.push(` ${renderTabs(selectedTab)}`);\n lines.push(` ${c.dim}\u2190 \u2192 tabs \u00B7 \u2191 \u2193 commands \u00B7 enter to use \u00B7 q quit${c.reset}`);\n lines.push(...renderGroup(GROUPS[selectedTab]!, selectedCmd));\n lines.push('');\n\n for (const line of lines) {\n process.stdout.write(`${CLEAR_LINE}${line}\\n`);\n }\n prevLineCount = lines.length;\n }\n\n printBanner();\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset} ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}`);\n\n render(true);\n\n // Enter raw mode for interactive navigation\n const stdin = process.stdin;\n if (!stdin.isTTY) {\n // Non-interactive: just print all groups\n for (let i = 1; i < GROUPS.length; i++) {\n const lines = renderGroup(GROUPS[i]!, -1);\n for (const line of lines) console.log(line);\n }\n return;\n }\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n function cleanup() {\n stdin.removeListener('data', onData);\n stdin.setRawMode(false);\n stdin.pause();\n }\n\n function onData(key: string) {\n // Arrow keys and other escape sequences start with \\x1b[\n if (key.startsWith('\\x1b[')) {\n if (key === '\\x1b[C') { // right arrow \u2014 next tab\n selectedTab = (selectedTab + 1) % GROUPS.length;\n selectedCmd = 0;\n render(false);\n } else if (key === '\\x1b[D') { // left arrow \u2014 prev tab\n selectedTab = (selectedTab - 1 + GROUPS.length) % GROUPS.length;\n selectedCmd = 0;\n render(false);\n } else if (key === '\\x1b[B') { // down arrow \u2014 next command\n const maxCmd = GROUPS[selectedTab]!.commands.length - 1;\n selectedCmd = Math.min(selectedCmd + 1, maxCmd);\n render(false);\n } else if (key === '\\x1b[A') { // up arrow \u2014 prev command\n selectedCmd = Math.max(selectedCmd - 1, 0);\n render(false);\n }\n // Ignore other escape sequences\n return;\n }\n\n if (key === '\\r' || key === '\\n') { // enter \u2014 copy command to terminal\n cleanup();\n const cmd = GROUPS[selectedTab]!.commands[selectedCmd]!;\n const fullCmd = `kirograph ${cmd.name}${cmd.args ? ' ' + cmd.args : ''}`;\n // Clear the interactive UI and print the command\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n for (let i = 0; i < prevLineCount; i++) {\n process.stdout.write(`${CLEAR_LINE}\\n`);\n }\n process.stdout.write(`\\x1b[${prevLineCount}A`);\n console.log(`\\n ${c.green}${c.bold}$${c.reset} ${fullCmd}\\n`);\n process.exit(0);\n } else if (key === 'q' || key === '\\x03') { // q, ctrl+c\n cleanup();\n console.log();\n process.exit(0);\n }\n }\n\n stdin.on('data', onData);\n}\n\n/**\n * Non-interactive full help (for piping, --help flag).\n */\nexport function printColoredHelp(): void {\n\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset}`);\n console.log(` ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}\\n`);\n\n for (const group of GROUPS) {\n console.log(`${c.bold}${c.paleLavender}${group.icon} ${group.title.toUpperCase()}${c.reset}\\n`);\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n for (const cmd of group.commands) {\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const namePart = `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n console.log(` ${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n if (cmd.opts) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n console.log(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n console.log();\n }\n\n console.log(`${c.bold}${c.paleLavender}GLOBAL FLAGS${c.reset}\\n`);\n console.log(` ${c.purple}-h, --help${c.reset} ${c.gray}Show this help${c.reset}`);\n console.log(` ${c.purple}-V, --version${c.reset} ${c.gray}Show version number${c.reset}\\n`);\n\n\n console.log(`${c.bold}${c.paleLavender}EXAMPLES${c.reset}\\n`);\n\n const exampleGroups: Array<{ title: string; examples: [string, string][] }> = [\n {\n title: '\uD83D\uDD27 Setup & indexing',\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering for the current workspace'],\n ['kirograph install --target claude', 'Wire up Claude Code MCP + project memory'],\n ['kirograph install --target codex', 'Install Codex project instructions and print MCP config'],\n ['kirograph init --index', 'Init and immediately index the project'],\n ['kirograph hook save', 'Save workspace hooks to ~/.kirograph/hooks/'],\n ['kirograph hook import', 'Import global hooks into .kiro/hooks/'],\n ['kirograph sync', 'Incremental sync of changed files'],\n ],\n },\n {\n title: '\uD83D\uDD0D Search & exploration',\n examples: [\n ['kirograph query useState', 'Find all symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get relevant code context for a task'],\n ['kirograph files --format grouped', 'Show files grouped by directory'],\n ['kirograph path LoginController DatabasePool', 'Find how two symbols are connected'],\n ['kirograph affected src/auth.ts', 'Find tests affected by a change'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from a git diff'],\n ['kirograph export start', 'Open the interactive graph dashboard in the browser'],\n ['kirograph export build -o /tmp/graph', 'Export the dashboard to a custom directory'],\n ],\n },\n {\n title: '\uD83D\uDCCA Graph insights',\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph surprising', 'Find unexpected cross-module connections'],\n ['kirograph dead-code', 'Find unreferenced unexported symbols'],\n ['kirograph snapshot save pre-refactor', 'Save a named snapshot before a refactor'],\n ['kirograph snapshot diff pre-refactor', 'Diff current graph vs the named snapshot'],\n ],\n },\n {\n title: '\uD83C\uDFDB\uFE0F Architecture',\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Show packages ranked by instability'],\n ['kirograph package src/auth', 'Inspect the auth package'],\n ],\n },\n {\n title: '\uD83D\uDD12 Security',\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV then list'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln suppress CVE-2024-1234 --expires 2026-12-31', 'Suppress with expiry date'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls (requires enablePatterns: true)'],\n ['kirograph pattern --list', 'Show all bundled SAST pattern rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run a specific library rule'],\n ],\n },\n {\n title: '\u2699\uFE0F Agent',\n examples: [\n ['kirograph caveman full', 'Enable full caveman mode for the agent'],\n ['kirograph caveman off', 'Disable caveman mode'],\n ['kirograph compression aggressive', 'Set compression to aggressive level'],\n ['kirograph compression off', 'Disable compression hook (tool still available)'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph exec --level ultra npm test', 'Run tests with ultra compression'],\n ['kirograph exec --raw cargo build', 'Show raw vs compressed comparison'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ['kirograph mem search \"auth decision\"', 'Search memory for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph data list', 'List all indexed datasets'],\n ['kirograph data describe tests-fixtures-users', 'Show schema and column profiles'],\n ['kirograph data query orders --filter status:eq:shipped --limit 10', 'Query rows with filters'],\n ['kirograph data aggregate orders --group-by region --metric sum:amount', 'Server-side aggregation'],\n ['kirograph serve --mcp', 'Start the MCP server'],\n ],\n },\n ];\n\n for (const eg of exampleGroups) {\n console.log(` ${c.dim}${eg.title}${c.reset}`);\n for (const [ex, desc] of eg.examples) {\n console.log(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n console.log(` ${c.dim}${desc}${c.reset}`);\n }\n console.log();\n }\n}\n\nexport function register(program: Command): void {\n program.configureHelp({ formatHelp: () => '' });\n program.addHelpText('afterAll', '');\n // Disable Commander's built-in --help to prevent process.exit\n program.helpOption(false);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA4B;AAK5B,MAAM,IAAI;AAAA,EACR,OAAc;AAAA,EACd,MAAc;AAAA,EACd,KAAc;AAAA,EACd,QAAc;AAAA,EACd,QAAc;AAAA,EACd,UAAc;AAAA,EACd,cAAc;AAAA,EACd,MAAc;AAAA,EACd,OAAc;AAAA,EACd,OAAc;AAAA,EACd,MAAc;AAAA,EACd,WAAc;AAChB;AAEA,MAAM,SAAkB;AAAA,EACtB;AAAA,IACE,MAAM;AAAA,IAAM,OAAO;AAAA,IACnB,UAAU;AAAA,MACR,EAAE,MAAM,WAAiB,MAAM,mDAAmD,MAAM,CAAC,yDAAyD,8CAA8C,EAAE;AAAA,MAClM,EAAE,MAAM,QAAiB,MAAM,UAAU,MAAM,qCAAqC,MAAM,CAAC,2CAA2C,EAAE;AAAA,MACxI,EAAE,MAAM,UAAiB,MAAM,UAAU,MAAM,mCAAqC,MAAM,CAAC,kCAAkC,6CAA6C,EAAE;AAAA,MAC5K,EAAE,MAAM,QAAiB,MAAM,mDAAmD,MAAM,CAAC,uDAAuD,qDAAqD,0CAA0C,mEAAmE,EAAE;AAAA,IACtT;AAAA,IACA,UAAU;AAAA,MACR,CAAC,qBAAqB,qCAAqC;AAAA,MAC3D,CAAC,qCAAqC,oCAAoC;AAAA,MAC1E,CAAC,0BAA0B,4BAA4B;AAAA,MACvD,CAAC,uBAAuB,6CAA6C;AAAA,MACrE,CAAC,yBAAyB,uCAAuC;AAAA,IACnE;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAM,OAAO;AAAA,IACnB,UAAU;AAAA,MACR,EAAE,MAAM,SAAiB,MAAM,UAAU,MAAM,8BAA0C,MAAM,CAAC,sCAAsC,EAAE;AAAA,MACxI,EAAE,MAAM,QAAiB,MAAM,UAAU,MAAM,qCAA2C,MAAM,CAAC,oCAAoC,EAAE;AAAA,MACvI,EAAE,MAAM,iBAAiB,MAAM,UAAU,MAAM,0CAA0C,MAAM,CAAC,8BAA8B,EAAE;AAAA,MAChI,EAAE,MAAM,cAAiB,MAAM,UAAU,MAAM,yCAAyC;AAAA,MACxF,EAAE,MAAM,UAAiB,MAAM,UAAU,MAAM,kCAAkC;AAAA,IACnF;AAAA,IACA,UAAU;AAAA,MACR,CAAC,kBAAkB,mCAAmC;AAAA,MACtD,CAAC,2BAA2B,qBAAqB;AAAA,IACnD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAM,OAAO;AAAA,IACnB,UAAU;AAAA,MACR,EAAE,MAAM,UAAY,MAAM,UAAa,MAAM,mCAAmC;AAAA,MAChF,EAAE,MAAM,SAAY,MAAM,YAAa,MAAM,8BAAuC,MAAM,CAAC,+BAA+B,0BAA0B,EAAE;AAAA,MACtJ,EAAE,MAAM,WAAY,MAAM,UAAa,MAAM,0CAA0C,MAAM,CAAC,gCAAgC,2BAA2B,+BAA+B,EAAE;AAAA,MAC1L,EAAE,MAAM,SAAY,MAAM,UAAa,MAAM,+BAAwC,MAAM,CAAC,iDAAiD,kCAAkC,qBAAqB,EAAE;AAAA,MACtM,EAAE,MAAM,QAAY,MAAM,eAAe,MAAM,oCAAoC;AAAA,MACnF,EAAE,MAAM,YAAY,MAAM,cAAc,MAAM,uCAAuC,MAAM,CAAC,4BAA4B,iBAAiB,WAAW,EAAE;AAAA,IACxJ;AAAA,IACA,UAAU;AAAA,MACR,CAAC,4BAA4B,6BAA6B;AAAA,MAC1D,CAAC,qCAAqC,wBAAwB;AAAA,MAC9D,CAAC,uCAAuC,0BAA0B;AAAA,MAClE,CAAC,qDAAqD,8BAA8B;AAAA,IACtF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAM,OAAO;AAAA,IACnB,UAAU;AAAA,MACR,EAAE,MAAM,YAAc,MAAM,UAAU,MAAM,yCAA2C,MAAM,CAAC,4BAA4B,4BAA4B,EAAE;AAAA,MACxJ,EAAE,MAAM,cAAc,MAAM,UAAU,MAAM,sCAA2C,MAAM,CAAC,0BAA0B,EAAE;AAAA,MAC1H,EAAE,MAAM,aAAc,MAAM,UAAU,MAAM,mCAA2C,MAAM,CAAC,0BAA0B,EAAE;AAAA,MAC1H,EAAE,MAAM,YAAc,MAAM,kCAA2D,MAAM,CAAC,gBAAgB,QAAQ,0CAA0C,EAAE;AAAA,MAClK,EAAE,MAAM,UAAc,MAAM,+BAA2D,MAAM,CAAC,+BAA+B,iCAAiC,EAAE;AAAA,IAClK;AAAA,IACA,UAAU;AAAA,MACR,CAAC,iCAAiC,+BAA+B;AAAA,MACjE,CAAC,wCAAwC,wBAAwB;AAAA,MACjE,CAAC,wCAAwC,kBAAkB;AAAA,MAC3D,CAAC,0BAA0B,0BAA0B;AAAA,IACvD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAO,OAAO;AAAA,IACpB,UAAU;AAAA,MACR,EAAE,MAAM,gBAAgB,MAAM,UAAU,MAAM,+BAAmC,MAAM,CAAC,6BAA6B,uBAAuB,EAAE;AAAA,MAC9I,EAAE,MAAM,YAAgB,MAAM,UAAU,MAAM,gCAAmC,MAAM,CAAC,4CAA4C,4BAA4B,EAAE;AAAA,MAClK,EAAE,MAAM,WAAgB,MAAM,UAAU,MAAM,qBAAmC,MAAM,CAAC,4BAA4B,EAAE;AAAA,IACxH;AAAA,IACA,UAAU;AAAA,MACR,CAAC,qCAAqC,4BAA4B;AAAA,MAClE,CAAC,yCAAyC,gCAAgC;AAAA,MAC1E,CAAC,8BAA8B,0BAA0B;AAAA,IAC3D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAM,OAAO;AAAA,IACnB,UAAU;AAAA,MACR,EAAE,MAAM,cAAgB,MAAM,WAAW,MAAM,4BAAkC,MAAM,CAAC,8BAA8B,0BAA0B,EAAE;AAAA,MAClJ,EAAE,MAAM,aAAgB,MAAM,UAAW,MAAM,wBAAkC,MAAM,CAAC,8DAA8D,EAAE;AAAA,MACxJ,EAAE,MAAM,gBAAgB,MAAM,wCAAwC;AAAA,MACtE,EAAE,MAAM,cAAgB,MAAM,0BAA0B;AAAA,MACxD,EAAE,MAAM,aAAgB,MAAM,2BAAmD,MAAM,CAAC,uCAAuC,EAAE;AAAA,MACjI,EAAE,MAAM,cAAgB,MAAM,uBAAmD,MAAM,CAAC,0BAA0B,EAAE;AAAA,MACpH,EAAE,MAAM,eAAgB,MAAM,8BAA8B;AAAA,MAC5D,EAAE,MAAM,YAAgB,MAAM,gCAAmD,MAAM,CAAC,wBAAwB,EAAE;AAAA,IACpH;AAAA,IACA,UAAU;AAAA,MACR,CAAC,wCAAwC,2BAA2B;AAAA,MACpE,CAAC,8DAA8D,kBAAkB;AAAA,MACjF,CAAC,0BAA0B,qBAAqB;AAAA,IAClD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAM,OAAO;AAAA,IACnB,UAAU;AAAA,MACR,EAAE,MAAM,YAAY,MAAM,UAAU,MAAM,oEAAoE;AAAA,MAC9G;AAAA,QAAE,MAAM;AAAA,QAAY,MAAM;AAAA,QAAU,MAAM;AAAA,QACxC,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,MAAM,gBAAgB,MAAM,YAAY,MAAM,0EAA0E;AAAA,MAC1H;AAAA,QAAE,MAAM;AAAA,QAAmB,MAAM;AAAA,QAAW,MAAM;AAAA,QAChD,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,MAAM,mBAAmB,MAAM,WAAW,MAAM,uBAAuB;AAAA,MACzE,EAAE,MAAM,qBAAqB,MAAM,gCAAgC,MAAM,CAAC,4BAA4B,EAAE;AAAA,MACxG;AAAA,QAAE,MAAM;AAAA,QAAY,MAAM;AAAA,QAAU,MAAM;AAAA,QACxC,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,MAAM,OAAa,MAAM,UAAU,MAAM,iEAAiE,MAAM,CAAC,kDAAkD,EAAE;AAAA,MACvK,EAAE,MAAM,QAAa,MAAM,UAAU,MAAM,uCAAiE,MAAM,CAAC,kDAAkD,EAAE;AAAA,MACvK;AAAA,QAAE,MAAM;AAAA,QAAa,MAAM;AAAA,QAAU,MAAM;AAAA,QACzC,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,MAAM,mBAAuB,MAAM,UAAU,MAAM,oCAAoC,MAAM,CAAC,gCAAgC,yBAAyB,EAAE;AAAA,MAC3J,EAAE,MAAM,oBAAuB,MAAM,UAAU,MAAM,2DAA2D,MAAM,CAAC,uCAAuC,gCAAgC,eAAe,EAAE;AAAA,MAC/M,EAAE,MAAM,kBAAuB,MAAM,UAAU,MAAM,sFAAsF,MAAM,CAAC,wCAAwC,eAAe,EAAE;AAAA,MAC3M,EAAE,MAAM,sBAAuB,MAAM,UAAU,MAAM,oEAAoE,MAAM,CAAC,4BAA4B,mCAAmC,iBAAiB,EAAE;AAAA,MAClN,EAAE,MAAM,kBAAuB,MAAM,UAAU,MAAM,oFAA+E,MAAM,CAAC,eAAe,iBAAiB,eAAe,EAAE;AAAA,MAC5L,EAAE,MAAM,gBAAuB,MAAM,UAAU,MAAM,gFAAgF,MAAM,CAAC,oCAAoC,aAAa,eAAe,EAAE;AAAA,MAC9M,EAAE,MAAM,iBAAuB,MAAM,UAAU,MAAM,kFAAkF,MAAM,CAAC,eAAe,EAAE;AAAA,MAC/J,EAAE,MAAM,eAAuB,MAAM,UAAU,MAAM,4EAA4E,MAAM,CAAC,kBAAkB,eAAe,EAAE;AAAA,MAC3K;AAAA,QAAE,MAAM;AAAA,QAAW,MAAM;AAAA,QAAa,MAAM;AAAA,QAC1C,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,CAAC,sBAAsB,oDAAoD;AAAA,MAC3E,CAAC,0CAA0C,2CAA2C;AAAA,MACtF,CAAC,mBAAmB,oDAAoD;AAAA,MACxE,CAAC,2BAA2B,yCAAyC;AAAA,MACrE,CAAC,iDAAiD,oDAAoD;AAAA,MACtG,CAAC,0DAA0D,oCAAoC;AAAA,MAC/F,CAAC,6BAA6B,6BAA6B;AAAA,MAC3D,CAAC,uBAAuB,2CAA2C;AAAA,MACnE,CAAC,iDAAiD,oDAAoD;AAAA,MACtG,CAAC,yCAAyC,uCAAuC;AAAA,MACjF,CAAC,iCAAiC,qDAAqD;AAAA,MACvF,CAAC,sBAAsB,8BAA8B;AAAA,MACrD,CAAC,+BAA+B,qCAAqC;AAAA,MACrE,CAAC,4CAA4C,6BAA6B;AAAA,MAC1E,CAAC,mCAAmC,+BAA+B;AAAA,MACnE,CAAC,qCAAqC,kBAAkB;AAAA,MACxD,CAAC,oCAAoC,2CAA2C;AAAA,MAChF,CAAC,8BAA8B,yDAAyD;AAAA,MACxF,CAAC,4BAA4B,yDAAyD;AAAA,MACtF,CAAC,sEAAsE,sCAAsC;AAAA,MAC7G,CAAC,0CAA0C,6CAA6C;AAAA,MACxF,CAAC,2CAA2C,sCAAsC;AAAA,MAClF,CAAC,2BAA2B,4CAA4C;AAAA,MACxE,CAAC,wCAAwC,sCAAsC;AAAA,MAC/E,CAAC,qEAAqE,+BAA+B;AAAA,MACrG,CAAC,2CAA2C,sBAAsB;AAAA,MAClE,CAAC,+BAA+B,8BAA8B;AAAA,MAC9D,CAAC,gCAAgC,uBAAuB;AAAA,MACxD,CAAC,4BAA4B,6BAA6B;AAAA,MAC1D,CAAC,iDAAiD,qCAAqC;AAAA,IACzF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IAAM,OAAO;AAAA,IACnB,UAAU;AAAA,MACR,EAAE,MAAM,WAAe,MAAM,UAAW,MAAM,kDAAkD;AAAA,MAChG,EAAE,MAAM,eAAe,MAAM,WAAW,MAAM,8DAA8D;AAAA,MAC5G,EAAE,MAAM,QAAe,MAAM,SAAW,MAAM,2CAA2C,MAAM,CAAC,iCAAiC,mBAAmB,EAAE;AAAA,MACtJ,EAAE,MAAM,QAAe,MAAM,4BAA4D,MAAM,CAAC,wBAAwB,8BAA8B,wBAAwB,EAAE;AAAA,MAChL,EAAE,MAAM,SAAe,MAAM,wBAA2D,MAAM,CAAC,2BAA2B,0BAA0B,EAAE;AAAA,IACxJ;AAAA,IACA,UAAU;AAAA,MACR,CAAC,0BAA0B,0BAA0B;AAAA,MACrD,CAAC,6BAA6B,iCAAiC;AAAA,MAC/D,CAAC,0BAA0B,0BAA0B;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,YAAY,OAAc,cAAgC;AACjE,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,UAAQ,IAAI,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO,KAAK,MAAM,CAAC,IAAI;AAEjH,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAK,EAAE,IAAI,GAAG,EAAE,YAAY,WAAW,EAAE,KAAK,KAAK,EAAE,GAAG,qDAAqC,EAAE,KAAK,EAAE;AACjH,QAAM,KAAK,EAAE;AAEb,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,QAAQ,KAAK;AAC9C,UAAM,MAAM,MAAM,SAAS,CAAC;AAC5B,UAAM,YAAY,IAAI,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO;AAC1D,UAAM,gBAAgB,MAAM;AAC5B,UAAM,SAAS,gBAAgB,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,SAAI,EAAE,KAAK,MAAM;AACnE,UAAM,WAAW,gBACb,GAAG,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG,IAAI,IAAI,GAAG,EAAE,KAAK,GAAG,IAAI,OAAO,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE,QAAQ,EAAE,KAC/F,GAAG,EAAE,QAAQ,GAAG,IAAI,IAAI,GAAG,EAAE,KAAK,GAAG,IAAI,OAAO,MAAM,EAAE,MAAM,IAAI,OAAO,EAAE,QAAQ,EAAE;AACzF,UAAM,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,YAAY,UAAU,MAAM,CAAC;AAChE,UAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE;AACrE,QAAI,IAAI,MAAM;AACZ,iBAAW,OAAO,IAAI,MAAM;AAC1B,cAAM,CAAC,MAAM,GAAG,IAAI,IAAI,IAAI,MAAM,KAAK;AACvC,cAAM,KAAK,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,EAAE,KAAK,GAAG,KAAK,SAAS,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,EAAE;AAAA,MAC7G;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,EAAE,IAAI,GAAG,EAAE,YAAY,WAAW,EAAE,KAAK,EAAE;AAC3D,UAAM,KAAK,EAAE;AACb,eAAW,CAAC,IAAI,IAAI,KAAK,MAAM,UAAU;AACvC,YAAM,KAAK,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;AAClE,YAAM,KAAK,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,KAAK,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,aAA6B;AAC/C,SAAO,OAAO,IAAI,CAAC,GAAG,MAAM;AAC1B,QAAI,MAAM,aAAa;AACrB,aAAO,GAAG,EAAE,IAAI,GAAG,EAAE,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,KAAK;AAAA,IACzE;AACA,WAAO,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,KAAK;AAAA,EAC/C,CAAC,EAAE,KAAK,IAAI;AACd;AAKO,SAAS,uBAA6B;AAC3C,QAAM,aAAa;AACnB,MAAI,cAAc;AAClB,MAAI,cAAc;AAClB,MAAI,gBAAgB;AAEpB,WAAS,OAAO,OAAgB;AAC9B,QAAI,CAAC,SAAS,gBAAgB,GAAG;AAC/B,cAAQ,OAAO,MAAM,QAAQ,aAAa,GAAG;AAC7C,eAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,gBAAQ,OAAO,MAAM,GAAG,UAAU;AAAA,CAAI;AAAA,MACxC;AACA,cAAQ,OAAO,MAAM,QAAQ,aAAa,GAAG;AAAA,IAC/C;AAEA,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,KAAK,WAAW,WAAW,CAAC,EAAE;AACzC,UAAM,KAAK,KAAK,EAAE,GAAG,+EAAkD,EAAE,KAAK,EAAE;AAChF,UAAM,KAAK,GAAG,YAAY,OAAO,WAAW,GAAI,WAAW,CAAC;AAC5D,UAAM,KAAK,EAAE;AAEb,eAAW,QAAQ,OAAO;AACxB,cAAQ,OAAO,MAAM,GAAG,UAAU,GAAG,IAAI;AAAA,CAAI;AAAA,IAC/C;AACA,oBAAgB,MAAM;AAAA,EACxB;AAEA,iCAAY;AACZ,UAAQ,IAAI;AAAA,EAAK,EAAE,IAAI,GAAG,EAAE,YAAY,QAAQ,EAAE,KAAK,KAAK,EAAE,QAAQ,YAAY,EAAE,KAAK,IAAI,EAAE,IAAI,YAAY,EAAE,KAAK,IAAI,EAAE,GAAG,YAAY,EAAE,KAAK,EAAE;AAEpJ,SAAO,IAAI;AAGX,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MAAM,OAAO;AAEhB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,QAAQ,YAAY,OAAO,CAAC,GAAI,EAAE;AACxC,iBAAW,QAAQ,MAAO,SAAQ,IAAI,IAAI;AAAA,IAC5C;AACA;AAAA,EACF;AAEA,QAAM,WAAW,IAAI;AACrB,QAAM,OAAO;AACb,QAAM,YAAY,MAAM;AAExB,WAAS,UAAU;AACjB,UAAM,eAAe,QAAQ,MAAM;AACnC,UAAM,WAAW,KAAK;AACtB,UAAM,MAAM;AAAA,EACd;AAEA,WAAS,OAAO,KAAa;AAE3B,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,UAAI,QAAQ,UAAU;AACpB,uBAAe,cAAc,KAAK,OAAO;AACzC,sBAAc;AACd,eAAO,KAAK;AAAA,MACd,WAAW,QAAQ,UAAU;AAC3B,uBAAe,cAAc,IAAI,OAAO,UAAU,OAAO;AACzD,sBAAc;AACd,eAAO,KAAK;AAAA,MACd,WAAW,QAAQ,UAAU;AAC3B,cAAM,SAAS,OAAO,WAAW,EAAG,SAAS,SAAS;AACtD,sBAAc,KAAK,IAAI,cAAc,GAAG,MAAM;AAC9C,eAAO,KAAK;AAAA,MACd,WAAW,QAAQ,UAAU;AAC3B,sBAAc,KAAK,IAAI,cAAc,GAAG,CAAC;AACzC,eAAO,KAAK;AAAA,MACd;AAEA;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,cAAQ;AACR,YAAM,MAAM,OAAO,WAAW,EAAG,SAAS,WAAW;AACrD,YAAM,UAAU,aAAa,IAAI,IAAI,GAAG,IAAI,OAAO,MAAM,IAAI,OAAO,EAAE;AAEtE,cAAQ,OAAO,MAAM,QAAQ,aAAa,GAAG;AAC7C,eAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,gBAAQ,OAAO,MAAM,GAAG,UAAU;AAAA,CAAI;AAAA,MACxC;AACA,cAAQ,OAAO,MAAM,QAAQ,aAAa,GAAG;AAC7C,cAAQ,IAAI;AAAA,IAAO,EAAE,KAAK,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,OAAO;AAAA,CAAI;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB,WAAW,QAAQ,OAAO,QAAQ,KAAQ;AACxC,cAAQ;AACR,cAAQ,IAAI;AACZ,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,GAAG,QAAQ,MAAM;AACzB;AAKO,SAAS,mBAAyB;AAEvC,UAAQ,IAAI;AAAA,EAAK,EAAE,IAAI,GAAG,EAAE,YAAY,QAAQ,EAAE,KAAK,EAAE;AACzD,UAAQ,IAAI,KAAK,EAAE,QAAQ,YAAY,EAAE,KAAK,IAAI,EAAE,IAAI,YAAY,EAAE,KAAK,IAAI,EAAE,GAAG,YAAY,EAAE,KAAK;AAAA,CAAI;AAE3G,aAAW,SAAS,QAAQ;AAC1B,YAAQ,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,YAAY,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK;AAAA,CAAI;AAC9F,UAAM,YAAY,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,UAAQ,IAAI,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO,KAAK,MAAM,CAAC,IAAI;AACjH,eAAW,OAAO,MAAM,UAAU;AAChC,YAAM,YAAY,IAAI,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO;AAC1D,YAAM,WAAW,GAAG,EAAE,QAAQ,GAAG,IAAI,IAAI,GAAG,EAAE,KAAK,GAAG,IAAI,OAAO,MAAM,EAAE,MAAM,IAAI,OAAO,EAAE,QAAQ,EAAE;AACtG,YAAM,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,YAAY,UAAU,MAAM,CAAC;AAChE,cAAQ,IAAI,KAAK,QAAQ,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE;AAC/D,UAAI,IAAI,MAAM;AACZ,mBAAW,OAAO,IAAI,MAAM;AAC1B,gBAAM,CAAC,MAAM,GAAG,IAAI,IAAI,IAAI,MAAM,KAAK;AACvC,kBAAQ,IAAI,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,EAAE,KAAK,GAAG,KAAK,SAAS,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,EAAE;AAAA,QAC9G;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,EACd;AAEA,UAAQ,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,YAAY,eAAe,EAAE,KAAK;AAAA,CAAI;AAChE,UAAQ,IAAI,KAAK,EAAE,MAAM,aAAa,EAAE,KAAK,QAAQ,EAAE,IAAI,iBAAiB,EAAE,KAAK,EAAE;AACrF,UAAQ,IAAI,KAAK,EAAE,MAAM,gBAAgB,EAAE,KAAK,KAAK,EAAE,IAAI,sBAAsB,EAAE,KAAK;AAAA,CAAI;AAG5F,UAAQ,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,YAAY,WAAW,EAAE,KAAK;AAAA,CAAI;AAE5D,QAAM,gBAAwE;AAAA,IAC5E;AAAA,MACE,OAAO;AAAA,MACP,UAAU;AAAA,QACR,CAAC,qBAAkD,+DAA+D;AAAA,QAClH,CAAC,qCAAkD,0CAA0C;AAAA,QAC7F,CAAC,oCAAkD,yDAAyD;AAAA,QAC5G,CAAC,0BAAkD,wCAAwC;AAAA,QAC3F,CAAC,uBAAkD,6CAA6C;AAAA,QAChG,CAAC,yBAAkD,uCAAuC;AAAA,QAC1F,CAAC,kBAAkD,mCAAmC;AAAA,MACxF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,UAAU;AAAA,QACR,CAAC,4BAAkD,iCAAiC;AAAA,QACpF,CAAC,qCAAkD,sCAAsC;AAAA,QACzF,CAAC,oCAAkD,iCAAiC;AAAA,QACpF,CAAC,+CAAmD,oCAAoC;AAAA,QACxF,CAAC,kCAAkD,iCAAiC;AAAA,QACpF,CAAC,qDAAqD,gCAAgC;AAAA,QACtF,CAAC,0BAAkD,qDAAqD;AAAA,QACxG,CAAC,wCAAkD,4CAA4C;AAAA,MACjG;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,UAAU;AAAA,QACR,CAAC,iCAAkD,+BAA+B;AAAA,QAClF,CAAC,wBAAkD,0CAA0C;AAAA,QAC7F,CAAC,uBAAkD,sCAAsC;AAAA,QACzF,CAAC,wCAAkD,yCAAyC;AAAA,QAC5F,CAAC,wCAAkD,0CAA0C;AAAA,MAC/F;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,UAAU;AAAA,QACR,CAAC,qCAAkD,4BAA4B;AAAA,QAC/E,CAAC,yCAAkD,qCAAqC;AAAA,QACxF,CAAC,8BAAkD,0BAA0B;AAAA,MAC/E;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,UAAU;AAAA,QACR,CAAC,sBAA6D,oDAAoD;AAAA,QAClH,CAAC,0CAA4D,2CAA2C;AAAA,QACxG,CAAC,mBAA6D,0BAA0B;AAAA,QACxF,CAAC,2BAA6D,yCAAyC;AAAA,QACvG,CAAC,iDAA6D,0CAA0C;AAAA,QACxG,CAAC,0DAA6D,oCAAoC;AAAA,QAClG,CAAC,6BAA6D,wBAAwB;AAAA,QACtF,CAAC,uBAA6D,2CAA2C;AAAA,QACzG,CAAC,iDAA4D,oDAAoD;AAAA,QACjH,CAAC,yCAA6D,uCAAuC;AAAA,QACrG,CAAC,iCAA6D,qDAAqD;AAAA,QACnH,CAAC,sBAA6D,8BAA8B;AAAA,QAC5F,CAAC,+BAA4D,qCAAqC;AAAA,QAClG,CAAC,4CAA4D,6BAA6B;AAAA,QAC1F,CAAC,mCAA4D,+BAA+B;AAAA,QAC5F,CAAC,qCAA4D,kBAAkB;AAAA,QAC/E,CAAC,qEAAqE,+BAA+B;AAAA,QACrG,CAAC,8DAA8D,2BAA2B;AAAA,QAC1F,CAAC,2CAA4D,sBAAsB;AAAA,QACnF,CAAC,+BAA4D,8BAA8B;AAAA,QAC3F,CAAC,gCAA4D,uDAAuD;AAAA,QACpH,CAAC,4BAA4D,qCAAqC;AAAA,QAClG,CAAC,iDAA4D,6BAA6B;AAAA,MAC5F;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,UAAU;AAAA,QACR,CAAC,0BAAkD,wCAAwC;AAAA,QAC3F,CAAC,yBAAkD,sBAAsB;AAAA,QACzE,CAAC,oCAAiD,qCAAqC;AAAA,QACvF,CAAC,6BAAkD,iDAAiD;AAAA,QACpG,CAAC,6BAAkD,iCAAiC;AAAA,QACpF,CAAC,yCAAkD,kCAAkC;AAAA,QACrF,CAAC,oCAAkD,mCAAmC;AAAA,QACtF,CAAC,0BAAkD,0BAA0B;AAAA,QAC7E,CAAC,wCAAmD,kCAAkC;AAAA,QACtF,CAAC,8DAA8D,kBAAkB;AAAA,QACjF,CAAC,uBAAmD,2BAA2B;AAAA,QAC/E,CAAC,gDAAmD,iCAAiC;AAAA,QACrF,CAAC,qEAAqE,yBAAyB;AAAA,QAC/F,CAAC,yEAAyE,yBAAyB;AAAA,QACnG,CAAC,yBAAkD,sBAAsB;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAEA,aAAW,MAAM,eAAe;AAC9B,YAAQ,IAAI,KAAK,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,KAAK,EAAE;AAC7C,eAAW,CAAC,IAAI,IAAI,KAAK,GAAG,UAAU;AACpC,cAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;AACnE,cAAQ,IAAI,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,KAAK,EAAE;AAAA,IAC7C;AACA,YAAQ,IAAI;AAAA,EACd;AACF;AAEO,SAAS,SAAS,SAAwB;AAC/C,UAAQ,cAAc,EAAE,YAAY,MAAM,GAAG,CAAC;AAC9C,UAAQ,YAAY,YAAY,EAAE;AAElC,UAAQ,WAAW,KAAK;AAC1B;",
6
6
  "names": []
7
7
  }