speccore 6.4.0 → 6.5.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.
@@ -50,6 +50,30 @@ function printReport(result, checkOnly) {
50
50
  logger_1.logger.info(` ⚠️ 新增未索引: ${added}`);
51
51
  if (fixed > 0 && !checkOnly)
52
52
  logger_1.logger.info(` 🔧 已修复: ${fixed}`);
53
+ // ── 知识图谱 ──
54
+ if (result.knowledgeGraph) {
55
+ logger_1.logger.info('');
56
+ logger_1.logger.info('── 知识图谱 ──');
57
+ logger_1.logger.info(` 📊 实体: ${result.knowledgeGraph.entities} 个`);
58
+ logger_1.logger.info(` 🔗 关系: ${result.knowledgeGraph.relations} 条`);
59
+ logger_1.logger.info(` 💾 图谱文件: ${result.knowledgeGraph.graphFile}`);
60
+ logger_1.logger.info(` 📄 上下文: ${result.knowledgeGraph.contextFile}`);
61
+ }
62
+ // ── 衰减检测 ──
63
+ if (result.decayReport) {
64
+ const { decayed, healthy } = result.decayReport.summary;
65
+ if (decayed > 0) {
66
+ logger_1.logger.info('');
67
+ logger_1.logger.info('── 知识衰减 ──');
68
+ const critical = result.decayReport.decayedFiles.filter(d => d.severity === 'critical');
69
+ const warning = result.decayReport.decayedFiles.filter(d => d.severity === 'warning');
70
+ if (critical.length > 0)
71
+ logger_1.logger.info(` ❌ 严重(上下游不一致): ${critical.length} 个`);
72
+ if (warning.length > 0)
73
+ logger_1.logger.info(` ⚠️ 内容已变更: ${warning.length} 个`);
74
+ logger_1.logger.info(` ✅ 健康: ${healthy} 个`);
75
+ }
76
+ }
53
77
  if (stale === 0 && added === 0) {
54
78
  logger_1.logger.info('');
55
79
  logger_1.logger.success('✅ 所有索引一致,无死链,无遗漏');
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../src/commands/reindex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../src/commands/reindex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * context-builder — 紧凑上下文生成器
3
+ *
4
+ * 从知识图谱 + 衰减报告生成 CONTEXT.md(AI 直接读取的紧凑上下文)
5
+ * 设计目标:< 800 tokens,一眼看到全貌
6
+ */
7
+ import { KnowledgeGraph } from './knowledge-graph';
8
+ import { DecayReport } from './decay-detector';
9
+ /** 生成完整的 CONTEXT.md 内容 */
10
+ export declare function buildContextMarkdown(graph: KnowledgeGraph, decay?: DecayReport, options?: {
11
+ currentTask?: string;
12
+ currentPlatform?: string;
13
+ }): string;
14
+ /** 生成并保存 CONTEXT.md */
15
+ export declare function saveContextMarkdown(cwd: string, content: string, iteration?: string): Promise<string>;
16
+ /**
17
+ * 为 prompt 注入生成紧凑上下文字符串(< 500 tokens)
18
+ * 直接嵌入到 AI prompt 中,不需要 AI 额外 Read
19
+ */
20
+ export declare function buildCompactContext(graph: KnowledgeGraph, options: {
21
+ taskId?: string;
22
+ platform?: string;
23
+ }): string;
24
+ //# sourceMappingURL=context-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/core/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,cAAc,EAA+B,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAwB/C,0BAA0B;AAC1B,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,cAAc,EACrB,KAAK,CAAC,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,MAAM,CAgIR;AAED,uBAAuB;AACvB,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,CAuBR"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ /**
3
+ * context-builder — 紧凑上下文生成器
4
+ *
5
+ * 从知识图谱 + 衰减报告生成 CONTEXT.md(AI 直接读取的紧凑上下文)
6
+ * 设计目标:< 800 tokens,一眼看到全貌
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildContextMarkdown = buildContextMarkdown;
10
+ exports.saveContextMarkdown = saveContextMarkdown;
11
+ exports.buildCompactContext = buildCompactContext;
12
+ const fs_extra_1 = require("fs-extra");
13
+ const path_1 = require("path");
14
+ const knowledge_graph_1 = require("./knowledge-graph");
15
+ // ═══════════════════════════════════════════════
16
+ // 状态 emoji
17
+ // ═══════════════════════════════════════════════
18
+ function statusEmoji(status) {
19
+ if (!status)
20
+ return '🔲';
21
+ if (status === 'completed')
22
+ return '✅';
23
+ if (status === 'in_progress')
24
+ return '🟡';
25
+ return '🔲';
26
+ }
27
+ function statusLabel(status) {
28
+ if (!status)
29
+ return '未开始';
30
+ if (status === 'completed')
31
+ return '已完成';
32
+ if (status === 'in_progress')
33
+ return '进行中';
34
+ return '未开始';
35
+ }
36
+ // ═══════════════════════════════════════════════
37
+ // CONTEXT.md 生成
38
+ // ═══════════════════════════════════════════════
39
+ /** 生成完整的 CONTEXT.md 内容 */
40
+ function buildContextMarkdown(graph, decay, options) {
41
+ const lines = [];
42
+ const now = new Date().toISOString().split('T')[0];
43
+ lines.push('# 项目上下文快照');
44
+ lines.push(`> 自动生成于 ${now} · speccore reindex · 迭代 ${graph.iteration}`);
45
+ lines.push('');
46
+ // ── 1. 需求→任务追踪表 ──
47
+ const reqs = Object.values(graph.entities).filter(e => e.type === 'requirement');
48
+ const tasks = Object.values(graph.entities).filter(e => e.type === 'task');
49
+ if (reqs.length > 0 || tasks.length > 0) {
50
+ lines.push('## 需求→任务追踪');
51
+ lines.push('');
52
+ lines.push('| 需求 | 任务 | 状态 | 子任务 |');
53
+ lines.push('| :--- | :--- | :--- | :--- |');
54
+ // 按编号配对
55
+ const paired = new Set();
56
+ for (const req of reqs) {
57
+ const reqNum = req.id.match(/\d+/)?.[0];
58
+ const relatedTasks = tasks.filter(t => {
59
+ const taskNum = t.id.match(/\d+/)?.[0];
60
+ return taskNum === reqNum;
61
+ });
62
+ if (relatedTasks.length > 0) {
63
+ for (const task of relatedTasks) {
64
+ paired.add(task.id);
65
+ const subtasks = Object.values(graph.entities)
66
+ .filter(e => e.parentTaskId === task.id);
67
+ const subtaskStr = subtasks.length > 0
68
+ ? subtasks.map(s => `${s.platform || '?'}(${s.id.slice(-4)}) ${statusEmoji(s.status)}`).join(' · ')
69
+ : '—';
70
+ lines.push(`| ${req.id} ${req.title} | ${task.id} | ${statusEmoji(task.status)} ${statusLabel(task.status)} | ${subtaskStr} |`);
71
+ }
72
+ }
73
+ else {
74
+ lines.push(`| ${req.id} ${req.title} | — | — | — |`);
75
+ }
76
+ }
77
+ // 未关联需求的任务
78
+ const unpairedTasks = tasks.filter(t => !paired.has(t.id));
79
+ for (const task of unpairedTasks) {
80
+ const subtasks = Object.values(graph.entities)
81
+ .filter(e => e.parentTaskId === task.id);
82
+ const subtaskStr = subtasks.length > 0
83
+ ? subtasks.map(s => `${s.platform || '?'}(${s.id.slice(-4)}) ${statusEmoji(s.status)}`).join(' · ')
84
+ : '—';
85
+ lines.push(`| — | ${task.id} ${task.title} | ${statusEmoji(task.status)} ${statusLabel(task.status)} | ${subtaskStr} |`);
86
+ }
87
+ lines.push('');
88
+ }
89
+ // ── 2. 用户自定义文件 ──
90
+ const userFiles = Object.values(graph.entities).filter(e => e.type === 'user-file');
91
+ if (userFiles.length > 0) {
92
+ lines.push('## 用户自定义文件(未归类)');
93
+ lines.push('');
94
+ for (const f of userFiles) {
95
+ lines.push(`- \`${f.file}\` — ${f.title}`);
96
+ }
97
+ lines.push('');
98
+ }
99
+ // ── 3. 衰减检测 ──
100
+ if (decay && decay.decayedFiles.length > 0) {
101
+ lines.push('## 知识衰减检测');
102
+ lines.push('');
103
+ const critical = decay.decayedFiles.filter(d => d.severity === 'critical');
104
+ const warning = decay.decayedFiles.filter(d => d.severity === 'warning');
105
+ if (critical.length > 0) {
106
+ lines.push('### ❌ 上下游不一致');
107
+ lines.push('');
108
+ for (const item of critical.slice(0, 5)) {
109
+ lines.push(`- \`${item.entityId}\` ${item.title} — ${item.detail}`);
110
+ }
111
+ lines.push('');
112
+ }
113
+ if (warning.length > 0) {
114
+ lines.push('### ⚠️ 内容已变更');
115
+ lines.push('');
116
+ for (const item of warning.slice(0, 5)) {
117
+ lines.push(`- \`${item.entityId}\` ${item.title} — ${item.detail}`);
118
+ }
119
+ lines.push('');
120
+ }
121
+ }
122
+ else if (decay) {
123
+ lines.push('## 知识衰减检测');
124
+ lines.push('> ✅ 所有知识均为最新状态');
125
+ lines.push('');
126
+ }
127
+ // ── 4. 当前任务上下文(如果指定了任务) ──
128
+ if (options?.currentTask) {
129
+ const taskContext = (0, knowledge_graph_1.getTaskContext)(graph, options.currentTask);
130
+ if (taskContext.requirement || taskContext.parentTask || taskContext.siblingSubtasks.length > 0) {
131
+ lines.push('## 当前任务关联链');
132
+ lines.push('');
133
+ if (taskContext.requirement) {
134
+ lines.push(`- **上游需求**: ${taskContext.requirement.id} — ${taskContext.requirement.title}`);
135
+ }
136
+ if (taskContext.parentTask) {
137
+ lines.push(`- **父任务**: ${taskContext.parentTask.id} — ${taskContext.parentTask.title}`);
138
+ }
139
+ if (taskContext.siblingSubtasks.length > 0) {
140
+ lines.push('- **兄弟子任务**:');
141
+ for (const sub of taskContext.siblingSubtasks) {
142
+ const current = sub.platform === options.currentPlatform ? ' ⬅ 当前' : '';
143
+ lines.push(` - ${sub.platform || '?'}: ${statusEmoji(sub.status)} ${sub.title}${current}`);
144
+ }
145
+ }
146
+ lines.push('');
147
+ }
148
+ }
149
+ // ── 5. 统计 ──
150
+ lines.push('---');
151
+ lines.push(`> ${graph.stats.requirements} 需求 · ${graph.stats.specs} 规格 · ${graph.stats.tasks} 任务 · ${graph.stats.subtasks} 子任务${userFiles.length > 0 ? ` · ${userFiles.length} 用户文件` : ''}`);
152
+ return lines.join('\n');
153
+ }
154
+ /** 生成并保存 CONTEXT.md */
155
+ async function saveContextMarkdown(cwd, content, iteration) {
156
+ const iterDir = iteration
157
+ ? (0, path_1.join)(cwd, `Iteration-${iteration}`)
158
+ : null;
159
+ let targetDir;
160
+ if (iterDir && await (0, fs_extra_1.pathExists)(iterDir)) {
161
+ // 保存到迭代的 000-overview/ 下
162
+ targetDir = (0, path_1.join)(iterDir, '000-overview');
163
+ }
164
+ else {
165
+ // 保存到全局 cache 下
166
+ targetDir = (0, path_1.join)(cwd, '.speccore', 'cache');
167
+ }
168
+ await (0, fs_extra_1.ensureDir)(targetDir);
169
+ const filePath = (0, path_1.join)(targetDir, 'CONTEXT.md');
170
+ await (0, fs_extra_1.writeFile)(filePath, content, 'utf-8');
171
+ return filePath;
172
+ }
173
+ /**
174
+ * 为 prompt 注入生成紧凑上下文字符串(< 500 tokens)
175
+ * 直接嵌入到 AI prompt 中,不需要 AI 额外 Read
176
+ */
177
+ function buildCompactContext(graph, options) {
178
+ if (!options.taskId)
179
+ return '';
180
+ const taskContext = (0, knowledge_graph_1.getTaskContext)(graph, options.taskId);
181
+ const lines = [];
182
+ if (taskContext.requirement) {
183
+ lines.push(`上游需求: ${taskContext.requirement.id}(${taskContext.requirement.title})`);
184
+ }
185
+ if (taskContext.parentTask) {
186
+ lines.push(`父任务: ${taskContext.parentTask.id}(${taskContext.parentTask.title})`);
187
+ }
188
+ if (taskContext.siblingSubtasks.length > 0) {
189
+ const parts = taskContext.siblingSubtasks.map(s => {
190
+ const current = s.platform === options.platform ? ' ⬅当前' : '';
191
+ return `${s.platform}:${statusEmoji(s.status)}${current}`;
192
+ });
193
+ lines.push(`各端进度: ${parts.join(' · ')}`);
194
+ }
195
+ return lines.length > 0 ? lines.join('\n') : '';
196
+ }
197
+ //# sourceMappingURL=context-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../src/core/context-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * decay-detector — 知识衰减检测
3
+ *
4
+ * 对比上次完整性快照(integrity.json)与当前文件状态,
5
+ * 检测哪些文件已变更但其关联索引/下游引用未更新
6
+ */
7
+ import { KnowledgeGraph } from './knowledge-graph';
8
+ export interface DecayReport {
9
+ generated: string;
10
+ iteration: string;
11
+ decayedFiles: DecayItem[];
12
+ summary: {
13
+ total: number;
14
+ decayed: number;
15
+ healthy: number;
16
+ };
17
+ }
18
+ export interface DecayItem {
19
+ entityId: string;
20
+ title: string;
21
+ file: string;
22
+ type: 'content_changed' | 'downstream_stale' | 'orphaned';
23
+ severity: 'warning' | 'critical';
24
+ detail: string;
25
+ affectedDownstream?: string[];
26
+ }
27
+ /**
28
+ * 检测知识衰减
29
+ *
30
+ * 检测规则:
31
+ * 1. content_changed: 文件 hash 与上次快照不同 → 内容已变更
32
+ * 2. downstream_stale: 上游需求变更了,但关联的 spec/task 未同步更新
33
+ * 3. orphaned: 图谱中有引用但文件已不存在
34
+ */
35
+ export declare function detectDecay(cwd: string, graph: KnowledgeGraph): Promise<DecayReport>;
36
+ /** 格式化衰减报告为 Markdown */
37
+ export declare function formatDecayReport(report: DecayReport): string;
38
+ //# sourceMappingURL=decay-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decay-detector.d.ts","sourceRoot":"","sources":["../../src/core/decay-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAC;AAMhE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,UAAU,CAAC;IAC1D,QAAQ,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAyCD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,WAAW,CAAC,CAmFtB;AAED,wBAAwB;AACxB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAmC7D"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ /**
3
+ * decay-detector — 知识衰减检测
4
+ *
5
+ * 对比上次完整性快照(integrity.json)与当前文件状态,
6
+ * 检测哪些文件已变更但其关联索引/下游引用未更新
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.detectDecay = detectDecay;
43
+ exports.formatDecayReport = formatDecayReport;
44
+ const fs_extra_1 = require("fs-extra");
45
+ const path_1 = require("path");
46
+ const crypto_1 = require("crypto");
47
+ // ═══════════════════════════════════════════════
48
+ // 核心检测
49
+ // ═══════════════════════════════════════════════
50
+ /** 加载上次完整性快照 */
51
+ async function loadIntegritySnapshot(cwd) {
52
+ const filePath = (0, path_1.join)(cwd, '.speccore', 'cache', 'integrity.json');
53
+ if (!(await (0, fs_extra_1.pathExists)(filePath)))
54
+ return null;
55
+ try {
56
+ const content = await (0, fs_extra_1.readFile)(filePath, 'utf-8');
57
+ return JSON.parse(content);
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /** 计算当前文件 hash */
64
+ async function currentFileHash(filePath) {
65
+ try {
66
+ const { readFile: read } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
67
+ const content = await read(filePath, 'utf-8');
68
+ return (0, crypto_1.createHash)('md5').update(content).digest('hex').slice(0, 8);
69
+ }
70
+ catch {
71
+ return '';
72
+ }
73
+ }
74
+ /**
75
+ * 检测知识衰减
76
+ *
77
+ * 检测规则:
78
+ * 1. content_changed: 文件 hash 与上次快照不同 → 内容已变更
79
+ * 2. downstream_stale: 上游需求变更了,但关联的 spec/task 未同步更新
80
+ * 3. orphaned: 图谱中有引用但文件已不存在
81
+ */
82
+ async function detectDecay(cwd, graph) {
83
+ const snapshot = await loadIntegritySnapshot(cwd);
84
+ const report = {
85
+ generated: new Date().toISOString(),
86
+ iteration: graph.iteration,
87
+ decayedFiles: [],
88
+ summary: { total: 0, decayed: 0, healthy: 0 },
89
+ };
90
+ const entities = Object.values(graph.entities);
91
+ report.summary.total = entities.length;
92
+ // 检测 1: content_changed — 文件内容与上次快照不一致
93
+ for (const entity of entities) {
94
+ if (!entity.file || !entity.hash)
95
+ continue;
96
+ if (snapshot && snapshot.files[entity.file]) {
97
+ const oldHash = snapshot.files[entity.file].hash;
98
+ if (oldHash !== entity.hash) {
99
+ report.decayedFiles.push({
100
+ entityId: entity.id,
101
+ title: entity.title,
102
+ file: entity.file,
103
+ type: 'content_changed',
104
+ severity: 'warning',
105
+ detail: `内容自上次索引后已变更(hash: ${oldHash} → ${entity.hash})`,
106
+ });
107
+ }
108
+ }
109
+ }
110
+ // 检测 2: downstream_stale — 上游需求变更,下游 spec/task 未更新
111
+ // 找出所有变更的需求
112
+ const changedReqs = new Set(report.decayedFiles
113
+ .filter(d => d.type === 'content_changed')
114
+ .map(d => d.entityId));
115
+ for (const reqId of changedReqs) {
116
+ // 找实现该需求的任务
117
+ const implRelations = graph.relations.filter(r => r.to === reqId && r.type === 'implements');
118
+ for (const rel of implRelations) {
119
+ const task = graph.entities[rel.from];
120
+ if (!task)
121
+ continue;
122
+ // 检查任务文件是否也变更了
123
+ const taskDecayed = report.decayedFiles.some(d => d.entityId === task.id);
124
+ if (!taskDecayed) {
125
+ report.decayedFiles.push({
126
+ entityId: task.id,
127
+ title: task.title,
128
+ file: task.file,
129
+ type: 'downstream_stale',
130
+ severity: 'critical',
131
+ detail: `上游需求 ${reqId} 已变更,但此任务未同步更新`,
132
+ affectedDownstream: [reqId],
133
+ });
134
+ }
135
+ }
136
+ }
137
+ // 检测 3: orphaned — 图谱中有实体但文件可能不存在(hash 为空)
138
+ for (const entity of entities) {
139
+ if (entity.hash === '' && entity.file && entity.type !== 'user-file') {
140
+ report.decayedFiles.push({
141
+ entityId: entity.id,
142
+ title: entity.title,
143
+ file: entity.file,
144
+ type: 'orphaned',
145
+ severity: 'warning',
146
+ detail: '文件不存在或无法读取',
147
+ });
148
+ }
149
+ }
150
+ report.summary.decayed = report.decayedFiles.length;
151
+ report.summary.healthy = report.summary.total - report.summary.decayed;
152
+ return report;
153
+ }
154
+ /** 格式化衰减报告为 Markdown */
155
+ function formatDecayReport(report) {
156
+ const lines = [];
157
+ lines.push('## 知识衰减检测');
158
+ lines.push('');
159
+ if (report.decayedFiles.length === 0) {
160
+ lines.push('> ✅ 所有知识均为最新状态,无衰减');
161
+ return lines.join('\n');
162
+ }
163
+ const critical = report.decayedFiles.filter(d => d.severity === 'critical');
164
+ const warning = report.decayedFiles.filter(d => d.severity === 'warning');
165
+ if (critical.length > 0) {
166
+ lines.push('### ❌ 严重(上下游不一致)');
167
+ lines.push('');
168
+ for (const item of critical) {
169
+ lines.push(`| \`${item.entityId}\` | ${item.title} | ${item.detail} |`);
170
+ }
171
+ lines.push('');
172
+ }
173
+ if (warning.length > 0) {
174
+ lines.push('### ⚠️ 警告(内容已变更)');
175
+ lines.push('');
176
+ for (const item of warning) {
177
+ lines.push(`| \`${item.entityId}\` | ${item.title} | ${item.detail} |`);
178
+ }
179
+ lines.push('');
180
+ }
181
+ lines.push(`> 共 ${report.summary.total} 个实体,${report.summary.decayed} 个需关注`);
182
+ return lines.join('\n');
183
+ }
184
+ //# sourceMappingURL=decay-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decay-detector.js","sourceRoot":"","sources":["../../src/core/decay-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * knowledge-graph — 知识图谱构建引擎
3
+ *
4
+ * 从文件系统扫描需求/规格/任务/子任务,提取实体和关联关系
5
+ * 输出 knowledge-graph.json(机器读)+ CONTEXT.md(AI 读)
6
+ */
7
+ export interface KnowledgeGraph {
8
+ version: string;
9
+ generated: string;
10
+ iteration: string;
11
+ entities: Record<string, GraphEntity>;
12
+ relations: GraphRelation[];
13
+ stats: GraphStats;
14
+ }
15
+ export interface GraphEntity {
16
+ id: string;
17
+ type: 'requirement' | 'spec' | 'task' | 'subtask' | 'user-file';
18
+ title: string;
19
+ file: string;
20
+ hash: string;
21
+ mtime: string;
22
+ status?: string;
23
+ platform?: string;
24
+ parentTaskId?: string;
25
+ tags?: string[];
26
+ }
27
+ export interface GraphRelation {
28
+ from: string;
29
+ to: string;
30
+ type: 'implements' | 'specifies' | 'subtask_of' | 'depends_on' | 'references';
31
+ }
32
+ export interface GraphStats {
33
+ requirements: number;
34
+ specs: number;
35
+ tasks: number;
36
+ subtasks: number;
37
+ userFiles: number;
38
+ relations: number;
39
+ }
40
+ export declare function buildKnowledgeGraph(cwd: string, iteration?: string): Promise<KnowledgeGraph>;
41
+ /** 保存知识图谱到 cache 目录 */
42
+ export declare function saveKnowledgeGraph(cwd: string, graph: KnowledgeGraph): Promise<string>;
43
+ /** 加载已存在的知识图谱 */
44
+ export declare function loadKnowledgeGraph(cwd: string): Promise<KnowledgeGraph | null>;
45
+ /** 获取指定任务的关联链(上游需求 + 关联子任务) */
46
+ export declare function getTaskContext(graph: KnowledgeGraph, taskId: string): {
47
+ requirement: GraphEntity | null;
48
+ siblingSubtasks: GraphEntity[];
49
+ parentTask: GraphEntity | null;
50
+ };
51
+ //# sourceMappingURL=knowledge-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../../src/core/knowledge-graph.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;CAC/E;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAiVD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC,CAoDzB;AAED,uBAAuB;AACvB,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5F;AAED,iBAAiB;AACjB,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CASpF;AAED,+BAA+B;AAC/B,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG;IACrE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC,CA+BA"}