vemora 0.1.0-alpha.8
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.
Potentially problematic release.
This version of vemora might be problematic. Click here for more details.
- package/README.md +716 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +589 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +14 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +136 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +408 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brief.d.ts +14 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +73 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +161 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +61 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +778 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/deps.d.ts +20 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +138 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/focus.d.ts +6 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +302 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +366 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init-agent.d.ts +23 -0
- package/dist/commands/init-agent.d.ts.map +1 -0
- package/dist/commands/init-agent.js +447 -0
- package/dist/commands/init-agent.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge.d.ts +8 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +98 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/plan.d.ts +16 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +535 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/query.d.ts +39 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +389 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/remember.d.ts +11 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +174 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/commands/report.d.ts +10 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +180 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +127 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summarize.d.ts +14 -0
- package/dist/commands/summarize.d.ts.map +1 -0
- package/dist/commands/summarize.js +205 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/triage.d.ts +33 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +419 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/usages.d.ts +14 -0
- package/dist/commands/usages.d.ts.map +1 -0
- package/dist/commands/usages.js +236 -0
- package/dist/commands/usages.js.map +1 -0
- package/dist/core/config.d.ts +35 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +140 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +251 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +26 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/noop.d.ts +17 -0
- package/dist/embeddings/noop.d.ts.map +1 -0
- package/dist/embeddings/noop.js +22 -0
- package/dist/embeddings/noop.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +16 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +41 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/openai.d.ts +10 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +67 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/provider.d.ts +19 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +3 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/indexer/callgraph.d.ts +16 -0
- package/dist/indexer/callgraph.d.ts.map +1 -0
- package/dist/indexer/callgraph.js +154 -0
- package/dist/indexer/callgraph.js.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts +6 -0
- package/dist/indexer/chunkBySlidingWindow.d.ts.map +1 -0
- package/dist/indexer/chunkBySlidingWindow.js +30 -0
- package/dist/indexer/chunkBySlidingWindow.js.map +1 -0
- package/dist/indexer/chunkBySymbols.d.ts +7 -0
- package/dist/indexer/chunkBySymbols.d.ts.map +1 -0
- package/dist/indexer/chunkBySymbols.js +57 -0
- package/dist/indexer/chunkBySymbols.js.map +1 -0
- package/dist/indexer/chunker.d.ts +15 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +26 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/classHeader.d.ts +7 -0
- package/dist/indexer/classHeader.d.ts.map +1 -0
- package/dist/indexer/classHeader.js +37 -0
- package/dist/indexer/classHeader.js.map +1 -0
- package/dist/indexer/deps.d.ts +66 -0
- package/dist/indexer/deps.d.ts.map +1 -0
- package/dist/indexer/deps.js +409 -0
- package/dist/indexer/deps.js.map +1 -0
- package/dist/indexer/hasher.d.ts +17 -0
- package/dist/indexer/hasher.d.ts.map +1 -0
- package/dist/indexer/hasher.js +38 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/parser.d.ts +18 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +355 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/scanner.d.ts +18 -0
- package/dist/indexer/scanner.d.ts.map +1 -0
- package/dist/indexer/scanner.js +37 -0
- package/dist/indexer/scanner.js.map +1 -0
- package/dist/indexer/strategy.d.ts +11 -0
- package/dist/indexer/strategy.d.ts.map +1 -0
- package/dist/indexer/strategy.js +15 -0
- package/dist/indexer/strategy.js.map +1 -0
- package/dist/indexer/tests.d.ts +15 -0
- package/dist/indexer/tests.d.ts.map +1 -0
- package/dist/indexer/tests.js +68 -0
- package/dist/indexer/tests.js.map +1 -0
- package/dist/indexer/todos.d.ts +9 -0
- package/dist/indexer/todos.d.ts.map +1 -0
- package/dist/indexer/todos.js +29 -0
- package/dist/indexer/todos.js.map +1 -0
- package/dist/llm/anthropic.d.ts +8 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +76 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/factory.d.ts +7 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +39 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/ollama.d.ts +8 -0
- package/dist/llm/ollama.d.ts.map +1 -0
- package/dist/llm/ollama.js +83 -0
- package/dist/llm/ollama.js.map +1 -0
- package/dist/llm/openai.d.ts +8 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +68 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +29 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +3 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/search/bm25.d.ts +3 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +102 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/formatter.d.ts +43 -0
- package/dist/search/formatter.d.ts.map +1 -0
- package/dist/search/formatter.js +208 -0
- package/dist/search/formatter.js.map +1 -0
- package/dist/search/hybrid.d.ts +10 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +53 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/merge.d.ts +33 -0
- package/dist/search/merge.d.ts.map +1 -0
- package/dist/search/merge.js +158 -0
- package/dist/search/merge.js.map +1 -0
- package/dist/search/mmr.d.ts +23 -0
- package/dist/search/mmr.d.ts.map +1 -0
- package/dist/search/mmr.js +95 -0
- package/dist/search/mmr.js.map +1 -0
- package/dist/search/rerank.d.ts +15 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +76 -0
- package/dist/search/rerank.js.map +1 -0
- package/dist/search/signature.d.ts +42 -0
- package/dist/search/signature.d.ts.map +1 -0
- package/dist/search/signature.js +112 -0
- package/dist/search/signature.js.map +1 -0
- package/dist/search/vector.d.ts +41 -0
- package/dist/search/vector.d.ts.map +1 -0
- package/dist/search/vector.js +185 -0
- package/dist/search/vector.js.map +1 -0
- package/dist/storage/cache.d.ts +30 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +160 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/knowledge.d.ts +17 -0
- package/dist/storage/knowledge.d.ts.map +1 -0
- package/dist/storage/knowledge.js +58 -0
- package/dist/storage/knowledge.js.map +1 -0
- package/dist/storage/repository.d.ts +27 -0
- package/dist/storage/repository.d.ts.map +1 -0
- package/dist/storage/repository.js +95 -0
- package/dist/storage/repository.js.map +1 -0
- package/dist/storage/session.d.ts +38 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +100 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/summaries.d.ts +19 -0
- package/dist/storage/summaries.d.ts.map +1 -0
- package/dist/storage/summaries.js +66 -0
- package/dist/storage/summaries.js.map +1 -0
- package/dist/storage/usage.d.ts +35 -0
- package/dist/storage/usage.d.ts.map +1 -0
- package/dist/storage/usage.js +55 -0
- package/dist/storage/usage.js.map +1 -0
- package/dist/utils/git.d.ts +15 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +38 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +24 -0
- package/dist/utils/tokenizer.d.ts.map +1 -0
- package/dist/utils/tokenizer.js +52 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseSymbols = parseSymbols;
|
|
4
|
+
exports.buildSymbolIndex = buildSymbolIndex;
|
|
5
|
+
// ─── tree-sitter (optional) ───────────────────────────────────────────────────
|
|
6
|
+
// tree-sitter native bindings are in optionalDependencies.
|
|
7
|
+
// If they fail to build (some CI environments, ARM, etc.) we fall back to regex.
|
|
8
|
+
let TreeSitterParser = null;
|
|
9
|
+
let tsLanguage = null;
|
|
10
|
+
let tsxLanguage = null;
|
|
11
|
+
let jsLanguage = null;
|
|
12
|
+
try {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
14
|
+
TreeSitterParser = require("tree-sitter");
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
16
|
+
const tsModule = require("tree-sitter-typescript");
|
|
17
|
+
tsLanguage = tsModule.typescript;
|
|
18
|
+
tsxLanguage = tsModule.tsx;
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
20
|
+
jsLanguage = require("tree-sitter-javascript");
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// tree-sitter not available — regex fallback will be used for all files
|
|
24
|
+
}
|
|
25
|
+
// ─── Main Entry Point ─────────────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Parses a source file and returns all top-level symbols found.
|
|
28
|
+
* Uses tree-sitter for TS/JS files when available; falls back to regex.
|
|
29
|
+
*/
|
|
30
|
+
function parseSymbols(filePath, content) {
|
|
31
|
+
const ext = filePath.split(".").pop()?.toLowerCase() ?? "";
|
|
32
|
+
if (TreeSitterParser) {
|
|
33
|
+
try {
|
|
34
|
+
if (ext === "ts")
|
|
35
|
+
return parseWithTreeSitter(content, tsLanguage);
|
|
36
|
+
if (ext === "tsx")
|
|
37
|
+
return parseWithTreeSitter(content, tsxLanguage);
|
|
38
|
+
if (ext === "js" || ext === "jsx")
|
|
39
|
+
return parseWithTreeSitter(content, jsLanguage);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// fall through to regex
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return parseWithRegex(content);
|
|
46
|
+
}
|
|
47
|
+
function buildSymbolIndex(filePath, symbols) {
|
|
48
|
+
const index = {};
|
|
49
|
+
for (const sym of symbols) {
|
|
50
|
+
index[sym.name] = {
|
|
51
|
+
type: sym.type,
|
|
52
|
+
file: filePath,
|
|
53
|
+
startLine: sym.startLine,
|
|
54
|
+
endLine: sym.endLine,
|
|
55
|
+
exported: sym.exported,
|
|
56
|
+
isDefault: sym.isDefault,
|
|
57
|
+
parent: sym.parent,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return index;
|
|
61
|
+
}
|
|
62
|
+
// ─── tree-sitter Parser ───────────────────────────────────────────────────────
|
|
63
|
+
function parseWithTreeSitter(content, language) {
|
|
64
|
+
if (!TreeSitterParser || !language)
|
|
65
|
+
return parseWithRegex(content);
|
|
66
|
+
const parser = new TreeSitterParser();
|
|
67
|
+
parser.setLanguage(language);
|
|
68
|
+
const tree = parser.parse(content);
|
|
69
|
+
const symbols = [];
|
|
70
|
+
visitNode(tree.rootNode, symbols, null, false);
|
|
71
|
+
return symbols;
|
|
72
|
+
}
|
|
73
|
+
function visitNode(node, out, parentClass, insideExport, isDefaultExport = false) {
|
|
74
|
+
switch (node.type) {
|
|
75
|
+
case "export_statement": {
|
|
76
|
+
// Detect `export default X` by looking for a "default" keyword child
|
|
77
|
+
const isDefault = node.children.some((c) => c.type === "default");
|
|
78
|
+
for (const child of node.namedChildren) {
|
|
79
|
+
visitNode(child, out, parentClass, true, isDefault);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
case "function_declaration":
|
|
84
|
+
case "generator_function_declaration": {
|
|
85
|
+
const name = node.childForFieldName("name")?.text;
|
|
86
|
+
if (name) {
|
|
87
|
+
out.push({
|
|
88
|
+
name: parentClass ? `${parentClass}.${name}` : name,
|
|
89
|
+
type: "function",
|
|
90
|
+
startLine: node.startPosition.row + 1,
|
|
91
|
+
endLine: node.endPosition.row + 1,
|
|
92
|
+
exported: insideExport,
|
|
93
|
+
isDefault: isDefaultExport || undefined,
|
|
94
|
+
parent: parentClass ?? undefined,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Don't recurse into function bodies for top-level symbol collection
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
case "class_declaration": {
|
|
101
|
+
const name = node.childForFieldName("name")?.text;
|
|
102
|
+
if (name) {
|
|
103
|
+
out.push({
|
|
104
|
+
name,
|
|
105
|
+
type: "class",
|
|
106
|
+
startLine: node.startPosition.row + 1,
|
|
107
|
+
endLine: node.endPosition.row + 1,
|
|
108
|
+
exported: insideExport,
|
|
109
|
+
isDefault: isDefaultExport || undefined,
|
|
110
|
+
});
|
|
111
|
+
// Extract methods from class body
|
|
112
|
+
const body = node.childForFieldName("body");
|
|
113
|
+
if (body) {
|
|
114
|
+
for (const child of body.namedChildren) {
|
|
115
|
+
visitNode(child, out, name, false);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
case "method_definition": {
|
|
122
|
+
const name = node.childForFieldName("name")?.text;
|
|
123
|
+
if (name && parentClass && name !== "constructor") {
|
|
124
|
+
out.push({
|
|
125
|
+
name: `${parentClass}.${name}`,
|
|
126
|
+
type: "method",
|
|
127
|
+
startLine: node.startPosition.row + 1,
|
|
128
|
+
endLine: node.endPosition.row + 1,
|
|
129
|
+
exported: false,
|
|
130
|
+
parent: parentClass,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
case "lexical_declaration":
|
|
136
|
+
case "variable_declaration": {
|
|
137
|
+
// const/let/var — check if the RHS is a function
|
|
138
|
+
for (const child of node.namedChildren) {
|
|
139
|
+
if (child.type === "variable_declarator") {
|
|
140
|
+
const name = child.childForFieldName("name")?.text;
|
|
141
|
+
const value = child.childForFieldName("value");
|
|
142
|
+
if (!name)
|
|
143
|
+
continue;
|
|
144
|
+
if (value &&
|
|
145
|
+
(value.type === "arrow_function" || value.type === "function")) {
|
|
146
|
+
out.push({
|
|
147
|
+
name,
|
|
148
|
+
type: "function",
|
|
149
|
+
startLine: node.startPosition.row + 1,
|
|
150
|
+
endLine: node.endPosition.row + 1,
|
|
151
|
+
exported: insideExport,
|
|
152
|
+
isDefault: isDefaultExport || undefined,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
else if (insideExport && value) {
|
|
156
|
+
out.push({
|
|
157
|
+
name,
|
|
158
|
+
type: "constant",
|
|
159
|
+
startLine: node.startPosition.row + 1,
|
|
160
|
+
endLine: node.endPosition.row + 1,
|
|
161
|
+
exported: true,
|
|
162
|
+
isDefault: isDefaultExport || undefined,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
case "enum_declaration": {
|
|
170
|
+
const name = node.childForFieldName("name")?.text;
|
|
171
|
+
if (name) {
|
|
172
|
+
out.push({
|
|
173
|
+
name,
|
|
174
|
+
type: "type",
|
|
175
|
+
startLine: node.startPosition.row + 1,
|
|
176
|
+
endLine: node.endPosition.row + 1,
|
|
177
|
+
exported: insideExport,
|
|
178
|
+
isDefault: isDefaultExport || undefined,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
case "interface_declaration": {
|
|
184
|
+
const name = node.childForFieldName("name")?.text;
|
|
185
|
+
if (name) {
|
|
186
|
+
out.push({
|
|
187
|
+
name,
|
|
188
|
+
type: "interface",
|
|
189
|
+
startLine: node.startPosition.row + 1,
|
|
190
|
+
endLine: node.endPosition.row + 1,
|
|
191
|
+
exported: insideExport,
|
|
192
|
+
isDefault: isDefaultExport || undefined,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
case "type_alias_declaration": {
|
|
198
|
+
const name = node.childForFieldName("name")?.text;
|
|
199
|
+
if (name) {
|
|
200
|
+
out.push({
|
|
201
|
+
name,
|
|
202
|
+
type: "type",
|
|
203
|
+
startLine: node.startPosition.row + 1,
|
|
204
|
+
endLine: node.endPosition.row + 1,
|
|
205
|
+
exported: insideExport,
|
|
206
|
+
isDefault: isDefaultExport || undefined,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
default:
|
|
212
|
+
// Recurse into other top-level constructs (namespaces, modules, etc.)
|
|
213
|
+
for (const child of node.namedChildren) {
|
|
214
|
+
visitNode(child, out, parentClass, insideExport);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// ─── Regex Fallback Parser ────────────────────────────────────────────────────
|
|
219
|
+
/**
|
|
220
|
+
* Estimates the end line of a symbol starting at `startIndex` (0-based).
|
|
221
|
+
* Returns a 1-based line number.
|
|
222
|
+
*
|
|
223
|
+
* Strategy:
|
|
224
|
+
* 1. Brace-counting — works for TS/JS/Rust/Go/C++ (any `{}`-delimited syntax).
|
|
225
|
+
* 2. Indentation heuristic — fallback for Python and similar indent-based languages.
|
|
226
|
+
* 3. Same-line fallback — if neither strategy applies (e.g. single-line constants).
|
|
227
|
+
*/
|
|
228
|
+
function findEndLine(lines, startIndex) {
|
|
229
|
+
let depth = 0;
|
|
230
|
+
let braceFound = false;
|
|
231
|
+
for (let i = startIndex; i < lines.length; i++) {
|
|
232
|
+
for (const ch of lines[i]) {
|
|
233
|
+
if (ch === "{") {
|
|
234
|
+
depth++;
|
|
235
|
+
braceFound = true;
|
|
236
|
+
}
|
|
237
|
+
else if (ch === "}") {
|
|
238
|
+
depth--;
|
|
239
|
+
if (braceFound && depth === 0)
|
|
240
|
+
return i + 1; // 1-indexed
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// No braces found — use indentation heuristic (Python, YAML-style, etc.)
|
|
245
|
+
if (!braceFound) {
|
|
246
|
+
const baseIndent = lines[startIndex].match(/^(\s*)/)?.[1].length ?? 0;
|
|
247
|
+
for (let i = startIndex + 1; i < lines.length; i++) {
|
|
248
|
+
const line = lines[i];
|
|
249
|
+
if (!line.trim())
|
|
250
|
+
continue; // skip blank lines
|
|
251
|
+
const indent = line.match(/^(\s*)/)?.[1].length ?? 0;
|
|
252
|
+
if (indent <= baseIndent)
|
|
253
|
+
return i; // i is 0-based next-block line → 1-based prev line
|
|
254
|
+
}
|
|
255
|
+
return lines.length; // EOF
|
|
256
|
+
}
|
|
257
|
+
return startIndex + 1; // fallback: same as start line
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Regex-based parser used as fallback for:
|
|
261
|
+
* - Non-TS/JS files (Python, Rust, Go, etc.)
|
|
262
|
+
* - When tree-sitter native bindings are unavailable
|
|
263
|
+
*/
|
|
264
|
+
function parseWithRegex(content) {
|
|
265
|
+
const symbols = [];
|
|
266
|
+
const lines = content.split("\n");
|
|
267
|
+
const patterns = [
|
|
268
|
+
// TypeScript/JavaScript — export default function/class
|
|
269
|
+
{
|
|
270
|
+
re: /^export\s+default\s+(async\s+)?function\s+(\w+)\s*[(<]/,
|
|
271
|
+
type: "function",
|
|
272
|
+
isDefault: true,
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
re: /^export\s+default\s+(abstract\s+)?class\s+(\w+)/,
|
|
276
|
+
type: "class",
|
|
277
|
+
isDefault: true,
|
|
278
|
+
},
|
|
279
|
+
// TypeScript/JavaScript
|
|
280
|
+
{
|
|
281
|
+
re: /^(export\s+)?(async\s+)?function\s+(\w+)\s*[(<]/,
|
|
282
|
+
type: "function",
|
|
283
|
+
exportGroup: true,
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
re: /^(export\s+)?(const|let)\s+(\w+)\s*=\s*(async\s+)?(\([^)]*\)|[^=])\s*=>/,
|
|
287
|
+
type: "function",
|
|
288
|
+
exportGroup: true,
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
re: /^(export\s+)?(abstract\s+)?class\s+(\w+)/,
|
|
292
|
+
type: "class",
|
|
293
|
+
exportGroup: true,
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
re: /^(export\s+)?interface\s+(\w+)/,
|
|
297
|
+
type: "interface",
|
|
298
|
+
exportGroup: true,
|
|
299
|
+
},
|
|
300
|
+
{ re: /^(export\s+)?type\s+(\w+)\s*=/, type: "type", exportGroup: true },
|
|
301
|
+
{
|
|
302
|
+
re: /^(export\s+)?(const\s+)?enum\s+(\w+)/,
|
|
303
|
+
type: "type",
|
|
304
|
+
exportGroup: true,
|
|
305
|
+
},
|
|
306
|
+
// Python
|
|
307
|
+
{ re: /^(async\s+)?def\s+(\w+)\s*\(/, type: "function" },
|
|
308
|
+
{ re: /^class\s+(\w+)(?:\s*:|\s*\()/, type: "class" },
|
|
309
|
+
// Rust
|
|
310
|
+
{
|
|
311
|
+
re: /^(pub\s+)?(async\s+)?fn\s+(\w+)\s*[(<]/,
|
|
312
|
+
type: "function",
|
|
313
|
+
exportGroup: true,
|
|
314
|
+
},
|
|
315
|
+
{ re: /^(pub\s+)?(struct|enum)\s+(\w+)/, type: "class", exportGroup: true },
|
|
316
|
+
// Go
|
|
317
|
+
{ re: /^func\s+(\w+)\s*\(/, type: "function" },
|
|
318
|
+
{ re: /^type\s+(\w+)\s+(struct|interface)/, type: "class" },
|
|
319
|
+
];
|
|
320
|
+
lines.forEach((line, i) => {
|
|
321
|
+
const trimmed = line.trim();
|
|
322
|
+
if (!trimmed || trimmed.startsWith("//") || trimmed.startsWith("#"))
|
|
323
|
+
return;
|
|
324
|
+
for (const { re, type, isDefault } of patterns) {
|
|
325
|
+
const m = trimmed.match(re);
|
|
326
|
+
if (m) {
|
|
327
|
+
// Heuristic: find the captured group that looks like an identifier
|
|
328
|
+
const name = m.slice(1).find((g) => g && /^\w+$/.test(g));
|
|
329
|
+
if (name &&
|
|
330
|
+
name !== "async" &&
|
|
331
|
+
name !== "pub" &&
|
|
332
|
+
name !== "abstract" &&
|
|
333
|
+
name !== "struct" &&
|
|
334
|
+
name !== "enum" &&
|
|
335
|
+
name !== "const" &&
|
|
336
|
+
name !== "let") {
|
|
337
|
+
symbols.push({
|
|
338
|
+
name,
|
|
339
|
+
type,
|
|
340
|
+
startLine: i + 1,
|
|
341
|
+
endLine: findEndLine(lines, i),
|
|
342
|
+
exported: isDefault ||
|
|
343
|
+
trimmed.startsWith("export") ||
|
|
344
|
+
trimmed.startsWith("pub ") ||
|
|
345
|
+
trimmed.startsWith("pub("),
|
|
346
|
+
isDefault: isDefault || undefined,
|
|
347
|
+
});
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
return symbols;
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/indexer/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AiMemoryConfig } from "../core/types";
|
|
2
|
+
export interface ScannedFile {
|
|
3
|
+
absolutePath: string;
|
|
4
|
+
relativePath: string;
|
|
5
|
+
/** Lowercase extension without leading dot */
|
|
6
|
+
extension: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Scans the repository using fast-glob and returns all files that match
|
|
10
|
+
* the include/exclude patterns from config.
|
|
11
|
+
*
|
|
12
|
+
* fast-glob is used over native fs.readdir because:
|
|
13
|
+
* - it natively supports .gitignore-style ignore patterns
|
|
14
|
+
* - it handles symlinks, hidden files, and large repos efficiently
|
|
15
|
+
* - it's significantly faster than recursive readdir
|
|
16
|
+
*/
|
|
17
|
+
export declare function scanRepository(config: AiMemoryConfig): Promise<ScannedFile[]>;
|
|
18
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/indexer/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.scanRepository = scanRepository;
|
|
7
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
/**
|
|
10
|
+
* Scans the repository using fast-glob and returns all files that match
|
|
11
|
+
* the include/exclude patterns from config.
|
|
12
|
+
*
|
|
13
|
+
* fast-glob is used over native fs.readdir because:
|
|
14
|
+
* - it natively supports .gitignore-style ignore patterns
|
|
15
|
+
* - it handles symlinks, hidden files, and large repos efficiently
|
|
16
|
+
* - it's significantly faster than recursive readdir
|
|
17
|
+
*/
|
|
18
|
+
async function scanRepository(config) {
|
|
19
|
+
const entries = await (0, fast_glob_1.default)(config.include, {
|
|
20
|
+
cwd: config.rootDir,
|
|
21
|
+
ignore: config.exclude,
|
|
22
|
+
dot: false,
|
|
23
|
+
absolute: false,
|
|
24
|
+
followSymbolicLinks: false,
|
|
25
|
+
onlyFiles: true,
|
|
26
|
+
// Return in consistent order for reproducible hashing
|
|
27
|
+
caseSensitiveMatch: true,
|
|
28
|
+
});
|
|
29
|
+
return entries
|
|
30
|
+
.sort() // reproducible order across machines
|
|
31
|
+
.map((relativePath) => ({
|
|
32
|
+
absolutePath: path_1.default.join(config.rootDir, relativePath),
|
|
33
|
+
relativePath,
|
|
34
|
+
extension: path_1.default.extname(relativePath).slice(1).toLowerCase(),
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/indexer/scanner.ts"],"names":[],"mappings":";;;;;AAoBA,wCAqBC;AAzCD,0DAA2B;AAC3B,gDAAwB;AAUxB;;;;;;;;GAQG;AACI,KAAK,UAAU,cAAc,CAClC,MAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAE,EAAC,MAAM,CAAC,OAAO,EAAE;QACvC,GAAG,EAAE,MAAM,CAAC,OAAO;QACnB,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,KAAK;QACf,mBAAmB,EAAE,KAAK;QAC1B,SAAS,EAAE,IAAI;QACf,sDAAsD;QACtD,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IAEH,OAAO,OAAO;SACX,IAAI,EAAE,CAAC,qCAAqC;SAC5C,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACtB,YAAY,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;QACrD,YAAY;QACZ,SAAS,EAAE,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;KAC7D,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ParsedSymbol } from "./parser";
|
|
2
|
+
/**
|
|
3
|
+
* Decides which chunking strategy to use based on the presence of valid symbols.
|
|
4
|
+
* If there are symbols with endLine >= startLine, we assume the parser worked and use symbol-based chunking.
|
|
5
|
+
* Otherwise, we fall back to sliding window chunking.
|
|
6
|
+
* This allows us to handle cases where the parser fails or returns incomplete symbols without losing all structure.
|
|
7
|
+
* Note: we check for endLine >= startLine to allow for symbols that are only one line long (e.g., simple functions or
|
|
8
|
+
* properties) while still filtering out invalid symbols with endLine = 0 or endLine < startLine.
|
|
9
|
+
*/
|
|
10
|
+
export declare function selectChunkingStrategy(symbols: ParsedSymbol[]): "symbol" | "sliding";
|
|
11
|
+
//# sourceMappingURL=strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../src/indexer/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,QAAQ,GAAG,SAAS,CAEpF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectChunkingStrategy = selectChunkingStrategy;
|
|
4
|
+
/**
|
|
5
|
+
* Decides which chunking strategy to use based on the presence of valid symbols.
|
|
6
|
+
* If there are symbols with endLine >= startLine, we assume the parser worked and use symbol-based chunking.
|
|
7
|
+
* Otherwise, we fall back to sliding window chunking.
|
|
8
|
+
* This allows us to handle cases where the parser fails or returns incomplete symbols without losing all structure.
|
|
9
|
+
* Note: we check for endLine >= startLine to allow for symbols that are only one line long (e.g., simple functions or
|
|
10
|
+
* properties) while still filtering out invalid symbols with endLine = 0 or endLine < startLine.
|
|
11
|
+
*/
|
|
12
|
+
function selectChunkingStrategy(symbols) {
|
|
13
|
+
return symbols.some((s) => s.endLine >= s.startLine) ? "symbol" : "sliding";
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../src/indexer/strategy.ts"],"names":[],"mappings":";;AAUA,wDAEC;AAVD;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CAAC,OAAuB;IAC5D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns all test files in the project that are likely to test `relPath`.
|
|
3
|
+
*
|
|
4
|
+
* Two strategies (both applied, results deduplicated):
|
|
5
|
+
* 1. Convention-based: look for sibling files with `.test.*` / `.spec.*`
|
|
6
|
+
* suffix, and for the same basename inside common test directories.
|
|
7
|
+
* 2. Import-based: any file whose path contains "test" or "spec" that is
|
|
8
|
+
* known to import `relPath` (via the dependency graph).
|
|
9
|
+
*
|
|
10
|
+
* @param relPath The source file to find tests for (project-relative)
|
|
11
|
+
* @param allFiles All known project-relative file paths
|
|
12
|
+
* @param importedBy Optional map of file → set of files that import it
|
|
13
|
+
*/
|
|
14
|
+
export declare function findTestFiles(relPath: string, allFiles: Iterable<string>, importedBy?: Map<string, string[]>): string[];
|
|
15
|
+
//# sourceMappingURL=tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../src/indexer/tests.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACjC,MAAM,EAAE,CA4CV"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.findTestFiles = findTestFiles;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
// Common test file suffixes and directory patterns
|
|
9
|
+
const TEST_SUFFIXES = [".test.ts", ".test.tsx", ".test.js", ".test.jsx",
|
|
10
|
+
".spec.ts", ".spec.tsx", ".spec.js", ".spec.jsx"];
|
|
11
|
+
const TEST_DIRS = ["__tests__", "test", "tests", "spec", "__spec__"];
|
|
12
|
+
/**
|
|
13
|
+
* Returns all test files in the project that are likely to test `relPath`.
|
|
14
|
+
*
|
|
15
|
+
* Two strategies (both applied, results deduplicated):
|
|
16
|
+
* 1. Convention-based: look for sibling files with `.test.*` / `.spec.*`
|
|
17
|
+
* suffix, and for the same basename inside common test directories.
|
|
18
|
+
* 2. Import-based: any file whose path contains "test" or "spec" that is
|
|
19
|
+
* known to import `relPath` (via the dependency graph).
|
|
20
|
+
*
|
|
21
|
+
* @param relPath The source file to find tests for (project-relative)
|
|
22
|
+
* @param allFiles All known project-relative file paths
|
|
23
|
+
* @param importedBy Optional map of file → set of files that import it
|
|
24
|
+
*/
|
|
25
|
+
function findTestFiles(relPath, allFiles, importedBy) {
|
|
26
|
+
const allFilesSet = new Set(allFiles);
|
|
27
|
+
const found = new Set();
|
|
28
|
+
const dir = path_1.default.dirname(relPath);
|
|
29
|
+
const base = path_1.default.basename(relPath);
|
|
30
|
+
// Strip known source extension to get the bare stem (e.g. "foo")
|
|
31
|
+
const stem = base.replace(/\.(ts|tsx|js|jsx|mts|cts|mjs|cjs)$/, "");
|
|
32
|
+
// Strategy 1a: sibling test files in the same directory
|
|
33
|
+
for (const suffix of TEST_SUFFIXES) {
|
|
34
|
+
const candidate = path_1.default.join(dir, stem + suffix);
|
|
35
|
+
if (allFilesSet.has(candidate))
|
|
36
|
+
found.add(candidate);
|
|
37
|
+
}
|
|
38
|
+
// Strategy 1b: same stem inside adjacent test directories
|
|
39
|
+
for (const testDir of TEST_DIRS) {
|
|
40
|
+
for (const suffix of TEST_SUFFIXES) {
|
|
41
|
+
// e.g. src/__tests__/foo.test.ts
|
|
42
|
+
const inSiblingDir = path_1.default.join(dir, testDir, stem + suffix);
|
|
43
|
+
if (allFilesSet.has(inSiblingDir))
|
|
44
|
+
found.add(inSiblingDir);
|
|
45
|
+
// e.g. __tests__/foo.test.ts (root-level test dir)
|
|
46
|
+
const inRootDir = path_1.default.join(testDir, stem + suffix);
|
|
47
|
+
if (allFilesSet.has(inRootDir))
|
|
48
|
+
found.add(inRootDir);
|
|
49
|
+
}
|
|
50
|
+
// Bare filename without suffix (e.g. __tests__/foo.ts)
|
|
51
|
+
for (const ext of [".ts", ".tsx", ".js", ".jsx"]) {
|
|
52
|
+
const inSiblingDir = path_1.default.join(dir, testDir, stem + ext);
|
|
53
|
+
if (allFilesSet.has(inSiblingDir))
|
|
54
|
+
found.add(inSiblingDir);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Strategy 2: import-based — files that import relPath and look like tests
|
|
58
|
+
if (importedBy) {
|
|
59
|
+
const importers = importedBy.get(relPath) ?? [];
|
|
60
|
+
for (const importer of importers) {
|
|
61
|
+
if (/[./](test|spec)[./]|\.test\.|\.spec\./.test(importer)) {
|
|
62
|
+
found.add(importer);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return Array.from(found).sort();
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests.js","sourceRoot":"","sources":["../../src/indexer/tests.ts"],"names":[],"mappings":";;;;;AAoBA,sCAgDC;AApED,gDAAwB;AAExB,mDAAmD;AACnD,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW;IAChD,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AACzE,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,SAAgB,aAAa,CAC3B,OAAe,EACf,QAA0B,EAC1B,UAAkC;IAElC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,iEAAiE;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;IAEpE,wDAAwD;IACxD,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;QAChD,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,0DAA0D;IAC1D,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,iCAAiC;YACjC,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;YAC5D,IAAI,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAE3D,mDAAmD;YACnD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;YACpD,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,uDAAuD;QACvD,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;YACzD,IAAI,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,uCAAuC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TodoAnnotation } from "../core/types";
|
|
2
|
+
/**
|
|
3
|
+
* Scans the lines of a source file and returns all TODO/FIXME/HACK/XXX
|
|
4
|
+
* annotations found in comments or inline text.
|
|
5
|
+
*
|
|
6
|
+
* Line numbers are 1-based to match editor conventions.
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractTodos(relativePath: string, content: string): TodoAnnotation[];
|
|
9
|
+
//# sourceMappingURL=todos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todos.d.ts","sourceRoot":"","sources":["../../src/indexer/todos.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAMpD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,cAAc,EAAE,CAiBlB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractTodos = extractTodos;
|
|
4
|
+
// Matches: // TODO: ..., # FIXME ..., /* HACK ... */, etc.
|
|
5
|
+
// Captures the keyword and the rest of the comment text on that line.
|
|
6
|
+
const TODO_RE = /\b(TODO|FIXME|HACK|XXX)\b[:\s]*(.*)/i;
|
|
7
|
+
/**
|
|
8
|
+
* Scans the lines of a source file and returns all TODO/FIXME/HACK/XXX
|
|
9
|
+
* annotations found in comments or inline text.
|
|
10
|
+
*
|
|
11
|
+
* Line numbers are 1-based to match editor conventions.
|
|
12
|
+
*/
|
|
13
|
+
function extractTodos(relativePath, content) {
|
|
14
|
+
const todos = [];
|
|
15
|
+
const lines = content.split("\n");
|
|
16
|
+
for (let i = 0; i < lines.length; i++) {
|
|
17
|
+
const match = lines[i].match(TODO_RE);
|
|
18
|
+
if (match) {
|
|
19
|
+
todos.push({
|
|
20
|
+
file: relativePath,
|
|
21
|
+
line: i + 1,
|
|
22
|
+
type: match[1].toUpperCase(),
|
|
23
|
+
text: match[2].trim(),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return todos;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=todos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todos.js","sourceRoot":"","sources":["../../src/indexer/todos.ts"],"names":[],"mappings":";;AAYA,oCAoBC;AA9BD,2DAA2D;AAC3D,sEAAsE;AACtE,MAAM,OAAO,GAAG,sCAAsC,CAAC;AAEvD;;;;;GAKG;AACH,SAAgB,YAAY,CAC1B,YAAoB,EACpB,OAAe;IAEf,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAA4B;gBACtD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ChatMessage, ChatOptions, LLMProvider, LLMResponse } from "./provider";
|
|
2
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
3
|
+
readonly name = "anthropic";
|
|
4
|
+
private client;
|
|
5
|
+
constructor(apiKey: string);
|
|
6
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<LLMResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,MAAM;IAapB,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,WAAW,CAAC;CAiExB"}
|