speccore 6.90.0 → 6.91.1
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/dist/cli.js +2 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +65 -6
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/ask.js +1 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +92 -5
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/pattern.d.ts +2 -0
- package/dist/commands/pattern.d.ts.map +1 -1
- package/dist/commands/pattern.js +2 -0
- package/dist/commands/pattern.js.map +1 -1
- package/dist/core/code-graph/index.d.ts.map +1 -1
- package/dist/core/code-graph/index.js +73 -0
- package/dist/core/code-graph/index.js.map +1 -1
- package/dist/core/code-graph/multimodal.d.ts +49 -0
- package/dist/core/code-graph/multimodal.d.ts.map +1 -0
- package/dist/core/code-graph/multimodal.js +270 -0
- package/dist/core/code-graph/multimodal.js.map +1 -0
- package/dist/core/code-graph/types.d.ts +1 -1
- package/dist/core/code-graph/types.d.ts.map +1 -1
- package/dist/core/prompt-builder.d.ts +1 -0
- package/dist/core/prompt-builder.d.ts.map +1 -1
- package/dist/core/prompt-builder.js +43 -0
- package/dist/core/prompt-builder.js.map +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Code Knowledge Graph — 类型定义
|
|
3
3
|
* v6.90.0: 本地 AST 解析构建代码知识图谱
|
|
4
4
|
*/
|
|
5
|
-
export type NodeType = 'function' | 'class' | 'interface' | 'type' | 'variable' | 'module' | 'method' | 'property' | 'enum';
|
|
5
|
+
export type NodeType = 'function' | 'class' | 'interface' | 'type' | 'variable' | 'module' | 'method' | 'property' | 'enum' | 'api_endpoint' | 'db_table';
|
|
6
6
|
export type EdgeType = 'calls' | 'imports' | 'exports' | 'extends' | 'implements' | 'references' | 'contains' | 'typed_by';
|
|
7
7
|
export type Confidence = 'EXTRACTED' | 'INFERRED';
|
|
8
8
|
export interface CodeNode {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/code-graph/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,OAAO,GACP,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/code-graph/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,OAAO,GACP,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,MAAM,GAEN,cAAc,GACd,UAAU,CAAC;AAEf,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,SAAS,GACT,SAAS,GACT,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,qBAAqB;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,8 @@ const unified_retrieval_1 = require("./unified-retrieval");
|
|
|
26
26
|
const rule_loader_1 = require("./rule-loader");
|
|
27
27
|
// v6.86.0+: AGENTS 全阶段扩展
|
|
28
28
|
const agents_1 = require("./agents");
|
|
29
|
+
// v6.91.0+: 代码知识图谱摘要注入
|
|
30
|
+
const code_graph_1 = require("./code-graph");
|
|
29
31
|
const techStackCache = new Map();
|
|
30
32
|
const constitutionCache = new Map();
|
|
31
33
|
const reqContentCache = new Map();
|
|
@@ -1217,6 +1219,41 @@ async function buildPrompt(command, options) {
|
|
|
1217
1219
|
}
|
|
1218
1220
|
}
|
|
1219
1221
|
}
|
|
1222
|
+
// v6.91.0+: analyze 阶段注入代码知识图谱摘要
|
|
1223
|
+
let codeGraphSummary;
|
|
1224
|
+
if (command === 'analyze') {
|
|
1225
|
+
try {
|
|
1226
|
+
const cg = await (0, code_graph_1.loadCodeGraph)(cwd);
|
|
1227
|
+
if (cg) {
|
|
1228
|
+
const lines = [];
|
|
1229
|
+
lines.push('## 📊 代码知识图谱摘要');
|
|
1230
|
+
lines.push(`> 基于本地 AST 解析(${cg.metadata.scannedFiles} 文件, ${cg.metadata.totalNodes} 节点, ${cg.metadata.totalEdges} 边)`);
|
|
1231
|
+
lines.push('');
|
|
1232
|
+
lines.push('### 子系统(自动检测)');
|
|
1233
|
+
for (const comm of cg.communities.slice(0, 8)) {
|
|
1234
|
+
const sample = comm.nodes
|
|
1235
|
+
.map(id => cg.nodes.find(n => n.id === id))
|
|
1236
|
+
.filter(Boolean)
|
|
1237
|
+
.slice(0, 5)
|
|
1238
|
+
.map(n => n.name);
|
|
1239
|
+
lines.push(`- **${comm.label}** (${comm.nodes.length} 节点, 密度 ${(comm.density * 100).toFixed(0)}%): ${sample.join(', ')}`);
|
|
1240
|
+
}
|
|
1241
|
+
lines.push('');
|
|
1242
|
+
lines.push('### 核心节点(God Nodes)');
|
|
1243
|
+
for (const id of cg.godNodes.slice(0, 10)) {
|
|
1244
|
+
const n = cg.nodes.find(node => node.id === id);
|
|
1245
|
+
if (n)
|
|
1246
|
+
lines.push(`- ${n.name} (${n.type}, degree=${n.degree})`);
|
|
1247
|
+
}
|
|
1248
|
+
lines.push('');
|
|
1249
|
+
lines.push('> 提示:如需深入查看完整图谱,运行 `speccore code-index --graph` 后打开 `.speccore/code-graph/graph.html`');
|
|
1250
|
+
codeGraphSummary = lines.join('\n');
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
catch {
|
|
1254
|
+
// 图谱不存在时静默跳过
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1220
1257
|
// v6.86.0+: 为 split/plan 命令注入 AGENTS
|
|
1221
1258
|
let instruction = getInstruction(command, context);
|
|
1222
1259
|
if (command === 'split' || command === 'plan') {
|
|
@@ -1254,6 +1291,7 @@ async function buildPrompt(command, options) {
|
|
|
1254
1291
|
taskContext: taskContextStr,
|
|
1255
1292
|
projectPaths: projectPathsInfo,
|
|
1256
1293
|
rulesContent,
|
|
1294
|
+
codeGraphSummary,
|
|
1257
1295
|
instruction,
|
|
1258
1296
|
outputHint: command === 'execute'
|
|
1259
1297
|
? '请返回格式: {"files": [{"path": "工程标识/相对路径", "content": "代码内容"}]}'
|
|
@@ -1357,6 +1395,11 @@ function buildPromptText(prompt) {
|
|
|
1357
1395
|
lines.push(prompt.rulesContent);
|
|
1358
1396
|
lines.push('');
|
|
1359
1397
|
}
|
|
1398
|
+
// v6.91.0+: 代码知识图谱摘要注入
|
|
1399
|
+
if (prompt.codeGraphSummary) {
|
|
1400
|
+
lines.push(prompt.codeGraphSummary);
|
|
1401
|
+
lines.push('');
|
|
1402
|
+
}
|
|
1360
1403
|
// API 定义
|
|
1361
1404
|
if (prompt.apiSpecs.length > 0) {
|
|
1362
1405
|
lines.push('## API 接口定义');
|