speccore 6.89.0 → 6.91.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 (51) hide show
  1. package/dist/cli.js +16 -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/commands/pattern.d.ts +2 -0
  12. package/dist/commands/pattern.d.ts.map +1 -1
  13. package/dist/commands/pattern.js +2 -0
  14. package/dist/commands/pattern.js.map +1 -1
  15. package/dist/core/code-graph/builder.d.ts +6 -0
  16. package/dist/core/code-graph/builder.d.ts.map +1 -0
  17. package/dist/core/code-graph/builder.js +155 -0
  18. package/dist/core/code-graph/builder.js.map +1 -0
  19. package/dist/core/code-graph/index.d.ts +25 -0
  20. package/dist/core/code-graph/index.d.ts.map +1 -0
  21. package/dist/core/code-graph/index.js +198 -0
  22. package/dist/core/code-graph/index.js.map +1 -0
  23. package/dist/core/code-graph/multimodal.d.ts +49 -0
  24. package/dist/core/code-graph/multimodal.d.ts.map +1 -0
  25. package/dist/core/code-graph/multimodal.js +270 -0
  26. package/dist/core/code-graph/multimodal.js.map +1 -0
  27. package/dist/core/code-graph/parser.d.ts +10 -0
  28. package/dist/core/code-graph/parser.d.ts.map +1 -0
  29. package/dist/core/code-graph/parser.js +314 -0
  30. package/dist/core/code-graph/parser.js.map +1 -0
  31. package/dist/core/code-graph/query.d.ts +14 -0
  32. package/dist/core/code-graph/query.d.ts.map +1 -0
  33. package/dist/core/code-graph/query.js +112 -0
  34. package/dist/core/code-graph/query.js.map +1 -0
  35. package/dist/core/code-graph/reporter.d.ts +7 -0
  36. package/dist/core/code-graph/reporter.d.ts.map +1 -0
  37. package/dist/core/code-graph/reporter.js +97 -0
  38. package/dist/core/code-graph/reporter.js.map +1 -0
  39. package/dist/core/code-graph/types.d.ts +60 -0
  40. package/dist/core/code-graph/types.d.ts.map +1 -0
  41. package/dist/core/code-graph/types.js +7 -0
  42. package/dist/core/code-graph/types.js.map +1 -0
  43. package/dist/core/code-graph/visualizer.d.ts +9 -0
  44. package/dist/core/code-graph/visualizer.d.ts.map +1 -0
  45. package/dist/core/code-graph/visualizer.js +97 -0
  46. package/dist/core/code-graph/visualizer.js.map +1 -0
  47. package/dist/core/prompt-builder.d.ts +1 -0
  48. package/dist/core/prompt-builder.d.ts.map +1 -1
  49. package/dist/core/prompt-builder.js +43 -0
  50. package/dist/core/prompt-builder.js.map +1 -1
  51. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/core/code-graph/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Code Knowledge Graph — 统一导出
3
+ * v6.90.0
4
+ */
5
+ export * from './types';
6
+ export { parseProject } from './parser';
7
+ export { buildCodeGraph } from './builder';
8
+ export { explainNode, findPath, queryGraph } from './query';
9
+ export { generateGraphReport } from './reporter';
10
+ export { buildCodeGraphHtml } from './visualizer';
11
+ import type { CodeGraph } from './types';
12
+ export interface BuildGraphOptions {
13
+ scope?: string;
14
+ projectRoot?: string;
15
+ projectName?: string;
16
+ }
17
+ /**
18
+ * 一键构建代码知识图谱,输出三产物
19
+ */
20
+ export declare function buildCodeKnowledgeGraph(options?: BuildGraphOptions): Promise<CodeGraph>;
21
+ /**
22
+ * 加载已存在的 graph.json
23
+ */
24
+ export declare function loadCodeGraph(projectRoot?: string): Promise<CodeGraph | null>;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/code-graph/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAWlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzC,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC,CA6DjG;AA6DD;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAWnF"}
@@ -0,0 +1,198 @@
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 multimodal_1 = require("./multimodal");
68
+ const GRAPH_DIR = '.speccore/code-graph';
69
+ /**
70
+ * 一键构建代码知识图谱,输出三产物
71
+ */
72
+ async function buildCodeKnowledgeGraph(options = {}) {
73
+ const projectRoot = options.projectRoot || process.cwd();
74
+ const projectName = options.projectName || 'Project';
75
+ const scope = options.scope || 'src';
76
+ const scopePath = (0, path_1.join)(projectRoot, scope);
77
+ // 1. 扫描文件
78
+ logger_1.logger.info(`🔍 扫描代码文件: ${scope}`);
79
+ const pattern = (0, path_1.join)(scopePath, '**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs}');
80
+ const files = await (0, glob_1.glob)(pattern, { absolute: true });
81
+ logger_1.logger.info(` 发现 ${files.length} 个文件`);
82
+ // 2. AST 解析
83
+ logger_1.logger.info(`🌳 AST 解析中...`);
84
+ const { nodes, edges, fileCount } = await (0, parser_2.parseProject)(files, projectRoot);
85
+ logger_1.logger.info(` 提取 ${nodes.length} 个节点, ${edges.length} 条边`);
86
+ // 2.5. v6.91.0+: 多模态节点(API Contract + SQL Schema)
87
+ logger_1.logger.info(`🌐 扫描 API Contract & SQL Schema...`);
88
+ const { nodes: mmNodes, edges: mmEdges } = await (0, multimodal_1.extractMultimodalNodes)(projectRoot, nodes);
89
+ if (mmNodes.length > 0) {
90
+ logger_1.logger.info(` 发现 ${mmNodes.length} 个多模态节点, ${mmEdges.length} 条关联边`);
91
+ nodes.push(...mmNodes);
92
+ edges.push(...mmEdges);
93
+ }
94
+ // 3. 构建图谱
95
+ const graph = (0, builder_2.buildCodeGraph)(nodes, edges, projectName, projectRoot, fileCount);
96
+ logger_1.logger.info(` 社区: ${graph.communities.length} 个 | God nodes: ${graph.godNodes.length} 个`);
97
+ // 4. 输出产物
98
+ const outDir = (0, path_1.join)(projectRoot, GRAPH_DIR);
99
+ await (0, fs_extra_1.ensureDir)(outDir);
100
+ // graph.json
101
+ const jsonPath = (0, path_1.join)(outDir, 'graph.json');
102
+ await (0, fs_extra_1.writeFile)(jsonPath, JSON.stringify(graph, null, 2));
103
+ logger_1.logger.info(` ✅ graph.json`);
104
+ // GRAPH_REPORT.md
105
+ const reportPath = (0, path_1.join)(outDir, 'GRAPH_REPORT.md');
106
+ await (0, fs_extra_1.writeFile)(reportPath, (0, reporter_2.generateGraphReport)(graph));
107
+ logger_1.logger.info(` ✅ GRAPH_REPORT.md`);
108
+ // graph.html
109
+ const htmlPath = (0, path_1.join)(outDir, 'graph.html');
110
+ await (0, fs_extra_1.writeFile)(htmlPath, (0, visualizer_2.buildCodeGraphHtml)(graph));
111
+ logger_1.logger.info(` ✅ graph.html`);
112
+ // v6.91.0+: MODULE_MAP.json — 社区检测结果映射
113
+ const moduleMapPath = (0, path_1.join)(outDir, 'MODULE_MAP.json');
114
+ const moduleMap = buildModuleMap(graph);
115
+ await (0, fs_extra_1.writeFile)(moduleMapPath, JSON.stringify(moduleMap, null, 2));
116
+ logger_1.logger.info(` ✅ MODULE_MAP.json`);
117
+ logger_1.logger.info('');
118
+ logger_1.logger.info(`📊 代码知识图谱已生成: ${outDir}`);
119
+ logger_1.logger.info(` 打开 ${(0, path_1.join)(GRAPH_DIR, 'graph.html')} 查看可视化`);
120
+ return graph;
121
+ }
122
+ /**
123
+ * 从社区检测结果构建 MODULE_MAP
124
+ * v6.91.0+
125
+ */
126
+ function buildModuleMap(graph) {
127
+ const communities = graph.communities.map(comm => {
128
+ const nodeDetails = comm.nodes
129
+ .map(id => graph.nodes.find(n => n.id === id))
130
+ .filter(Boolean);
131
+ const filePaths = [...new Set(nodeDetails.map(n => n.filePath))];
132
+ // 该社区内的 god nodes
133
+ const commGodNodes = comm.nodes.filter(id => graph.godNodes.includes(id));
134
+ // 该社区的桥梁节点(连接到其他社区的节点)
135
+ const bridgeNodes = new Set();
136
+ for (const e of graph.edges) {
137
+ if (e.source === e.target)
138
+ continue;
139
+ const s = graph.nodes.find(n => n.id === e.source);
140
+ const t = graph.nodes.find(n => n.id === e.target);
141
+ if (s && t && s.community !== t.community) {
142
+ if (s.community === comm.id)
143
+ bridgeNodes.add(s.id);
144
+ if (t.community === comm.id)
145
+ bridgeNodes.add(t.id);
146
+ }
147
+ }
148
+ return {
149
+ id: comm.id,
150
+ label: comm.label,
151
+ nodeCount: comm.nodes.length,
152
+ filePaths,
153
+ density: Math.round(comm.density * 100) / 100,
154
+ godNodes: commGodNodes,
155
+ bridges: [...bridgeNodes],
156
+ };
157
+ });
158
+ const crossCommunityEdges = graph.edges.filter(e => {
159
+ const s = graph.nodes.find(n => n.id === e.source);
160
+ const t = graph.nodes.find(n => n.id === e.target);
161
+ return s && t && s.community !== t.community;
162
+ }).map(e => ({
163
+ source: e.source,
164
+ target: e.target,
165
+ type: e.type,
166
+ confidence: e.confidence,
167
+ }));
168
+ return {
169
+ generatedAt: new Date().toISOString(),
170
+ projectName: graph.metadata.projectName,
171
+ summary: {
172
+ totalCommunities: communities.length,
173
+ totalNodes: graph.metadata.totalNodes,
174
+ totalEdges: graph.metadata.totalEdges,
175
+ crossCommunityEdges: crossCommunityEdges.length,
176
+ },
177
+ communities,
178
+ crossCommunityEdges: crossCommunityEdges.slice(0, 50),
179
+ };
180
+ }
181
+ /**
182
+ * 加载已存在的 graph.json
183
+ */
184
+ async function loadCodeGraph(projectRoot) {
185
+ const root = projectRoot || process.cwd();
186
+ const jsonPath = (0, path_1.join)(root, GRAPH_DIR, 'graph.json');
187
+ if (!(await (0, fs_extra_1.pathExists)(jsonPath)))
188
+ return null;
189
+ try {
190
+ const { readFile } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
191
+ const raw = await readFile(jsonPath, 'utf-8');
192
+ return JSON.parse(raw);
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ }
198
+ //# 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,49 @@
1
+ import type { CodeNode, CodeEdge } from './types';
2
+ interface ApiEndpoint {
3
+ path: string;
4
+ method: string;
5
+ summary?: string;
6
+ operationId?: string;
7
+ tags?: string[];
8
+ }
9
+ /**
10
+ * 扫描项目中的 API_CONTRACT.yaml / openapi.yaml
11
+ */
12
+ export declare function scanApiContracts(projectRoot: string): Promise<ApiEndpoint[]>;
13
+ /**
14
+ * 将 API 端点转为图谱节点
15
+ */
16
+ export declare function apiEndpointsToNodes(endpoints: ApiEndpoint[]): CodeNode[];
17
+ interface DbTable {
18
+ name: string;
19
+ columns: string[];
20
+ sourceFile: string;
21
+ }
22
+ /**
23
+ * 扫描项目中的 .sql 文件和 TypeORM entity 文件
24
+ */
25
+ export declare function scanSqlSchemas(projectRoot: string): Promise<DbTable[]>;
26
+ /**
27
+ * 将数据库表转为图谱节点
28
+ */
29
+ export declare function dbTablesToNodes(tables: DbTable[]): CodeNode[];
30
+ /**
31
+ * 将 API 端点与代码中的 handler/controller/service 关联
32
+ * 策略:operationId / path 片段与函数/类名匹配
33
+ */
34
+ export declare function linkApiToCode(apiNodes: CodeNode[], codeNodes: CodeNode[]): CodeEdge[];
35
+ /**
36
+ * 将数据库表与代码中的 repository/model/entity 关联
37
+ * 策略:表名与类名/变量名匹配
38
+ */
39
+ export declare function linkSchemaToCode(dbNodes: CodeNode[], codeNodes: CodeNode[]): CodeEdge[];
40
+ export interface MultimodalResult {
41
+ nodes: CodeNode[];
42
+ edges: CodeEdge[];
43
+ }
44
+ /**
45
+ * 扫描并解析项目中的 API Contract 和 SQL Schema,返回图谱节点和边
46
+ */
47
+ export declare function extractMultimodalNodes(projectRoot: string, codeNodes: CodeNode[]): Promise<MultimodalResult>;
48
+ export {};
49
+ //# sourceMappingURL=multimodal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.d.ts","sourceRoot":"","sources":["../../../src/core/code-graph/multimodal.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIlD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA0ClF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CASxE;AAID,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAsB5E;AA+BD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAS7D;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAAE,EACpB,SAAS,EAAE,QAAQ,EAAE,GACpB,QAAQ,EAAE,CAqCZ;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,QAAQ,EAAE,EACnB,SAAS,EAAE,QAAQ,EAAE,GACpB,QAAQ,EAAE,CAyCZ;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAqB3B"}
@@ -0,0 +1,270 @@
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.scanApiContracts = scanApiContracts;
37
+ exports.apiEndpointsToNodes = apiEndpointsToNodes;
38
+ exports.scanSqlSchemas = scanSqlSchemas;
39
+ exports.dbTablesToNodes = dbTablesToNodes;
40
+ exports.linkApiToCode = linkApiToCode;
41
+ exports.linkSchemaToCode = linkSchemaToCode;
42
+ exports.extractMultimodalNodes = extractMultimodalNodes;
43
+ /**
44
+ * Code Knowledge Graph — 多模态解析器
45
+ * v6.91.0: 将 API_CONTRACT + SQL Schema 纳入图谱
46
+ */
47
+ const path_1 = require("path");
48
+ const fs_extra_1 = require("fs-extra");
49
+ const glob_1 = require("glob");
50
+ const yaml = __importStar(require("js-yaml"));
51
+ /**
52
+ * 扫描项目中的 API_CONTRACT.yaml / openapi.yaml
53
+ */
54
+ async function scanApiContracts(projectRoot) {
55
+ const results = [];
56
+ // 可能的文件位置
57
+ const candidates = [
58
+ (0, path_1.join)(projectRoot, '.speccore', 'API_CONTRACT.yaml'),
59
+ (0, path_1.join)(projectRoot, '.speccore', 'api-contract.yaml'),
60
+ (0, path_1.join)(projectRoot, 'API_CONTRACT.yaml'),
61
+ (0, path_1.join)(projectRoot, 'openapi.yaml'),
62
+ (0, path_1.join)(projectRoot, 'openapi.yml'),
63
+ ];
64
+ // 也扫描迭代目录
65
+ const iterDirs = await (0, glob_1.glob)((0, path_1.join)(projectRoot, 'Iteration-*/_shared/API_CONTRACT.yaml'));
66
+ candidates.push(...iterDirs);
67
+ for (const filePath of candidates) {
68
+ if (!(await (0, fs_extra_1.pathExists)(filePath)))
69
+ continue;
70
+ try {
71
+ const content = await (0, fs_extra_1.readFile)(filePath, 'utf-8');
72
+ const doc = yaml.load(content);
73
+ if (doc && typeof doc === 'object' && 'paths' in doc) {
74
+ const paths = doc.paths;
75
+ for (const [path, methods] of Object.entries(paths)) {
76
+ for (const [method, spec] of Object.entries(methods)) {
77
+ if (typeof spec !== 'object' || spec === null)
78
+ continue;
79
+ results.push({
80
+ path,
81
+ method: method.toUpperCase(),
82
+ summary: spec.summary,
83
+ operationId: spec.operationId,
84
+ tags: spec.tags,
85
+ });
86
+ }
87
+ }
88
+ }
89
+ }
90
+ catch {
91
+ // 解析失败静默跳过
92
+ }
93
+ }
94
+ return results;
95
+ }
96
+ /**
97
+ * 将 API 端点转为图谱节点
98
+ */
99
+ function apiEndpointsToNodes(endpoints) {
100
+ return endpoints.map((ep, i) => ({
101
+ id: `api:${ep.method}:${ep.path}`,
102
+ name: ep.operationId || `${ep.method} ${ep.path}`,
103
+ type: 'api_endpoint',
104
+ filePath: 'API_CONTRACT.yaml',
105
+ line: i + 1,
106
+ column: 1,
107
+ }));
108
+ }
109
+ /**
110
+ * 扫描项目中的 .sql 文件和 TypeORM entity 文件
111
+ */
112
+ async function scanSqlSchemas(projectRoot) {
113
+ const results = [];
114
+ // 1. 扫描 .sql 文件
115
+ const sqlFiles = await (0, glob_1.glob)((0, path_1.join)(projectRoot, '**/*.sql'), {
116
+ ignore: ['node_modules/**', 'dist/**', '.speccore/cache/**'],
117
+ });
118
+ for (const filePath of sqlFiles) {
119
+ try {
120
+ const content = await (0, fs_extra_1.readFile)(filePath, 'utf-8');
121
+ const tables = parseSqlTables(content, filePath);
122
+ results.push(...tables);
123
+ }
124
+ catch {
125
+ // 跳过
126
+ }
127
+ }
128
+ // 2. 从已解析的 TypeORM entity 中补充(由调用方提供)
129
+ // 这里只处理 .sql 文件,TypeORM entity 在 parser.ts 中已识别为 class 节点
130
+ return results;
131
+ }
132
+ /**
133
+ * 简单正则解析 CREATE TABLE 语句
134
+ */
135
+ function parseSqlTables(sql, sourceFile) {
136
+ const tables = [];
137
+ // 匹配 CREATE TABLE `name` 或 CREATE TABLE name (
138
+ const tableRegex = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?[`"]?(\w+)[`"]?\s*\(([^;]+)\)/gi;
139
+ let match;
140
+ while ((match = tableRegex.exec(sql)) !== null) {
141
+ const tableName = match[1];
142
+ const body = match[2];
143
+ // 提取列名(简单取每行第一个单词)
144
+ const columns = body
145
+ .split('\n')
146
+ .map(l => l.trim())
147
+ .filter(l => l && !l.startsWith('//') && !l.startsWith('/*') && !l.startsWith('*'))
148
+ .map(l => {
149
+ const m = l.match(/[`"]?(\w+)[`"]?/);
150
+ return m ? m[1] : '';
151
+ })
152
+ .filter(Boolean);
153
+ tables.push({ name: tableName, columns, sourceFile });
154
+ }
155
+ return tables;
156
+ }
157
+ /**
158
+ * 将数据库表转为图谱节点
159
+ */
160
+ function dbTablesToNodes(tables) {
161
+ return tables.map((t, i) => ({
162
+ id: `db:${t.name}`,
163
+ name: t.name,
164
+ type: 'db_table',
165
+ filePath: t.sourceFile,
166
+ line: i + 1,
167
+ column: 1,
168
+ }));
169
+ }
170
+ // ── 关联边构建 ──
171
+ /**
172
+ * 将 API 端点与代码中的 handler/controller/service 关联
173
+ * 策略:operationId / path 片段与函数/类名匹配
174
+ */
175
+ function linkApiToCode(apiNodes, codeNodes) {
176
+ const edges = [];
177
+ for (const api of apiNodes) {
178
+ const apiName = api.name.toLowerCase();
179
+ const pathParts = apiName.split(/[\/\s_-]+/).filter(Boolean);
180
+ for (const node of codeNodes) {
181
+ if (node.type !== 'function' && node.type !== 'method' && node.type !== 'class')
182
+ continue;
183
+ const nodeName = node.name.toLowerCase();
184
+ let matched = false;
185
+ // 1. operationId 精确匹配
186
+ if (apiName.replace(/\s+/g, '') === nodeName) {
187
+ matched = true;
188
+ }
189
+ // 2. path 关键词匹配(如 /users/{id} → 匹配 handleUser、UserController)
190
+ else if (pathParts.length > 1) {
191
+ const matchCount = pathParts.filter(p => nodeName.includes(p)).length;
192
+ if (matchCount >= Math.min(2, pathParts.length)) {
193
+ matched = true;
194
+ }
195
+ }
196
+ if (matched) {
197
+ edges.push({
198
+ source: api.id,
199
+ target: node.id,
200
+ type: 'references',
201
+ confidence: 'INFERRED',
202
+ });
203
+ }
204
+ }
205
+ }
206
+ return edges;
207
+ }
208
+ /**
209
+ * 将数据库表与代码中的 repository/model/entity 关联
210
+ * 策略:表名与类名/变量名匹配
211
+ */
212
+ function linkSchemaToCode(dbNodes, codeNodes) {
213
+ const edges = [];
214
+ for (const db of dbNodes) {
215
+ const tableName = db.name.toLowerCase();
216
+ const camelTable = tableName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
217
+ const pascalTable = camelTable.charAt(0).toUpperCase() + camelTable.slice(1);
218
+ for (const node of codeNodes) {
219
+ if (node.type !== 'class' && node.type !== 'interface' && node.type !== 'variable')
220
+ continue;
221
+ const nodeName = node.name.toLowerCase();
222
+ const nodePascal = node.name;
223
+ let matched = false;
224
+ // 1. 表名精确匹配(忽略大小写)
225
+ if (nodeName === tableName) {
226
+ matched = true;
227
+ }
228
+ // 2. 驼峰/帕斯卡匹配(user → User、UserEntity)
229
+ else if (nodePascal === pascalTable || nodePascal === pascalTable + 'Entity') {
230
+ matched = true;
231
+ }
232
+ // 3. 包含关系(如 user_profile → UserProfileRepository)
233
+ else if (nodePascal.toLowerCase().includes(tableName) || tableName.includes(nodeName)) {
234
+ matched = true;
235
+ }
236
+ if (matched) {
237
+ edges.push({
238
+ source: db.id,
239
+ target: node.id,
240
+ type: 'references',
241
+ confidence: 'INFERRED',
242
+ });
243
+ }
244
+ }
245
+ }
246
+ return edges;
247
+ }
248
+ /**
249
+ * 扫描并解析项目中的 API Contract 和 SQL Schema,返回图谱节点和边
250
+ */
251
+ async function extractMultimodalNodes(projectRoot, codeNodes) {
252
+ const nodes = [];
253
+ const edges = [];
254
+ // 1. API Contract
255
+ const apiEndpoints = await scanApiContracts(projectRoot);
256
+ if (apiEndpoints.length > 0) {
257
+ const apiNodes = apiEndpointsToNodes(apiEndpoints);
258
+ nodes.push(...apiNodes);
259
+ edges.push(...linkApiToCode(apiNodes, codeNodes));
260
+ }
261
+ // 2. SQL Schema
262
+ const dbTables = await scanSqlSchemas(projectRoot);
263
+ if (dbTables.length > 0) {
264
+ const dbNodes = dbTablesToNodes(dbTables);
265
+ nodes.push(...dbNodes);
266
+ edges.push(...linkSchemaToCode(dbNodes, codeNodes));
267
+ }
268
+ return { nodes, edges };
269
+ }
270
+ //# sourceMappingURL=multimodal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.js","sourceRoot":"","sources":["../../../src/core/code-graph/multimodal.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"}