@optave/codegraph 3.1.2 → 3.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 (194) hide show
  1. package/README.md +19 -21
  2. package/package.json +10 -7
  3. package/src/analysis/context.js +408 -0
  4. package/src/analysis/dependencies.js +341 -0
  5. package/src/analysis/exports.js +130 -0
  6. package/src/analysis/impact.js +463 -0
  7. package/src/analysis/module-map.js +322 -0
  8. package/src/analysis/roles.js +45 -0
  9. package/src/analysis/symbol-lookup.js +232 -0
  10. package/src/ast-analysis/shared.js +5 -4
  11. package/src/batch.js +2 -1
  12. package/src/builder/context.js +85 -0
  13. package/src/builder/helpers.js +218 -0
  14. package/src/builder/incremental.js +178 -0
  15. package/src/builder/pipeline.js +130 -0
  16. package/src/builder/stages/build-edges.js +297 -0
  17. package/src/builder/stages/build-structure.js +113 -0
  18. package/src/builder/stages/collect-files.js +44 -0
  19. package/src/builder/stages/detect-changes.js +413 -0
  20. package/src/builder/stages/finalize.js +139 -0
  21. package/src/builder/stages/insert-nodes.js +195 -0
  22. package/src/builder/stages/parse-files.js +28 -0
  23. package/src/builder/stages/resolve-imports.js +143 -0
  24. package/src/builder/stages/run-analyses.js +44 -0
  25. package/src/builder.js +10 -1472
  26. package/src/cfg.js +1 -2
  27. package/src/cli/commands/ast.js +26 -0
  28. package/src/cli/commands/audit.js +46 -0
  29. package/src/cli/commands/batch.js +68 -0
  30. package/src/cli/commands/branch-compare.js +21 -0
  31. package/src/cli/commands/build.js +26 -0
  32. package/src/cli/commands/cfg.js +30 -0
  33. package/src/cli/commands/check.js +79 -0
  34. package/src/cli/commands/children.js +31 -0
  35. package/src/cli/commands/co-change.js +65 -0
  36. package/src/cli/commands/communities.js +23 -0
  37. package/src/cli/commands/complexity.js +45 -0
  38. package/src/cli/commands/context.js +34 -0
  39. package/src/cli/commands/cycles.js +28 -0
  40. package/src/cli/commands/dataflow.js +32 -0
  41. package/src/cli/commands/deps.js +16 -0
  42. package/src/cli/commands/diff-impact.js +30 -0
  43. package/src/cli/commands/embed.js +30 -0
  44. package/src/cli/commands/export.js +75 -0
  45. package/src/cli/commands/exports.js +18 -0
  46. package/src/cli/commands/flow.js +36 -0
  47. package/src/cli/commands/fn-impact.js +30 -0
  48. package/src/cli/commands/impact.js +16 -0
  49. package/src/cli/commands/info.js +76 -0
  50. package/src/cli/commands/map.js +19 -0
  51. package/src/cli/commands/mcp.js +18 -0
  52. package/src/cli/commands/models.js +19 -0
  53. package/src/cli/commands/owners.js +25 -0
  54. package/src/cli/commands/path.js +36 -0
  55. package/src/cli/commands/plot.js +80 -0
  56. package/src/cli/commands/query.js +49 -0
  57. package/src/cli/commands/registry.js +100 -0
  58. package/src/cli/commands/roles.js +34 -0
  59. package/src/cli/commands/search.js +42 -0
  60. package/src/cli/commands/sequence.js +32 -0
  61. package/src/cli/commands/snapshot.js +61 -0
  62. package/src/cli/commands/stats.js +15 -0
  63. package/src/cli/commands/structure.js +32 -0
  64. package/src/cli/commands/triage.js +78 -0
  65. package/src/cli/commands/watch.js +12 -0
  66. package/src/cli/commands/where.js +24 -0
  67. package/src/cli/index.js +118 -0
  68. package/src/cli/shared/options.js +39 -0
  69. package/src/cli/shared/output.js +1 -0
  70. package/src/cli.js +11 -1514
  71. package/src/commands/check.js +5 -5
  72. package/src/commands/manifesto.js +3 -3
  73. package/src/commands/structure.js +1 -1
  74. package/src/communities.js +15 -87
  75. package/src/complexity.js +1 -1
  76. package/src/cycles.js +30 -85
  77. package/src/dataflow.js +1 -2
  78. package/src/db/connection.js +4 -4
  79. package/src/db/migrations.js +41 -0
  80. package/src/db/query-builder.js +6 -5
  81. package/src/db/repository/base.js +201 -0
  82. package/src/db/repository/cached-stmt.js +19 -0
  83. package/src/db/repository/cfg.js +27 -38
  84. package/src/db/repository/cochange.js +16 -3
  85. package/src/db/repository/complexity.js +11 -6
  86. package/src/db/repository/dataflow.js +6 -1
  87. package/src/db/repository/edges.js +120 -98
  88. package/src/db/repository/embeddings.js +14 -3
  89. package/src/db/repository/graph-read.js +32 -9
  90. package/src/db/repository/in-memory-repository.js +584 -0
  91. package/src/db/repository/index.js +6 -1
  92. package/src/db/repository/nodes.js +110 -40
  93. package/src/db/repository/sqlite-repository.js +219 -0
  94. package/src/db.js +5 -0
  95. package/src/embeddings/generator.js +163 -0
  96. package/src/embeddings/index.js +13 -0
  97. package/src/embeddings/models.js +218 -0
  98. package/src/embeddings/search/cli-formatter.js +151 -0
  99. package/src/embeddings/search/filters.js +46 -0
  100. package/src/embeddings/search/hybrid.js +121 -0
  101. package/src/embeddings/search/keyword.js +68 -0
  102. package/src/embeddings/search/prepare.js +66 -0
  103. package/src/embeddings/search/semantic.js +145 -0
  104. package/src/embeddings/stores/fts5.js +27 -0
  105. package/src/embeddings/stores/sqlite-blob.js +24 -0
  106. package/src/embeddings/strategies/source.js +14 -0
  107. package/src/embeddings/strategies/structured.js +43 -0
  108. package/src/embeddings/strategies/text-utils.js +43 -0
  109. package/src/errors.js +78 -0
  110. package/src/export.js +217 -520
  111. package/src/extractors/csharp.js +10 -2
  112. package/src/extractors/go.js +3 -1
  113. package/src/extractors/helpers.js +71 -0
  114. package/src/extractors/java.js +9 -2
  115. package/src/extractors/javascript.js +38 -1
  116. package/src/extractors/php.js +3 -1
  117. package/src/extractors/python.js +14 -3
  118. package/src/extractors/rust.js +3 -1
  119. package/src/graph/algorithms/bfs.js +49 -0
  120. package/src/graph/algorithms/centrality.js +16 -0
  121. package/src/graph/algorithms/index.js +5 -0
  122. package/src/graph/algorithms/louvain.js +26 -0
  123. package/src/graph/algorithms/shortest-path.js +41 -0
  124. package/src/graph/algorithms/tarjan.js +49 -0
  125. package/src/graph/builders/dependency.js +91 -0
  126. package/src/graph/builders/index.js +3 -0
  127. package/src/graph/builders/structure.js +40 -0
  128. package/src/graph/builders/temporal.js +33 -0
  129. package/src/graph/classifiers/index.js +2 -0
  130. package/src/graph/classifiers/risk.js +85 -0
  131. package/src/graph/classifiers/roles.js +64 -0
  132. package/src/graph/index.js +13 -0
  133. package/src/graph/model.js +230 -0
  134. package/src/index.js +33 -204
  135. package/src/infrastructure/result-formatter.js +2 -21
  136. package/src/mcp/index.js +2 -0
  137. package/src/mcp/middleware.js +26 -0
  138. package/src/mcp/server.js +128 -0
  139. package/src/mcp/tool-registry.js +801 -0
  140. package/src/mcp/tools/ast-query.js +14 -0
  141. package/src/mcp/tools/audit.js +21 -0
  142. package/src/mcp/tools/batch-query.js +11 -0
  143. package/src/mcp/tools/branch-compare.js +10 -0
  144. package/src/mcp/tools/cfg.js +21 -0
  145. package/src/mcp/tools/check.js +43 -0
  146. package/src/mcp/tools/co-changes.js +20 -0
  147. package/src/mcp/tools/code-owners.js +12 -0
  148. package/src/mcp/tools/communities.js +15 -0
  149. package/src/mcp/tools/complexity.js +18 -0
  150. package/src/mcp/tools/context.js +17 -0
  151. package/src/mcp/tools/dataflow.js +26 -0
  152. package/src/mcp/tools/diff-impact.js +24 -0
  153. package/src/mcp/tools/execution-flow.js +26 -0
  154. package/src/mcp/tools/export-graph.js +57 -0
  155. package/src/mcp/tools/file-deps.js +12 -0
  156. package/src/mcp/tools/file-exports.js +13 -0
  157. package/src/mcp/tools/find-cycles.js +15 -0
  158. package/src/mcp/tools/fn-impact.js +15 -0
  159. package/src/mcp/tools/impact-analysis.js +12 -0
  160. package/src/mcp/tools/index.js +71 -0
  161. package/src/mcp/tools/list-functions.js +14 -0
  162. package/src/mcp/tools/list-repos.js +11 -0
  163. package/src/mcp/tools/module-map.js +6 -0
  164. package/src/mcp/tools/node-roles.js +14 -0
  165. package/src/mcp/tools/path.js +12 -0
  166. package/src/mcp/tools/query.js +30 -0
  167. package/src/mcp/tools/semantic-search.js +65 -0
  168. package/src/mcp/tools/sequence.js +17 -0
  169. package/src/mcp/tools/structure.js +15 -0
  170. package/src/mcp/tools/symbol-children.js +14 -0
  171. package/src/mcp/tools/triage.js +35 -0
  172. package/src/mcp/tools/where.js +13 -0
  173. package/src/mcp.js +2 -1470
  174. package/src/native.js +34 -10
  175. package/src/parser.js +53 -2
  176. package/src/presentation/colors.js +44 -0
  177. package/src/presentation/export.js +444 -0
  178. package/src/presentation/result-formatter.js +21 -0
  179. package/src/presentation/sequence-renderer.js +43 -0
  180. package/src/presentation/table.js +47 -0
  181. package/src/presentation/viewer.js +634 -0
  182. package/src/queries.js +35 -2276
  183. package/src/resolve.js +1 -1
  184. package/src/sequence.js +2 -38
  185. package/src/shared/file-utils.js +153 -0
  186. package/src/shared/generators.js +125 -0
  187. package/src/shared/hierarchy.js +27 -0
  188. package/src/shared/normalize.js +59 -0
  189. package/src/snapshot.js +6 -5
  190. package/src/structure.js +15 -40
  191. package/src/triage.js +20 -72
  192. package/src/viewer.js +35 -656
  193. package/src/watcher.js +8 -148
  194. package/src/embedder.js +0 -1097
@@ -1,21 +1,2 @@
1
- import { printNdjson } from '../paginate.js';
2
-
3
- /**
4
- * Shared JSON / NDJSON output dispatch for CLI wrappers.
5
- *
6
- * @param {object} data - Result object from a *Data() function
7
- * @param {string} field - Array field name for NDJSON streaming (e.g. 'results')
8
- * @param {object} opts - CLI options ({ json?, ndjson? })
9
- * @returns {boolean} true if output was handled (caller should return early)
10
- */
11
- export function outputResult(data, field, opts) {
12
- if (opts.ndjson) {
13
- printNdjson(data, field);
14
- return true;
15
- }
16
- if (opts.json) {
17
- console.log(JSON.stringify(data, null, 2));
18
- return true;
19
- }
20
- return false;
21
- }
1
+ // Re-export from presentation layer — this file exists for backward compatibility.
2
+ export { outputResult } from '../presentation/result-formatter.js';
@@ -0,0 +1,2 @@
1
+ export { startMCPServer } from './server.js';
2
+ export { buildToolList, TOOLS } from './tool-registry.js';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * MCP middleware helpers — pagination defaults and limits.
3
+ */
4
+
5
+ import { MCP_DEFAULTS, MCP_MAX_LIMIT } from '../paginate.js';
6
+
7
+ export { MCP_DEFAULTS, MCP_MAX_LIMIT };
8
+
9
+ /**
10
+ * Resolve effective limit for a tool call.
11
+ * @param {object} args - Tool arguments
12
+ * @param {string} toolName - Tool name (for default lookup)
13
+ * @returns {number}
14
+ */
15
+ export function effectiveLimit(args, toolName) {
16
+ return Math.min(args.limit ?? MCP_DEFAULTS[toolName] ?? 100, MCP_MAX_LIMIT);
17
+ }
18
+
19
+ /**
20
+ * Resolve effective offset for a tool call.
21
+ * @param {object} args - Tool arguments
22
+ * @returns {number}
23
+ */
24
+ export function effectiveOffset(args) {
25
+ return args.offset ?? 0;
26
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * MCP (Model Context Protocol) server for codegraph.
3
+ * Exposes codegraph queries as tools that AI coding assistants can call.
4
+ *
5
+ * Requires: npm install @modelcontextprotocol/sdk
6
+ */
7
+
8
+ import { createRequire } from 'node:module';
9
+ import { findDbPath } from '../db.js';
10
+ import { CodegraphError, ConfigError } from '../errors.js';
11
+ import { MCP_MAX_LIMIT } from '../paginate.js';
12
+ import { buildToolList } from './tool-registry.js';
13
+ import { TOOL_HANDLERS } from './tools/index.js';
14
+
15
+ /**
16
+ * Start the MCP server.
17
+ * This function requires @modelcontextprotocol/sdk to be installed.
18
+ *
19
+ * @param {string} [customDbPath] - Path to a specific graph.db
20
+ * @param {object} [options]
21
+ * @param {boolean} [options.multiRepo] - Enable multi-repo access (default: false)
22
+ * @param {string[]} [options.allowedRepos] - Restrict access to these repo names only
23
+ */
24
+ export async function startMCPServer(customDbPath, options = {}) {
25
+ const { allowedRepos } = options;
26
+ const multiRepo = options.multiRepo || !!allowedRepos;
27
+ let Server, StdioServerTransport, ListToolsRequestSchema, CallToolRequestSchema;
28
+ try {
29
+ const sdk = await import('@modelcontextprotocol/sdk/server/index.js');
30
+ Server = sdk.Server;
31
+ const transport = await import('@modelcontextprotocol/sdk/server/stdio.js');
32
+ StdioServerTransport = transport.StdioServerTransport;
33
+ const types = await import('@modelcontextprotocol/sdk/types.js');
34
+ ListToolsRequestSchema = types.ListToolsRequestSchema;
35
+ CallToolRequestSchema = types.CallToolRequestSchema;
36
+ } catch {
37
+ throw new ConfigError(
38
+ 'MCP server requires @modelcontextprotocol/sdk.\nInstall it with: npm install @modelcontextprotocol/sdk',
39
+ );
40
+ }
41
+
42
+ // Connect transport FIRST so the server can receive the client's
43
+ // `initialize` request while heavy modules (queries, better-sqlite3)
44
+ // are still loading. These are lazy-loaded on the first tool call
45
+ // and cached for subsequent calls.
46
+ let _queries;
47
+ let _Database;
48
+
49
+ async function getQueries() {
50
+ if (!_queries) {
51
+ _queries = await import('../queries.js');
52
+ }
53
+ return _queries;
54
+ }
55
+
56
+ function getDatabase() {
57
+ if (!_Database) {
58
+ const require = createRequire(import.meta.url);
59
+ _Database = require('better-sqlite3');
60
+ }
61
+ return _Database;
62
+ }
63
+
64
+ const server = new Server(
65
+ { name: 'codegraph', version: '1.0.0' },
66
+ { capabilities: { tools: {} } },
67
+ );
68
+
69
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
70
+ tools: buildToolList(multiRepo),
71
+ }));
72
+
73
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
74
+ const { name, arguments: args } = request.params;
75
+ try {
76
+ if (!multiRepo && args.repo) {
77
+ throw new ConfigError(
78
+ 'Multi-repo access is disabled. Restart with `codegraph mcp --multi-repo` to access other repositories.',
79
+ );
80
+ }
81
+ if (!multiRepo && name === 'list_repos') {
82
+ throw new ConfigError(
83
+ 'Multi-repo access is disabled. Restart with `codegraph mcp --multi-repo` to list repositories.',
84
+ );
85
+ }
86
+
87
+ let dbPath = customDbPath || undefined;
88
+ if (args.repo) {
89
+ if (allowedRepos && !allowedRepos.includes(args.repo)) {
90
+ throw new ConfigError(`Repository "${args.repo}" is not in the allowed repos list.`);
91
+ }
92
+ const { resolveRepoDbPath } = await import('../registry.js');
93
+ const resolved = resolveRepoDbPath(args.repo);
94
+ if (!resolved)
95
+ throw new ConfigError(
96
+ `Repository "${args.repo}" not found in registry or its database is missing.`,
97
+ );
98
+ dbPath = resolved;
99
+ }
100
+
101
+ const toolEntry = TOOL_HANDLERS.get(name);
102
+ if (!toolEntry) {
103
+ return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
104
+ }
105
+
106
+ const ctx = {
107
+ dbPath,
108
+ getQueries,
109
+ getDatabase,
110
+ findDbPath,
111
+ allowedRepos,
112
+ MCP_MAX_LIMIT,
113
+ };
114
+
115
+ const result = await toolEntry.handler(args, ctx);
116
+ if (result?.content) return result; // pass-through MCP responses
117
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
118
+ } catch (err) {
119
+ const code = err instanceof CodegraphError ? err.code : 'UNKNOWN_ERROR';
120
+ const text =
121
+ err instanceof CodegraphError ? `[${code}] ${err.message}` : `Error: ${err.message}`;
122
+ return { content: [{ type: 'text', text }], isError: true };
123
+ }
124
+ });
125
+
126
+ const transport = new StdioServerTransport();
127
+ await server.connect(transport);
128
+ }