@monoes/monomindcli 1.6.4 → 1.6.6
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/.claude/helpers/graphify-freshen.cjs +10 -1
- package/bundled-graph/dist/src/analyze.d.ts +32 -0
- package/bundled-graph/dist/src/analyze.d.ts.map +1 -0
- package/bundled-graph/dist/src/analyze.js +297 -0
- package/bundled-graph/dist/src/analyze.js.map +1 -0
- package/bundled-graph/dist/src/build.d.ts +8 -0
- package/bundled-graph/dist/src/build.d.ts.map +1 -0
- package/bundled-graph/dist/src/build.js +73 -0
- package/bundled-graph/dist/src/build.js.map +1 -0
- package/bundled-graph/dist/src/cache.d.ts +12 -0
- package/bundled-graph/dist/src/cache.d.ts.map +1 -0
- package/bundled-graph/dist/src/cache.js +43 -0
- package/bundled-graph/dist/src/cache.js.map +1 -0
- package/bundled-graph/dist/src/cluster.d.ts +5 -0
- package/bundled-graph/dist/src/cluster.d.ts.map +1 -0
- package/bundled-graph/dist/src/cluster.js +120 -0
- package/bundled-graph/dist/src/cluster.js.map +1 -0
- package/bundled-graph/dist/src/detect.d.ts +21 -0
- package/bundled-graph/dist/src/detect.d.ts.map +1 -0
- package/bundled-graph/dist/src/detect.js +195 -0
- package/bundled-graph/dist/src/detect.js.map +1 -0
- package/bundled-graph/dist/src/export.d.ts +21 -0
- package/bundled-graph/dist/src/export.d.ts.map +1 -0
- package/bundled-graph/dist/src/export.js +68 -0
- package/bundled-graph/dist/src/export.js.map +1 -0
- package/bundled-graph/dist/src/extract/index.d.ts +20 -0
- package/bundled-graph/dist/src/extract/index.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/index.js +158 -0
- package/bundled-graph/dist/src/extract/index.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/c.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/c.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/c.js +88 -0
- package/bundled-graph/dist/src/extract/languages/c.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/cpp.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/cpp.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/cpp.js +121 -0
- package/bundled-graph/dist/src/extract/languages/cpp.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/csharp.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/csharp.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/csharp.js +121 -0
- package/bundled-graph/dist/src/extract/languages/csharp.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/go.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/go.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/go.js +181 -0
- package/bundled-graph/dist/src/extract/languages/go.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/java.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/java.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/java.js +117 -0
- package/bundled-graph/dist/src/extract/languages/java.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/kotlin.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/kotlin.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/kotlin.js +112 -0
- package/bundled-graph/dist/src/extract/languages/kotlin.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/php.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/php.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/php.js +130 -0
- package/bundled-graph/dist/src/extract/languages/php.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/python.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/python.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/python.js +230 -0
- package/bundled-graph/dist/src/extract/languages/python.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/ruby.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/ruby.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/ruby.js +120 -0
- package/bundled-graph/dist/src/extract/languages/ruby.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/rust.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/rust.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/rust.js +195 -0
- package/bundled-graph/dist/src/extract/languages/rust.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/scala.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/scala.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/scala.js +110 -0
- package/bundled-graph/dist/src/extract/languages/scala.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/swift.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/swift.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/swift.js +122 -0
- package/bundled-graph/dist/src/extract/languages/swift.js.map +1 -0
- package/bundled-graph/dist/src/extract/languages/typescript.d.ts +3 -0
- package/bundled-graph/dist/src/extract/languages/typescript.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/languages/typescript.js +295 -0
- package/bundled-graph/dist/src/extract/languages/typescript.js.map +1 -0
- package/bundled-graph/dist/src/extract/semantic.d.ts +38 -0
- package/bundled-graph/dist/src/extract/semantic.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/semantic.js +242 -0
- package/bundled-graph/dist/src/extract/semantic.js.map +1 -0
- package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts +48 -0
- package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/tree-sitter-runner.js +137 -0
- package/bundled-graph/dist/src/extract/tree-sitter-runner.js.map +1 -0
- package/bundled-graph/dist/src/extract/types.d.ts +7 -0
- package/bundled-graph/dist/src/extract/types.d.ts.map +1 -0
- package/bundled-graph/dist/src/extract/types.js +2 -0
- package/bundled-graph/dist/src/extract/types.js.map +1 -0
- package/bundled-graph/dist/src/index.d.ts +28 -0
- package/bundled-graph/dist/src/index.d.ts.map +1 -0
- package/bundled-graph/dist/src/index.js +26 -0
- package/bundled-graph/dist/src/index.js.map +1 -0
- package/bundled-graph/dist/src/pipeline.d.ts +27 -0
- package/bundled-graph/dist/src/pipeline.d.ts.map +1 -0
- package/bundled-graph/dist/src/pipeline.js +269 -0
- package/bundled-graph/dist/src/pipeline.js.map +1 -0
- package/bundled-graph/dist/src/report.d.ts +26 -0
- package/bundled-graph/dist/src/report.d.ts.map +1 -0
- package/bundled-graph/dist/src/report.js +214 -0
- package/bundled-graph/dist/src/report.js.map +1 -0
- package/bundled-graph/dist/src/types.d.ts +124 -0
- package/bundled-graph/dist/src/types.d.ts.map +1 -0
- package/bundled-graph/dist/src/types.js +2 -0
- package/bundled-graph/dist/src/types.js.map +1 -0
- package/bundled-graph/dist/src/visualize.d.ts +4 -0
- package/bundled-graph/dist/src/visualize.d.ts.map +1 -0
- package/bundled-graph/dist/src/visualize.js +574 -0
- package/bundled-graph/dist/src/visualize.js.map +1 -0
- package/bundled-graph/dist/tsconfig.tsbuildinfo +1 -0
- package/bundled-graph/package.json +57 -0
- package/package.json +9 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swift.js","sourceRoot":"","sources":["../../../../src/extract/languages/swift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../../src/extract/languages/typescript.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAsUrD,eAAO,MAAM,mBAAmB,EAAE,iBAejC,CAAC"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { basename } from 'path';
|
|
2
|
+
import { tryLoadParser, walk, } from '../tree-sitter-runner.js';
|
|
3
|
+
// ---- helpers ----
|
|
4
|
+
function nodeName(node) {
|
|
5
|
+
// Most declaration nodes expose "name" as a named field
|
|
6
|
+
const nameNode = node.childForFieldName('name');
|
|
7
|
+
return nameNode?.text ?? '';
|
|
8
|
+
}
|
|
9
|
+
function loc(node) {
|
|
10
|
+
return `L${node.startPosition.row + 1}`;
|
|
11
|
+
}
|
|
12
|
+
// ---- tree-sitter extraction ----
|
|
13
|
+
const CLASS_TYPES = new Set([
|
|
14
|
+
'class_declaration',
|
|
15
|
+
'abstract_class_declaration',
|
|
16
|
+
]);
|
|
17
|
+
const FUNCTION_TYPES = new Set([
|
|
18
|
+
'function_declaration',
|
|
19
|
+
'generator_function_declaration',
|
|
20
|
+
]);
|
|
21
|
+
function extractWithTreeSitter(filePath, content, language) {
|
|
22
|
+
const nodes = [];
|
|
23
|
+
const edges = [];
|
|
24
|
+
const errors = [];
|
|
25
|
+
const parser = tryLoadParser(language);
|
|
26
|
+
if (!parser) {
|
|
27
|
+
return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
|
|
28
|
+
}
|
|
29
|
+
let tree;
|
|
30
|
+
try {
|
|
31
|
+
tree = parser.parse(content);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
errors.push(`tree-sitter parse error in ${filePath}: ${String(err)}`);
|
|
35
|
+
return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
|
|
36
|
+
}
|
|
37
|
+
// Track current class/method context for call-edge attribution
|
|
38
|
+
const classStack = [];
|
|
39
|
+
const methodStack = [];
|
|
40
|
+
const addNode = (name, n) => {
|
|
41
|
+
if (!name)
|
|
42
|
+
return;
|
|
43
|
+
nodes.push({
|
|
44
|
+
id: name,
|
|
45
|
+
label: name,
|
|
46
|
+
fileType: 'code',
|
|
47
|
+
sourceFile: filePath,
|
|
48
|
+
sourceLocation: loc(n),
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
walk(tree.rootNode, (n) => {
|
|
52
|
+
// ---- classes ----
|
|
53
|
+
if (CLASS_TYPES.has(n.type)) {
|
|
54
|
+
const name = nodeName(n);
|
|
55
|
+
addNode(name, n);
|
|
56
|
+
if (name)
|
|
57
|
+
classStack.push(name);
|
|
58
|
+
// heritage: extends / implements
|
|
59
|
+
for (const child of n.children) {
|
|
60
|
+
if (child.type === 'class_heritage') {
|
|
61
|
+
for (const clause of child.children) {
|
|
62
|
+
if (clause.type !== 'extends_clause' && clause.type !== 'implements_clause')
|
|
63
|
+
continue;
|
|
64
|
+
const relation = clause.type === 'extends_clause' ? 'extends' : 'implements';
|
|
65
|
+
// Each type_identifier inside the clause is a target
|
|
66
|
+
for (const target of clause.children) {
|
|
67
|
+
if (target.type === 'type_identifier' ||
|
|
68
|
+
target.type === 'identifier') {
|
|
69
|
+
edges.push({
|
|
70
|
+
source: name,
|
|
71
|
+
target: target.text,
|
|
72
|
+
relation,
|
|
73
|
+
confidence: 'EXTRACTED',
|
|
74
|
+
sourceFile: filePath,
|
|
75
|
+
sourceLocation: loc(clause),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// ---- functions (top-level) ----
|
|
85
|
+
if (FUNCTION_TYPES.has(n.type)) {
|
|
86
|
+
const name = nodeName(n);
|
|
87
|
+
addNode(name, n);
|
|
88
|
+
if (name)
|
|
89
|
+
methodStack.push(name);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// ---- method definitions (inside class body) ----
|
|
93
|
+
if (n.type === 'method_definition' || n.type === 'public_field_definition') {
|
|
94
|
+
const name = nodeName(n);
|
|
95
|
+
// Qualify name with class if available
|
|
96
|
+
const qualifiedName = classStack.length > 0 ? `${classStack[classStack.length - 1]}.${name}` : name;
|
|
97
|
+
addNode(qualifiedName, n);
|
|
98
|
+
if (qualifiedName)
|
|
99
|
+
methodStack.push(qualifiedName);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// ---- interfaces ----
|
|
103
|
+
if (n.type === 'interface_declaration') {
|
|
104
|
+
const name = nodeName(n);
|
|
105
|
+
addNode(name, n);
|
|
106
|
+
// interface X extends Y
|
|
107
|
+
for (const child of n.children) {
|
|
108
|
+
if (child.type === 'extends_type_clause' || child.type === 'extends_clause') {
|
|
109
|
+
for (const target of child.children) {
|
|
110
|
+
if (target.type === 'type_identifier' || target.type === 'identifier') {
|
|
111
|
+
edges.push({
|
|
112
|
+
source: name,
|
|
113
|
+
target: target.text,
|
|
114
|
+
relation: 'extends',
|
|
115
|
+
confidence: 'EXTRACTED',
|
|
116
|
+
sourceFile: filePath,
|
|
117
|
+
sourceLocation: loc(child),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// ---- type aliases ----
|
|
126
|
+
if (n.type === 'type_alias_declaration') {
|
|
127
|
+
const name = nodeName(n);
|
|
128
|
+
addNode(name, n);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// ---- import statements ----
|
|
132
|
+
if (n.type === 'import_statement') {
|
|
133
|
+
// Extract the module specifier
|
|
134
|
+
const moduleSpecifier = n.childForFieldName('source');
|
|
135
|
+
const moduleText = moduleSpecifier
|
|
136
|
+
? moduleSpecifier.text.replace(/^['"]|['"]$/g, '')
|
|
137
|
+
: '';
|
|
138
|
+
// Extract named specifiers: import { A, B } from '...'
|
|
139
|
+
for (const child of n.children) {
|
|
140
|
+
if (child.type === 'named_imports' || child.type === 'import_clause') {
|
|
141
|
+
for (const spec of child.children) {
|
|
142
|
+
if (spec.type === 'import_specifier') {
|
|
143
|
+
const importedName = spec.childForFieldName('name')?.text ?? spec.text;
|
|
144
|
+
if (importedName) {
|
|
145
|
+
edges.push({
|
|
146
|
+
source: filePath,
|
|
147
|
+
target: importedName,
|
|
148
|
+
relation: 'imports',
|
|
149
|
+
confidence: 'EXTRACTED',
|
|
150
|
+
sourceFile: filePath,
|
|
151
|
+
sourceLocation: loc(n),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Default import: import X from '...'
|
|
158
|
+
if (child.type === 'import_clause') {
|
|
159
|
+
const defaultId = child.childForFieldName('name') ?? (child.children.find(c => c.type === 'identifier') ?? null);
|
|
160
|
+
if (defaultId) {
|
|
161
|
+
edges.push({
|
|
162
|
+
source: filePath,
|
|
163
|
+
target: defaultId.text,
|
|
164
|
+
relation: 'imports',
|
|
165
|
+
confidence: 'EXTRACTED',
|
|
166
|
+
sourceFile: filePath,
|
|
167
|
+
sourceLocation: loc(n),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Always emit a file-level import edge to the module path
|
|
173
|
+
if (moduleText) {
|
|
174
|
+
edges.push({
|
|
175
|
+
source: basename(filePath),
|
|
176
|
+
target: moduleText,
|
|
177
|
+
relation: 'imports',
|
|
178
|
+
confidence: 'EXTRACTED',
|
|
179
|
+
sourceFile: filePath,
|
|
180
|
+
sourceLocation: loc(n),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// ---- call expressions ----
|
|
186
|
+
if (n.type === 'call_expression') {
|
|
187
|
+
const fnNode = n.childForFieldName('function');
|
|
188
|
+
if (!fnNode)
|
|
189
|
+
return;
|
|
190
|
+
// Resolve callee name (may be `a.b()` or plain `foo()`)
|
|
191
|
+
let calleeName;
|
|
192
|
+
if (fnNode.type === 'member_expression') {
|
|
193
|
+
calleeName = fnNode.text;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
calleeName = fnNode.text;
|
|
197
|
+
}
|
|
198
|
+
// Attribute to deepest known method context
|
|
199
|
+
const caller = methodStack[methodStack.length - 1] ??
|
|
200
|
+
classStack[classStack.length - 1] ??
|
|
201
|
+
basename(filePath);
|
|
202
|
+
if (calleeName && caller && calleeName !== caller) {
|
|
203
|
+
edges.push({
|
|
204
|
+
source: caller,
|
|
205
|
+
target: calleeName,
|
|
206
|
+
relation: 'calls',
|
|
207
|
+
confidence: 'INFERRED',
|
|
208
|
+
confidenceScore: 0.8,
|
|
209
|
+
sourceFile: filePath,
|
|
210
|
+
sourceLocation: loc(n),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
|
|
216
|
+
}
|
|
217
|
+
// ---- regex fallback ----
|
|
218
|
+
function extractWithRegex(filePath, content) {
|
|
219
|
+
const nodes = [];
|
|
220
|
+
const edges = [];
|
|
221
|
+
const lines = content.split('\n');
|
|
222
|
+
lines.forEach((line, idx) => {
|
|
223
|
+
const location = `L${idx + 1}`;
|
|
224
|
+
// class
|
|
225
|
+
const classMatch = line.match(/^(export\s+)?(abstract\s+)?class\s+(\w+)/);
|
|
226
|
+
if (classMatch) {
|
|
227
|
+
const name = classMatch[3];
|
|
228
|
+
nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
|
|
229
|
+
// extends
|
|
230
|
+
const extendsMatch = line.match(/\bextends\s+(\w+)/);
|
|
231
|
+
if (extendsMatch) {
|
|
232
|
+
edges.push({ source: name, target: extendsMatch[1], relation: 'extends', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
|
|
233
|
+
}
|
|
234
|
+
// implements
|
|
235
|
+
const implementsMatch = line.match(/\bimplements\s+([\w,\s]+)/);
|
|
236
|
+
if (implementsMatch) {
|
|
237
|
+
for (const impl of implementsMatch[1].split(',')) {
|
|
238
|
+
const implName = impl.trim().split(/\s/)[0];
|
|
239
|
+
if (implName) {
|
|
240
|
+
edges.push({ source: name, target: implName, relation: 'implements', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// interface
|
|
246
|
+
const ifaceMatch = line.match(/^(export\s+)?interface\s+(\w+)/);
|
|
247
|
+
if (ifaceMatch) {
|
|
248
|
+
const name = ifaceMatch[2];
|
|
249
|
+
nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
|
|
250
|
+
}
|
|
251
|
+
// type alias
|
|
252
|
+
const typeMatch = line.match(/^(export\s+)?type\s+(\w+)\s*=/);
|
|
253
|
+
if (typeMatch) {
|
|
254
|
+
const name = typeMatch[2];
|
|
255
|
+
nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
|
|
256
|
+
}
|
|
257
|
+
// function
|
|
258
|
+
const funcMatch = line.match(/^(export\s+)?(default\s+)?(async\s+)?function\s+(\w+)/);
|
|
259
|
+
if (funcMatch) {
|
|
260
|
+
const name = funcMatch[4];
|
|
261
|
+
nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
|
|
262
|
+
}
|
|
263
|
+
// import
|
|
264
|
+
const importMatch = line.match(/^import\s+.*from\s+['"]([^'"]+)['"]/);
|
|
265
|
+
if (importMatch) {
|
|
266
|
+
edges.push({ source: basename(filePath), target: importMatch[1], relation: 'imports', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
|
|
267
|
+
// Named specifiers
|
|
268
|
+
const namedMatch = line.match(/\{([^}]+)\}/);
|
|
269
|
+
if (namedMatch) {
|
|
270
|
+
for (const spec of namedMatch[1].split(',')) {
|
|
271
|
+
const specName = spec.trim().split(/\s+as\s+/)[0].trim();
|
|
272
|
+
if (specName) {
|
|
273
|
+
edges.push({ source: filePath, target: specName, relation: 'imports', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
return { nodes, edges, filesProcessed: 1, fromCache: 0, errors: [] };
|
|
280
|
+
}
|
|
281
|
+
// ---- extractor implementation ----
|
|
282
|
+
export const typescriptExtractor = {
|
|
283
|
+
language: 'typescript',
|
|
284
|
+
extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
|
|
285
|
+
extract(filePath, content) {
|
|
286
|
+
const lang = filePath.endsWith('.tsx') || filePath.endsWith('.jsx') ? 'tsx' : 'typescript';
|
|
287
|
+
const tsResult = extractWithTreeSitter(filePath, content, lang);
|
|
288
|
+
if (tsResult.nodes.length > 0 || tsResult.edges.length > 0 || tsResult.errors.length > 0) {
|
|
289
|
+
return tsResult;
|
|
290
|
+
}
|
|
291
|
+
// tree-sitter not available or produced nothing — fall back to regex
|
|
292
|
+
return extractWithRegex(filePath, content);
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
//# sourceMappingURL=typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../../src/extract/languages/typescript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic extraction via the Anthropic Claude API.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors graphify's skill.md Step B1-B3 pipeline:
|
|
5
|
+
* - Groups files into chunks of ~20
|
|
6
|
+
* - Sends each chunk to Claude with the graphify extraction prompt
|
|
7
|
+
* - Merges results into a single ExtractionResult
|
|
8
|
+
*
|
|
9
|
+
* Gracefully returns empty results if ANTHROPIC_API_KEY is not set
|
|
10
|
+
* or the API call fails.
|
|
11
|
+
*/
|
|
12
|
+
import type { ExtractionResult } from '../types.js';
|
|
13
|
+
export interface SemanticFile {
|
|
14
|
+
path: string;
|
|
15
|
+
relPath: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SemanticOptions {
|
|
19
|
+
apiKey?: string;
|
|
20
|
+
model?: string;
|
|
21
|
+
chunkSize?: number;
|
|
22
|
+
mode?: 'fast' | 'deep';
|
|
23
|
+
maxTokens?: number;
|
|
24
|
+
timeBudget?: number;
|
|
25
|
+
targetChunkTokens?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run semantic extraction on a set of files using the Anthropic Claude API.
|
|
29
|
+
*
|
|
30
|
+
* Returns an empty ExtractionResult (not an error) when:
|
|
31
|
+
* - No API key is available
|
|
32
|
+
* - The API call fails
|
|
33
|
+
*
|
|
34
|
+
* Only document/paper files benefit from semantic extraction.
|
|
35
|
+
* Code files may be included but the prompt instructs Claude not to re-extract imports.
|
|
36
|
+
*/
|
|
37
|
+
export declare function extractSemantic(files: SemanticFile[], options?: SemanticOptions): Promise<ExtractionResult>;
|
|
38
|
+
//# sourceMappingURL=semantic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../src/extract/semantic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAmC,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA0ND;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA4E3B"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Prompt template (mirrors graphify skill.md lines 253-303)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
function buildPrompt(files, mode, chunkNum, totalChunks) {
|
|
5
|
+
const deepInstructions = mode === 'deep'
|
|
6
|
+
? '\nDEEP MODE: be aggressive with INFERRED edges - indirect deps, shared assumptions, latent couplings. Mark uncertain ones AMBIGUOUS instead of omitting.\n'
|
|
7
|
+
: '';
|
|
8
|
+
const fileList = files
|
|
9
|
+
.map((f) => `--- file: ${f.relPath} ---\n${f.content.slice(0, 6000)}\n---`)
|
|
10
|
+
.join('\n\n');
|
|
11
|
+
return `You are a graphify extraction subagent. Read the files listed and extract a knowledge graph fragment.
|
|
12
|
+
Output ONLY valid JSON matching the schema below - no explanation, no markdown fences, no preamble.
|
|
13
|
+
|
|
14
|
+
Files (chunk ${chunkNum} of ${totalChunks}):
|
|
15
|
+
${fileList}
|
|
16
|
+
|
|
17
|
+
Rules:
|
|
18
|
+
- EXTRACTED: relationship explicit in source (import, call, citation, "see §3.2")
|
|
19
|
+
- INFERRED: reasonable inference (shared data structure, implied dependency)
|
|
20
|
+
- AMBIGUOUS: uncertain - flag for review, do not omit
|
|
21
|
+
|
|
22
|
+
Code files: focus on semantic edges AST cannot find (call relationships, shared data, arch patterns).
|
|
23
|
+
Do not re-extract imports - AST already has those.
|
|
24
|
+
Doc/paper files: extract named concepts, entities, citations. Also extract rationale — sections that explain WHY a decision was made, trade-offs chosen, or design intent. These become nodes with "rationale_for" edges pointing to the concept they explain.
|
|
25
|
+
${deepInstructions}
|
|
26
|
+
Semantic similarity: if two concepts in this chunk solve the same problem or represent the same idea without any structural link, add a "semantically_similar_to" edge marked INFERRED with a confidence_score reflecting how similar they are (0.6-0.95). Only add these when the similarity is genuinely non-obvious and cross-cutting.
|
|
27
|
+
|
|
28
|
+
Hyperedges: if 3 or more nodes clearly participate together in a shared concept, flow, or pattern not captured by pairwise edges, add a hyperedge to the "hyperedges" array. Use sparingly — maximum 3 hyperedges per chunk.
|
|
29
|
+
|
|
30
|
+
If a file has YAML frontmatter (--- ... ---), copy source_url, captured_at, author, contributor onto every node from that file.
|
|
31
|
+
|
|
32
|
+
confidence_score is REQUIRED on every edge:
|
|
33
|
+
- EXTRACTED edges: confidence_score = 1.0 always
|
|
34
|
+
- INFERRED edges: Direct structural evidence: 0.8-0.9. Reasonable with uncertainty: 0.6-0.7. Weak/speculative: 0.4-0.5.
|
|
35
|
+
- AMBIGUOUS edges: 0.1-0.3
|
|
36
|
+
|
|
37
|
+
Output exactly this JSON (no other text):
|
|
38
|
+
{"nodes":[{"id":"filestem_entityname","label":"Human Readable Name","file_type":"code|document|paper|image","source_file":"relative/path","source_location":null,"source_url":null,"captured_at":null,"author":null,"contributor":null}],"edges":[{"source":"node_id","target":"node_id","relation":"calls|implements|references|cites|conceptually_related_to|shares_data_with|semantically_similar_to|rationale_for","confidence":"EXTRACTED|INFERRED|AMBIGUOUS","confidence_score":1.0,"source_file":"relative/path","source_location":null,"weight":1.0}],"hyperedges":[{"id":"snake_case_id","label":"Human Readable Label","nodes":["node_id1","node_id2","node_id3"],"relation":"participate_in|implement|form","confidence":"EXTRACTED|INFERRED","confidence_score":0.75,"source_file":"relative/path"}],"input_tokens":0,"output_tokens":0}`;
|
|
39
|
+
}
|
|
40
|
+
async function callClaude(prompt, apiKey, model, maxTokens) {
|
|
41
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
'x-api-key': apiKey,
|
|
46
|
+
'anthropic-version': '2023-06-01',
|
|
47
|
+
},
|
|
48
|
+
body: JSON.stringify({
|
|
49
|
+
model,
|
|
50
|
+
max_tokens: maxTokens,
|
|
51
|
+
messages: [{ role: 'user', content: prompt }],
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
const body = await response.text();
|
|
56
|
+
throw new Error(`Anthropic API error ${response.status}: ${body}`);
|
|
57
|
+
}
|
|
58
|
+
const msg = (await response.json());
|
|
59
|
+
const text = msg.content.find((c) => c.type === 'text')?.text ?? '';
|
|
60
|
+
return {
|
|
61
|
+
text,
|
|
62
|
+
inputTokens: msg.usage?.input_tokens ?? 0,
|
|
63
|
+
outputTokens: msg.usage?.output_tokens ?? 0,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function parseChunkResult(text, chunkFiles) {
|
|
67
|
+
// Strip markdown fences if model added them despite instructions
|
|
68
|
+
const cleaned = text.replace(/^```json\s*/i, '').replace(/\s*```\s*$/, '').trim();
|
|
69
|
+
let raw;
|
|
70
|
+
try {
|
|
71
|
+
raw = JSON.parse(cleaned);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { nodes: [], edges: [], hyperedges: [], inputTokens: 0, outputTokens: 0 };
|
|
75
|
+
}
|
|
76
|
+
const fileSet = new Set(chunkFiles.map((f) => f.relPath));
|
|
77
|
+
const nodes = (raw.nodes ?? [])
|
|
78
|
+
.filter((n) => typeof n === 'object' && n !== null)
|
|
79
|
+
.map((n) => ({
|
|
80
|
+
id: String(n['id'] ?? ''),
|
|
81
|
+
label: String(n['label'] ?? n['id'] ?? ''),
|
|
82
|
+
fileType: n['file_type'] ?? 'document',
|
|
83
|
+
sourceFile: String(n['source_file'] ?? ''),
|
|
84
|
+
sourceLocation: n['source_location'] ?? undefined,
|
|
85
|
+
// Extra metadata from YAML frontmatter
|
|
86
|
+
...(n['source_url'] ? { sourceUrl: n['source_url'] } : {}),
|
|
87
|
+
...(n['captured_at'] ? { capturedAt: n['captured_at'] } : {}),
|
|
88
|
+
...(n['author'] ? { author: n['author'] } : {}),
|
|
89
|
+
}))
|
|
90
|
+
.filter((n) => n.id && fileSet.has(n.sourceFile));
|
|
91
|
+
const edges = (raw.edges ?? [])
|
|
92
|
+
.filter((e) => typeof e === 'object' && e !== null)
|
|
93
|
+
.map((e) => ({
|
|
94
|
+
source: String(e['source'] ?? ''),
|
|
95
|
+
target: String(e['target'] ?? ''),
|
|
96
|
+
relation: String(e['relation'] ?? 'references'),
|
|
97
|
+
confidence: e['confidence'] ?? 'INFERRED',
|
|
98
|
+
confidenceScore: typeof e['confidence_score'] === 'number' ? e['confidence_score'] : 0.7,
|
|
99
|
+
sourceFile: e['source_file'] ?? undefined,
|
|
100
|
+
weight: typeof e['weight'] === 'number' ? e['weight'] : 1.0,
|
|
101
|
+
}))
|
|
102
|
+
.filter((e) => e.source && e.target);
|
|
103
|
+
const hyperedges = (raw.hyperedges ?? [])
|
|
104
|
+
.filter((h) => typeof h === 'object' && h !== null)
|
|
105
|
+
.map((h) => ({
|
|
106
|
+
label: String(h['label'] ?? h['id'] ?? ''),
|
|
107
|
+
nodes: Array.isArray(h['nodes']) ? h['nodes'] : [],
|
|
108
|
+
confidence: h['confidence'] ?? 'INFERRED',
|
|
109
|
+
confidenceScore: typeof h['confidence_score'] === 'number' ? h['confidence_score'] : 0.7,
|
|
110
|
+
}))
|
|
111
|
+
.filter((h) => h.label && h.nodes.length >= 2);
|
|
112
|
+
return {
|
|
113
|
+
nodes,
|
|
114
|
+
edges,
|
|
115
|
+
hyperedges,
|
|
116
|
+
inputTokens: raw.input_tokens ?? 0,
|
|
117
|
+
outputTokens: raw.output_tokens ?? 0,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// Best-Fit Decreasing (BFD) chunk packing — from autoresearch experiment loop
|
|
122
|
+
//
|
|
123
|
+
// Instead of slicing files into equal-sized groups, BFD estimates the token
|
|
124
|
+
// count of each file, sorts descending, and packs into bins that stay under
|
|
125
|
+
// targetTokens. This mirrors the document-packing dataloader in autoresearch
|
|
126
|
+
// (best-fit + zero-waste) and produces denser, fairer prompts than fixed chunks.
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
/**
|
|
129
|
+
* Pack `files` into chunks using First-Fit Decreasing bin packing.
|
|
130
|
+
*
|
|
131
|
+
* Each file's token estimate = min(content.length / 4, 1500)
|
|
132
|
+
* (the prompt already truncates each file to 6000 chars = ~1500 tokens).
|
|
133
|
+
*
|
|
134
|
+
* @param files - Files to pack
|
|
135
|
+
* @param targetTokens - Soft upper bound on tokens per chunk (default 30 000)
|
|
136
|
+
* @returns - Array of chunks; each chunk is an array of files
|
|
137
|
+
*/
|
|
138
|
+
function packChunksBFD(files, targetTokens) {
|
|
139
|
+
// Estimate tokens per file — capped at the 6 000-char prompt truncation limit
|
|
140
|
+
const sized = files.map((f) => ({
|
|
141
|
+
file: f,
|
|
142
|
+
tokens: Math.min(Math.ceil(f.content.length / 4), 1500),
|
|
143
|
+
}));
|
|
144
|
+
// Sort descending so large files get placed first (First Fit Decreasing)
|
|
145
|
+
sized.sort((a, b) => b.tokens - a.tokens);
|
|
146
|
+
const bins = [];
|
|
147
|
+
for (const item of sized) {
|
|
148
|
+
let placed = false;
|
|
149
|
+
for (const bin of bins) {
|
|
150
|
+
if (bin.tokens + item.tokens <= targetTokens) {
|
|
151
|
+
bin.files.push(item.file);
|
|
152
|
+
bin.tokens += item.tokens;
|
|
153
|
+
placed = true;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (!placed) {
|
|
158
|
+
// File is too large (or bins are all full) — open a new bin
|
|
159
|
+
bins.push({ files: [item.file], tokens: item.tokens });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return bins.map((b) => b.files);
|
|
163
|
+
}
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
// Main export
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
/**
|
|
168
|
+
* Run semantic extraction on a set of files using the Anthropic Claude API.
|
|
169
|
+
*
|
|
170
|
+
* Returns an empty ExtractionResult (not an error) when:
|
|
171
|
+
* - No API key is available
|
|
172
|
+
* - The API call fails
|
|
173
|
+
*
|
|
174
|
+
* Only document/paper files benefit from semantic extraction.
|
|
175
|
+
* Code files may be included but the prompt instructs Claude not to re-extract imports.
|
|
176
|
+
*/
|
|
177
|
+
export async function extractSemantic(files, options = {}) {
|
|
178
|
+
const apiKey = options.apiKey ?? process.env['ANTHROPIC_API_KEY'] ?? '';
|
|
179
|
+
if (!apiKey) {
|
|
180
|
+
return { nodes: [], edges: [], hyperedges: [], filesProcessed: 0, fromCache: 0, errors: ['ANTHROPIC_API_KEY not set — semantic extraction skipped'] };
|
|
181
|
+
}
|
|
182
|
+
const model = options.model ?? 'claude-haiku-4-5-20251001';
|
|
183
|
+
const mode = options.mode ?? 'fast';
|
|
184
|
+
const maxTokens = options.maxTokens ?? 8192;
|
|
185
|
+
// BFD packing — targetChunkTokens defaults to 30 000 (~20 avg files × 1500 tok each).
|
|
186
|
+
// Fallback to legacy chunkSize if targetChunkTokens is not set and chunkSize was specified,
|
|
187
|
+
// so callers that relied on chunkSize still get predictable behaviour.
|
|
188
|
+
const targetChunkTokens = options.targetChunkTokens
|
|
189
|
+
?? (options.chunkSize ? options.chunkSize * 1500 : 30_000);
|
|
190
|
+
// Time budget — undefined = no limit (run all chunks)
|
|
191
|
+
const deadline = options.timeBudget ? Date.now() + options.timeBudget : Infinity;
|
|
192
|
+
const allNodes = [];
|
|
193
|
+
const allEdges = [];
|
|
194
|
+
const allHyperedges = [];
|
|
195
|
+
const errors = [];
|
|
196
|
+
let totalInput = 0;
|
|
197
|
+
let totalOutput = 0;
|
|
198
|
+
// Pack files into token-aware chunks using BFD (replaces fixed equal-size slicing)
|
|
199
|
+
const chunks = packChunksBFD(files, targetChunkTokens);
|
|
200
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
201
|
+
// Time budget enforcement — mirrors autoresearch's 5-min wall-clock limit
|
|
202
|
+
if (Date.now() > deadline) {
|
|
203
|
+
errors.push(`Time budget (${options.timeBudget}ms) exceeded after chunk ${i}/${chunks.length} — partial results returned`);
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
const chunk = chunks[i];
|
|
207
|
+
const prompt = buildPrompt(chunk, mode, i + 1, chunks.length);
|
|
208
|
+
try {
|
|
209
|
+
const { text, inputTokens, outputTokens } = await callClaude(prompt, apiKey, model, maxTokens);
|
|
210
|
+
totalInput += inputTokens;
|
|
211
|
+
totalOutput += outputTokens;
|
|
212
|
+
const parsed = parseChunkResult(text, chunk);
|
|
213
|
+
allNodes.push(...parsed.nodes);
|
|
214
|
+
allEdges.push(...parsed.edges);
|
|
215
|
+
allHyperedges.push(...parsed.hyperedges);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
errors.push(`Chunk ${i + 1}/${chunks.length} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Deduplicate nodes by id
|
|
222
|
+
const seenNodeIds = new Set();
|
|
223
|
+
const dedupedNodes = allNodes.filter((n) => {
|
|
224
|
+
if (seenNodeIds.has(n.id))
|
|
225
|
+
return false;
|
|
226
|
+
seenNodeIds.add(n.id);
|
|
227
|
+
return true;
|
|
228
|
+
});
|
|
229
|
+
// Attach token totals as extra fields for report generation
|
|
230
|
+
const result = {
|
|
231
|
+
nodes: dedupedNodes,
|
|
232
|
+
edges: allEdges,
|
|
233
|
+
hyperedges: allHyperedges,
|
|
234
|
+
filesProcessed: files.length,
|
|
235
|
+
fromCache: 0,
|
|
236
|
+
errors,
|
|
237
|
+
inputTokens: totalInput,
|
|
238
|
+
outputTokens: totalOutput,
|
|
239
|
+
};
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../../src/extract/semantic.ts"],"names":[],"mappings":"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"}
|