monarch-code-graph 0.3.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 (53) hide show
  1. package/README.md +485 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +100 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/analyze.d.ts +8 -0
  7. package/dist/commands/analyze.d.ts.map +1 -0
  8. package/dist/commands/analyze.js +76 -0
  9. package/dist/commands/analyze.js.map +1 -0
  10. package/dist/commands/diff.d.ts +8 -0
  11. package/dist/commands/diff.d.ts.map +1 -0
  12. package/dist/commands/diff.js +203 -0
  13. package/dist/commands/diff.js.map +1 -0
  14. package/dist/commands/graph.d.ts +12 -0
  15. package/dist/commands/graph.d.ts.map +1 -0
  16. package/dist/commands/graph.js +72 -0
  17. package/dist/commands/graph.js.map +1 -0
  18. package/dist/commands/help.d.ts +2 -0
  19. package/dist/commands/help.d.ts.map +1 -0
  20. package/dist/commands/help.js +234 -0
  21. package/dist/commands/help.js.map +1 -0
  22. package/dist/commands/init.d.ts +6 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +37 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/list.d.ts +7 -0
  27. package/dist/commands/list.d.ts.map +1 -0
  28. package/dist/commands/list.js +148 -0
  29. package/dist/commands/list.js.map +1 -0
  30. package/dist/commands/run.d.ts +10 -0
  31. package/dist/commands/run.d.ts.map +1 -0
  32. package/dist/commands/run.js +388 -0
  33. package/dist/commands/run.js.map +1 -0
  34. package/dist/commands/serve.d.ts +8 -0
  35. package/dist/commands/serve.d.ts.map +1 -0
  36. package/dist/commands/serve.js +137 -0
  37. package/dist/commands/serve.js.map +1 -0
  38. package/dist/index.d.ts +6 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +7 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/queries/calls.ql +53 -0
  43. package/dist/queries/dataflow.ql +62 -0
  44. package/dist/queries/functions.ql +52 -0
  45. package/dist/utils/ascii-graph.d.ts +21 -0
  46. package/dist/utils/ascii-graph.d.ts.map +1 -0
  47. package/dist/utils/ascii-graph.js +431 -0
  48. package/dist/utils/ascii-graph.js.map +1 -0
  49. package/dist/utils/output.d.ts +12 -0
  50. package/dist/utils/output.d.ts.map +1 -0
  51. package/dist/utils/output.js +24 -0
  52. package/dist/utils/output.js.map +1 -0
  53. package/package.json +55 -0
@@ -0,0 +1,431 @@
1
+ import chalk from 'chalk';
2
+ const BOX_CHARS = {
3
+ topLeft: '┌',
4
+ topRight: '┐',
5
+ bottomLeft: '└',
6
+ bottomRight: '┘',
7
+ horizontal: '─',
8
+ vertical: '│',
9
+ arrow: '→',
10
+ arrowDown: '↓',
11
+ junction: '├',
12
+ junctionRight: '┤',
13
+ };
14
+ /**
15
+ * Render an ASCII graph from a CodeFlowArtifact
16
+ */
17
+ export function renderAsciiGraph(artifact, level, options = {}) {
18
+ const { maxWidth = 80, showEdgeCounts = true, colorize = true } = options;
19
+ const { nodes, edges } = extractGraphData(artifact, level);
20
+ if (nodes.length === 0) {
21
+ return chalk.yellow('No nodes found at this level.');
22
+ }
23
+ const lines = [];
24
+ // Header
25
+ lines.push(formatHeader(level, nodes.length, edges.length, colorize));
26
+ lines.push('');
27
+ // Render nodes grouped by connections
28
+ const { roots, connected, isolated } = categorizeNodes(nodes, edges);
29
+ if (roots.length > 0 || connected.length > 0) {
30
+ lines.push(formatSectionHeader('Connected Graph', colorize));
31
+ lines.push(...renderConnectedGraph(nodes, edges, maxWidth, showEdgeCounts, colorize));
32
+ lines.push('');
33
+ }
34
+ if (isolated.length > 0) {
35
+ lines.push(formatSectionHeader(`Isolated Nodes (${isolated.length})`, colorize));
36
+ lines.push(...renderIsolatedNodes(isolated, nodes, maxWidth, colorize));
37
+ }
38
+ return lines.join('\n');
39
+ }
40
+ /**
41
+ * Render a specific component or module expanded
42
+ */
43
+ export function renderExpandedView(artifact, targetName, targetType, options = {}) {
44
+ const { maxWidth = 80, showEdgeCounts = true, colorize = true } = options;
45
+ const lines = [];
46
+ if (targetType === 'component') {
47
+ const component = artifact.nodes.components.find((c) => c.name === targetName || c.id === targetName);
48
+ if (!component) {
49
+ return chalk.red(`Component not found: ${targetName}`);
50
+ }
51
+ lines.push(formatHeader(`Component: ${component.name}`, 0, 0, colorize));
52
+ lines.push('');
53
+ // Get modules in this component
54
+ const moduleIds = new Set(component.moduleIds || []);
55
+ const modules = artifact.nodes.modules.filter((m) => moduleIds.has(m.id));
56
+ if (modules.length === 0) {
57
+ lines.push(chalk.yellow(' No modules in this component.'));
58
+ return lines.join('\n');
59
+ }
60
+ // Get edges between modules in this component
61
+ const moduleFunctionIds = new Map();
62
+ for (const mod of modules) {
63
+ moduleFunctionIds.set(mod.id, new Set(mod.functionIds || []));
64
+ }
65
+ const edges = aggregateEdgesBetweenContainers(artifact, modules.map((m) => m.id), moduleFunctionIds);
66
+ const nodes = modules.map((m) => ({
67
+ id: m.id,
68
+ label: formatModulePath(m.path),
69
+ type: 'module',
70
+ children: m.functionIds?.length || 0,
71
+ }));
72
+ lines.push(formatSectionHeader(`Modules (${modules.length})`, colorize));
73
+ // If there are edges, render connected graph, otherwise show all modules as isolated
74
+ if (edges.length > 0) {
75
+ lines.push(...renderConnectedGraph(nodes, edges, maxWidth, showEdgeCounts, colorize));
76
+ }
77
+ else {
78
+ // All nodes are isolated - render them as a simple list
79
+ for (const node of nodes) {
80
+ lines.push(formatNode(node, colorize));
81
+ }
82
+ }
83
+ }
84
+ else {
85
+ // Module view - show functions
86
+ const module = artifact.nodes.modules.find((m) => m.path === targetName || m.id === targetName || m.path.endsWith(targetName));
87
+ if (!module) {
88
+ return chalk.red(`Module not found: ${targetName}`);
89
+ }
90
+ lines.push(formatHeader(`Module: ${module.path}`, 0, 0, colorize));
91
+ lines.push('');
92
+ // Get functions in this module
93
+ const functionIds = new Set(module.functionIds || []);
94
+ const functions = artifact.nodes.functions.filter((f) => functionIds.has(f.id));
95
+ if (functions.length === 0) {
96
+ lines.push(chalk.yellow(' No functions in this module.'));
97
+ return lines.join('\n');
98
+ }
99
+ // Get edges between functions in this module
100
+ const edges = getEdgesBetweenFunctions(artifact, functionIds);
101
+ const nodes = functions.map((f) => ({
102
+ id: f.id,
103
+ label: formatFunctionName(f),
104
+ type: 'function',
105
+ }));
106
+ lines.push(formatSectionHeader(`Functions (${functions.length})`, colorize));
107
+ // If there are edges, render connected graph, otherwise show all functions as isolated
108
+ if (edges.length > 0) {
109
+ lines.push(...renderConnectedGraph(nodes, edges, maxWidth, showEdgeCounts, colorize));
110
+ }
111
+ else {
112
+ // All nodes are isolated - render them as a simple list
113
+ for (const node of nodes) {
114
+ lines.push(formatNode(node, colorize));
115
+ }
116
+ }
117
+ }
118
+ return lines.join('\n');
119
+ }
120
+ /**
121
+ * List available components and modules for expansion
122
+ */
123
+ export function listExpandableItems(artifact) {
124
+ const lines = [];
125
+ lines.push(chalk.bold.cyan('\nExpandable Items\n'));
126
+ lines.push(chalk.bold('Components:'));
127
+ if (artifact.nodes.components.length === 0) {
128
+ lines.push(chalk.dim(' (none)'));
129
+ }
130
+ else {
131
+ for (const comp of artifact.nodes.components) {
132
+ const modCount = comp.moduleIds?.length || 0;
133
+ lines.push(` ${chalk.cyan(comp.name)} ${chalk.dim(`(${modCount} modules)`)}`);
134
+ }
135
+ }
136
+ lines.push('');
137
+ lines.push(chalk.bold('Modules:'));
138
+ if (artifact.nodes.modules.length === 0) {
139
+ lines.push(chalk.dim(' (none)'));
140
+ }
141
+ else {
142
+ for (const mod of artifact.nodes.modules) {
143
+ const fnCount = mod.functionIds?.length || 0;
144
+ lines.push(` ${chalk.cyan(formatModulePath(mod.path))} ${chalk.dim(`(${fnCount} functions)`)}`);
145
+ }
146
+ }
147
+ return lines.join('\n');
148
+ }
149
+ // ============================================================================
150
+ // Helper Functions
151
+ // ============================================================================
152
+ function extractGraphData(artifact, level) {
153
+ switch (level) {
154
+ case 'components':
155
+ return extractComponentGraph(artifact);
156
+ case 'modules':
157
+ return extractModuleGraph(artifact);
158
+ case 'functions':
159
+ return extractFunctionGraph(artifact);
160
+ }
161
+ }
162
+ function extractComponentGraph(artifact) {
163
+ const nodes = artifact.nodes.components.map((c) => ({
164
+ id: c.id,
165
+ label: c.name,
166
+ type: 'component',
167
+ children: c.moduleIds?.length || 0,
168
+ }));
169
+ // Build component membership map
170
+ const functionToComponent = new Map();
171
+ for (const comp of artifact.nodes.components) {
172
+ for (const modId of comp.moduleIds || []) {
173
+ const mod = artifact.nodes.modules.find((m) => m.id === modId);
174
+ if (mod) {
175
+ for (const fnId of mod.functionIds || []) {
176
+ functionToComponent.set(fnId, comp.id);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ // Aggregate edges between components
182
+ const edgeMap = new Map();
183
+ for (const edge of artifact.edges.calls) {
184
+ const fromComp = functionToComponent.get(edge.from);
185
+ const toComp = functionToComponent.get(edge.to);
186
+ if (fromComp && toComp && fromComp !== toComp) {
187
+ const key = `${fromComp}->${toComp}`;
188
+ edgeMap.set(key, (edgeMap.get(key) || 0) + 1);
189
+ }
190
+ }
191
+ const edges = Array.from(edgeMap.entries()).map(([key, count]) => {
192
+ const [from, to] = key.split('->');
193
+ return { from, to, count };
194
+ });
195
+ return { nodes, edges };
196
+ }
197
+ function extractModuleGraph(artifact) {
198
+ const nodes = artifact.nodes.modules.map((m) => ({
199
+ id: m.id,
200
+ label: formatModulePath(m.path),
201
+ type: 'module',
202
+ children: m.functionIds?.length || 0,
203
+ }));
204
+ // Build function to module map
205
+ const functionToModule = new Map();
206
+ for (const mod of artifact.nodes.modules) {
207
+ for (const fnId of mod.functionIds || []) {
208
+ functionToModule.set(fnId, mod.id);
209
+ }
210
+ }
211
+ // Aggregate edges between modules
212
+ const edgeMap = new Map();
213
+ for (const edge of artifact.edges.calls) {
214
+ const fromMod = functionToModule.get(edge.from);
215
+ const toMod = functionToModule.get(edge.to);
216
+ if (fromMod && toMod && fromMod !== toMod) {
217
+ const key = `${fromMod}->${toMod}`;
218
+ edgeMap.set(key, (edgeMap.get(key) || 0) + 1);
219
+ }
220
+ }
221
+ const edges = Array.from(edgeMap.entries()).map(([key, count]) => {
222
+ const [from, to] = key.split('->');
223
+ return { from, to, count };
224
+ });
225
+ return { nodes, edges };
226
+ }
227
+ function extractFunctionGraph(artifact) {
228
+ const nodes = artifact.nodes.functions.map((f) => ({
229
+ id: f.id,
230
+ label: formatFunctionName(f),
231
+ type: 'function',
232
+ }));
233
+ const edges = artifact.edges.calls.map((e) => ({
234
+ from: e.from,
235
+ to: e.to,
236
+ count: e.callsites.length,
237
+ }));
238
+ return { nodes, edges };
239
+ }
240
+ function aggregateEdgesBetweenContainers(artifact, containerIds, containerFunctions) {
241
+ const containerSet = new Set(containerIds);
242
+ const functionToContainer = new Map();
243
+ for (const [containerId, fnIds] of containerFunctions) {
244
+ for (const fnId of fnIds) {
245
+ functionToContainer.set(fnId, containerId);
246
+ }
247
+ }
248
+ const edgeMap = new Map();
249
+ for (const edge of artifact.edges.calls) {
250
+ const fromContainer = functionToContainer.get(edge.from);
251
+ const toContainer = functionToContainer.get(edge.to);
252
+ if (fromContainer &&
253
+ toContainer &&
254
+ containerSet.has(fromContainer) &&
255
+ containerSet.has(toContainer) &&
256
+ fromContainer !== toContainer) {
257
+ const key = `${fromContainer}->${toContainer}`;
258
+ edgeMap.set(key, (edgeMap.get(key) || 0) + 1);
259
+ }
260
+ }
261
+ return Array.from(edgeMap.entries()).map(([key, count]) => {
262
+ const [from, to] = key.split('->');
263
+ return { from, to, count };
264
+ });
265
+ }
266
+ function getEdgesBetweenFunctions(artifact, functionIds) {
267
+ return artifact.edges.calls
268
+ .filter((e) => functionIds.has(e.from) && functionIds.has(e.to))
269
+ .map((e) => ({
270
+ from: e.from,
271
+ to: e.to,
272
+ count: e.callsites.length,
273
+ }));
274
+ }
275
+ function categorizeNodes(nodes, edges) {
276
+ const hasIncoming = new Set();
277
+ const hasOutgoing = new Set();
278
+ for (const edge of edges) {
279
+ hasOutgoing.add(edge.from);
280
+ hasIncoming.add(edge.to);
281
+ }
282
+ const roots = [];
283
+ const connected = [];
284
+ const isolated = [];
285
+ for (const node of nodes) {
286
+ const incoming = hasIncoming.has(node.id);
287
+ const outgoing = hasOutgoing.has(node.id);
288
+ if (!incoming && !outgoing) {
289
+ isolated.push(node.id);
290
+ }
291
+ else if (!incoming && outgoing) {
292
+ roots.push(node.id);
293
+ }
294
+ else {
295
+ connected.push(node.id);
296
+ }
297
+ }
298
+ return { roots, connected, isolated };
299
+ }
300
+ function renderConnectedGraph(nodes, edges, _maxWidth, showEdgeCounts, colorize) {
301
+ const lines = [];
302
+ const nodeMap = new Map(nodes.map((n) => [n.id, n]));
303
+ // Build adjacency list
304
+ const outgoing = new Map();
305
+ const incoming = new Map();
306
+ for (const edge of edges) {
307
+ if (!outgoing.has(edge.from))
308
+ outgoing.set(edge.from, []);
309
+ if (!incoming.has(edge.to))
310
+ incoming.set(edge.to, []);
311
+ outgoing.get(edge.from).push(edge);
312
+ incoming.get(edge.to).push(edge);
313
+ }
314
+ // Find roots (nodes with no incoming edges)
315
+ const roots = nodes.filter((n) => !incoming.has(n.id) && outgoing.has(n.id));
316
+ const visited = new Set();
317
+ // Render from each root using DFS
318
+ for (const root of roots) {
319
+ lines.push(...renderNodeTree(root, nodeMap, outgoing, visited, 0, showEdgeCounts, colorize));
320
+ }
321
+ // Render any remaining connected nodes (cycles)
322
+ for (const node of nodes) {
323
+ if (!visited.has(node.id) && (outgoing.has(node.id) || incoming.has(node.id))) {
324
+ lines.push(...renderNodeTree(node, nodeMap, outgoing, visited, 0, showEdgeCounts, colorize));
325
+ }
326
+ }
327
+ return lines;
328
+ }
329
+ function renderNodeTree(node, nodeMap, outgoing, visited, depth, showEdgeCounts, colorize) {
330
+ if (visited.has(node.id)) {
331
+ return [`${' '.repeat(depth)}${BOX_CHARS.arrow} ${chalk.dim(`(${node.label} - cycle)`)}`];
332
+ }
333
+ visited.add(node.id);
334
+ const lines = [];
335
+ // Render current node
336
+ const indent = ' '.repeat(depth);
337
+ const nodeStr = formatNode(node, colorize);
338
+ lines.push(`${indent}${nodeStr}`);
339
+ // Render children
340
+ const children = outgoing.get(node.id) || [];
341
+ for (let i = 0; i < children.length; i++) {
342
+ const edge = children[i];
343
+ const targetNode = nodeMap.get(edge.to);
344
+ const isLast = i === children.length - 1;
345
+ const prefix = isLast ? BOX_CHARS.bottomLeft : BOX_CHARS.junction;
346
+ const countStr = showEdgeCounts && edge.count > 1 ? chalk.dim(` (${edge.count}x)`) : '';
347
+ if (targetNode) {
348
+ if (visited.has(targetNode.id)) {
349
+ lines.push(`${indent} ${prefix}${BOX_CHARS.horizontal}${BOX_CHARS.arrow} ${chalk.dim(`${targetNode.label} (cycle)`)}${countStr}`);
350
+ }
351
+ else {
352
+ lines.push(`${indent} ${prefix}${BOX_CHARS.horizontal}${BOX_CHARS.arrow}${countStr}`);
353
+ lines.push(...renderNodeTree(targetNode, nodeMap, outgoing, visited, depth + 2, showEdgeCounts, colorize));
354
+ }
355
+ }
356
+ }
357
+ return lines;
358
+ }
359
+ function renderIsolatedNodes(isolatedIds, nodes, maxWidth, colorize) {
360
+ const lines = [];
361
+ const isolatedNodes = nodes.filter((n) => isolatedIds.includes(n.id));
362
+ // Render in columns
363
+ const colWidth = 30;
364
+ const cols = Math.max(1, Math.floor(maxWidth / colWidth));
365
+ for (let i = 0; i < isolatedNodes.length; i += cols) {
366
+ const row = isolatedNodes.slice(i, i + cols);
367
+ const rowStr = row.map((n) => formatNode(n, colorize).padEnd(colWidth)).join('');
368
+ lines.push(` ${rowStr}`);
369
+ }
370
+ return lines;
371
+ }
372
+ function formatNode(node, colorize) {
373
+ const icon = getNodeIcon(node.type);
374
+ const label = node.label;
375
+ const childInfo = node.children !== undefined ? chalk.dim(` (${node.children})`) : '';
376
+ if (colorize) {
377
+ const color = getNodeColor(node.type);
378
+ return `${icon} ${color(label)}${childInfo}`;
379
+ }
380
+ return `${icon} ${label}${childInfo}`;
381
+ }
382
+ function getNodeIcon(type) {
383
+ switch (type) {
384
+ case 'component':
385
+ return '📦';
386
+ case 'module':
387
+ return '📄';
388
+ case 'function':
389
+ return '⚡';
390
+ }
391
+ }
392
+ function getNodeColor(type) {
393
+ switch (type) {
394
+ case 'component':
395
+ return chalk.cyan;
396
+ case 'module':
397
+ return chalk.yellow;
398
+ case 'function':
399
+ return chalk.green;
400
+ }
401
+ }
402
+ function formatHeader(title, nodeCount, edgeCount, colorize) {
403
+ const levelTitles = {
404
+ components: 'Component Graph',
405
+ modules: 'Module Graph',
406
+ functions: 'Function Graph',
407
+ };
408
+ const displayTitle = levelTitles[title] || title;
409
+ if (nodeCount === 0 && edgeCount === 0) {
410
+ return colorize ? chalk.bold.cyan(`\n${displayTitle}\n`) : `\n${displayTitle}\n`;
411
+ }
412
+ const stats = `${nodeCount} nodes, ${edgeCount} edges`;
413
+ const header = `${displayTitle} (${stats})`;
414
+ return colorize ? chalk.bold.cyan(`\n${header}\n`) : `\n${header}\n`;
415
+ }
416
+ function formatSectionHeader(title, colorize) {
417
+ return colorize ? chalk.bold.underline(title) : title;
418
+ }
419
+ function formatModulePath(path) {
420
+ // Shorten long paths
421
+ const parts = path.split(/[/\\]/);
422
+ if (parts.length > 3) {
423
+ return `.../${parts.slice(-2).join('/')}`;
424
+ }
425
+ return path;
426
+ }
427
+ function formatFunctionName(fn) {
428
+ const kindIcon = fn.kind === 'method' ? '.' : fn.kind === 'arrow' ? '=>' : '';
429
+ return `${kindIcon}${fn.name}`;
430
+ }
431
+ //# sourceMappingURL=ascii-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ascii-graph.js","sourceRoot":"","sources":["../../src/utils/ascii-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const log: {
2
+ info: (message: string) => void;
3
+ success: (message: string) => void;
4
+ warning: (message: string) => void;
5
+ error: (message: string) => void;
6
+ title: (message: string) => void;
7
+ dim: (message: string) => void;
8
+ };
9
+ export declare function formatNumber(n: number): string;
10
+ export declare function formatPath(p: string): string;
11
+ export declare function formatDiff(added: number, removed: number): string;
12
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG;oBACE,MAAM;uBACH,MAAM;uBACN,MAAM;qBACR,MAAM;qBACN,MAAM;mBACR,MAAM;CACtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKjE"}
@@ -0,0 +1,24 @@
1
+ import chalk from 'chalk';
2
+ export const log = {
3
+ info: (message) => console.log(chalk.blue('ℹ'), message),
4
+ success: (message) => console.log(chalk.green('✓'), message),
5
+ warning: (message) => console.log(chalk.yellow('⚠'), message),
6
+ error: (message) => console.error(chalk.red('✗'), message),
7
+ title: (message) => console.log(chalk.bold.cyan(`\n${message}\n`)),
8
+ dim: (message) => console.log(chalk.dim(message)),
9
+ };
10
+ export function formatNumber(n) {
11
+ return n.toLocaleString();
12
+ }
13
+ export function formatPath(p) {
14
+ return chalk.underline(p);
15
+ }
16
+ export function formatDiff(added, removed) {
17
+ const parts = [];
18
+ if (added > 0)
19
+ parts.push(chalk.green(`+${added}`));
20
+ if (removed > 0)
21
+ parts.push(chalk.red(`-${removed}`));
22
+ return parts.join(' / ') || chalk.dim('no changes');
23
+ }
24
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAChE,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACpE,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACrE,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAClE,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;IAC1E,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CAC1D,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,OAAe;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IACpD,IAAI,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACtD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "monarch-code-graph",
3
+ "version": "0.3.4",
4
+ "description": "CLI tool for Monarch - Static codebase flow mapping and visualization",
5
+ "type": "module",
6
+ "bin": {
7
+ "monarch": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc && node -e \"require('fs').cpSync('../analyzer/src/exporters/codeql/queries', 'dist/queries', {recursive: true})\"",
16
+ "dev": "tsc --watch",
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "clean": "rm -rf dist",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "keywords": [
24
+ "static-analysis",
25
+ "codeql",
26
+ "code-visualization",
27
+ "call-graph",
28
+ "dataflow",
29
+ "cli"
30
+ ],
31
+ "author": {
32
+ "name": "Amir Gur",
33
+ "email": "amirtac@gmail.com"
34
+ },
35
+ "license": "SEE LICENSE IN LICENSE",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/your-username/monarch.git"
39
+ },
40
+ "dependencies": {
41
+ "@codeflow/shared": "workspace:*",
42
+ "@codeflow/analyzer": "workspace:*",
43
+ "commander": "^13.0.0",
44
+ "chalk": "^5.4.1",
45
+ "ora": "^8.2.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^22.10.5",
49
+ "typescript": "^5.7.2",
50
+ "vitest": "^4.0.17"
51
+ },
52
+ "engines": {
53
+ "node": ">=20.0.0"
54
+ }
55
+ }