@mduenas/codegraph 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +641 -0
- package/dist/bin/codegraph.d.ts +20 -0
- package/dist/bin/codegraph.d.ts.map +1 -0
- package/dist/bin/codegraph.js +704 -0
- package/dist/bin/codegraph.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +291 -0
- package/dist/config.js.map +1 -0
- package/dist/context/formatter.d.ts +30 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +244 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/context/index.d.ts +86 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +402 -0
- package/dist/context/index.js.map +1 -0
- package/dist/db/index.d.ts +64 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +170 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +44 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +105 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +148 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +669 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/directory.d.ts +45 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +191 -0
- package/dist/directory.js.map +1 -0
- package/dist/errors.d.ts +136 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +219 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction/grammars.d.ts +36 -0
- package/dist/extraction/grammars.d.ts.map +1 -0
- package/dist/extraction/grammars.js +181 -0
- package/dist/extraction/grammars.js.map +1 -0
- package/dist/extraction/index.d.ts +91 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +493 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/tree-sitter.d.ts +176 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -0
- package/dist/extraction/tree-sitter.js +1798 -0
- package/dist/extraction/tree-sitter.js.map +1 -0
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/queries.d.ts +106 -0
- package/dist/graph/queries.d.ts.map +1 -0
- package/dist/graph/queries.js +355 -0
- package/dist/graph/queries.js.map +1 -0
- package/dist/graph/traversal.d.ts +127 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/traversal.js +465 -0
- package/dist/graph/traversal.js.map +1 -0
- package/dist/index.d.ts +496 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +818 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/banner.d.ts +40 -0
- package/dist/installer/banner.d.ts.map +1 -0
- package/dist/installer/banner.js +162 -0
- package/dist/installer/banner.js.map +1 -0
- package/dist/installer/claude-md-template.d.ts +10 -0
- package/dist/installer/claude-md-template.d.ts.map +1 -0
- package/dist/installer/claude-md-template.js +46 -0
- package/dist/installer/claude-md-template.js.map +1 -0
- package/dist/installer/config-writer.d.ts +36 -0
- package/dist/installer/config-writer.d.ts.map +1 -0
- package/dist/installer/config-writer.js +282 -0
- package/dist/installer/config-writer.js.map +1 -0
- package/dist/installer/index.d.ts +13 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +155 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/prompts.d.ts +18 -0
- package/dist/installer/prompts.d.ts.map +1 -0
- package/dist/installer/prompts.js +113 -0
- package/dist/installer/prompts.js.map +1 -0
- package/dist/mcp/index.d.ts +64 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +207 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +93 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +442 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/transport.d.ts +89 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +170 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/resolution/frameworks/csharp.d.ts +8 -0
- package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
- package/dist/resolution/frameworks/csharp.js +274 -0
- package/dist/resolution/frameworks/csharp.js.map +1 -0
- package/dist/resolution/frameworks/express.d.ts +8 -0
- package/dist/resolution/frameworks/express.d.ts.map +1 -0
- package/dist/resolution/frameworks/express.js +208 -0
- package/dist/resolution/frameworks/express.js.map +1 -0
- package/dist/resolution/frameworks/go.d.ts +8 -0
- package/dist/resolution/frameworks/go.d.ts.map +1 -0
- package/dist/resolution/frameworks/go.js +225 -0
- package/dist/resolution/frameworks/go.js.map +1 -0
- package/dist/resolution/frameworks/index.d.ts +33 -0
- package/dist/resolution/frameworks/index.d.ts.map +1 -0
- package/dist/resolution/frameworks/index.js +113 -0
- package/dist/resolution/frameworks/index.js.map +1 -0
- package/dist/resolution/frameworks/java.d.ts +8 -0
- package/dist/resolution/frameworks/java.d.ts.map +1 -0
- package/dist/resolution/frameworks/java.js +239 -0
- package/dist/resolution/frameworks/java.js.map +1 -0
- package/dist/resolution/frameworks/laravel.d.ts +13 -0
- package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
- package/dist/resolution/frameworks/laravel.js +198 -0
- package/dist/resolution/frameworks/laravel.js.map +1 -0
- package/dist/resolution/frameworks/python.d.ts +10 -0
- package/dist/resolution/frameworks/python.d.ts.map +1 -0
- package/dist/resolution/frameworks/python.js +331 -0
- package/dist/resolution/frameworks/python.js.map +1 -0
- package/dist/resolution/frameworks/react.d.ts +8 -0
- package/dist/resolution/frameworks/react.d.ts.map +1 -0
- package/dist/resolution/frameworks/react.js +294 -0
- package/dist/resolution/frameworks/react.js.map +1 -0
- package/dist/resolution/frameworks/ruby.d.ts +8 -0
- package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
- package/dist/resolution/frameworks/ruby.js +262 -0
- package/dist/resolution/frameworks/ruby.js.map +1 -0
- package/dist/resolution/frameworks/rust.d.ts +8 -0
- package/dist/resolution/frameworks/rust.d.ts.map +1 -0
- package/dist/resolution/frameworks/rust.js +222 -0
- package/dist/resolution/frameworks/rust.js.map +1 -0
- package/dist/resolution/frameworks/swift.d.ts +10 -0
- package/dist/resolution/frameworks/swift.d.ts.map +1 -0
- package/dist/resolution/frameworks/swift.js +486 -0
- package/dist/resolution/frameworks/swift.js.map +1 -0
- package/dist/resolution/import-resolver.d.ts +20 -0
- package/dist/resolution/import-resolver.d.ts.map +1 -0
- package/dist/resolution/import-resolver.js +445 -0
- package/dist/resolution/import-resolver.js.map +1 -0
- package/dist/resolution/index.d.ts +72 -0
- package/dist/resolution/index.d.ts.map +1 -0
- package/dist/resolution/index.js +301 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +27 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -0
- package/dist/resolution/name-matcher.js +210 -0
- package/dist/resolution/name-matcher.js.map +1 -0
- package/dist/resolution/types.d.ts +108 -0
- package/dist/resolution/types.d.ts.map +1 -0
- package/dist/resolution/types.js +8 -0
- package/dist/resolution/types.js.map +1 -0
- package/dist/sync/git-hooks.d.ts +66 -0
- package/dist/sync/git-hooks.d.ts.map +1 -0
- package/dist/sync/git-hooks.js +281 -0
- package/dist/sync/git-hooks.js.map +1 -0
- package/dist/sync/index.d.ts +13 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +18 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +410 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +165 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +116 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +295 -0
- package/dist/utils.js.map +1 -0
- package/dist/vectors/embedder.d.ts +140 -0
- package/dist/vectors/embedder.d.ts.map +1 -0
- package/dist/vectors/embedder.js +336 -0
- package/dist/vectors/embedder.js.map +1 -0
- package/dist/vectors/index.d.ts +9 -0
- package/dist/vectors/index.d.ts.map +1 -0
- package/dist/vectors/index.js +20 -0
- package/dist/vectors/index.js.map +1 -0
- package/dist/vectors/manager.d.ts +119 -0
- package/dist/vectors/manager.d.ts.map +1 -0
- package/dist/vectors/manager.js +274 -0
- package/dist/vectors/manager.js.map +1 -0
- package/dist/vectors/search.d.ts +134 -0
- package/dist/vectors/search.d.ts.map +1 -0
- package/dist/vectors/search.js +409 -0
- package/dist/vectors/search.js.map +1 -0
- package/package.json +67 -0
- package/scripts/postinstall.js +68 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Context Builder
|
|
4
|
+
*
|
|
5
|
+
* Builds rich context for tasks by combining semantic search with graph traversal.
|
|
6
|
+
* Outputs structured context ready to inject into Claude.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.formatContextAsJson = exports.formatContextAsMarkdown = exports.ContextBuilder = void 0;
|
|
43
|
+
exports.createContextBuilder = createContextBuilder;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const formatter_1 = require("./formatter");
|
|
47
|
+
const errors_1 = require("../errors");
|
|
48
|
+
/**
|
|
49
|
+
* Default options for context building
|
|
50
|
+
*
|
|
51
|
+
* Tuned for minimal context usage while still providing useful results:
|
|
52
|
+
* - Fewer nodes and code blocks by default
|
|
53
|
+
* - Smaller code block size limit
|
|
54
|
+
* - Shallower traversal
|
|
55
|
+
*/
|
|
56
|
+
const DEFAULT_BUILD_OPTIONS = {
|
|
57
|
+
maxNodes: 20, // Reduced from 50 - most tasks don't need 50 symbols
|
|
58
|
+
maxCodeBlocks: 5, // Reduced from 10 - only show most relevant code
|
|
59
|
+
maxCodeBlockSize: 1500, // Reduced from 2000
|
|
60
|
+
includeCode: true,
|
|
61
|
+
format: 'markdown',
|
|
62
|
+
searchLimit: 3, // Reduced from 5 - fewer entry points
|
|
63
|
+
traversalDepth: 1, // Reduced from 2 - shallower graph expansion
|
|
64
|
+
minScore: 0.3,
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Default options for finding relevant context
|
|
68
|
+
*/
|
|
69
|
+
const DEFAULT_FIND_OPTIONS = {
|
|
70
|
+
searchLimit: 3, // Reduced from 5
|
|
71
|
+
traversalDepth: 1, // Reduced from 2
|
|
72
|
+
maxNodes: 20, // Reduced from 50
|
|
73
|
+
minScore: 0.3,
|
|
74
|
+
edgeKinds: [],
|
|
75
|
+
nodeKinds: [],
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Context Builder
|
|
79
|
+
*
|
|
80
|
+
* Coordinates semantic search and graph traversal to build
|
|
81
|
+
* comprehensive context for tasks.
|
|
82
|
+
*/
|
|
83
|
+
class ContextBuilder {
|
|
84
|
+
projectRoot;
|
|
85
|
+
queries;
|
|
86
|
+
traverser;
|
|
87
|
+
vectorManager;
|
|
88
|
+
constructor(projectRoot, queries, traverser, vectorManager) {
|
|
89
|
+
this.projectRoot = projectRoot;
|
|
90
|
+
this.queries = queries;
|
|
91
|
+
this.traverser = traverser;
|
|
92
|
+
this.vectorManager = vectorManager;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build context for a task
|
|
96
|
+
*
|
|
97
|
+
* Pipeline:
|
|
98
|
+
* 1. Parse task input (string or {title, description})
|
|
99
|
+
* 2. Run semantic search to find entry points
|
|
100
|
+
* 3. Expand graph around entry points
|
|
101
|
+
* 4. Extract code blocks for key nodes
|
|
102
|
+
* 5. Format output for Claude
|
|
103
|
+
*
|
|
104
|
+
* @param input - Task description or object with title/description
|
|
105
|
+
* @param options - Build options
|
|
106
|
+
* @returns TaskContext (structured) or formatted string
|
|
107
|
+
*/
|
|
108
|
+
async buildContext(input, options = {}) {
|
|
109
|
+
const opts = { ...DEFAULT_BUILD_OPTIONS, ...options };
|
|
110
|
+
// Parse input
|
|
111
|
+
const query = typeof input === 'string' ? input : `${input.title}${input.description ? `: ${input.description}` : ''}`;
|
|
112
|
+
// Find relevant context (semantic search + graph expansion)
|
|
113
|
+
const subgraph = await this.findRelevantContext(query, {
|
|
114
|
+
searchLimit: opts.searchLimit,
|
|
115
|
+
traversalDepth: opts.traversalDepth,
|
|
116
|
+
maxNodes: opts.maxNodes,
|
|
117
|
+
minScore: opts.minScore,
|
|
118
|
+
});
|
|
119
|
+
// Get entry points (nodes from semantic search)
|
|
120
|
+
const entryPoints = this.getEntryPoints(subgraph);
|
|
121
|
+
// Extract code blocks for key nodes
|
|
122
|
+
const codeBlocks = opts.includeCode
|
|
123
|
+
? await this.extractCodeBlocks(subgraph, opts.maxCodeBlocks, opts.maxCodeBlockSize)
|
|
124
|
+
: [];
|
|
125
|
+
// Get related files
|
|
126
|
+
const relatedFiles = this.getRelatedFiles(subgraph);
|
|
127
|
+
// Generate summary
|
|
128
|
+
const summary = this.generateSummary(query, subgraph, entryPoints);
|
|
129
|
+
// Calculate stats
|
|
130
|
+
const stats = {
|
|
131
|
+
nodeCount: subgraph.nodes.size,
|
|
132
|
+
edgeCount: subgraph.edges.length,
|
|
133
|
+
fileCount: relatedFiles.length,
|
|
134
|
+
codeBlockCount: codeBlocks.length,
|
|
135
|
+
totalCodeSize: codeBlocks.reduce((sum, block) => sum + block.content.length, 0),
|
|
136
|
+
};
|
|
137
|
+
const context = {
|
|
138
|
+
query,
|
|
139
|
+
subgraph,
|
|
140
|
+
entryPoints,
|
|
141
|
+
codeBlocks,
|
|
142
|
+
relatedFiles,
|
|
143
|
+
summary,
|
|
144
|
+
stats,
|
|
145
|
+
};
|
|
146
|
+
// Return formatted output or raw context
|
|
147
|
+
if (opts.format === 'markdown') {
|
|
148
|
+
return (0, formatter_1.formatContextAsMarkdown)(context);
|
|
149
|
+
}
|
|
150
|
+
else if (opts.format === 'json') {
|
|
151
|
+
return (0, formatter_1.formatContextAsJson)(context);
|
|
152
|
+
}
|
|
153
|
+
return context;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Find relevant subgraph for a query
|
|
157
|
+
*
|
|
158
|
+
* Combines semantic search with graph traversal:
|
|
159
|
+
* 1. Use semantic search to find relevant entry points
|
|
160
|
+
* 2. Traverse graph from entry points
|
|
161
|
+
* 3. Merge results into a unified subgraph
|
|
162
|
+
*
|
|
163
|
+
* @param query - Natural language query
|
|
164
|
+
* @param options - Search and traversal options
|
|
165
|
+
* @returns Subgraph of relevant nodes and edges
|
|
166
|
+
*/
|
|
167
|
+
async findRelevantContext(query, options = {}) {
|
|
168
|
+
const opts = { ...DEFAULT_FIND_OPTIONS, ...options };
|
|
169
|
+
// Start with empty subgraph
|
|
170
|
+
const nodes = new Map();
|
|
171
|
+
const edges = [];
|
|
172
|
+
const roots = [];
|
|
173
|
+
// Handle empty query - return empty subgraph
|
|
174
|
+
if (!query || query.trim().length === 0) {
|
|
175
|
+
return { nodes, edges, roots };
|
|
176
|
+
}
|
|
177
|
+
// Try semantic search if vector manager is available
|
|
178
|
+
let searchResults = [];
|
|
179
|
+
if (this.vectorManager && this.vectorManager.isInitialized()) {
|
|
180
|
+
try {
|
|
181
|
+
searchResults = await this.vectorManager.search(query, {
|
|
182
|
+
limit: opts.searchLimit,
|
|
183
|
+
kinds: opts.nodeKinds && opts.nodeKinds.length > 0 ? opts.nodeKinds : undefined,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
(0, errors_1.logDebug)('Semantic search failed, falling back to text search', { query, error: String(error) });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Fall back to text search if no semantic results
|
|
191
|
+
if (searchResults.length === 0) {
|
|
192
|
+
try {
|
|
193
|
+
const textResults = this.queries.searchNodes(query, {
|
|
194
|
+
limit: opts.searchLimit,
|
|
195
|
+
kinds: opts.nodeKinds && opts.nodeKinds.length > 0 ? opts.nodeKinds : undefined,
|
|
196
|
+
});
|
|
197
|
+
searchResults = textResults;
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
(0, errors_1.logWarn)('Text search failed', { query, error: String(error) });
|
|
201
|
+
// Return empty results
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Filter by minimum score
|
|
205
|
+
const filteredResults = searchResults.filter((r) => r.score >= opts.minScore);
|
|
206
|
+
// Add entry points to subgraph
|
|
207
|
+
for (const result of filteredResults) {
|
|
208
|
+
nodes.set(result.node.id, result.node);
|
|
209
|
+
roots.push(result.node.id);
|
|
210
|
+
}
|
|
211
|
+
// Traverse from each entry point
|
|
212
|
+
for (const result of filteredResults) {
|
|
213
|
+
const traversalResult = this.traverser.traverseBFS(result.node.id, {
|
|
214
|
+
maxDepth: opts.traversalDepth,
|
|
215
|
+
edgeKinds: opts.edgeKinds && opts.edgeKinds.length > 0 ? opts.edgeKinds : undefined,
|
|
216
|
+
nodeKinds: opts.nodeKinds && opts.nodeKinds.length > 0 ? opts.nodeKinds : undefined,
|
|
217
|
+
direction: 'both',
|
|
218
|
+
limit: Math.ceil(opts.maxNodes / Math.max(1, filteredResults.length)),
|
|
219
|
+
});
|
|
220
|
+
// Merge nodes
|
|
221
|
+
for (const [id, node] of traversalResult.nodes) {
|
|
222
|
+
if (!nodes.has(id)) {
|
|
223
|
+
nodes.set(id, node);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Merge edges (avoid duplicates)
|
|
227
|
+
for (const edge of traversalResult.edges) {
|
|
228
|
+
const exists = edges.some((e) => e.source === edge.source && e.target === edge.target && e.kind === edge.kind);
|
|
229
|
+
if (!exists) {
|
|
230
|
+
edges.push(edge);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Trim to max nodes if needed
|
|
235
|
+
if (nodes.size > opts.maxNodes) {
|
|
236
|
+
// Prioritize entry points and their direct neighbors
|
|
237
|
+
const priorityIds = new Set(roots);
|
|
238
|
+
for (const edge of edges) {
|
|
239
|
+
if (priorityIds.has(edge.source)) {
|
|
240
|
+
priorityIds.add(edge.target);
|
|
241
|
+
}
|
|
242
|
+
if (priorityIds.has(edge.target)) {
|
|
243
|
+
priorityIds.add(edge.source);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Keep priority nodes, then fill remaining slots
|
|
247
|
+
const trimmedNodes = new Map();
|
|
248
|
+
for (const id of priorityIds) {
|
|
249
|
+
const node = nodes.get(id);
|
|
250
|
+
if (node && trimmedNodes.size < opts.maxNodes) {
|
|
251
|
+
trimmedNodes.set(id, node);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Fill remaining from other nodes
|
|
255
|
+
for (const [id, node] of nodes) {
|
|
256
|
+
if (trimmedNodes.size >= opts.maxNodes)
|
|
257
|
+
break;
|
|
258
|
+
if (!trimmedNodes.has(id)) {
|
|
259
|
+
trimmedNodes.set(id, node);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Filter edges to only include kept nodes
|
|
263
|
+
const trimmedEdges = edges.filter((e) => trimmedNodes.has(e.source) && trimmedNodes.has(e.target));
|
|
264
|
+
return { nodes: trimmedNodes, edges: trimmedEdges, roots };
|
|
265
|
+
}
|
|
266
|
+
return { nodes, edges, roots };
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get the source code for a node
|
|
270
|
+
*
|
|
271
|
+
* Reads the file and extracts the code between startLine and endLine.
|
|
272
|
+
*
|
|
273
|
+
* @param nodeId - ID of the node
|
|
274
|
+
* @returns Code string or null if not found
|
|
275
|
+
*/
|
|
276
|
+
async getCode(nodeId) {
|
|
277
|
+
const node = this.queries.getNodeById(nodeId);
|
|
278
|
+
if (!node) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
return this.extractNodeCode(node);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Extract code from a node's source file
|
|
285
|
+
*/
|
|
286
|
+
async extractNodeCode(node) {
|
|
287
|
+
const filePath = path.join(this.projectRoot, node.filePath);
|
|
288
|
+
if (!fs.existsSync(filePath)) {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
try {
|
|
292
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
293
|
+
const lines = content.split('\n');
|
|
294
|
+
// Extract lines (1-indexed to 0-indexed)
|
|
295
|
+
const startIdx = Math.max(0, node.startLine - 1);
|
|
296
|
+
const endIdx = Math.min(lines.length, node.endLine);
|
|
297
|
+
return lines.slice(startIdx, endIdx).join('\n');
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
(0, errors_1.logDebug)('Failed to extract code from node', { nodeId: node.id, filePath: node.filePath, error: String(error) });
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get entry points from a subgraph (the root nodes)
|
|
306
|
+
*/
|
|
307
|
+
getEntryPoints(subgraph) {
|
|
308
|
+
return subgraph.roots
|
|
309
|
+
.map((id) => subgraph.nodes.get(id))
|
|
310
|
+
.filter((n) => n !== undefined);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Extract code blocks for key nodes in the subgraph
|
|
314
|
+
*/
|
|
315
|
+
async extractCodeBlocks(subgraph, maxBlocks, maxBlockSize) {
|
|
316
|
+
const blocks = [];
|
|
317
|
+
// Prioritize entry points, then functions/methods
|
|
318
|
+
const priorityNodes = [];
|
|
319
|
+
// First: entry points
|
|
320
|
+
for (const id of subgraph.roots) {
|
|
321
|
+
const node = subgraph.nodes.get(id);
|
|
322
|
+
if (node) {
|
|
323
|
+
priorityNodes.push(node);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Then: functions and methods
|
|
327
|
+
for (const node of subgraph.nodes.values()) {
|
|
328
|
+
if (!subgraph.roots.includes(node.id)) {
|
|
329
|
+
if (node.kind === 'function' || node.kind === 'method') {
|
|
330
|
+
priorityNodes.push(node);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Then: classes
|
|
335
|
+
for (const node of subgraph.nodes.values()) {
|
|
336
|
+
if (!subgraph.roots.includes(node.id)) {
|
|
337
|
+
if (node.kind === 'class') {
|
|
338
|
+
priorityNodes.push(node);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Extract code for priority nodes
|
|
343
|
+
for (const node of priorityNodes) {
|
|
344
|
+
if (blocks.length >= maxBlocks)
|
|
345
|
+
break;
|
|
346
|
+
const code = await this.extractNodeCode(node);
|
|
347
|
+
if (code) {
|
|
348
|
+
// Truncate if too long
|
|
349
|
+
const truncated = code.length > maxBlockSize
|
|
350
|
+
? code.slice(0, maxBlockSize) + '\n// ... truncated ...'
|
|
351
|
+
: code;
|
|
352
|
+
blocks.push({
|
|
353
|
+
content: truncated,
|
|
354
|
+
filePath: node.filePath,
|
|
355
|
+
startLine: node.startLine,
|
|
356
|
+
endLine: node.endLine,
|
|
357
|
+
language: node.language,
|
|
358
|
+
node,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return blocks;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Get unique files from a subgraph
|
|
366
|
+
*/
|
|
367
|
+
getRelatedFiles(subgraph) {
|
|
368
|
+
const files = new Set();
|
|
369
|
+
for (const node of subgraph.nodes.values()) {
|
|
370
|
+
files.add(node.filePath);
|
|
371
|
+
}
|
|
372
|
+
return Array.from(files).sort();
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Generate a summary of the context
|
|
376
|
+
*/
|
|
377
|
+
generateSummary(_query, subgraph, entryPoints) {
|
|
378
|
+
const nodeCount = subgraph.nodes.size;
|
|
379
|
+
const edgeCount = subgraph.edges.length;
|
|
380
|
+
const files = this.getRelatedFiles(subgraph);
|
|
381
|
+
const entryPointNames = entryPoints
|
|
382
|
+
.slice(0, 3)
|
|
383
|
+
.map((n) => n.name)
|
|
384
|
+
.join(', ');
|
|
385
|
+
const remaining = entryPoints.length > 3 ? ` and ${entryPoints.length - 3} more` : '';
|
|
386
|
+
return `Found ${nodeCount} relevant code symbols across ${files.length} files. ` +
|
|
387
|
+
`Key entry points: ${entryPointNames}${remaining}. ` +
|
|
388
|
+
`${edgeCount} relationships identified.`;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
exports.ContextBuilder = ContextBuilder;
|
|
392
|
+
/**
|
|
393
|
+
* Create a context builder
|
|
394
|
+
*/
|
|
395
|
+
function createContextBuilder(projectRoot, queries, traverser, vectorManager) {
|
|
396
|
+
return new ContextBuilder(projectRoot, queries, traverser, vectorManager);
|
|
397
|
+
}
|
|
398
|
+
// Re-export formatter
|
|
399
|
+
var formatter_2 = require("./formatter");
|
|
400
|
+
Object.defineProperty(exports, "formatContextAsMarkdown", { enumerable: true, get: function () { return formatter_2.formatContextAsMarkdown; } });
|
|
401
|
+
Object.defineProperty(exports, "formatContextAsJson", { enumerable: true, get: function () { return formatter_2.formatContextAsJson; } });
|
|
402
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Layer
|
|
3
|
+
*
|
|
4
|
+
* Handles SQLite database initialization and connection management.
|
|
5
|
+
*/
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import { SchemaVersion } from '../types';
|
|
8
|
+
/**
|
|
9
|
+
* Database connection wrapper with lifecycle management
|
|
10
|
+
*/
|
|
11
|
+
export declare class DatabaseConnection {
|
|
12
|
+
private db;
|
|
13
|
+
private dbPath;
|
|
14
|
+
private constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Initialize a new database at the given path
|
|
17
|
+
*/
|
|
18
|
+
static initialize(dbPath: string): DatabaseConnection;
|
|
19
|
+
/**
|
|
20
|
+
* Open an existing database
|
|
21
|
+
*/
|
|
22
|
+
static open(dbPath: string): DatabaseConnection;
|
|
23
|
+
/**
|
|
24
|
+
* Get the underlying database instance
|
|
25
|
+
*/
|
|
26
|
+
getDb(): Database.Database;
|
|
27
|
+
/**
|
|
28
|
+
* Get database file path
|
|
29
|
+
*/
|
|
30
|
+
getPath(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get current schema version
|
|
33
|
+
*/
|
|
34
|
+
getSchemaVersion(): SchemaVersion | null;
|
|
35
|
+
/**
|
|
36
|
+
* Execute a function within a transaction
|
|
37
|
+
*/
|
|
38
|
+
transaction<T>(fn: () => T): T;
|
|
39
|
+
/**
|
|
40
|
+
* Get database file size in bytes
|
|
41
|
+
*/
|
|
42
|
+
getSize(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Optimize database (vacuum and analyze)
|
|
45
|
+
*/
|
|
46
|
+
optimize(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Close the database connection
|
|
49
|
+
*/
|
|
50
|
+
close(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Check if the database connection is open
|
|
53
|
+
*/
|
|
54
|
+
isOpen(): boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Default database filename
|
|
58
|
+
*/
|
|
59
|
+
export declare const DATABASE_FILENAME = "codegraph.db";
|
|
60
|
+
/**
|
|
61
|
+
* Get the default database path for a project
|
|
62
|
+
*/
|
|
63
|
+
export declare function getDatabasePath(projectRoot: string): string;
|
|
64
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAKP;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAsBrD;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAsB/C;;OAEG;IACH,KAAK,IAAI,QAAQ,CAAC,QAAQ;IAI1B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAcxC;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAI9B;;OAEG;IACH,OAAO,IAAI,MAAM;IAKjB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,OAAO;CAGlB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database Layer
|
|
4
|
+
*
|
|
5
|
+
* Handles SQLite database initialization and connection management.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.DATABASE_FILENAME = exports.DatabaseConnection = void 0;
|
|
45
|
+
exports.getDatabasePath = getDatabasePath;
|
|
46
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const migrations_1 = require("./migrations");
|
|
50
|
+
/**
|
|
51
|
+
* Database connection wrapper with lifecycle management
|
|
52
|
+
*/
|
|
53
|
+
class DatabaseConnection {
|
|
54
|
+
db;
|
|
55
|
+
dbPath;
|
|
56
|
+
constructor(db, dbPath) {
|
|
57
|
+
this.db = db;
|
|
58
|
+
this.dbPath = dbPath;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Initialize a new database at the given path
|
|
62
|
+
*/
|
|
63
|
+
static initialize(dbPath) {
|
|
64
|
+
// Ensure parent directory exists
|
|
65
|
+
const dir = path.dirname(dbPath);
|
|
66
|
+
if (!fs.existsSync(dir)) {
|
|
67
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
// Create and configure database
|
|
70
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
71
|
+
// Enable foreign keys and WAL mode for better performance
|
|
72
|
+
db.pragma('foreign_keys = ON');
|
|
73
|
+
db.pragma('journal_mode = WAL');
|
|
74
|
+
// Run schema initialization
|
|
75
|
+
const schemaPath = path.join(__dirname, 'schema.sql');
|
|
76
|
+
const schema = fs.readFileSync(schemaPath, 'utf-8');
|
|
77
|
+
db.exec(schema);
|
|
78
|
+
return new DatabaseConnection(db, dbPath);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Open an existing database
|
|
82
|
+
*/
|
|
83
|
+
static open(dbPath) {
|
|
84
|
+
if (!fs.existsSync(dbPath)) {
|
|
85
|
+
throw new Error(`Database not found: ${dbPath}`);
|
|
86
|
+
}
|
|
87
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
88
|
+
// Enable foreign keys and WAL mode
|
|
89
|
+
db.pragma('foreign_keys = ON');
|
|
90
|
+
db.pragma('journal_mode = WAL');
|
|
91
|
+
// Check and run migrations if needed
|
|
92
|
+
const conn = new DatabaseConnection(db, dbPath);
|
|
93
|
+
const currentVersion = (0, migrations_1.getCurrentVersion)(db);
|
|
94
|
+
if (currentVersion < migrations_1.CURRENT_SCHEMA_VERSION) {
|
|
95
|
+
(0, migrations_1.runMigrations)(db, currentVersion);
|
|
96
|
+
}
|
|
97
|
+
return conn;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get the underlying database instance
|
|
101
|
+
*/
|
|
102
|
+
getDb() {
|
|
103
|
+
return this.db;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get database file path
|
|
107
|
+
*/
|
|
108
|
+
getPath() {
|
|
109
|
+
return this.dbPath;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get current schema version
|
|
113
|
+
*/
|
|
114
|
+
getSchemaVersion() {
|
|
115
|
+
const row = this.db
|
|
116
|
+
.prepare('SELECT version, applied_at, description FROM schema_versions ORDER BY version DESC LIMIT 1')
|
|
117
|
+
.get();
|
|
118
|
+
if (!row)
|
|
119
|
+
return null;
|
|
120
|
+
return {
|
|
121
|
+
version: row.version,
|
|
122
|
+
appliedAt: row.applied_at,
|
|
123
|
+
description: row.description ?? undefined,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Execute a function within a transaction
|
|
128
|
+
*/
|
|
129
|
+
transaction(fn) {
|
|
130
|
+
return this.db.transaction(fn)();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get database file size in bytes
|
|
134
|
+
*/
|
|
135
|
+
getSize() {
|
|
136
|
+
const stats = fs.statSync(this.dbPath);
|
|
137
|
+
return stats.size;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Optimize database (vacuum and analyze)
|
|
141
|
+
*/
|
|
142
|
+
optimize() {
|
|
143
|
+
this.db.exec('VACUUM');
|
|
144
|
+
this.db.exec('ANALYZE');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Close the database connection
|
|
148
|
+
*/
|
|
149
|
+
close() {
|
|
150
|
+
this.db.close();
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if the database connection is open
|
|
154
|
+
*/
|
|
155
|
+
isOpen() {
|
|
156
|
+
return this.db.open;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.DatabaseConnection = DatabaseConnection;
|
|
160
|
+
/**
|
|
161
|
+
* Default database filename
|
|
162
|
+
*/
|
|
163
|
+
exports.DATABASE_FILENAME = 'codegraph.db';
|
|
164
|
+
/**
|
|
165
|
+
* Get the default database path for a project
|
|
166
|
+
*/
|
|
167
|
+
function getDatabasePath(projectRoot) {
|
|
168
|
+
return path.join(projectRoot, '.codegraph', exports.DATABASE_FILENAME);
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
|