codestrate 0.1.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/README.md +154 -0
- package/dist/constants.d.ts +40 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +145 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +134 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/index.d.ts +260 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +173 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/security/guard.d.ts +18 -0
- package/dist/security/guard.d.ts.map +1 -0
- package/dist/security/guard.js +39 -0
- package/dist/security/guard.js.map +1 -0
- package/dist/services/code-searcher.d.ts +22 -0
- package/dist/services/code-searcher.d.ts.map +1 -0
- package/dist/services/code-searcher.js +171 -0
- package/dist/services/code-searcher.js.map +1 -0
- package/dist/services/context-builder.d.ts +22 -0
- package/dist/services/context-builder.d.ts.map +1 -0
- package/dist/services/context-builder.js +232 -0
- package/dist/services/context-builder.js.map +1 -0
- package/dist/services/memory-store.d.ts +31 -0
- package/dist/services/memory-store.d.ts.map +1 -0
- package/dist/services/memory-store.js +27 -0
- package/dist/services/memory-store.js.map +1 -0
- package/dist/services/repository-parser.d.ts +8 -0
- package/dist/services/repository-parser.d.ts.map +1 -0
- package/dist/services/repository-parser.js +255 -0
- package/dist/services/repository-parser.js.map +1 -0
- package/dist/services/symbol-indexer.d.ts +16 -0
- package/dist/services/symbol-indexer.d.ts.map +1 -0
- package/dist/services/symbol-indexer.js +417 -0
- package/dist/services/symbol-indexer.js.map +1 -0
- package/dist/services/tree-sitter.d.ts +22 -0
- package/dist/services/tree-sitter.d.ts.map +1 -0
- package/dist/services/tree-sitter.js +269 -0
- package/dist/services/tree-sitter.js.map +1 -0
- package/dist/services/validation-runner.d.ts +30 -0
- package/dist/services/validation-runner.d.ts.map +1 -0
- package/dist/services/validation-runner.js +159 -0
- package/dist/services/validation-runner.js.map +1 -0
- package/dist/store/index.d.ts +23 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +93 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/interface.d.ts +73 -0
- package/dist/store/interface.d.ts.map +1 -0
- package/dist/store/interface.js +9 -0
- package/dist/store/interface.js.map +1 -0
- package/dist/store/memory.d.ts +21 -0
- package/dist/store/memory.d.ts.map +1 -0
- package/dist/store/memory.js +157 -0
- package/dist/store/memory.js.map +1 -0
- package/dist/store/sqlite.d.ts +95 -0
- package/dist/store/sqlite.d.ts.map +1 -0
- package/dist/store/sqlite.js +1018 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/tools/analyze-impact.d.ts +3 -0
- package/dist/tools/analyze-impact.d.ts.map +1 -0
- package/dist/tools/analyze-impact.js +110 -0
- package/dist/tools/analyze-impact.js.map +1 -0
- package/dist/tools/explore.d.ts +3 -0
- package/dist/tools/explore.d.ts.map +1 -0
- package/dist/tools/explore.js +96 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/get-context.d.ts +3 -0
- package/dist/tools/get-context.d.ts.map +1 -0
- package/dist/tools/get-context.js +82 -0
- package/dist/tools/get-context.js.map +1 -0
- package/dist/tools/inspect-symbol.d.ts +3 -0
- package/dist/tools/inspect-symbol.d.ts.map +1 -0
- package/dist/tools/inspect-symbol.js +146 -0
- package/dist/tools/inspect-symbol.js.map +1 -0
- package/dist/tools/recall-experience.d.ts +3 -0
- package/dist/tools/recall-experience.d.ts.map +1 -0
- package/dist/tools/recall-experience.js +141 -0
- package/dist/tools/recall-experience.js.map +1 -0
- package/dist/tools/record-experience.d.ts +6 -0
- package/dist/tools/record-experience.d.ts.map +1 -0
- package/dist/tools/record-experience.js +68 -0
- package/dist/tools/record-experience.js.map +1 -0
- package/dist/tools/reindex.d.ts +8 -0
- package/dist/tools/reindex.d.ts.map +1 -0
- package/dist/tools/reindex.js +74 -0
- package/dist/tools/reindex.js.map +1 -0
- package/dist/tools/repo-overview.d.ts +7 -0
- package/dist/tools/repo-overview.d.ts.map +1 -0
- package/dist/tools/repo-overview.js +102 -0
- package/dist/tools/repo-overview.js.map +1 -0
- package/dist/tools/run-validation.d.ts +6 -0
- package/dist/tools/run-validation.d.ts.map +1 -0
- package/dist/tools/run-validation.js +115 -0
- package/dist/tools/run-validation.js.map +1 -0
- package/dist/tools/search-code.d.ts +3 -0
- package/dist/tools/search-code.d.ts.map +1 -0
- package/dist/tools/search-code.js +98 -0
- package/dist/tools/search-code.js.map +1 -0
- package/dist/tools/search-history.d.ts +6 -0
- package/dist/tools/search-history.d.ts.map +1 -0
- package/dist/tools/search-history.js +69 -0
- package/dist/tools/search-history.js.map +1 -0
- package/dist/tools/status.d.ts +7 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/status.js +98 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/trace-flow.d.ts +3 -0
- package/dist/tools/trace-flow.d.ts.map +1 -0
- package/dist/tools/trace-flow.js +155 -0
- package/dist/tools/trace-flow.js.map +1 -0
- package/dist/types.d.ts +182 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/grammars/tree-sitter-python.wasm +0 -0
- package/grammars/tree-sitter-typescript.wasm +0 -0
- package/package.json +48 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-Sitter Service — parse AST bằng WASM cho TypeScript và Python.
|
|
3
|
+
*
|
|
4
|
+
* Lazy-load web-tree-sitter và grammar WASM lần đầu dùng.
|
|
5
|
+
* Fallback graceful khi init fail hoặc language không hỗ trợ.
|
|
6
|
+
*/
|
|
7
|
+
import * as Pkg from "web-tree-sitter";
|
|
8
|
+
import { existsSync } from "fs";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
10
|
+
import { dirname, join } from "path";
|
|
11
|
+
// ─── Lazy WASM Grammar Registry ─────────────────────────
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
const GRAMMAR_DIR = join(__dirname, "..", "..", "grammars");
|
|
15
|
+
let _state = "uninitialized";
|
|
16
|
+
let _initPromise = null;
|
|
17
|
+
const _grammars = new Map();
|
|
18
|
+
const GRAMMAR_FILES = {
|
|
19
|
+
typescript: "tree-sitter-typescript.wasm",
|
|
20
|
+
python: "tree-sitter-python.wasm",
|
|
21
|
+
};
|
|
22
|
+
async function doInit() {
|
|
23
|
+
try {
|
|
24
|
+
await Pkg.Parser.init();
|
|
25
|
+
for (const [lang, filename] of Object.entries(GRAMMAR_FILES)) {
|
|
26
|
+
const wasmPath = join(GRAMMAR_DIR, filename);
|
|
27
|
+
if (!existsSync(wasmPath)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const langObj = await Pkg.Language.load(wasmPath);
|
|
31
|
+
_grammars.set(lang, langObj);
|
|
32
|
+
}
|
|
33
|
+
_state = "ready";
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
_state = "failed";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function initTreeSitter() {
|
|
40
|
+
if (_state === "ready")
|
|
41
|
+
return;
|
|
42
|
+
if (_state === "initializing" && _initPromise) {
|
|
43
|
+
await _initPromise;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
_state = "initializing";
|
|
47
|
+
_initPromise = doInit();
|
|
48
|
+
await _initPromise;
|
|
49
|
+
}
|
|
50
|
+
/** True if at least one grammar loaded successfully. */
|
|
51
|
+
export function isReady() {
|
|
52
|
+
return _state === "ready" && _grammars.size > 0;
|
|
53
|
+
}
|
|
54
|
+
/** Languages available for tree-sitter parsing. */
|
|
55
|
+
export function availableLanguages() {
|
|
56
|
+
return [..._grammars.keys()];
|
|
57
|
+
}
|
|
58
|
+
// ─── Parsing ───────────────────────────────────────────────
|
|
59
|
+
/** Tree-sitter query patterns per language. */
|
|
60
|
+
const TS_QUERIES = [
|
|
61
|
+
// Functions (regular, exported, async)
|
|
62
|
+
"(function_declaration name: (identifier) @name) @node",
|
|
63
|
+
// Arrow functions assigned to const/let/var
|
|
64
|
+
"(variable_declarator name: (identifier) @name value: (arrow_function) @node)",
|
|
65
|
+
// Class methods
|
|
66
|
+
"(method_definition name: (property_identifier) @name) @node",
|
|
67
|
+
// Classes
|
|
68
|
+
"(class_declaration name: (type_identifier) @name) @node",
|
|
69
|
+
// Interfaces
|
|
70
|
+
"(interface_declaration name: (type_identifier) @name) @node",
|
|
71
|
+
// Enums
|
|
72
|
+
"(enum_declaration name: (identifier) @name) @node",
|
|
73
|
+
// Type aliases
|
|
74
|
+
"(type_alias_declaration name: (type_identifier) @name) @node",
|
|
75
|
+
// Module/namespace
|
|
76
|
+
"(module name: (identifier) @name) @node",
|
|
77
|
+
];
|
|
78
|
+
const PY_QUERIES = [
|
|
79
|
+
// Functions (including async)
|
|
80
|
+
"(function_definition name: (identifier) @name) @node",
|
|
81
|
+
// Classes
|
|
82
|
+
"(class_definition name: (identifier) @name) @node",
|
|
83
|
+
];
|
|
84
|
+
function nodeToKind(nodeType) {
|
|
85
|
+
switch (nodeType) {
|
|
86
|
+
case "function_declaration":
|
|
87
|
+
case "arrow_function":
|
|
88
|
+
return "function";
|
|
89
|
+
case "method_definition":
|
|
90
|
+
return "method";
|
|
91
|
+
case "class_declaration":
|
|
92
|
+
return "class";
|
|
93
|
+
case "interface_declaration":
|
|
94
|
+
return "interface";
|
|
95
|
+
case "enum_declaration":
|
|
96
|
+
return "enum";
|
|
97
|
+
case "type_alias_declaration":
|
|
98
|
+
return "type";
|
|
99
|
+
case "module":
|
|
100
|
+
return "module";
|
|
101
|
+
case "function_definition":
|
|
102
|
+
return "function";
|
|
103
|
+
case "class_definition":
|
|
104
|
+
return "class";
|
|
105
|
+
default:
|
|
106
|
+
return "unknown";
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function extractSignature(code, node) {
|
|
110
|
+
const end = node.endIndex;
|
|
111
|
+
// Try to find the end of the signature (before the first newline after the opening paren)
|
|
112
|
+
for (let i = node.startIndex; i < Math.min(end, node.startIndex + 500); i++) {
|
|
113
|
+
if (code[i] === "\n") {
|
|
114
|
+
return code.slice(node.startIndex, i).trim();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return code.slice(node.startIndex, Math.min(end, node.startIndex + 200)).trim();
|
|
118
|
+
}
|
|
119
|
+
function nodeHasModifier(node, modifierType) {
|
|
120
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
121
|
+
const child = node.child(i);
|
|
122
|
+
if (child.type === modifierType)
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
function parseWithTS(lang, code) {
|
|
128
|
+
const parser = new Pkg.Parser();
|
|
129
|
+
parser.setLanguage(lang);
|
|
130
|
+
const tree = parser.parse(code);
|
|
131
|
+
if (!tree)
|
|
132
|
+
return { symbols: [], imports: [] };
|
|
133
|
+
const root = tree.rootNode;
|
|
134
|
+
const symbols = [];
|
|
135
|
+
const imports = [];
|
|
136
|
+
// Extract imports from import_statements
|
|
137
|
+
const importQuery = new Pkg.Query(lang, "(import_statement source: (string) @src)");
|
|
138
|
+
for (const match of importQuery.matches(root)) {
|
|
139
|
+
for (const cap of match.captures) {
|
|
140
|
+
imports.push(code.slice(cap.node.startIndex, cap.node.endIndex));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Extract symbols from combined query
|
|
144
|
+
const combinedQuery = TS_QUERIES.join(" ");
|
|
145
|
+
const query = new Pkg.Query(lang, combinedQuery);
|
|
146
|
+
const matches = query.matches(root);
|
|
147
|
+
const seen = new Set();
|
|
148
|
+
for (const match of matches) {
|
|
149
|
+
let nameNode = null;
|
|
150
|
+
let declNode = null;
|
|
151
|
+
for (const cap of match.captures) {
|
|
152
|
+
if (cap.name === "name")
|
|
153
|
+
nameNode = cap.node;
|
|
154
|
+
if (cap.name === "node")
|
|
155
|
+
declNode = cap.node;
|
|
156
|
+
}
|
|
157
|
+
if (!nameNode || !declNode)
|
|
158
|
+
continue;
|
|
159
|
+
// Deduplicate: same name + same line
|
|
160
|
+
const key = code.slice(nameNode.startIndex, nameNode.endIndex) + ":" + declNode.startPosition.row;
|
|
161
|
+
if (seen.has(hashCode(key)))
|
|
162
|
+
continue;
|
|
163
|
+
seen.add(hashCode(key));
|
|
164
|
+
const name = code.slice(nameNode.startIndex, nameNode.endIndex);
|
|
165
|
+
const nodeType = declNode.type;
|
|
166
|
+
const kind = nodeToKind(nodeType);
|
|
167
|
+
// For arrow function variables, the kind is "function"
|
|
168
|
+
// For method definitions, check if it's a constructor
|
|
169
|
+
let finalKind = kind;
|
|
170
|
+
if (nodeType === "method_definition") {
|
|
171
|
+
finalKind = name === "constructor" ? "method" : "method";
|
|
172
|
+
}
|
|
173
|
+
// Check for export modifier
|
|
174
|
+
// In tree-sitter, export is a sibling before the declaration
|
|
175
|
+
const isExported = nodeHasModifier(declNode, "export") ||
|
|
176
|
+
(declNode.parent?.type === "export_statement");
|
|
177
|
+
const signature = extractSignature(code, declNode);
|
|
178
|
+
symbols.push({
|
|
179
|
+
name: isExported && !name.startsWith("export ") ? name : name,
|
|
180
|
+
kind: finalKind,
|
|
181
|
+
line: declNode.startPosition.row + 1,
|
|
182
|
+
column: declNode.startPosition.column,
|
|
183
|
+
signature,
|
|
184
|
+
summary: code.slice(declNode.startIndex, declNode.endIndex).split("\n")[0] || signature,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return { symbols, imports };
|
|
188
|
+
}
|
|
189
|
+
function parseWithPython(lang, code) {
|
|
190
|
+
const parser = new Pkg.Parser();
|
|
191
|
+
parser.setLanguage(lang);
|
|
192
|
+
const tree = parser.parse(code);
|
|
193
|
+
if (!tree)
|
|
194
|
+
return { symbols: [], imports: [] };
|
|
195
|
+
const root = tree.rootNode;
|
|
196
|
+
const symbols = [];
|
|
197
|
+
const imports = [];
|
|
198
|
+
// Extract imports
|
|
199
|
+
const importQuery = new Pkg.Query(lang, "[(import_statement (dotted_name) @src) (import_from_statement module_name: (dotted_name) @src)]");
|
|
200
|
+
for (const match of importQuery.matches(root)) {
|
|
201
|
+
for (const cap of match.captures) {
|
|
202
|
+
imports.push(code.slice(cap.node.startIndex, cap.node.endIndex));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Extract symbols
|
|
206
|
+
const combinedQuery = PY_QUERIES.join(" ");
|
|
207
|
+
const query = new Pkg.Query(lang, combinedQuery);
|
|
208
|
+
const matches = query.matches(root);
|
|
209
|
+
const seen = new Set();
|
|
210
|
+
for (const match of matches) {
|
|
211
|
+
let nameNode = null;
|
|
212
|
+
let declNode = null;
|
|
213
|
+
for (const cap of match.captures) {
|
|
214
|
+
if (cap.name === "name")
|
|
215
|
+
nameNode = cap.node;
|
|
216
|
+
if (cap.name === "node")
|
|
217
|
+
declNode = cap.node;
|
|
218
|
+
}
|
|
219
|
+
if (!nameNode || !declNode)
|
|
220
|
+
continue;
|
|
221
|
+
const key = code.slice(nameNode.startIndex, nameNode.endIndex) + ":" + declNode.startPosition.row;
|
|
222
|
+
if (seen.has(hashCode(key)))
|
|
223
|
+
continue;
|
|
224
|
+
seen.add(hashCode(key));
|
|
225
|
+
const name = code.slice(nameNode.startIndex, nameNode.endIndex);
|
|
226
|
+
const nodeType = declNode.type;
|
|
227
|
+
const kind = nodeToKind(nodeType);
|
|
228
|
+
// Check if decorated
|
|
229
|
+
const isDecorated = declNode.parent?.type === "decorated_definition";
|
|
230
|
+
// Check if async
|
|
231
|
+
const isAsync = declNode.type === "function_definition" && nodeHasModifier(declNode, "async");
|
|
232
|
+
const signature = extractSignature(code, declNode);
|
|
233
|
+
symbols.push({
|
|
234
|
+
name,
|
|
235
|
+
kind,
|
|
236
|
+
line: declNode.startPosition.row + 1,
|
|
237
|
+
column: declNode.startPosition.column,
|
|
238
|
+
signature: isAsync ? `async ${signature}` : signature,
|
|
239
|
+
summary: code.slice(declNode.startIndex, declNode.endIndex).split("\n")[0] || signature,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
return { symbols, imports };
|
|
243
|
+
}
|
|
244
|
+
/** Parse code with tree-sitter — returns null if language or init unavailable. */
|
|
245
|
+
export function parseCode(language, code) {
|
|
246
|
+
if (_state !== "ready")
|
|
247
|
+
return null;
|
|
248
|
+
const lang = _grammars.get(language);
|
|
249
|
+
if (!lang)
|
|
250
|
+
return null;
|
|
251
|
+
switch (language) {
|
|
252
|
+
case "typescript":
|
|
253
|
+
return parseWithTS(lang, code);
|
|
254
|
+
case "python":
|
|
255
|
+
return parseWithPython(lang, code);
|
|
256
|
+
default:
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// ─── Helpers ───────────────────────────────────────────────
|
|
261
|
+
function hashCode(s) {
|
|
262
|
+
let hash = 0;
|
|
263
|
+
for (let i = 0; i < s.length; i++) {
|
|
264
|
+
hash = (hash << 5) - hash + s.charCodeAt(i);
|
|
265
|
+
hash |= 0;
|
|
266
|
+
}
|
|
267
|
+
return hash;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=tree-sitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-sitter.js","sourceRoot":"","sources":["../../src/services/tree-sitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ValidationResult, ValidationConfig } from "../types.js";
|
|
2
|
+
interface RunOptions {
|
|
3
|
+
targets: ("build" | "test" | "lint" | "all")[];
|
|
4
|
+
changedFilesOnly: boolean;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
config: ValidationConfig;
|
|
7
|
+
repoPath: string;
|
|
8
|
+
}
|
|
9
|
+
export interface GitCommitEntry {
|
|
10
|
+
commit: string;
|
|
11
|
+
message: string;
|
|
12
|
+
date: string;
|
|
13
|
+
author: string;
|
|
14
|
+
files: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Search git log for commits matching a query.
|
|
18
|
+
*/
|
|
19
|
+
export declare function searchGitHistory(repoPath: string, query: string, maxResults?: number): GitCommitEntry[];
|
|
20
|
+
/**
|
|
21
|
+
* Get changed files since a commit (for incremental re-indexing).
|
|
22
|
+
*/
|
|
23
|
+
export declare function getChangedFiles(repoPath: string, sinceCommit?: string): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Get repo fingerprint: hash of remote URL + HEAD.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getRepoFingerprint(repoPath: string): string;
|
|
28
|
+
export declare function runValidation(opts: RunOptions): Promise<ValidationResult[]>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=validation-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-runner.d.ts","sourceRoot":"","sources":["../../src/services/validation-runner.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGxF,UAAU,UAAU;IAClB,OAAO,EAAE,CAAC,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;IAC/C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,cAAc,EAAE,CAsC3G;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY3D;AAWD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0BjF"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Runner — executes build/test/lint commands via shell.
|
|
3
|
+
*
|
|
4
|
+
* Permission model:
|
|
5
|
+
* - Only commands from config allowlist are executed
|
|
6
|
+
* - Timeout enforced per command
|
|
7
|
+
* - Output capped to prevent flooding
|
|
8
|
+
* - Executes in repo working directory
|
|
9
|
+
*/
|
|
10
|
+
import { execSync } from "child_process";
|
|
11
|
+
import { resolve } from "path";
|
|
12
|
+
import { DEFAULT_VALIDATION_TIMEOUT, MAX_VALIDATION_OUTPUT } from "../constants.js";
|
|
13
|
+
import { redactSecrets } from "../security/guard.js";
|
|
14
|
+
/**
|
|
15
|
+
* Search git log for commits matching a query.
|
|
16
|
+
*/
|
|
17
|
+
export function searchGitHistory(repoPath, query, maxResults = 20) {
|
|
18
|
+
try {
|
|
19
|
+
const raw = execSync(`git log --all --oneline --format="%H|%s|%ai|%an" --max-count=${maxResults * 3} --regexp-ignore-case --grep="${query.replace(/"/g, '\\"')}"`, { cwd: repoPath, encoding: "utf-8", maxBuffer: 1024 * 1024, stdio: ["ignore", "pipe", "pipe"] });
|
|
20
|
+
const entries = [];
|
|
21
|
+
for (const line of raw.trim().split("\n").filter(Boolean)) {
|
|
22
|
+
const parts = line.split("|");
|
|
23
|
+
if (parts.length >= 4) {
|
|
24
|
+
entries.push({
|
|
25
|
+
commit: parts[0],
|
|
26
|
+
message: parts[1],
|
|
27
|
+
date: parts[2],
|
|
28
|
+
author: parts[3],
|
|
29
|
+
files: [],
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Get changed files for each commit
|
|
34
|
+
for (const entry of entries.slice(0, maxResults)) {
|
|
35
|
+
try {
|
|
36
|
+
const files = execSync(`git diff-tree --no-commit-id --name-only -r ${entry.commit}`, { cwd: repoPath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
|
|
37
|
+
entry.files = files.trim().split("\n").filter(Boolean);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// skip file listing for this commit
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return entries.slice(0, maxResults);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get changed files since a commit (for incremental re-indexing).
|
|
51
|
+
*/
|
|
52
|
+
export function getChangedFiles(repoPath, sinceCommit) {
|
|
53
|
+
try {
|
|
54
|
+
const range = sinceCommit ? `${sinceCommit}..HEAD` : "--cached";
|
|
55
|
+
const raw = execSync(`git diff --name-only ${range}`, { cwd: repoPath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
|
|
56
|
+
return raw.trim().split("\n").filter(Boolean);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get repo fingerprint: hash of remote URL + HEAD.
|
|
64
|
+
*/
|
|
65
|
+
export function getRepoFingerprint(repoPath) {
|
|
66
|
+
try {
|
|
67
|
+
const url = execSync("git config --get remote.origin.url 2>/dev/null || echo local", {
|
|
68
|
+
cwd: repoPath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"],
|
|
69
|
+
}).trim();
|
|
70
|
+
const head = execSync("git rev-parse HEAD", {
|
|
71
|
+
cwd: repoPath, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"],
|
|
72
|
+
}).trim();
|
|
73
|
+
return `${url}@${head}`;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return `local@${Date.now()}`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ─── Validation runner ────────────────────────────────────
|
|
80
|
+
const VALIDATION_EXPAND = {
|
|
81
|
+
build: ["build"],
|
|
82
|
+
test: ["test"],
|
|
83
|
+
lint: ["lint"],
|
|
84
|
+
all: ["build", "test", "lint"],
|
|
85
|
+
};
|
|
86
|
+
export async function runValidation(opts) {
|
|
87
|
+
const results = [];
|
|
88
|
+
// Expand "all" target
|
|
89
|
+
const expandedTargets = opts.targets.flatMap(t => VALIDATION_EXPAND[t] || [t]);
|
|
90
|
+
for (const target of expandedTargets) {
|
|
91
|
+
const command = opts.config.commands[target];
|
|
92
|
+
if (!command) {
|
|
93
|
+
results.push({
|
|
94
|
+
type: target,
|
|
95
|
+
passed: false,
|
|
96
|
+
command: "",
|
|
97
|
+
output: "",
|
|
98
|
+
errors: [`No command configured for '${target}'. Add to .ci-mcp.json config.`],
|
|
99
|
+
duration: 0,
|
|
100
|
+
exitCode: -1,
|
|
101
|
+
});
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const result = await executeCommand(target, command, opts);
|
|
105
|
+
results.push(result);
|
|
106
|
+
}
|
|
107
|
+
return results;
|
|
108
|
+
}
|
|
109
|
+
async function executeCommand(type, command, opts) {
|
|
110
|
+
const startedAt = Date.now();
|
|
111
|
+
const timeout = opts.timeout ?? opts.config.timeout ?? DEFAULT_VALIDATION_TIMEOUT;
|
|
112
|
+
try {
|
|
113
|
+
const output = execSync(command, {
|
|
114
|
+
cwd: resolve(opts.repoPath),
|
|
115
|
+
encoding: "utf-8",
|
|
116
|
+
maxBuffer: MAX_VALIDATION_OUTPUT,
|
|
117
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
118
|
+
timeout: timeout * 1000,
|
|
119
|
+
shell: "/bin/sh",
|
|
120
|
+
});
|
|
121
|
+
const duration = Math.round((Date.now() - startedAt) / 1000);
|
|
122
|
+
return {
|
|
123
|
+
type,
|
|
124
|
+
passed: true,
|
|
125
|
+
command,
|
|
126
|
+
output: redactSecrets(output).slice(0, MAX_VALIDATION_OUTPUT),
|
|
127
|
+
errors: [],
|
|
128
|
+
duration,
|
|
129
|
+
exitCode: 0,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
const duration = Math.round((Date.now() - startedAt) / 1000);
|
|
134
|
+
let stderr = '';
|
|
135
|
+
let stdout = '';
|
|
136
|
+
let errorMessage = 'Command failed';
|
|
137
|
+
let exitCode = -1;
|
|
138
|
+
if (typeof error === 'object' && error !== null) {
|
|
139
|
+
if ('stderr' in error)
|
|
140
|
+
stderr = String(error.stderr);
|
|
141
|
+
if ('stdout' in error)
|
|
142
|
+
stdout = String(error.stdout);
|
|
143
|
+
if ('message' in error)
|
|
144
|
+
errorMessage = String(error.message);
|
|
145
|
+
if ('status' in error && typeof error.status === 'number')
|
|
146
|
+
exitCode = error.status;
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
type,
|
|
150
|
+
passed: false,
|
|
151
|
+
command,
|
|
152
|
+
output: redactSecrets(stdout + '\n' + stderr).slice(0, MAX_VALIDATION_OUTPUT),
|
|
153
|
+
errors: [redactSecrets(errorMessage)],
|
|
154
|
+
duration,
|
|
155
|
+
exitCode,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=validation-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-runner.js","sourceRoot":"","sources":["../../src/services/validation-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAgB,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAoBrD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,KAAa,EAAE,aAAqB,EAAE;IACvF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,gEAAgE,UAAU,GAAG,CAAC,iCAAiC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAC5I,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAChG,CAAC;QAEF,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC;oBACX,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;oBAChB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBACjB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;oBACd,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;oBAChB,KAAK,EAAE,EAAE;iBACV,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,QAAQ,CACpB,+CAA+C,KAAK,CAAC,MAAM,EAAE,EAC7D,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACxE,CAAC;gBACF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAoB;IACpE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;QAChE,MAAM,GAAG,GAAG,QAAQ,CAClB,wBAAwB,KAAK,EAAE,EAC/B,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACxE,CAAC;QACF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,8DAA8D,EAAE;YACnF,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpE,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,QAAQ,CAAC,oBAAoB,EAAE;YAC1C,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpE,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,6DAA6D;AAE7D,MAAM,iBAAiB,GAAuC;IAC5D,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB;IAClD,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,sBAAsB;IACtB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,CAAC,8BAA8B,MAAM,gCAAgC,CAAC;gBAC9E,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,CAAC,CAAC;aACb,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAsB,EACtB,OAAe,EACf,IAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,0BAA0B,CAAC;IAElF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC/B,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3B,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,qBAAqB;YAChC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,OAAO,GAAG,IAAI;YACvB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAE7D,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,IAAI;YACZ,OAAO;YACP,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC;YAC7D,MAAM,EAAE,EAAE;YACV,QAAQ;YACR,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAE7D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,YAAY,GAAG,gBAAgB,CAAC;QACpC,IAAI,QAAQ,GAAkB,CAAC,CAAC,CAAC;QAEjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChD,IAAI,QAAQ,IAAI,KAAK;gBAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,QAAQ,IAAI,KAAK;gBAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,SAAS,IAAI,KAAK;gBAAE,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;QACrF,CAAC;QAED,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,OAAO;YACP,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC;YAC7E,MAAM,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YACrC,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RepoSnapshot, SymbolInfo, SymbolRelation } from "../types.js";
|
|
2
|
+
export interface IndexData {
|
|
3
|
+
repoFingerprint: string;
|
|
4
|
+
lastIndexed: string;
|
|
5
|
+
snapshot: RepoSnapshot | null;
|
|
6
|
+
symbols: SymbolInfo[];
|
|
7
|
+
relations: SymbolRelation[];
|
|
8
|
+
fileIndex: Record<string, string[]>;
|
|
9
|
+
}
|
|
10
|
+
export declare function loadIndex(storePath?: string): void;
|
|
11
|
+
export declare function saveIndex(storePath?: string): void;
|
|
12
|
+
export declare function getIndex(): IndexData;
|
|
13
|
+
export declare function resetIndex(): void;
|
|
14
|
+
export declare function setSnapshot(snapshot: RepoSnapshot): void;
|
|
15
|
+
export declare function setSymbols(symbols: SymbolInfo[]): void;
|
|
16
|
+
export declare function setRelations(relations: SymbolRelation[]): void;
|
|
17
|
+
export declare function findSymbols(query: string): SymbolInfo[];
|
|
18
|
+
export declare function findSymbol(name: string): SymbolInfo | undefined;
|
|
19
|
+
export declare function findCallers(symbolName: string): SymbolRelation[];
|
|
20
|
+
export declare function findCallees(symbolName: string): SymbolRelation[];
|
|
21
|
+
export declare function findRelatedTests(filePath: string): string[];
|
|
22
|
+
export declare function findFilesInScope(scope: string): string[];
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAeD,wBAAgB,SAAS,CAAC,SAAS,GAAE,MAA2B,GAAG,IAAI,CAUtE;AAED,wBAAgB,SAAS,CAAC,SAAS,GAAE,MAA2B,GAAG,IAAI,CAMtE;AAED,wBAAgB,QAAQ,IAAI,SAAS,CAEpC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAIxD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAStD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI,CAE9D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAOvD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE/D;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CAEhE;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CAEhE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAS3D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index Store — JSON-based persistence for repository index data.
|
|
3
|
+
*
|
|
4
|
+
* Stores symbol index, file index, and repo snapshots as flat JSON files.
|
|
5
|
+
* MVP uses JSON; can be upgraded to SQLite/PostgreSQL later.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
import { DEFAULT_STORE_PATH, INDEX_FILE } from "../constants.js";
|
|
10
|
+
let data = {
|
|
11
|
+
repoFingerprint: "",
|
|
12
|
+
lastIndexed: "",
|
|
13
|
+
snapshot: null,
|
|
14
|
+
symbols: [],
|
|
15
|
+
relations: [],
|
|
16
|
+
fileIndex: {},
|
|
17
|
+
};
|
|
18
|
+
function getPath(storePath) {
|
|
19
|
+
return join(storePath, INDEX_FILE);
|
|
20
|
+
}
|
|
21
|
+
export function loadIndex(storePath = DEFAULT_STORE_PATH) {
|
|
22
|
+
const path = getPath(storePath);
|
|
23
|
+
if (existsSync(path)) {
|
|
24
|
+
try {
|
|
25
|
+
const raw = readFileSync(path, "utf-8");
|
|
26
|
+
data = JSON.parse(raw);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
data = { repoFingerprint: "", lastIndexed: "", snapshot: null, symbols: [], relations: [], fileIndex: {} };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function saveIndex(storePath = DEFAULT_STORE_PATH) {
|
|
34
|
+
const path = getPath(storePath);
|
|
35
|
+
if (!existsSync(storePath)) {
|
|
36
|
+
mkdirSync(storePath, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
writeFileSync(path, JSON.stringify(data, null, 2), "utf-8");
|
|
39
|
+
}
|
|
40
|
+
export function getIndex() {
|
|
41
|
+
return data;
|
|
42
|
+
}
|
|
43
|
+
export function resetIndex() {
|
|
44
|
+
data = { repoFingerprint: "", lastIndexed: "", snapshot: null, symbols: [], relations: [], fileIndex: {} };
|
|
45
|
+
}
|
|
46
|
+
export function setSnapshot(snapshot) {
|
|
47
|
+
data.repoFingerprint = snapshot.repoFingerprint;
|
|
48
|
+
data.lastIndexed = new Date().toISOString();
|
|
49
|
+
data.snapshot = snapshot;
|
|
50
|
+
}
|
|
51
|
+
export function setSymbols(symbols) {
|
|
52
|
+
data.symbols = symbols;
|
|
53
|
+
// rebuild file index
|
|
54
|
+
const index = {};
|
|
55
|
+
for (const sym of symbols) {
|
|
56
|
+
if (!index[sym.file])
|
|
57
|
+
index[sym.file] = [];
|
|
58
|
+
index[sym.file].push(sym.name);
|
|
59
|
+
}
|
|
60
|
+
data.fileIndex = index;
|
|
61
|
+
}
|
|
62
|
+
export function setRelations(relations) {
|
|
63
|
+
data.relations = relations;
|
|
64
|
+
}
|
|
65
|
+
export function findSymbols(query) {
|
|
66
|
+
const q = query.toLowerCase();
|
|
67
|
+
return data.symbols.filter(s => s.name.toLowerCase().includes(q) ||
|
|
68
|
+
s.file.toLowerCase().includes(q) ||
|
|
69
|
+
s.signature.toLowerCase().includes(q));
|
|
70
|
+
}
|
|
71
|
+
export function findSymbol(name) {
|
|
72
|
+
return data.symbols.find(s => s.name === name);
|
|
73
|
+
}
|
|
74
|
+
export function findCallers(symbolName) {
|
|
75
|
+
return data.relations.filter(r => r.target === symbolName && r.kind === "calls");
|
|
76
|
+
}
|
|
77
|
+
export function findCallees(symbolName) {
|
|
78
|
+
return data.relations.filter(r => r.source === symbolName && r.kind === "calls");
|
|
79
|
+
}
|
|
80
|
+
export function findRelatedTests(filePath) {
|
|
81
|
+
// Heuristic: test files mirror source files
|
|
82
|
+
const basename = filePath.replace(/\.\w+$/, "");
|
|
83
|
+
return data.snapshot?.files
|
|
84
|
+
.filter(f => f.path.includes("test") || f.path.includes("spec") || f.path.includes("__tests__"))
|
|
85
|
+
.filter(f => f.path.includes(basename.split("/").pop() || ""))
|
|
86
|
+
.map(f => f.path) ?? [];
|
|
87
|
+
}
|
|
88
|
+
export function findFilesInScope(scope) {
|
|
89
|
+
return data.snapshot?.files
|
|
90
|
+
.filter(f => f.path.startsWith(scope))
|
|
91
|
+
.map(f => f.path) ?? [];
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"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"}
|