speccore 6.89.0 → 6.90.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.
Files changed (39) hide show
  1. package/dist/cli.js +15 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/code-index.d.ts +1 -0
  4. package/dist/commands/code-index.d.ts.map +1 -1
  5. package/dist/commands/code-index.js +10 -0
  6. package/dist/commands/code-index.js.map +1 -1
  7. package/dist/commands/knowledge.d.ts +12 -0
  8. package/dist/commands/knowledge.d.ts.map +1 -1
  9. package/dist/commands/knowledge.js +80 -0
  10. package/dist/commands/knowledge.js.map +1 -1
  11. package/dist/core/code-graph/builder.d.ts +6 -0
  12. package/dist/core/code-graph/builder.d.ts.map +1 -0
  13. package/dist/core/code-graph/builder.js +155 -0
  14. package/dist/core/code-graph/builder.js.map +1 -0
  15. package/dist/core/code-graph/index.d.ts +25 -0
  16. package/dist/core/code-graph/index.d.ts.map +1 -0
  17. package/dist/core/code-graph/index.js +125 -0
  18. package/dist/core/code-graph/index.js.map +1 -0
  19. package/dist/core/code-graph/parser.d.ts +10 -0
  20. package/dist/core/code-graph/parser.d.ts.map +1 -0
  21. package/dist/core/code-graph/parser.js +314 -0
  22. package/dist/core/code-graph/parser.js.map +1 -0
  23. package/dist/core/code-graph/query.d.ts +14 -0
  24. package/dist/core/code-graph/query.d.ts.map +1 -0
  25. package/dist/core/code-graph/query.js +112 -0
  26. package/dist/core/code-graph/query.js.map +1 -0
  27. package/dist/core/code-graph/reporter.d.ts +7 -0
  28. package/dist/core/code-graph/reporter.d.ts.map +1 -0
  29. package/dist/core/code-graph/reporter.js +97 -0
  30. package/dist/core/code-graph/reporter.js.map +1 -0
  31. package/dist/core/code-graph/types.d.ts +60 -0
  32. package/dist/core/code-graph/types.d.ts.map +1 -0
  33. package/dist/core/code-graph/types.js +7 -0
  34. package/dist/core/code-graph/types.js.map +1 -0
  35. package/dist/core/code-graph/visualizer.d.ts +9 -0
  36. package/dist/core/code-graph/visualizer.d.ts.map +1 -0
  37. package/dist/core/code-graph/visualizer.js +97 -0
  38. package/dist/core/code-graph/visualizer.js.map +1 -0
  39. package/package.json +1 -1
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.buildCodeGraphHtml = exports.generateGraphReport = exports.queryGraph = exports.findPath = exports.explainNode = exports.buildCodeGraph = exports.parseProject = void 0;
40
+ exports.buildCodeKnowledgeGraph = buildCodeKnowledgeGraph;
41
+ exports.loadCodeGraph = loadCodeGraph;
42
+ /**
43
+ * Code Knowledge Graph — 统一导出
44
+ * v6.90.0
45
+ */
46
+ __exportStar(require("./types"), exports);
47
+ var parser_1 = require("./parser");
48
+ Object.defineProperty(exports, "parseProject", { enumerable: true, get: function () { return parser_1.parseProject; } });
49
+ var builder_1 = require("./builder");
50
+ Object.defineProperty(exports, "buildCodeGraph", { enumerable: true, get: function () { return builder_1.buildCodeGraph; } });
51
+ var query_1 = require("./query");
52
+ Object.defineProperty(exports, "explainNode", { enumerable: true, get: function () { return query_1.explainNode; } });
53
+ Object.defineProperty(exports, "findPath", { enumerable: true, get: function () { return query_1.findPath; } });
54
+ Object.defineProperty(exports, "queryGraph", { enumerable: true, get: function () { return query_1.queryGraph; } });
55
+ var reporter_1 = require("./reporter");
56
+ Object.defineProperty(exports, "generateGraphReport", { enumerable: true, get: function () { return reporter_1.generateGraphReport; } });
57
+ var visualizer_1 = require("./visualizer");
58
+ Object.defineProperty(exports, "buildCodeGraphHtml", { enumerable: true, get: function () { return visualizer_1.buildCodeGraphHtml; } });
59
+ const path_1 = require("path");
60
+ const fs_extra_1 = require("fs-extra");
61
+ const glob_1 = require("glob");
62
+ const logger_1 = require("../../utils/logger");
63
+ const parser_2 = require("./parser");
64
+ const builder_2 = require("./builder");
65
+ const reporter_2 = require("./reporter");
66
+ const visualizer_2 = require("./visualizer");
67
+ const GRAPH_DIR = '.speccore/code-graph';
68
+ /**
69
+ * 一键构建代码知识图谱,输出三产物
70
+ */
71
+ async function buildCodeKnowledgeGraph(options = {}) {
72
+ const projectRoot = options.projectRoot || process.cwd();
73
+ const projectName = options.projectName || 'Project';
74
+ const scope = options.scope || 'src';
75
+ const scopePath = (0, path_1.join)(projectRoot, scope);
76
+ // 1. 扫描文件
77
+ logger_1.logger.info(`🔍 扫描代码文件: ${scope}`);
78
+ const pattern = (0, path_1.join)(scopePath, '**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs}');
79
+ const files = await (0, glob_1.glob)(pattern, { absolute: true });
80
+ logger_1.logger.info(` 发现 ${files.length} 个文件`);
81
+ // 2. AST 解析
82
+ logger_1.logger.info(`🌳 AST 解析中...`);
83
+ const { nodes, edges, fileCount } = await (0, parser_2.parseProject)(files, projectRoot);
84
+ logger_1.logger.info(` 提取 ${nodes.length} 个节点, ${edges.length} 条边`);
85
+ // 3. 构建图谱
86
+ const graph = (0, builder_2.buildCodeGraph)(nodes, edges, projectName, projectRoot, fileCount);
87
+ logger_1.logger.info(` 社区: ${graph.communities.length} 个 | God nodes: ${graph.godNodes.length} 个`);
88
+ // 4. 输出产物
89
+ const outDir = (0, path_1.join)(projectRoot, GRAPH_DIR);
90
+ await (0, fs_extra_1.ensureDir)(outDir);
91
+ // graph.json
92
+ const jsonPath = (0, path_1.join)(outDir, 'graph.json');
93
+ await (0, fs_extra_1.writeFile)(jsonPath, JSON.stringify(graph, null, 2));
94
+ logger_1.logger.info(` ✅ graph.json`);
95
+ // GRAPH_REPORT.md
96
+ const reportPath = (0, path_1.join)(outDir, 'GRAPH_REPORT.md');
97
+ await (0, fs_extra_1.writeFile)(reportPath, (0, reporter_2.generateGraphReport)(graph));
98
+ logger_1.logger.info(` ✅ GRAPH_REPORT.md`);
99
+ // graph.html
100
+ const htmlPath = (0, path_1.join)(outDir, 'graph.html');
101
+ await (0, fs_extra_1.writeFile)(htmlPath, (0, visualizer_2.buildCodeGraphHtml)(graph));
102
+ logger_1.logger.info(` ✅ graph.html`);
103
+ logger_1.logger.info('');
104
+ logger_1.logger.info(`📊 代码知识图谱已生成: ${outDir}`);
105
+ logger_1.logger.info(` 打开 ${(0, path_1.join)(GRAPH_DIR, 'graph.html')} 查看可视化`);
106
+ return graph;
107
+ }
108
+ /**
109
+ * 加载已存在的 graph.json
110
+ */
111
+ async function loadCodeGraph(projectRoot) {
112
+ const root = projectRoot || process.cwd();
113
+ const jsonPath = (0, path_1.join)(root, GRAPH_DIR, 'graph.json');
114
+ if (!(await (0, fs_extra_1.pathExists)(jsonPath)))
115
+ return null;
116
+ try {
117
+ const { readFile } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
118
+ const raw = await readFile(jsonPath, 'utf-8');
119
+ return JSON.parse(raw);
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/code-graph/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CodeNode, CodeEdge } from './types';
2
+ /**
3
+ * 扫描目录,解析所有 TS/JS 文件
4
+ */
5
+ export declare function parseProject(filePaths: string[], projectRoot: string): Promise<{
6
+ nodes: CodeNode[];
7
+ edges: CodeEdge[];
8
+ fileCount: number;
9
+ }>;
10
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/core/code-graph/parser.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAc,MAAM,SAAS,CAAC;AAoR9D;;GAEG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BtE"}
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseProject = parseProject;
37
+ /**
38
+ * Code Knowledge Graph — AST 解析器
39
+ * v6.90.0: 基于 TypeScript 编译器 API 的本地确定性解析
40
+ *
41
+ * 零 LLM Token 消耗,代码不出本机。
42
+ */
43
+ const ts = __importStar(require("typescript"));
44
+ const fs_1 = require("fs");
45
+ const path_1 = require("path");
46
+ const SCRIPT_TARGET = ts.ScriptTarget.ES2020;
47
+ const SCRIPT_KIND_TS = ts.ScriptKind.TS;
48
+ const SCRIPT_KIND_JS = ts.ScriptKind.JS;
49
+ function isTsOrJs(filePath) {
50
+ return /\.(ts|tsx|js|jsx|mts|cts|mjs|cjs)$/i.test(filePath);
51
+ }
52
+ function getScriptKind(filePath) {
53
+ if (/\.tsx$/i.test(filePath))
54
+ return ts.ScriptKind.TSX;
55
+ if (/\.jsx$/i.test(filePath))
56
+ return ts.ScriptKind.JSX;
57
+ if (/\.(js|mjs|cjs)$/i.test(filePath))
58
+ return SCRIPT_KIND_JS;
59
+ return SCRIPT_KIND_TS;
60
+ }
61
+ function makeNodeId(filePath, name) {
62
+ return `${filePath}::${name}`;
63
+ }
64
+ function getNodePosition(node, sourceFile) {
65
+ const pos = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
66
+ return { line: pos.line + 1, column: pos.character + 1 };
67
+ }
68
+ function getSnippet(node, sourceFile) {
69
+ const text = node.getText(sourceFile);
70
+ return text.slice(0, 200).replace(/\s+/g, ' ').trim();
71
+ }
72
+ /**
73
+ * 解析单个文件,提取节点和边
74
+ */
75
+ function parseSingleFile(filePath, projectRoot) {
76
+ if (!isTsOrJs(filePath))
77
+ return null;
78
+ let content;
79
+ try {
80
+ content = (0, fs_1.readFileSync)(filePath, 'utf-8');
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ const relPath = (0, path_1.relative)(projectRoot, filePath);
86
+ const sourceFile = ts.createSourceFile(filePath, content, SCRIPT_TARGET, true, getScriptKind(filePath));
87
+ const nodes = [];
88
+ const edges = [];
89
+ const exports = [];
90
+ const localNames = new Set();
91
+ // 文件级 module 节点
92
+ const moduleId = relPath;
93
+ nodes.push({
94
+ id: moduleId,
95
+ name: (0, path_1.basename)(relPath),
96
+ type: 'module',
97
+ filePath: relPath,
98
+ line: 1,
99
+ column: 1,
100
+ });
101
+ function addNode(name, type, node) {
102
+ const pos = getNodePosition(node, sourceFile);
103
+ const id = makeNodeId(relPath, name);
104
+ const n = {
105
+ id,
106
+ name,
107
+ type,
108
+ filePath: relPath,
109
+ line: pos.line,
110
+ column: pos.column,
111
+ snippet: getSnippet(node, sourceFile),
112
+ };
113
+ nodes.push(n);
114
+ localNames.add(name);
115
+ return n;
116
+ }
117
+ function addEdge(source, target, type, confidence, line) {
118
+ edges.push({ source, target, type, confidence, filePath: relPath, line });
119
+ }
120
+ function visit(node) {
121
+ // 1. Import declarations → module dependency edges
122
+ if (ts.isImportDeclaration(node)) {
123
+ const moduleName = node.moduleSpecifier?.text;
124
+ if (moduleName) {
125
+ // Named imports / namespace imports
126
+ const importClause = node.importClause;
127
+ if (importClause) {
128
+ if (importClause.namedBindings) {
129
+ if (ts.isNamedImports(importClause.namedBindings)) {
130
+ for (const elem of importClause.namedBindings.elements) {
131
+ const name = elem.name.text;
132
+ addNode(name, 'variable', elem); // imported symbol as a node
133
+ addEdge(makeNodeId(relPath, name), moduleName, 'imports', 'EXTRACTED', getNodePosition(node, sourceFile).line);
134
+ }
135
+ }
136
+ else if (ts.isNamespaceImport(importClause.namedBindings)) {
137
+ const name = importClause.namedBindings.name.text;
138
+ addNode(name, 'variable', importClause.namedBindings);
139
+ addEdge(makeNodeId(relPath, name), moduleName, 'imports', 'EXTRACTED', getNodePosition(node, sourceFile).line);
140
+ }
141
+ }
142
+ if (importClause.name) {
143
+ const name = importClause.name.text;
144
+ addNode(name, 'variable', importClause);
145
+ addEdge(makeNodeId(relPath, name), moduleName, 'imports', 'EXTRACTED', getNodePosition(node, sourceFile).line);
146
+ }
147
+ }
148
+ else {
149
+ // side-effect import: import "module"
150
+ addEdge(relPath, moduleName, 'imports', 'EXTRACTED', getNodePosition(node, sourceFile).line);
151
+ }
152
+ }
153
+ }
154
+ // 2. Export declarations
155
+ if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {
156
+ for (const elem of node.exportClause.elements) {
157
+ exports.push(elem.name.text);
158
+ }
159
+ }
160
+ if (ts.isExportAssignment(node) && !node.isExportEquals) {
161
+ // export default <expr>
162
+ const expr = node.expression;
163
+ if (ts.isIdentifier(expr)) {
164
+ exports.push(`default:${expr.text}`);
165
+ }
166
+ }
167
+ // 3. Function declarations
168
+ if (ts.isFunctionDeclaration(node) && node.name) {
169
+ addNode(node.name.text, 'function', node);
170
+ }
171
+ // 4. Class declarations
172
+ if (ts.isClassDeclaration(node) && node.name) {
173
+ const className = node.name.text;
174
+ const classId = makeNodeId(relPath, className);
175
+ addNode(className, 'class', node);
176
+ // extends
177
+ if (node.heritageClauses) {
178
+ for (const clause of node.heritageClauses) {
179
+ if (clause.token === ts.SyntaxKind.ExtendsKeyword) {
180
+ for (const type of clause.types) {
181
+ const parentName = type.expression.getText(sourceFile);
182
+ addEdge(classId, parentName, 'extends', 'EXTRACTED', getNodePosition(clause, sourceFile).line);
183
+ }
184
+ }
185
+ if (clause.token === ts.SyntaxKind.ImplementsKeyword) {
186
+ for (const type of clause.types) {
187
+ const ifaceName = type.expression.getText(sourceFile);
188
+ addEdge(classId, ifaceName, 'implements', 'EXTRACTED', getNodePosition(clause, sourceFile).line);
189
+ }
190
+ }
191
+ }
192
+ }
193
+ // methods and properties
194
+ for (const member of node.members) {
195
+ if (ts.isMethodDeclaration(member) && member.name) {
196
+ const methodName = member.name.getText(sourceFile);
197
+ const methodId = makeNodeId(relPath, `${className}.${methodName}`);
198
+ nodes.push({
199
+ id: methodId,
200
+ name: methodName,
201
+ type: 'method',
202
+ filePath: relPath,
203
+ line: getNodePosition(member, sourceFile).line,
204
+ column: getNodePosition(member, sourceFile).column,
205
+ snippet: getSnippet(member, sourceFile),
206
+ });
207
+ localNames.add(methodName);
208
+ addEdge(classId, methodId, 'contains', 'EXTRACTED', getNodePosition(member, sourceFile).line);
209
+ }
210
+ if (ts.isPropertyDeclaration(member) && member.name) {
211
+ const propName = member.name.getText(sourceFile);
212
+ const propId = makeNodeId(relPath, `${className}.${propName}`);
213
+ nodes.push({
214
+ id: propId,
215
+ name: propName,
216
+ type: 'property',
217
+ filePath: relPath,
218
+ line: getNodePosition(member, sourceFile).line,
219
+ column: getNodePosition(member, sourceFile).column,
220
+ snippet: getSnippet(member, sourceFile),
221
+ });
222
+ addEdge(classId, propId, 'contains', 'EXTRACTED', getNodePosition(member, sourceFile).line);
223
+ }
224
+ }
225
+ }
226
+ // 5. Interface declarations
227
+ if (ts.isInterfaceDeclaration(node) && node.name) {
228
+ const ifaceName = node.name.text;
229
+ const ifaceId = makeNodeId(relPath, ifaceName);
230
+ addNode(ifaceName, 'interface', node);
231
+ if (node.heritageClauses) {
232
+ for (const clause of node.heritageClauses) {
233
+ for (const type of clause.types) {
234
+ const parentName = type.expression.getText(sourceFile);
235
+ addEdge(ifaceId, parentName, 'extends', 'EXTRACTED', getNodePosition(clause, sourceFile).line);
236
+ }
237
+ }
238
+ }
239
+ }
240
+ // 6. Type alias declarations
241
+ if (ts.isTypeAliasDeclaration(node) && node.name) {
242
+ addNode(node.name.text, 'type', node);
243
+ }
244
+ // 7. Enum declarations
245
+ if (ts.isEnumDeclaration(node) && node.name) {
246
+ addNode(node.name.text, 'enum', node);
247
+ }
248
+ // 8. Variable declarations (catch arrow functions / function expressions)
249
+ if (ts.isVariableDeclaration(node) && node.name) {
250
+ const varName = node.name.getText(sourceFile);
251
+ const isFunctionLike = node.initializer &&
252
+ (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer));
253
+ addNode(varName, isFunctionLike ? 'function' : 'variable', node);
254
+ }
255
+ // 9. Call expressions → same-file call edges
256
+ if (ts.isCallExpression(node)) {
257
+ const expr = node.expression;
258
+ let calleeName;
259
+ if (ts.isIdentifier(expr)) {
260
+ calleeName = expr.text;
261
+ }
262
+ else if (ts.isPropertyAccessExpression(expr)) {
263
+ // obj.method() or Class.method()
264
+ calleeName = expr.name.text;
265
+ // Try to get full chain like "fs.readFileSync"
266
+ const fullChain = expr.getText(sourceFile);
267
+ if (fullChain.includes('.')) {
268
+ calleeName = fullChain;
269
+ }
270
+ }
271
+ if (calleeName && localNames.has(calleeName)) {
272
+ // 简单推断:如果调用的是本文件已知的名称,标记为 EXTRACTED
273
+ const confidence = 'EXTRACTED';
274
+ addEdge(moduleId, makeNodeId(relPath, calleeName), 'calls', confidence, getNodePosition(node, sourceFile).line);
275
+ }
276
+ else if (calleeName) {
277
+ // INFERRED: could be imported or built-in
278
+ addEdge(moduleId, calleeName, 'calls', 'INFERRED', getNodePosition(node, sourceFile).line);
279
+ }
280
+ }
281
+ ts.forEachChild(node, visit);
282
+ }
283
+ visit(sourceFile);
284
+ return { filePath: relPath, nodes, edges, exports };
285
+ }
286
+ /**
287
+ * 扫描目录,解析所有 TS/JS 文件
288
+ */
289
+ async function parseProject(filePaths, projectRoot) {
290
+ const allNodes = [];
291
+ const allEdges = [];
292
+ let fileCount = 0;
293
+ for (const fp of filePaths) {
294
+ const parsed = parseSingleFile(fp, projectRoot);
295
+ if (parsed) {
296
+ allNodes.push(...parsed.nodes);
297
+ allEdges.push(...parsed.edges);
298
+ fileCount++;
299
+ }
300
+ }
301
+ // 去重节点(按 id)
302
+ const nodeMap = new Map();
303
+ for (const n of allNodes) {
304
+ if (!nodeMap.has(n.id)) {
305
+ nodeMap.set(n.id, n);
306
+ }
307
+ }
308
+ return {
309
+ nodes: Array.from(nodeMap.values()),
310
+ edges: allEdges,
311
+ fileCount,
312
+ };
313
+ }
314
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/core/code-graph/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Code Knowledge Graph — 查询引擎
3
+ * v6.90.0
4
+ *
5
+ * 支持 explain / path / query 三种查询模式
6
+ */
7
+ import type { CodeGraph, GraphQueryResult } from './types';
8
+ /** explain: 解释一个节点及其直接连接 */
9
+ export declare function explainNode(graph: CodeGraph, nameOrId: string): GraphQueryResult;
10
+ /** path: BFS 最短路径 */
11
+ export declare function findPath(graph: CodeGraph, from: string, to: string): GraphQueryResult;
12
+ /** query: 关键词匹配返回子图(简化版) */
13
+ export declare function queryGraph(graph: CodeGraph, question: string): GraphQueryResult;
14
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/core/code-graph/query.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAsB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO/E,4BAA4B;AAC5B,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAoBhF;AAED,qBAAqB;AACrB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAqDrF;AAED,4BAA4B;AAC5B,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAqC/E"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.explainNode = explainNode;
4
+ exports.findPath = findPath;
5
+ exports.queryGraph = queryGraph;
6
+ /** 根据名称或 id 查找节点 */
7
+ function findNode(graph, nameOrId) {
8
+ return graph.nodes.find(n => n.id === nameOrId || n.name === nameOrId);
9
+ }
10
+ /** explain: 解释一个节点及其直接连接 */
11
+ function explainNode(graph, nameOrId) {
12
+ const target = findNode(graph, nameOrId);
13
+ if (!target) {
14
+ return { nodes: [], edges: [] };
15
+ }
16
+ const relatedEdges = graph.edges.filter(e => e.source === target.id || e.target === target.id);
17
+ const relatedNodeIds = new Set([target.id]);
18
+ for (const e of relatedEdges) {
19
+ relatedNodeIds.add(e.source);
20
+ relatedNodeIds.add(e.target);
21
+ }
22
+ return {
23
+ nodes: graph.nodes.filter(n => relatedNodeIds.has(n.id)),
24
+ edges: relatedEdges,
25
+ };
26
+ }
27
+ /** path: BFS 最短路径 */
28
+ function findPath(graph, from, to) {
29
+ const start = findNode(graph, from);
30
+ const end = findNode(graph, to);
31
+ if (!start || !end) {
32
+ return { nodes: [], edges: [] };
33
+ }
34
+ // BFS
35
+ const queue = [start.id];
36
+ const visited = new Set([start.id]);
37
+ const parent = new Map();
38
+ while (queue.length > 0) {
39
+ const current = queue.shift();
40
+ if (current === end.id)
41
+ break;
42
+ for (const edge of graph.edges) {
43
+ let neighbor;
44
+ if (edge.source === current)
45
+ neighbor = edge.target;
46
+ else if (edge.target === current)
47
+ neighbor = edge.source;
48
+ if (neighbor && !visited.has(neighbor)) {
49
+ visited.add(neighbor);
50
+ parent.set(neighbor, { node: current, edge });
51
+ queue.push(neighbor);
52
+ }
53
+ }
54
+ }
55
+ if (!parent.has(end.id) && start.id !== end.id) {
56
+ return { nodes: [start, end], edges: [] };
57
+ }
58
+ // Reconstruct path
59
+ const pathNodes = [];
60
+ const pathEdges = [];
61
+ let curr = end.id;
62
+ while (curr !== start.id) {
63
+ pathNodes.unshift(curr);
64
+ const p = parent.get(curr);
65
+ if (!p)
66
+ break;
67
+ pathEdges.unshift(p.edge);
68
+ curr = p.node;
69
+ }
70
+ pathNodes.unshift(start.id);
71
+ const nodeSet = new Set(pathNodes);
72
+ return {
73
+ nodes: graph.nodes.filter(n => nodeSet.has(n.id)),
74
+ edges: pathEdges,
75
+ path: pathNodes,
76
+ };
77
+ }
78
+ /** query: 关键词匹配返回子图(简化版) */
79
+ function queryGraph(graph, question) {
80
+ const keywords = question.toLowerCase()
81
+ .replace(/[^\u4e00-\u9fa5a-z0-9\s]/g, ' ')
82
+ .split(/\s+/)
83
+ .filter(w => w.length >= 2);
84
+ if (keywords.length === 0) {
85
+ return { nodes: [], edges: [] };
86
+ }
87
+ const scoredNodes = graph.nodes.map(n => {
88
+ const text = `${n.name} ${n.type} ${n.filePath} ${n.snippet || ''}`.toLowerCase();
89
+ let score = 0;
90
+ for (const kw of keywords) {
91
+ if (n.name.toLowerCase().includes(kw))
92
+ score += 5;
93
+ else if (text.includes(kw))
94
+ score += 1;
95
+ }
96
+ return { node: n, score };
97
+ }).filter(s => s.score > 0)
98
+ .sort((a, b) => b.score - a.score)
99
+ .slice(0, 20);
100
+ const matchedIds = new Set(scoredNodes.map(s => s.node.id));
101
+ // 包含匹配节点的一阶邻居
102
+ const relatedEdges = graph.edges.filter(e => matchedIds.has(e.source) || matchedIds.has(e.target));
103
+ for (const e of relatedEdges) {
104
+ matchedIds.add(e.source);
105
+ matchedIds.add(e.target);
106
+ }
107
+ return {
108
+ nodes: graph.nodes.filter(n => matchedIds.has(n.id)),
109
+ edges: relatedEdges,
110
+ };
111
+ }
112
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/core/code-graph/query.ts"],"names":[],"mappings":";;AAcA,kCAoBC;AAGD,4BAqDC;AAGD,gCAqCC;AA1HD,oBAAoB;AACpB,SAAS,QAAQ,CAAC,KAAgB,EAAE,QAAgB;IAClD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED,4BAA4B;AAC5B,SAAgB,WAAW,CAAC,KAAgB,EAAE,QAAgB;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CACtD,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,KAAK,EAAE,YAAY;KACpB,CAAC;AACJ,CAAC;AAED,qBAAqB;AACrB,SAAgB,QAAQ,CAAC,KAAgB,EAAE,IAAY,EAAE,EAAU;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,MAAM;IACN,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4C,CAAC;IAEnE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC/B,IAAI,OAAO,KAAK,GAAG,CAAC,EAAE;YAAE,MAAM;QAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,QAA4B,CAAC;YACjC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;gBAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;iBAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;gBAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;YAEzD,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;QAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,mBAAmB;IACnB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,IAAI,IAAI,GAAW,GAAG,CAAC,EAAE,CAAC;IAE1B,OAAO,IAAI,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC;YAAE,MAAM;QACd,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjD,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;KAChB,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,SAAgB,UAAU,CAAC,KAAgB,EAAE,QAAgB;IAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE;SACpC,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAE9B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;QAClF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;iBAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;SACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5D,cAAc;IACd,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAC1D,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpD,KAAK,EAAE,YAAY;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Code Knowledge Graph — GRAPH_REPORT.md 生成器
3
+ * v6.90.0
4
+ */
5
+ import type { CodeGraph } from './types';
6
+ export declare function generateGraphReport(graph: CodeGraph): string;
7
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../src/core/code-graph/reporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CA0F5D"}