ts-knowledge-graph 0.1.1 → 0.1.4

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 (212) hide show
  1. package/README.md +104 -43
  2. package/contribs/web_visualisation/README.md +83 -0
  3. package/contribs/web_visualisation/web/css/style.css +219 -0
  4. package/contribs/web_visualisation/web/data/.gitignore +3 -0
  5. package/contribs/web_visualisation/web/data/kind_descriptions.js +38 -0
  6. package/contribs/web_visualisation/web/index.html +74 -0
  7. package/contribs/web_visualisation/web/js/app.js +910 -0
  8. package/contribs/web_visualisation/web/tsconfig.json +18 -0
  9. package/contribs/web_visualisation/web/types/app_globals.d.ts +146 -0
  10. package/dist/benchmark/benchmark_stats.d.ts +41 -0
  11. package/dist/benchmark/benchmark_stats.d.ts.map +1 -0
  12. package/dist/benchmark/benchmark_stats.js +61 -0
  13. package/dist/benchmark/benchmark_stats.js.map +1 -0
  14. package/dist/benchmark/node_benchmark.d.ts +78 -0
  15. package/dist/benchmark/node_benchmark.d.ts.map +1 -0
  16. package/dist/benchmark/node_benchmark.js +112 -0
  17. package/dist/benchmark/node_benchmark.js.map +1 -0
  18. package/dist/cli.d.ts +0 -9
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +32 -208
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/benchmark_command.d.ts +11 -0
  23. package/dist/commands/benchmark_command.d.ts.map +1 -0
  24. package/dist/commands/benchmark_command.js +91 -0
  25. package/dist/commands/benchmark_command.js.map +1 -0
  26. package/dist/commands/blast_radius_command.d.ts +5 -0
  27. package/dist/commands/blast_radius_command.d.ts.map +1 -0
  28. package/dist/commands/blast_radius_command.js +18 -0
  29. package/dist/commands/blast_radius_command.js.map +1 -0
  30. package/dist/commands/calls_command.d.ts +5 -0
  31. package/dist/commands/calls_command.d.ts.map +1 -0
  32. package/dist/commands/calls_command.js +7 -0
  33. package/dist/commands/calls_command.js.map +1 -0
  34. package/dist/commands/command_helpers.d.ts +15 -0
  35. package/dist/commands/command_helpers.d.ts.map +1 -0
  36. package/dist/commands/command_helpers.js +61 -0
  37. package/dist/commands/command_helpers.js.map +1 -0
  38. package/dist/commands/cost_command.d.ts +13 -0
  39. package/dist/commands/cost_command.d.ts.map +1 -0
  40. package/dist/commands/cost_command.js +122 -0
  41. package/dist/commands/cost_command.js.map +1 -0
  42. package/dist/commands/dead_exports_command.d.ts +5 -0
  43. package/dist/commands/dead_exports_command.d.ts.map +1 -0
  44. package/dist/commands/dead_exports_command.js +7 -0
  45. package/dist/commands/dead_exports_command.js.map +1 -0
  46. package/dist/commands/enrich_command.d.ts +7 -0
  47. package/dist/commands/enrich_command.d.ts.map +1 -0
  48. package/dist/commands/enrich_command.js +62 -0
  49. package/dist/commands/enrich_command.js.map +1 -0
  50. package/dist/commands/extract_command.d.ts +8 -0
  51. package/dist/commands/extract_command.d.ts.map +1 -0
  52. package/dist/commands/extract_command.js +49 -0
  53. package/dist/commands/extract_command.js.map +1 -0
  54. package/dist/commands/find_command.d.ts +5 -0
  55. package/dist/commands/find_command.d.ts.map +1 -0
  56. package/dist/commands/find_command.js +7 -0
  57. package/dist/commands/find_command.js.map +1 -0
  58. package/dist/commands/hotspots_command.d.ts +7 -0
  59. package/dist/commands/hotspots_command.d.ts.map +1 -0
  60. package/dist/commands/hotspots_command.js +67 -0
  61. package/dist/commands/hotspots_command.js.map +1 -0
  62. package/dist/commands/install_command.d.ts +15 -0
  63. package/dist/commands/install_command.d.ts.map +1 -0
  64. package/dist/commands/install_command.js +41 -0
  65. package/dist/commands/install_command.js.map +1 -0
  66. package/dist/commands/load_command.d.ts +6 -0
  67. package/dist/commands/load_command.d.ts.map +1 -0
  68. package/dist/commands/load_command.js +30 -0
  69. package/dist/commands/load_command.js.map +1 -0
  70. package/dist/commands/neighbors_command.d.ts +5 -0
  71. package/dist/commands/neighbors_command.d.ts.map +1 -0
  72. package/dist/commands/neighbors_command.js +17 -0
  73. package/dist/commands/neighbors_command.js.map +1 -0
  74. package/dist/commands/references_command.d.ts +5 -0
  75. package/dist/commands/references_command.d.ts.map +1 -0
  76. package/dist/commands/references_command.js +17 -0
  77. package/dist/commands/references_command.js.map +1 -0
  78. package/dist/commands/verify_command.d.ts +8 -0
  79. package/dist/commands/verify_command.d.ts.map +1 -0
  80. package/dist/commands/verify_command.js +57 -0
  81. package/dist/commands/verify_command.js.map +1 -0
  82. package/dist/commands/web_command.d.ts +46 -0
  83. package/dist/commands/web_command.d.ts.map +1 -0
  84. package/dist/commands/web_command.js +226 -0
  85. package/dist/commands/web_command.js.map +1 -0
  86. package/dist/commands/who_calls_command.d.ts +5 -0
  87. package/dist/commands/who_calls_command.d.ts.map +1 -0
  88. package/dist/commands/who_calls_command.js +7 -0
  89. package/dist/commands/who_calls_command.js.map +1 -0
  90. package/dist/enrich/cpu_profile.d.ts +127 -0
  91. package/dist/enrich/cpu_profile.d.ts.map +1 -0
  92. package/dist/enrich/cpu_profile.js +97 -0
  93. package/dist/enrich/cpu_profile.js.map +1 -0
  94. package/dist/enrich/runtime_enricher.d.ts +56 -0
  95. package/dist/enrich/runtime_enricher.d.ts.map +1 -0
  96. package/dist/enrich/runtime_enricher.js +80 -0
  97. package/dist/enrich/runtime_enricher.js.map +1 -0
  98. package/dist/enrich/runtime_join.d.ts +100 -0
  99. package/dist/enrich/runtime_join.d.ts.map +1 -0
  100. package/dist/enrich/runtime_join.js +227 -0
  101. package/dist/enrich/runtime_join.js.map +1 -0
  102. package/dist/extract/api_extractor.d.ts +24 -0
  103. package/dist/extract/api_extractor.d.ts.map +1 -0
  104. package/dist/extract/api_extractor.js +71 -0
  105. package/dist/extract/api_extractor.js.map +1 -0
  106. package/dist/extract/config_extractor.d.ts +22 -0
  107. package/dist/extract/config_extractor.d.ts.map +1 -0
  108. package/dist/extract/config_extractor.js +61 -0
  109. package/dist/extract/config_extractor.js.map +1 -0
  110. package/dist/extract/endpoint_extractor.d.ts +36 -0
  111. package/dist/extract/endpoint_extractor.d.ts.map +1 -0
  112. package/dist/extract/endpoint_extractor.js +117 -0
  113. package/dist/extract/endpoint_extractor.js.map +1 -0
  114. package/dist/extract/{graph-builder.d.ts → graph_builder.d.ts} +9 -1
  115. package/dist/extract/graph_builder.d.ts.map +1 -0
  116. package/dist/extract/graph_builder.js +61 -0
  117. package/dist/extract/graph_builder.js.map +1 -0
  118. package/dist/extract/node_id.d.ts +24 -0
  119. package/dist/extract/node_id.d.ts.map +1 -0
  120. package/dist/extract/node_id.js +44 -0
  121. package/dist/extract/node_id.js.map +1 -0
  122. package/dist/extract/{project-loader.d.ts → project_loader.d.ts} +1 -1
  123. package/dist/extract/project_loader.d.ts.map +1 -0
  124. package/dist/extract/{project-loader.js → project_loader.js} +1 -1
  125. package/dist/extract/{project-loader.js.map → project_loader.js.map} +1 -1
  126. package/dist/extract/scope_resolver.d.ts +22 -0
  127. package/dist/extract/scope_resolver.d.ts.map +1 -0
  128. package/dist/extract/scope_resolver.js +53 -0
  129. package/dist/extract/scope_resolver.js.map +1 -0
  130. package/dist/extract/semantic_extractor.d.ts +47 -0
  131. package/dist/extract/semantic_extractor.d.ts.map +1 -0
  132. package/dist/extract/{semantic-extractor.js → semantic_extractor.js} +98 -4
  133. package/dist/extract/semantic_extractor.js.map +1 -0
  134. package/dist/extract/{structural-extractor.d.ts → structural_extractor.d.ts} +7 -1
  135. package/dist/extract/{structural-extractor.d.ts.map → structural_extractor.d.ts.map} +1 -1
  136. package/dist/extract/{structural-extractor.js → structural_extractor.js} +24 -14
  137. package/dist/extract/structural_extractor.js.map +1 -0
  138. package/dist/project_root.d.ts +7 -0
  139. package/dist/project_root.d.ts.map +1 -0
  140. package/dist/project_root.js +9 -0
  141. package/dist/project_root.js.map +1 -0
  142. package/dist/query/graph_query.d.ts +262 -0
  143. package/dist/query/graph_query.d.ts.map +1 -0
  144. package/dist/query/graph_query.js +604 -0
  145. package/dist/query/graph_query.js.map +1 -0
  146. package/dist/schema/edge.d.ts +40 -5
  147. package/dist/schema/edge.d.ts.map +1 -1
  148. package/dist/schema/edge.js +70 -0
  149. package/dist/schema/edge.js.map +1 -1
  150. package/dist/schema/node.d.ts +20 -5
  151. package/dist/schema/node.d.ts.map +1 -1
  152. package/dist/schema/node.js +36 -0
  153. package/dist/schema/node.js.map +1 -1
  154. package/dist/schema/runtime_manifest.d.ts +36 -0
  155. package/dist/schema/runtime_manifest.d.ts.map +1 -0
  156. package/dist/schema/runtime_manifest.js +23 -0
  157. package/dist/schema/runtime_manifest.js.map +1 -0
  158. package/dist/store/{jsonl-reader.d.ts → jsonl_reader.d.ts} +1 -1
  159. package/dist/store/{jsonl-reader.d.ts.map → jsonl_reader.d.ts.map} +1 -1
  160. package/dist/store/{jsonl-reader.js → jsonl_reader.js} +1 -1
  161. package/dist/store/{jsonl-reader.js.map → jsonl_reader.js.map} +1 -1
  162. package/dist/store/{jsonl-store.d.ts → jsonl_store.d.ts} +1 -1
  163. package/dist/store/{jsonl-store.d.ts.map → jsonl_store.d.ts.map} +1 -1
  164. package/dist/store/{jsonl-store.js → jsonl_store.js} +1 -1
  165. package/dist/store/{jsonl-store.js.map → jsonl_store.js.map} +1 -1
  166. package/dist/store/kuzu_store.d.ts +66 -0
  167. package/dist/store/kuzu_store.d.ts.map +1 -0
  168. package/dist/store/kuzu_store.js +156 -0
  169. package/dist/store/kuzu_store.js.map +1 -0
  170. package/dist/verify/project_verifier.d.ts +85 -0
  171. package/dist/verify/project_verifier.d.ts.map +1 -0
  172. package/dist/verify/project_verifier.js +138 -0
  173. package/dist/verify/project_verifier.js.map +1 -0
  174. package/dotclaude_folder/skills/code-graph-query/SKILL.md +91 -0
  175. package/package.json +88 -5
  176. package/.env-sample +0 -34
  177. package/dist/agent/agent-tools.d.ts +0 -13
  178. package/dist/agent/agent-tools.d.ts.map +0 -1
  179. package/dist/agent/agent-tools.js +0 -153
  180. package/dist/agent/agent-tools.js.map +0 -1
  181. package/dist/agent/code-editor.d.ts +0 -18
  182. package/dist/agent/code-editor.d.ts.map +0 -1
  183. package/dist/agent/code-editor.js +0 -43
  184. package/dist/agent/code-editor.js.map +0 -1
  185. package/dist/agent/optimizer-agent.d.ts +0 -30
  186. package/dist/agent/optimizer-agent.d.ts.map +0 -1
  187. package/dist/agent/optimizer-agent.js +0 -97
  188. package/dist/agent/optimizer-agent.js.map +0 -1
  189. package/dist/agent/verifier.d.ts +0 -9
  190. package/dist/agent/verifier.d.ts.map +0 -1
  191. package/dist/agent/verifier.js +0 -19
  192. package/dist/agent/verifier.js.map +0 -1
  193. package/dist/extract/graph-builder.d.ts.map +0 -1
  194. package/dist/extract/graph-builder.js +0 -39
  195. package/dist/extract/graph-builder.js.map +0 -1
  196. package/dist/extract/node-id.d.ts +0 -8
  197. package/dist/extract/node-id.d.ts.map +0 -1
  198. package/dist/extract/node-id.js +0 -22
  199. package/dist/extract/node-id.js.map +0 -1
  200. package/dist/extract/project-loader.d.ts.map +0 -1
  201. package/dist/extract/semantic-extractor.d.ts +0 -22
  202. package/dist/extract/semantic-extractor.d.ts.map +0 -1
  203. package/dist/extract/semantic-extractor.js.map +0 -1
  204. package/dist/extract/structural-extractor.js.map +0 -1
  205. package/dist/query/graph-query.d.ts +0 -28
  206. package/dist/query/graph-query.d.ts.map +0 -1
  207. package/dist/query/graph-query.js +0 -93
  208. package/dist/query/graph-query.js.map +0 -1
  209. package/dist/store/kuzu-store.d.ts +0 -14
  210. package/dist/store/kuzu-store.d.ts.map +0 -1
  211. package/dist/store/kuzu-store.js +0 -52
  212. package/dist/store/kuzu-store.js.map +0 -1
package/dist/cli.js CHANGED
@@ -1,221 +1,45 @@
1
1
  #!/usr/bin/env node
2
- import { existsSync } from 'node:fs';
3
- import { resolve } from 'node:path';
4
- import chalk from 'chalk';
5
2
  import { Command } from 'commander';
6
- import { AgentTools } from './agent/agent-tools.js';
7
- import { CodeEditor } from './agent/code-editor.js';
8
- import { OptimizerAgent } from './agent/optimizer-agent.js';
9
- import { GraphBuilder } from './extract/graph-builder.js';
10
- import { ProjectLoader } from './extract/project-loader.js';
11
- import { GraphQuery } from './query/graph-query.js';
12
- import { JsonlReader } from './store/jsonl-reader.js';
13
- import { JsonlStore } from './store/jsonl-store.js';
14
- import { KuzuStore } from './store/kuzu-store.js';
15
- const DEFAULT_TASK = 'Find one genuinely dead exported symbol using dead_exports, confirm with references that it has zero inbound references, then remove it safely.';
16
- const DEFAULT_DB_PATH = './outputs/graph.kuzu';
17
- const DEFAULT_GRAPH_DIR = './outputs/graph';
3
+ import { BenchmarkCommand } from './commands/benchmark_command.js';
4
+ import { BlastRadiusCommand } from './commands/blast_radius_command.js';
5
+ import { CallsCommand } from './commands/calls_command.js';
6
+ import { CostCommand } from './commands/cost_command.js';
7
+ import { DeadExportsCommand } from './commands/dead_exports_command.js';
8
+ import { EnrichCommand } from './commands/enrich_command.js';
9
+ import { ExtractCommand } from './commands/extract_command.js';
10
+ import { FindCommand } from './commands/find_command.js';
11
+ import { HotspotsCommand } from './commands/hotspots_command.js';
12
+ import { InstallCommand } from './commands/install_command.js';
13
+ import { LoadCommand } from './commands/load_command.js';
14
+ import { NeighborsCommand } from './commands/neighbors_command.js';
15
+ import { ReferencesCommand } from './commands/references_command.js';
16
+ import { VerifyCommand } from './commands/verify_command.js';
17
+ import { WebCommand } from './commands/web_command.js';
18
+ import { WhoCallsCommand } from './commands/who_calls_command.js';
18
19
  export class Cli {
19
20
  static run(argv) {
20
21
  const program = new Command();
21
22
  program
22
23
  .name('ts-knowledge-graph')
23
24
  .description('Parse a TypeScript project into a knowledge graph and query it');
24
- program
25
- .command('extract')
26
- .argument('<root>', 'path to the TypeScript project to parse')
27
- .option('-o, --out <dir>', 'output directory for the JSONL graph', DEFAULT_GRAPH_DIR)
28
- .option('--semantic', 'resolve heritage and CALLS edges (slower)', false)
29
- .action(async (root, options) => {
30
- await Cli.extract(root, options);
31
- });
32
- program
33
- .command('load')
34
- .description('load a JSONL graph into an embedded Kùzu database')
35
- .argument('[graphDir]', 'directory holding nodes.jsonl and edges.jsonl', DEFAULT_GRAPH_DIR)
36
- .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
37
- .action(async (graphDir, options) => {
38
- await Cli.load(graphDir, options.db);
39
- });
40
- Cli.registerQuery(program, 'find', '<pattern>', 'find symbols whose name contains <pattern>', (query, arg) => query.find(arg));
41
- Cli.registerQuery(program, 'who-calls', '<id>', 'list symbols that call <id>', (query, arg) => query.whoCalls(arg));
42
- Cli.registerQuery(program, 'calls', '<id>', 'list symbols that <id> calls', (query, arg) => query.calls(arg));
43
- Cli.registerQuery(program, 'dead-exports', '', 'list exported symbols with no inbound references', (query) => query.deadExports());
44
- program
45
- .command('blast-radius')
46
- .description('list every symbol transitively impacted by changing <id>')
47
- .argument('<id>', 'node id to analyse')
48
- .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
49
- .option('--depth <n>', 'maximum traversal depth', '10')
50
- .option('--json', 'emit raw JSON', false)
51
- .action(async (id, options) => {
52
- await Cli.withQuery(options.db, async (query) => {
53
- Cli.printRefs(await query.blastRadius(id, Number(options.depth)), options.json === true);
54
- });
55
- });
56
- program
57
- .command('neighbors')
58
- .description('show the one-hop neighbourhood of <id>')
59
- .argument('<id>', 'node id to inspect')
60
- .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
61
- .option('--json', 'emit raw JSON', false)
62
- .action(async (id, options) => {
63
- await Cli.withQuery(options.db, async (query) => {
64
- Cli.printNeighbors(await query.neighborhood(id), options.json === true);
65
- });
66
- });
67
- program
68
- .command('references')
69
- .description('list everything that references <id> (calls, type usage, heritage, new)')
70
- .argument('<id>', 'node id to inspect')
71
- .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
72
- .option('--json', 'emit raw JSON', false)
73
- .action(async (id, options) => {
74
- await Cli.withQuery(options.db, async (query) => {
75
- Cli.printNeighbors(await query.references(id), options.json === true);
76
- });
77
- });
78
- program
79
- .command('optimize')
80
- .description('run the autonomous optimization agent against the loaded graph')
81
- .argument('[task]', 'what the agent should try to optimize', DEFAULT_TASK)
82
- .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
83
- .option('-m, --model <name>', 'model name (defaults to OPENAI_MODEL)')
84
- .option('--max-steps <n>', 'maximum agent steps', '12')
85
- .action(async (task, options) => {
86
- await Cli.optimize(task, options);
87
- });
25
+ ExtractCommand.register(program);
26
+ LoadCommand.register(program);
27
+ EnrichCommand.register(program);
28
+ FindCommand.register(program);
29
+ WhoCallsCommand.register(program);
30
+ CallsCommand.register(program);
31
+ DeadExportsCommand.register(program);
32
+ HotspotsCommand.register(program);
33
+ CostCommand.register(program);
34
+ VerifyCommand.register(program);
35
+ BenchmarkCommand.register(program);
36
+ BlastRadiusCommand.register(program);
37
+ NeighborsCommand.register(program);
38
+ ReferencesCommand.register(program);
39
+ WebCommand.register(program);
40
+ InstallCommand.register(program);
88
41
  void program.parseAsync(argv);
89
42
  }
90
- static registerQuery(program, name, argSpec, description, run) {
91
- const command = program.command(argSpec === '' ? name : `${name} ${argSpec}`).description(description);
92
- command
93
- .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
94
- .option('--json', 'emit raw JSON', false)
95
- .action(async (...args) => {
96
- const options = args[args.length - 2];
97
- const arg = argSpec === '' ? '' : args[0];
98
- await Cli.withQuery(options.db, async (query) => {
99
- Cli.printRefs(await run(query, arg), options.json === true);
100
- });
101
- });
102
- }
103
- static async extract(root, options) {
104
- const rootPath = resolve(root);
105
- const outPath = resolve(options.out);
106
- console.log(chalk.cyan(`Loading project at ${rootPath} ...`));
107
- const project = ProjectLoader.load(rootPath);
108
- const builder = new GraphBuilder();
109
- builder.build(project, rootPath, { semantic: options.semantic });
110
- const nodes = builder.getNodes();
111
- const edges = builder.getEdges();
112
- await JsonlStore.write(outPath, nodes, edges);
113
- console.log(chalk.green(`✓ ${nodes.length} nodes, ${edges.length} edges -> ${outPath}`));
114
- Cli.printBreakdown(nodes, edges);
115
- }
116
- static async load(graphDir, dbPath) {
117
- const resolvedDb = resolve(dbPath);
118
- console.log(chalk.cyan(`Loading ${resolve(graphDir)} into ${resolvedDb} ...`));
119
- const { nodes, edges } = await JsonlReader.read(resolve(graphDir));
120
- const store = new KuzuStore(resolvedDb);
121
- await store.initSchema();
122
- await store.load(nodes, edges);
123
- await store.close();
124
- console.log(chalk.green(`✓ loaded ${nodes.length} nodes, ${edges.length} edges`));
125
- }
126
- static async optimize(task, options) {
127
- if (existsSync('.env') === true) {
128
- process.loadEnvFile('.env');
129
- }
130
- if (process.env.OPENAI_API_KEY === undefined) {
131
- console.log(chalk.red('Set OPENAI_API_KEY before running the optimizer — copy .env-sample to .env and pick a provider.'));
132
- return;
133
- }
134
- const model = options.model ?? process.env.OPENAI_MODEL;
135
- if (model === undefined) {
136
- console.log(chalk.red('Set OPENAI_MODEL in .env (or pass --model) — see .env-sample for per-provider examples.'));
137
- return;
138
- }
139
- const rootPath = process.cwd();
140
- await Cli.withQuery(options.db, async (query) => {
141
- const agent = new OptimizerAgent({
142
- tools: new AgentTools(query, rootPath),
143
- editor: new CodeEditor(rootPath),
144
- rootPath,
145
- model,
146
- maxSteps: Number(options.maxSteps),
147
- });
148
- console.log(chalk.gray(`Model: ${model}${process.env.OPENAI_BASE_URL === undefined ? '' : ` @ ${process.env.OPENAI_BASE_URL}`}`));
149
- console.log(chalk.cyan(`Task: ${task}\n`));
150
- const outcome = await agent.run(task);
151
- for (const line of outcome.transcript) {
152
- console.log(chalk.gray(line));
153
- }
154
- console.log(chalk.bold(`\nApplied ${outcome.applied.length} verified edit(s):`));
155
- for (const edit of outcome.applied) {
156
- console.log(` ${chalk.green('✓')} ${edit.filePath} — ${edit.rationale}`);
157
- }
158
- if (outcome.applied.length === 0) {
159
- console.log(chalk.yellow(' (none — the agent found no safe change, or reverted what it tried)'));
160
- }
161
- });
162
- }
163
- static async withQuery(dbPath, fn) {
164
- const store = new KuzuStore(resolve(dbPath));
165
- await store.initSchema();
166
- try {
167
- await fn(new GraphQuery(store));
168
- }
169
- finally {
170
- await store.close();
171
- }
172
- }
173
- static printRefs(refs, json) {
174
- if (json === true) {
175
- console.log(JSON.stringify(refs, null, 2));
176
- return;
177
- }
178
- if (refs.length === 0) {
179
- console.log(chalk.yellow('(no results)'));
180
- return;
181
- }
182
- for (const ref of refs) {
183
- console.log(`${chalk.gray(ref.kind.padEnd(14))} ${chalk.bold(ref.name)} ${chalk.gray(`${ref.filePath}:${ref.startLine}`)}`);
184
- }
185
- console.log(chalk.gray(`\n${refs.length} result(s)`));
186
- }
187
- static printNeighbors(neighbors, json) {
188
- if (json === true) {
189
- console.log(JSON.stringify(neighbors, null, 2));
190
- return;
191
- }
192
- if (neighbors.length === 0) {
193
- console.log(chalk.yellow('(no neighbours)'));
194
- return;
195
- }
196
- for (const neighbor of neighbors) {
197
- const arrow = neighbor.direction === 'out' ? '->' : '<-';
198
- console.log(`${chalk.cyan(arrow)} ${chalk.gray(neighbor.edgeKind.padEnd(12))} ${chalk.bold(neighbor.name)} ${chalk.gray(`${neighbor.filePath}:${neighbor.startLine}`)}`);
199
- }
200
- console.log(chalk.gray(`\n${neighbors.length} edge(s)`));
201
- }
202
- static printBreakdown(nodes, edges) {
203
- console.log(chalk.bold('\nNodes'));
204
- for (const [kind, count] of Cli.countBy(nodes.map((node) => node.kind))) {
205
- console.log(` ${kind.padEnd(16)} ${count}`);
206
- }
207
- console.log(chalk.bold('\nEdges'));
208
- for (const [kind, count] of Cli.countBy(edges.map((edge) => edge.kind))) {
209
- console.log(` ${kind.padEnd(16)} ${count}`);
210
- }
211
- }
212
- static countBy(values) {
213
- const counts = new Map();
214
- for (const value of values) {
215
- counts.set(value, (counts.get(value) ?? 0) + 1);
216
- }
217
- return [...counts.entries()].sort((a, b) => b[1] - a[1]);
218
- }
219
43
  }
220
44
  Cli.run(process.argv);
221
45
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,OAAO,GAAG;IACf,MAAM,CAAC,GAAG,CAAC,IAAc;QACxB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,OAAO;aACL,IAAI,CAAC,oBAAoB,CAAC;aAC1B,WAAW,CAAC,gEAAgE,CAAC,CAAC;QAEhF,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9B,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9B,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9B,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7B,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,KAAK,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACD;AAED,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ export declare class BenchmarkCommand {
3
+ static register(program: Command): void;
4
+ private static run;
5
+ private static readBaselineMedian;
6
+ private static writeBaseline;
7
+ private static print;
8
+ private static printDelta;
9
+ private static round;
10
+ }
11
+ //# sourceMappingURL=benchmark_command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark_command.d.ts","sourceRoot":"","sources":["../../src/commands/benchmark_command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,qBAAa,gBAAgB;IAC5B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAuBlB,GAAG;mBAsBH,kBAAkB;mBAKlB,aAAa;IAMlC,OAAO,CAAC,MAAM,CAAC,KAAK;IAsBpB,OAAO,CAAC,MAAM,CAAC,UAAU;IAQzB,OAAO,CAAC,MAAM,CAAC,KAAK;CAGpB"}
@@ -0,0 +1,91 @@
1
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { z } from 'zod';
6
+ import { BenchmarkStats } from '../benchmark/benchmark_stats.js';
7
+ import { NodeBenchmark } from '../benchmark/node_benchmark.js';
8
+ import { KuzuStore } from '../store/kuzu_store.js';
9
+ import { DEFAULT_DB_PATH } from './command_helpers.js';
10
+ const METRICS = ['self-time', 'inclusive-time', 'samples'];
11
+ /** A saved baseline is just a prior report; we only need its median back. */
12
+ const BaselineFileSchema = z.object({ stats: z.object({ median: z.number() }) });
13
+ export class BenchmarkCommand {
14
+ static register(program) {
15
+ program
16
+ .command('benchmark')
17
+ .description('measure a target node\'s runtime metric over N profiling runs and report the median + spread (advisory)')
18
+ .argument('<target>', 'symbol name to benchmark; resolved against the current graph like `find`')
19
+ .requiredOption('--workload <path>', 'repeatable workload entry (.ts/.js) that exercises the target under load')
20
+ .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
21
+ .option('-r, --root <path>', 'project root the profile paths resolve against', process.cwd())
22
+ .option('--by <metric>', `metric: ${METRICS.join(', ')}`, 'self-time')
23
+ .option('--runs <n>', 'number of profiling runs to take the median of', '5')
24
+ .option('--baseline <file>', 'compare against the median saved in this baseline file (advisory delta)')
25
+ .option('--save-baseline <file>', 'write this run as a baseline for a later --baseline comparison')
26
+ .option('--json', 'emit the benchmark report as JSON', false)
27
+ .action(async (target, options) => {
28
+ if (METRICS.includes(options.by) === false) {
29
+ console.error(chalk.red(`unknown metric '${options.by}' — choose one of: ${METRICS.join(', ')}`));
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ await BenchmarkCommand.run(target, options);
34
+ });
35
+ }
36
+ static async run(target, options) {
37
+ const store = new KuzuStore(resolve(options.db));
38
+ await store.initSchema();
39
+ const profileDir = await mkdtemp(join(tmpdir(), 'tkg-bench-'));
40
+ try {
41
+ const baselineMedian = options.baseline === undefined ? undefined : await BenchmarkCommand.readBaselineMedian(options.baseline);
42
+ const config = { workload: resolve(options.workload), root: resolve(options.root), profileDir };
43
+ const report = await NodeBenchmark.measure(store, { target, metric: options.by, runs: Number(options.runs), baselineMedian }, () => NodeBenchmark.profileAndEnrich(store, config));
44
+ if (options.saveBaseline !== undefined) {
45
+ await BenchmarkCommand.writeBaseline(options.saveBaseline, report);
46
+ }
47
+ BenchmarkCommand.print(report, options.json === true);
48
+ }
49
+ finally {
50
+ await store.close();
51
+ await rm(profileDir, { recursive: true, force: true });
52
+ }
53
+ }
54
+ static async readBaselineMedian(file) {
55
+ const parsed = BaselineFileSchema.parse(JSON.parse(await readFile(resolve(file), 'utf8')));
56
+ return parsed.stats.median;
57
+ }
58
+ static async writeBaseline(file, report) {
59
+ const path = resolve(file);
60
+ await mkdir(dirname(path), { recursive: true });
61
+ await writeFile(path, JSON.stringify(report, null, 2), 'utf8');
62
+ }
63
+ static print(report, json) {
64
+ if (json === true) {
65
+ console.log(JSON.stringify(report, null, 2));
66
+ return;
67
+ }
68
+ const target = report.target;
69
+ console.log(chalk.bold(target.name) + chalk.gray(` ${target.kind} · ${target.filePath}:${target.startLine}`));
70
+ const stats = report.stats;
71
+ const median = chalk.cyan(`${BenchmarkCommand.round(stats.median)} ${report.unit}`);
72
+ const spread = chalk.gray(`(min ${BenchmarkCommand.round(stats.min)} · max ${BenchmarkCommand.round(stats.max)} · ` +
73
+ `spread ${BenchmarkCommand.round(stats.spread)} · mean ${BenchmarkCommand.round(stats.mean)} · ${stats.runs} runs)`);
74
+ console.log(` ${chalk.bold(report.metric)} median ${median} ${spread}`);
75
+ if (report.delta !== null) {
76
+ BenchmarkCommand.printDelta(report, report.delta);
77
+ }
78
+ console.log(chalk.yellow(` ${report.advisory}`));
79
+ }
80
+ static printDelta(report, delta) {
81
+ const direction = BenchmarkStats.direction(delta, report.stats.spread);
82
+ const colour = direction === 'improved' ? chalk.green : direction === 'regressed' ? chalk.red : chalk.gray;
83
+ const absolute = `${delta.absolute > 0 ? '+' : ''}${BenchmarkCommand.round(delta.absolute)} ${report.unit}`;
84
+ const percent = BenchmarkStats.formatPercent(delta.percent);
85
+ console.log(` ${chalk.bold('Δ vs baseline')} ${colour(`${absolute} (${percent})`)} ${colour(direction)}`);
86
+ }
87
+ static round(value) {
88
+ return Math.round(value * 1000) / 1000;
89
+ }
90
+ }
91
+ //# sourceMappingURL=benchmark_command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark_command.js","sourceRoot":"","sources":["../../src/commands/benchmark_command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ export declare class BlastRadiusCommand {
3
+ static register(program: Command): void;
4
+ }
5
+ //# sourceMappingURL=blast_radius_command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blast_radius_command.d.ts","sourceRoot":"","sources":["../../src/commands/blast_radius_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,qBAAa,kBAAkB;IAC9B,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAcvC"}
@@ -0,0 +1,18 @@
1
+ import { CommandHelpers, DEFAULT_DB_PATH } from './command_helpers.js';
2
+ export class BlastRadiusCommand {
3
+ static register(program) {
4
+ program
5
+ .command('blast-radius')
6
+ .description('list every symbol transitively impacted by changing <id>')
7
+ .argument('<id>', 'node id to analyse')
8
+ .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
9
+ .option('--depth <n>', 'maximum traversal depth (clamped to 1–30)', '10')
10
+ .option('--json', 'emit raw JSON', false)
11
+ .action(async (id, options) => {
12
+ await CommandHelpers.withQuery(options.db, async (query) => {
13
+ CommandHelpers.printRefs(await query.blastRadius(id, Number(options.depth)), options.json === true);
14
+ });
15
+ });
16
+ }
17
+ }
18
+ //# sourceMappingURL=blast_radius_command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blast_radius_command.js","sourceRoot":"","sources":["../../src/commands/blast_radius_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAMrF,MAAM,OAAO,kBAAkB;IAC9B,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,OAAO;aACL,OAAO,CAAC,cAAc,CAAC;aACvB,WAAW,CAAC,0DAA0D,CAAC;aACvE,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;aACtC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,CAAC;aAChE,MAAM,CAAC,aAAa,EAAE,2CAA2C,EAAE,IAAI,CAAC;aACxE,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC;aACxC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAqB,EAAE,EAAE;YACnD,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC1D,cAAc,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACrG,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACD"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ export declare class CallsCommand {
3
+ static register(program: Command): void;
4
+ }
5
+ //# sourceMappingURL=calls_command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls_command.d.ts","sourceRoot":"","sources":["../../src/commands/calls_command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,qBAAa,YAAY;IACxB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAIvC"}
@@ -0,0 +1,7 @@
1
+ import { CommandHelpers } from './command_helpers.js';
2
+ export class CallsCommand {
3
+ static register(program) {
4
+ CommandHelpers.registerSymbolQuery(program, 'calls', '<id>', 'list symbols that <id> calls', (query, arg) => query.calls(arg));
5
+ }
6
+ }
7
+ //# sourceMappingURL=calls_command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls_command.js","sourceRoot":"","sources":["../../src/commands/calls_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,YAAY;IACxB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC/B,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAC3G,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpB,CAAC;CACD"}
@@ -0,0 +1,15 @@
1
+ import { Command } from 'commander';
2
+ import { GraphQuery, NeighborRef, SymbolRef } from '../query/graph_query.js';
3
+ export declare const DEFAULT_DB_PATH = "./outputs/graph.kuzu";
4
+ export declare const DEFAULT_GRAPH_DIR = "./outputs/graph";
5
+ export type QueryOptions = {
6
+ db: string;
7
+ json?: boolean;
8
+ };
9
+ export declare class CommandHelpers {
10
+ static registerSymbolQuery(program: Command, name: string, argSpec: string, description: string, run: (query: GraphQuery, arg: string) => Promise<SymbolRef[]>): void;
11
+ static withQuery(dbPath: string, fn: (query: GraphQuery) => Promise<void>): Promise<void>;
12
+ static printRefs(refs: SymbolRef[], json: boolean): void;
13
+ static printNeighbors(neighbors: NeighborRef[], json: boolean): void;
14
+ }
15
+ //# sourceMappingURL=command_helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command_helpers.d.ts","sourceRoot":"","sources":["../../src/commands/command_helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAG7E,eAAO,MAAM,eAAe,yBAAyB,CAAC;AACtD,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,qBAAa,cAAc;IAC1B,MAAM,CAAC,mBAAmB,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,GAC3D,IAAI;WAcM,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/F,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAexD,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;CAepE"}
@@ -0,0 +1,61 @@
1
+ import { resolve } from 'node:path';
2
+ import chalk from 'chalk';
3
+ import { GraphQuery } from '../query/graph_query.js';
4
+ import { KuzuStore } from '../store/kuzu_store.js';
5
+ export const DEFAULT_DB_PATH = './outputs/graph.kuzu';
6
+ export const DEFAULT_GRAPH_DIR = './outputs/graph';
7
+ export class CommandHelpers {
8
+ static registerSymbolQuery(program, name, argSpec, description, run) {
9
+ const command = program.command(argSpec === '' ? name : `${name} ${argSpec}`).description(description);
10
+ command
11
+ .option('-d, --db <path>', 'Kùzu database path', DEFAULT_DB_PATH)
12
+ .option('--json', 'emit raw JSON', false)
13
+ .action(async (...args) => {
14
+ const options = args[args.length - 2];
15
+ const arg = argSpec === '' ? '' : args[0];
16
+ await CommandHelpers.withQuery(options.db, async (query) => {
17
+ CommandHelpers.printRefs(await run(query, arg), options.json === true);
18
+ });
19
+ });
20
+ }
21
+ static async withQuery(dbPath, fn) {
22
+ const store = new KuzuStore(resolve(dbPath));
23
+ await store.initSchema();
24
+ try {
25
+ await fn(new GraphQuery(store));
26
+ }
27
+ finally {
28
+ await store.close();
29
+ }
30
+ }
31
+ static printRefs(refs, json) {
32
+ if (json === true) {
33
+ console.log(JSON.stringify(refs, null, 2));
34
+ return;
35
+ }
36
+ if (refs.length === 0) {
37
+ console.log(chalk.yellow('(no results)'));
38
+ return;
39
+ }
40
+ for (const ref of refs) {
41
+ console.log(`${chalk.gray(ref.kind.padEnd(14))} ${chalk.bold(ref.name)} ${chalk.gray(`${ref.filePath}:${ref.startLine}`)}`);
42
+ }
43
+ console.log(chalk.gray(`\n${refs.length} result(s)`));
44
+ }
45
+ static printNeighbors(neighbors, json) {
46
+ if (json === true) {
47
+ console.log(JSON.stringify(neighbors, null, 2));
48
+ return;
49
+ }
50
+ if (neighbors.length === 0) {
51
+ console.log(chalk.yellow('(no neighbours)'));
52
+ return;
53
+ }
54
+ for (const neighbor of neighbors) {
55
+ const arrow = neighbor.direction === 'out' ? '->' : '<-';
56
+ console.log(`${chalk.cyan(arrow)} ${chalk.gray(neighbor.edgeKind.padEnd(12))} ${chalk.bold(neighbor.name)} ${chalk.gray(`${neighbor.filePath}:${neighbor.startLine}`)}`);
57
+ }
58
+ console.log(chalk.gray(`\n${neighbors.length} edge(s)`));
59
+ }
60
+ }
61
+ //# sourceMappingURL=command_helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command_helpers.js","sourceRoot":"","sources":["../../src/commands/command_helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from 'commander';
2
+ export declare class CostCommand {
3
+ static register(program: Command): void;
4
+ private static printRanking;
5
+ private static printAttribution;
6
+ private static printFlows;
7
+ private static formatAmount;
8
+ private static formatShare;
9
+ private static formatCoverage;
10
+ /** A one-line gloss under the ranking: what coverage means, or how to record it when missing. */
11
+ private static printCoverageHint;
12
+ }
13
+ //# sourceMappingURL=cost_command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost_command.d.ts","sourceRoot":"","sources":["../../src/commands/cost_command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,qBAAa,WAAW;IACvB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA4BvC,OAAO,CAAC,MAAM,CAAC,YAAY;IA2B3B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgC/B,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,OAAO,CAAC,MAAM,CAAC,YAAY;IAK3B,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B,OAAO,CAAC,MAAM,CAAC,cAAc;IAI7B,iGAAiG;IACjG,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAUhC"}