@accelerator-mzq/forge 1.4.0 → 3.0.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 (85) hide show
  1. package/dist/cli/commands/archive.d.ts +73 -10
  2. package/dist/cli/commands/archive.d.ts.map +1 -1
  3. package/dist/cli/commands/archive.js +362 -89
  4. package/dist/cli/commands/archive.js.map +1 -1
  5. package/dist/cli/commands/legacy-bridge.d.ts +110 -0
  6. package/dist/cli/commands/legacy-bridge.d.ts.map +1 -1
  7. package/dist/cli/commands/legacy-bridge.js +1058 -438
  8. package/dist/cli/commands/legacy-bridge.js.map +1 -1
  9. package/dist/cli/commands/pause-capture.d.ts +24 -0
  10. package/dist/cli/commands/pause-capture.d.ts.map +1 -0
  11. package/dist/cli/commands/pause-capture.js +87 -0
  12. package/dist/cli/commands/pause-capture.js.map +1 -0
  13. package/dist/cli/index.js +3 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/core/ack-log.d.ts +17 -1
  16. package/dist/core/ack-log.d.ts.map +1 -1
  17. package/dist/core/ack-log.js.map +1 -1
  18. package/dist/core/archive/ack-log-consistency.d.ts.map +1 -1
  19. package/dist/core/archive/ack-log-consistency.js +2 -1
  20. package/dist/core/archive/ack-log-consistency.js.map +1 -1
  21. package/dist/core/archive/pause-decisions-fence.d.ts +24 -1
  22. package/dist/core/archive/pause-decisions-fence.d.ts.map +1 -1
  23. package/dist/core/archive/pause-decisions-fence.js +260 -46
  24. package/dist/core/archive/pause-decisions-fence.js.map +1 -1
  25. package/dist/core/backlog/assets/backlog-readme.md +4 -2
  26. package/dist/core/backlog/index.d.ts +1 -1
  27. package/dist/core/backlog/index.d.ts.map +1 -1
  28. package/dist/core/backlog/index.js +27 -8
  29. package/dist/core/backlog/index.js.map +1 -1
  30. package/dist/core/backlog/render.d.ts +48 -3
  31. package/dist/core/backlog/render.d.ts.map +1 -1
  32. package/dist/core/backlog/render.js +151 -15
  33. package/dist/core/backlog/render.js.map +1 -1
  34. package/dist/core/legacy-bridge/extractor.d.ts +79 -0
  35. package/dist/core/legacy-bridge/extractor.d.ts.map +1 -0
  36. package/dist/core/legacy-bridge/extractor.js +374 -0
  37. package/dist/core/legacy-bridge/extractor.js.map +1 -0
  38. package/dist/core/legacy-bridge/indexer.d.ts +8 -2
  39. package/dist/core/legacy-bridge/indexer.d.ts.map +1 -1
  40. package/dist/core/legacy-bridge/indexer.js +61 -9
  41. package/dist/core/legacy-bridge/indexer.js.map +1 -1
  42. package/dist/core/legacy-bridge/legacy-requirements.d.ts +53 -0
  43. package/dist/core/legacy-bridge/legacy-requirements.d.ts.map +1 -0
  44. package/dist/core/legacy-bridge/legacy-requirements.js +114 -0
  45. package/dist/core/legacy-bridge/legacy-requirements.js.map +1 -0
  46. package/dist/core/legacy-bridge/llm-task.d.ts +54 -0
  47. package/dist/core/legacy-bridge/llm-task.d.ts.map +1 -0
  48. package/dist/core/legacy-bridge/llm-task.js +87 -0
  49. package/dist/core/legacy-bridge/llm-task.js.map +1 -0
  50. package/dist/core/legacy-bridge/mapper.d.ts +8 -9
  51. package/dist/core/legacy-bridge/mapper.d.ts.map +1 -1
  52. package/dist/core/legacy-bridge/mapper.js +24 -39
  53. package/dist/core/legacy-bridge/mapper.js.map +1 -1
  54. package/dist/core/legacy-bridge/quality-judge.d.ts +5 -0
  55. package/dist/core/legacy-bridge/quality-judge.d.ts.map +1 -1
  56. package/dist/core/legacy-bridge/quality-judge.js +25 -21
  57. package/dist/core/legacy-bridge/quality-judge.js.map +1 -1
  58. package/dist/core/legacy-bridge/regenerator.d.ts +21 -1
  59. package/dist/core/legacy-bridge/regenerator.d.ts.map +1 -1
  60. package/dist/core/legacy-bridge/regenerator.js +132 -2
  61. package/dist/core/legacy-bridge/regenerator.js.map +1 -1
  62. package/dist/core/legacy-bridge/runners.d.ts +33 -0
  63. package/dist/core/legacy-bridge/runners.d.ts.map +1 -0
  64. package/dist/core/legacy-bridge/runners.js +77 -0
  65. package/dist/core/legacy-bridge/runners.js.map +1 -0
  66. package/dist/core/legacy-bridge/sync-check.d.ts +8 -0
  67. package/dist/core/legacy-bridge/sync-check.d.ts.map +1 -1
  68. package/dist/core/legacy-bridge/sync-check.js +83 -0
  69. package/dist/core/legacy-bridge/sync-check.js.map +1 -1
  70. package/dist/core/legacy-bridge/types.d.ts +2 -0
  71. package/dist/core/legacy-bridge/types.d.ts.map +1 -1
  72. package/dist/core/markers/types.d.ts +5 -0
  73. package/dist/core/markers/types.d.ts.map +1 -1
  74. package/dist/core/parse/unified-diff.d.ts +26 -0
  75. package/dist/core/parse/unified-diff.d.ts.map +1 -0
  76. package/dist/core/parse/unified-diff.js +61 -0
  77. package/dist/core/parse/unified-diff.js.map +1 -0
  78. package/dist/core/templates/commands/apply.md +12 -3
  79. package/dist/core/templates/commands/archive.md +15 -0
  80. package/dist/core/templates/commands/verify.md +2 -0
  81. package/dist/core/templates/skills/legacy-bridge-fulfillment.md +22 -0
  82. package/dist/core/validate/marker-schema.d.ts.map +1 -1
  83. package/dist/core/validate/marker-schema.js +15 -0
  84. package/dist/core/validate/marker-schema.js.map +1 -1
  85. package/package.json +21 -20
@@ -0,0 +1,374 @@
1
+ // Layer 3b:whole-repo 发现 + 文本抽取 + prep + apply + 增量 diff(spec §4/§5/§6)
2
+ import { readdir, stat, readFile } from 'node:fs/promises';
3
+ import { join, relative, extname, basename } from 'node:path';
4
+ import { createHash } from 'node:crypto';
5
+ import { stringify as stringifyYaml } from 'yaml';
6
+ import { parseWorkbook, sheetToMarkdown } from './excel.js';
7
+ import { redact } from './redact.js';
8
+ /** 发现时跳过的目录(沿 mapper.ts 的 SKIP_DIRS 约定 + spec §5.1) */
9
+ const SKIP_DIRS = new Set([
10
+ 'node_modules',
11
+ '.git',
12
+ 'dist',
13
+ 'dist-bundled',
14
+ 'build',
15
+ 'forge',
16
+ '.cache',
17
+ ]);
18
+ /** 可读取的文档扩展名(spec §5.1 / §5.2) */
19
+ const DOC_EXTS = new Set(['.md', '.txt', '.docx', '.pdf', '.xlsx']);
20
+ /** 需求文档文件名匹配模式(不分大小写) */
21
+ const REQUIREMENT_NAME_RE = /(srs|prd|requirement|需求|规格|spec)/i;
22
+ /** backlog 文件名匹配模式 */
23
+ const BACKLOG_NAME_RE = /^(backlog|todo|roadmap)\b/i;
24
+ /** issue 导出文件名匹配模式 */
25
+ const ISSUE_NAME_RE = /issue/i;
26
+ /** 递归扫目录,产相对 baseRoot 的文件路径 */
27
+ async function* walk(dir, baseRoot) {
28
+ let entries = [];
29
+ try {
30
+ entries = await readdir(dir);
31
+ }
32
+ catch {
33
+ return;
34
+ }
35
+ for (const name of entries) {
36
+ if (SKIP_DIRS.has(name))
37
+ continue;
38
+ if (name.startsWith('.'))
39
+ continue;
40
+ const full = join(dir, name);
41
+ let s;
42
+ try {
43
+ s = await stat(full);
44
+ }
45
+ catch {
46
+ continue;
47
+ }
48
+ if (s.isDirectory())
49
+ yield* walk(full, baseRoot);
50
+ else if (s.isFile())
51
+ yield relative(baseRoot, full).split('\\').join('/');
52
+ }
53
+ }
54
+ /** 据文件名判 kind;不属需求/backlog 任何一类返回 null(不纳入发现) */
55
+ function classifyKind(relPath) {
56
+ const name = basename(relPath);
57
+ if (ISSUE_NAME_RE.test(name))
58
+ return 'issue-export';
59
+ if (BACKLOG_NAME_RE.test(name))
60
+ return 'backlog-file';
61
+ if (REQUIREMENT_NAME_RE.test(name))
62
+ return 'srs';
63
+ return null;
64
+ }
65
+ /**
66
+ * whole-repo 发现(spec §5.1):扫整个仓库,识别需求文档 / backlog 文件。
67
+ * 排除 SKIP_DIRS;只收 DOC_EXTS 扩展名;按文件名 classifyKind。
68
+ */
69
+ export async function discoverSources(repoRoot) {
70
+ const out = [];
71
+ for await (const rel of walk(repoRoot, repoRoot)) {
72
+ const ext = extname(rel).toLowerCase();
73
+ if (!DOC_EXTS.has(ext))
74
+ continue;
75
+ const kind = classifyKind(rel);
76
+ if (kind === null)
77
+ continue;
78
+ out.push({ path: rel, kind, ext });
79
+ }
80
+ // 排序:跨平台确定,便于测试与 manifest 稳定
81
+ out.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
82
+ return out;
83
+ }
84
+ /**
85
+ * 按扩展名抽纯文本(spec §5.2)。
86
+ * .md/.txt 直读;.xlsx 复用 excel.ts;.docx 用 mammoth;.pdf 用 pdf-parse(v2 class API)。
87
+ * 读取/解析失败抛带路径的错误。
88
+ */
89
+ export async function extractText(repoRoot, relPath) {
90
+ const full = join(repoRoot, relPath);
91
+ const ext = extname(relPath).toLowerCase();
92
+ try {
93
+ if (ext === '.md' || ext === '.txt') {
94
+ return await readFile(full, 'utf8');
95
+ }
96
+ if (ext === '.xlsx') {
97
+ const wb = await parseWorkbook(full);
98
+ return wb.sheets.map((s) => sheetToMarkdown(s)).join('\n\n');
99
+ }
100
+ if (ext === '.docx') {
101
+ // mammoth 动态 import:仅 .docx 路径需要,避免无谓加载
102
+ const mammoth = await import('mammoth');
103
+ const { value } = await mammoth.extractRawText({ path: full });
104
+ return value;
105
+ }
106
+ if (ext === '.pdf') {
107
+ // pdf-parse v2:class API(动态 import 仅 .pdf 路径需要,避免无谓加载)
108
+ const { PDFParse } = await import('pdf-parse');
109
+ const buf = await readFile(full);
110
+ const parser = new PDFParse({ data: buf });
111
+ try {
112
+ const result = await parser.getText();
113
+ return result.text;
114
+ }
115
+ finally {
116
+ await parser.destroy();
117
+ }
118
+ }
119
+ throw new Error(`不支持的扩展名 ${ext}`);
120
+ }
121
+ catch (err) {
122
+ throw new Error(`文本抽取失败 ${relPath}:${err.message}`);
123
+ }
124
+ }
125
+ const DEFAULT_MODEL = 'claude-sonnet-4-6';
126
+ /** 抽取条目数组的 outputSchema 描述(供 agent 自校验,spec §4.2) */
127
+ const EXTRACT_OUTPUT_SCHEMA = '[{ "title": string, "description": string, "status": "implemented"|"unimplemented", ' +
128
+ '"section": string, "evidence": string[], "confidence": "high"|"medium"|"low" }]';
129
+ /** 单文档抽取 prompt:内嵌 redact 后文本 + redact 后代码索引(spec §4.2) */
130
+ function buildExtractPrompt(args) {
131
+ return `你是一名需求抽取员。从下面这份老文档抽取需求条目,逐条判定其在当前代码库里是否已实现。
132
+
133
+ # 文档
134
+ 路径:${args.docPath}(kind=${args.docKind})
135
+ ---
136
+ ${args.redactedText}
137
+ ---
138
+
139
+ # 当前代码库结构索引(file tree;判 implemented 时参考)
140
+ ${args.redactedCodeIndex}
141
+
142
+ # 任务
143
+ - 抽取该文档里的每条需求,给 title(一行)+ description(正文)。
144
+ - 逐条判 status:implemented(代码已实现)或 unimplemented。
145
+ - 判 implemented 必须在 evidence 给出代码依据(形如 "src/foo.ts:42 ...");unimplemented 时 evidence 为 []。
146
+ - section:该条所在章节锚 / 标题;无则空字符串。
147
+ - confidence:你对 status 判定的置信度 high/medium/low。
148
+
149
+ # 输出格式(严格 JSON,无 preamble)
150
+ ${EXTRACT_OUTPUT_SCHEMA}`;
151
+ }
152
+ /**
153
+ * prep:每来源文档建一个 LlmTask(spec §4.1 第 4 步 / §4.2)。
154
+ * redact 对**全部输入**(文档文本 + 代码索引);prompt 内嵌 redact 后两者(ApiRunner 只发 prompt)。
155
+ * @param codeIndex whole-repo 代码文件路径列表(file tree),由调用方传入
156
+ */
157
+ export async function buildExtractTasks(repoRoot, sources, codeIndex) {
158
+ // 代码索引对全部 task 相同,redact 一次(spec §4.1 第 3 步:全部输入都 redact,含代码索引)
159
+ const redactedCodeIndex = redact(codeIndex.join('\n')).redactedText;
160
+ const tasks = [];
161
+ for (let i = 0; i < sources.length; i++) {
162
+ const src = sources[i];
163
+ const rawText = await extractText(repoRoot, src.path);
164
+ const redactedText = redact(rawText).redactedText;
165
+ const prompt = buildExtractPrompt({
166
+ docPath: src.path,
167
+ docKind: src.kind,
168
+ redactedText,
169
+ redactedCodeIndex,
170
+ });
171
+ tasks.push({
172
+ op: 'extract',
173
+ // inputs:与 prompt 并列的 redact 快照(文档 + 代码索引;非送 LLM 通道,spec §4.2)
174
+ inputs: [
175
+ { source: src.path, content: redactedText },
176
+ { source: '<code-index>', content: redactedCodeIndex },
177
+ ],
178
+ prompt,
179
+ model: DEFAULT_MODEL,
180
+ outputSchema: EXTRACT_OUTPUT_SCHEMA,
181
+ outputPath: `.cache/extract-result-${i}.json`,
182
+ });
183
+ }
184
+ return tasks;
185
+ }
186
+ const STATUS_SET = new Set(['implemented', 'unimplemented']);
187
+ const CONFIDENCE_SET = new Set(['high', 'medium', 'low']);
188
+ /**
189
+ * 解析 + 校验各 task 结果(spec §4.4 第 2-3 步)。
190
+ * 每个 ExtractResultInput.text 是需求条目数组的 JSON 字符串。
191
+ * 非法 JSON / schema 不符 → 抛带 source 的错误。
192
+ */
193
+ export function parseExtractResults(inputs) {
194
+ const out = [];
195
+ for (const input of inputs) {
196
+ let arr;
197
+ try {
198
+ arr = JSON.parse(input.text.trim());
199
+ }
200
+ catch (err) {
201
+ throw new Error(`extract 结果解析失败 ${input.source}:${err.message}`);
202
+ }
203
+ if (!Array.isArray(arr)) {
204
+ throw new Error(`extract 结果 ${input.source}:顶层不是数组`);
205
+ }
206
+ arr.forEach((e, i) => {
207
+ const at = `${input.source}[${i}]`;
208
+ // 元素守卫:null / 非对象 / 数组提前报错 —— 否则下面 o.title 访问 null 抛无 source 的 TypeError
209
+ if (e === null || typeof e !== 'object' || Array.isArray(e)) {
210
+ throw new Error(`${at} 须为 object,实得 ${e === null ? 'null' : typeof e}`);
211
+ }
212
+ const o = e;
213
+ if (typeof o.title !== 'string' || o.title === '')
214
+ throw new Error(`${at}.title 须为非空字符串`);
215
+ if (typeof o.description !== 'string')
216
+ throw new Error(`${at}.description 须为字符串`);
217
+ if (!STATUS_SET.has(o.status))
218
+ throw new Error(`${at}.status 越界:${String(o.status)}`);
219
+ if (!CONFIDENCE_SET.has(o.confidence))
220
+ throw new Error(`${at}.confidence 越界:${String(o.confidence)}`);
221
+ if (!Array.isArray(o.evidence) || !o.evidence.every((x) => typeof x === 'string')) {
222
+ throw new Error(`${at}.evidence 须为 string[]`);
223
+ }
224
+ const section = typeof o.section === 'string' ? o.section : '';
225
+ out.push({
226
+ title: o.title,
227
+ description: o.description,
228
+ status: o.status,
229
+ source: { document: input.source, section, kind: input.kind },
230
+ evidence: o.evidence,
231
+ confidence: o.confidence,
232
+ });
233
+ });
234
+ }
235
+ return out;
236
+ }
237
+ /** 归一化 content hash:title+description 去空白后 sha256 前 12 位 */
238
+ function contentHash(title, description) {
239
+ const norm = (title + ' ' + description).replace(/\s+/g, ' ').trim();
240
+ return createHash('sha256').update(norm, 'utf8').digest('hex').slice(0, 12);
241
+ }
242
+ /** 匹配键(spec §6.1):document +(section 非空用它,否则 content hash) */
243
+ function matchKey(document, section, title, description) {
244
+ return section !== ''
245
+ ? `${document} sec:${section}`
246
+ : `${document} hash:${contentHash(title, description)}`;
247
+ }
248
+ /** ExtractedRequirement → draft LegacyRequirement(id/review 由调用方按 change 定) */
249
+ function toRequirement(e) {
250
+ return {
251
+ id: '',
252
+ title: e.title,
253
+ description: e.description,
254
+ status: e.status,
255
+ source: e.source,
256
+ evidence: e.evidence,
257
+ confidence: e.confidence,
258
+ priority: null,
259
+ review: 'pending',
260
+ notes: '',
261
+ };
262
+ }
263
+ /**
264
+ * 增量 diff(spec §6.1):本轮抽取条目 vs 已确认 yaml。
265
+ * 匹配仅在键唯一(旧侧、新侧各恰好 1 条)时进行;任一侧多于 1 条 → conflict。
266
+ * confirmed 为 null(首次抽取)时全部 new。
267
+ */
268
+ export function diffAgainstConfirmed(extracted, confirmed) {
269
+ const oldList = confirmed?.requirements ?? [];
270
+ // 按键分组
271
+ const oldByKey = new Map();
272
+ for (const r of oldList) {
273
+ const k = matchKey(r.source.document, r.source.section, r.title, r.description);
274
+ (oldByKey.get(k) ?? oldByKey.set(k, []).get(k)).push(r);
275
+ }
276
+ const newByKey = new Map();
277
+ for (const e of extracted) {
278
+ const k = matchKey(e.source.document, e.source.section, e.title, e.description);
279
+ (newByKey.get(k) ?? newByKey.set(k, []).get(k)).push(e);
280
+ }
281
+ const draft = [];
282
+ const allKeys = new Set([...oldByKey.keys(), ...newByKey.keys()]);
283
+ for (const k of allKeys) {
284
+ const olds = oldByKey.get(k) ?? [];
285
+ const news = newByKey.get(k) ?? [];
286
+ if (olds.length > 1 || news.length > 1) {
287
+ // 冲突:键非唯一(spec §6.1)。该键下旧 + 新条目一个都不能丢:
288
+ // 新条目 → conflict,不继承 id
289
+ for (const e of news)
290
+ draft.push({ requirement: toRequirement(e), change: 'conflict' });
291
+ // 旧条目:本轮没抽到该键 → vanished(保留 id,用户决定删不删);
292
+ // 键被本轮新条目竞争 → 同进 conflict、清空 id(spec §6.1「不继承既有 id」),不静默丢失
293
+ for (const o of olds) {
294
+ draft.push(news.length === 0
295
+ ? { requirement: o, change: 'vanished' }
296
+ : { requirement: { ...o, id: '', review: 'pending' }, change: 'conflict' });
297
+ }
298
+ continue;
299
+ }
300
+ const old = olds[0];
301
+ const ne = news[0];
302
+ if (old && ne) {
303
+ // matched:复制 id,保留用户 priority/notes;status/evidence/confidence 用新值。
304
+ // changed 判定须含 title/description/status/evidence/confidence 全部 5 项(spec §6.1
305
+ //「新值与既有全一致」)—— 漏 evidence/confidence 会把它们的变化误标 unchanged、跳过用户复审。
306
+ const changed = old.title !== ne.title ||
307
+ old.description !== ne.description ||
308
+ old.status !== ne.status ||
309
+ old.confidence !== ne.confidence ||
310
+ JSON.stringify(old.evidence) !== JSON.stringify(ne.evidence);
311
+ draft.push({
312
+ requirement: {
313
+ ...toRequirement(ne),
314
+ id: old.id,
315
+ priority: old.priority,
316
+ notes: old.notes,
317
+ review: changed ? 'pending' : 'confirmed',
318
+ },
319
+ change: changed ? 'changed' : 'unchanged',
320
+ });
321
+ }
322
+ else if (ne) {
323
+ draft.push({ requirement: toRequirement(ne), change: 'new' });
324
+ }
325
+ else if (old) {
326
+ draft.push({ requirement: old, change: 'vanished' });
327
+ }
328
+ }
329
+ return draft;
330
+ }
331
+ /** 渲染 draft .md 概览:按 change 分组(spec §6.1 第 3 步) */
332
+ function renderDraftOverview(draft) {
333
+ const lines = ['# Legacy Requirements Draft 概览', ''];
334
+ lines.push('LLM 抽取 + 增量 diff 的草稿。请审改 `legacy-requirements-draft.yaml` 后跑 `forge legacy-bridge extract --finalize`。', '');
335
+ const groups = [
336
+ ['new', 'New(本轮新抽)'],
337
+ ['changed', 'Changed(本轮有变更,待复审)'],
338
+ ['conflict', 'Conflict(匹配键撞,需手动认领 ID / 合并)'],
339
+ ['vanished', 'Vanished(既有有、本轮没抽到)'],
340
+ ['unchanged', 'Unchanged(未变,无需复审)'],
341
+ ];
342
+ for (const [kind, title] of groups) {
343
+ const items = draft.filter((d) => d.change === kind);
344
+ lines.push(`## ${title.split('(')[0].trim()} (${items.length})`, '');
345
+ if (items.length === 0) {
346
+ lines.push('(无)', '');
347
+ continue;
348
+ }
349
+ for (const d of items) {
350
+ const idLabel = d.requirement.id === '' ? '(待分配)' : d.requirement.id;
351
+ lines.push(`- \`${idLabel}\` ${d.requirement.title} —— ${d.requirement.source.document}` +
352
+ (d.requirement.source.section ? `#${d.requirement.source.section}` : ''));
353
+ }
354
+ lines.push('');
355
+ }
356
+ return lines.join('\n').trimEnd() + '\n';
357
+ }
358
+ /**
359
+ * --apply 后处理(spec §4.4 第 3-5 步):
360
+ * 校验汇总 → 增量 diff → 产 draft yaml + md 概览。
361
+ */
362
+ export function applyExtractResult(results, confirmed) {
363
+ const extracted = parseExtractResults(results);
364
+ const draft = diffAgainstConfirmed(extracted, confirmed);
365
+ const draftFile = {
366
+ schema: 'forge-legacy-requirements/v1',
367
+ requirements: draft.map((d) => d.requirement),
368
+ };
369
+ return {
370
+ draftYaml: stringifyYaml(draftFile),
371
+ draftMarkdown: renderDraftOverview(draft),
372
+ };
373
+ }
374
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../../src/core/legacy-bridge/extractor.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import Anthropic from '@anthropic-ai/sdk';
2
2
  import type { LegacyAnchor, LegacyAnchorsFile } from './types.js';
3
+ import type { LlmTask } from './llm-task.js';
3
4
  /** 单 anchor 索引项 */
4
5
  export interface IndexEntry {
5
6
  path: string;
@@ -19,10 +20,15 @@ export interface IndexerClient {
19
20
  export declare function chunkText(text: string, maxChunkBytes?: number): string[];
20
21
  /** 跑单 anchor 的索引 */
21
22
  export declare function indexAnchor(client: IndexerClient, anchor: LegacyAnchor): Promise<IndexEntry>;
22
- /** 跑全部 authoritative anchor */
23
- export declare function buildIndex(client: IndexerClient, file: LegacyAnchorsFile): Promise<IndexEntry[]>;
24
23
  /** 渲染索引为 markdown(forge/docs/index.md) */
25
24
  export declare function renderIndexMarkdown(entries: IndexEntry[]): string;
26
25
  /** 摘要长度容差校验(spec §5.4 indexer) */
27
26
  export declare function isSummaryWithinTolerance(summary: string): boolean;
27
+ /** 确定性 prep:产 batch 摘要 LlmTask + metadata-only 的 prebuilt 项 */
28
+ export declare function buildIndexTask(file: LegacyAnchorsFile, readText: (anchor: LegacyAnchor) => Promise<string>): Promise<{
29
+ task: LlmTask | null;
30
+ prebuilt: IndexEntry[];
31
+ }>;
32
+ /** 确定性后处理:LLM 的 {path:summary} map + prebuilt → index markdown */
33
+ export declare function applyIndexResult(llmText: string, file: LegacyAnchorsFile, prebuilt: IndexEntry[]): string;
28
34
  //# sourceMappingURL=indexer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/indexer.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElE,mBAAmB;AACnB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,KAAK,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;KAC/F,CAAC;CACH;AAQD,0BAA0B;AAC1B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,MAA8B,GAAG,MAAM,EAAE,CAe/F;AAwBD,oBAAoB;AACpB,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED,+BAA+B;AAC/B,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,EAAE,CAAC,CAOvB;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAWjE;AAED,kCAAkC;AAClC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMjE"}
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/indexer.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,mBAAmB;AACnB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,KAAK,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;KAC/F,CAAC;CACH;AAQD,0BAA0B;AAC1B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,MAA8B,GAAG,MAAM,EAAE,CAe/F;AAwBD,oBAAoB;AACpB,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAWjE;AAED,kCAAkC;AAClC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMjE;AAED,+DAA+D;AAC/D,wBAAsB,cAAc,CAClC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,GAClD,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC,CAgC3D;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,UAAU,EAAE,GACrB,MAAM,CAuBR"}
@@ -77,15 +77,6 @@ export async function indexAnchor(client, anchor) {
77
77
  inputBytes,
78
78
  };
79
79
  }
80
- /** 跑全部 authoritative anchor */
81
- export async function buildIndex(client, file) {
82
- const auth = file.anchors.filter((a) => a.authoritative);
83
- const out = [];
84
- for (const a of auth) {
85
- out.push(await indexAnchor(client, a));
86
- }
87
- return out;
88
- }
89
80
  /** 渲染索引为 markdown(forge/docs/index.md) */
90
81
  export function renderIndexMarkdown(entries) {
91
82
  const lines = [];
@@ -105,6 +96,67 @@ export function isSummaryWithinTolerance(summary) {
105
96
  return (len >= SUMMARY_TARGET_LEN - SUMMARY_TOLERANCE * 2 &&
106
97
  len <= SUMMARY_TARGET_LEN + SUMMARY_TOLERANCE * 4);
107
98
  }
99
+ /** 确定性 prep:产 batch 摘要 LlmTask + metadata-only 的 prebuilt 项 */
100
+ export async function buildIndexTask(file, readText) {
101
+ // 只处理 authoritative anchor
102
+ const auth = file.anchors.filter((a) => a.authoritative);
103
+ const prebuilt = [];
104
+ const llmAnchors = [];
105
+ for (const a of auth) {
106
+ // metadata-only role 不进 LLM,走 prebuilt 路径
107
+ if (METADATA_ONLY_INDEX_ROLES.has(a.role)) {
108
+ prebuilt.push(await indexAnchorMetadataOnly(a));
109
+ continue;
110
+ }
111
+ // 读文件内容并 redact 敏感数据
112
+ const masked = redact(await readText(a)).redactedText;
113
+ llmAnchors.push({ anchor: a, masked });
114
+ }
115
+ // 所有 anchor 均为 metadata-only,不需要 LLM
116
+ if (llmAnchors.length === 0)
117
+ return { task: null, prebuilt };
118
+ // 构造 batch prompt:合并所有需要 LLM 的 anchor
119
+ const prompt = `请为下列每份文档产出约 ${SUMMARY_TARGET_LEN} 字摘要。\n严格输出 JSON 对象 {"<path>": "<摘要>"},不加 preamble。\n\n` +
120
+ llmAnchors.map((x) => `## ${x.anchor.path}(role=${x.anchor.role})\n${x.masked}`).join('\n\n');
121
+ return {
122
+ task: {
123
+ op: 'index',
124
+ inputs: llmAnchors.map((x) => ({ source: x.anchor.path, content: x.masked })),
125
+ prompt,
126
+ model: DEFAULT_MODEL,
127
+ outputSchema: '{ "<anchor-path>": "<约 100 字摘要>" }',
128
+ outputPath: '.cache/legacy-bridge-result-index.json',
129
+ },
130
+ prebuilt,
131
+ };
132
+ }
133
+ /** 确定性后处理:LLM 的 {path:summary} map + prebuilt → index markdown */
134
+ export function applyIndexResult(llmText, file, prebuilt) {
135
+ // 解析 LLM 返回的 {path: summary} JSON 对象
136
+ let summaries = {};
137
+ try {
138
+ const parsed = JSON.parse(llmText.trim());
139
+ // 排除 JSON 数组:typeof [] === 'object' 亦为 true,放行会产 numeric-key 垃圾条目
140
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
141
+ summaries = parsed;
142
+ }
143
+ catch {
144
+ // 解析失败:LLM 摘要全空,prebuilt 仍渲染
145
+ }
146
+ // 建立 path → role 的反查 map
147
+ const roleOf = new Map(file.anchors.map((a) => [a.path, a.role]));
148
+ // 合并 prebuilt 与 LLM 摘要,统一渲染 markdown
149
+ const entries = [
150
+ ...prebuilt,
151
+ ...Object.entries(summaries).map(([path, summary]) => ({
152
+ path,
153
+ role: roleOf.get(path) ?? 'unmatched',
154
+ summary,
155
+ inputBytes: 0,
156
+ })),
157
+ ];
158
+ return renderIndexMarkdown(entries);
159
+ }
108
160
  /** P7-03 修复:metadata-only 索引(不发 LLM,只读文件名 + 可选 frontmatter)
109
161
  * spec §7 line 909:验收报告仅在 forge/docs/index.md 索引文件名 + metadata,
110
162
  * 不读全文,不发 LLM,提供 trace graph 入口
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/core/legacy-bridge/indexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/core/legacy-bridge/indexer.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,8CAA8C;AAG9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAqBrC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAC1C,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,uBAAuB;AACvB,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC,0BAA0B;AAC1B,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,gBAAwB,qBAAqB;IACnF,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,aAAa;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,aAAa,IAAI,OAAO,EAAE,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wBAAwB;AACxB,KAAK,UAAU,cAAc,CAAC,MAAqB,EAAE,KAAa,EAAE,IAAY;IAC9E,MAAM,MAAM,GAAG,iBAAiB,IAAI;;;EAGpC,KAAK,EAAE,CAAC;IACR,yBAAyB;IACzB,OAAO,CAAC,GAAG,CACT,aAAa,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,oEAAoE,aAAa,aAAa,CAC7I,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1C,KAAK,EAAE,aAAa;QACpB,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAqC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC/F,OAAO,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,4EAA4E;AAC5E,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAEjE,oBAAoB;AACpB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAqB,EACrB,MAAoB;IAEpB,6EAA6E;IAC7E,qCAAqC;IACrC,IAAI,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,MAAM,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAI,OAAe,CAAC;IACpB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,aAAa;QACb,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,mCAAmC;QACnC,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,mBAAmB,CAAC,OAAqB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,QAAQ,cAAc,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,OAAO,CACL,GAAG,IAAI,kBAAkB,GAAG,iBAAiB,GAAG,CAAC;QACjD,GAAG,IAAI,kBAAkB,GAAG,iBAAiB,GAAG,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAuB,EACvB,QAAmD;IAEnD,2BAA2B;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,MAAM,UAAU,GAAoD,EAAE,CAAC;IACvE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,0CAA0C;QAC1C,IAAI,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,qCAAqC;IACrC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC7D,sCAAsC;IACtC,MAAM,MAAM,GACV,eAAe,kBAAkB,yDAAyD;QAC1F,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChG,OAAO;QACL,IAAI,EAAE;YACJ,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7E,MAAM;YACN,KAAK,EAAE,aAAa;YACpB,YAAY,EAAE,oCAAoC;YAClD,UAAU,EAAE,wCAAwC;SACrD;QACD,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,IAAuB,EACvB,QAAsB;IAEtB,qCAAqC;IACrC,IAAI,SAAS,GAA2B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAA2B,CAAC;QACpE,kEAAkE;QAClE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,SAAS,GAAG,MAAM,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IACD,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,qCAAqC;IACrC,MAAM,OAAO,GAAiB;QAC5B,GAAG,QAAQ;QACX,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACrD,IAAI;YACJ,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,WAAW;YACrC,OAAO;YACP,UAAU,EAAE,CAAC;SACd,CAAC,CAAC;KACJ,CAAC;IACF,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,uBAAuB,CAAC,MAAoB;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACtD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,kBAAkB,GAAG,sBAAsB,CAAC;IAChD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACjE,wCAAwC;YACxC,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC;iBACtE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;iBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,IAAI,MAAM,EAAE,CAAC;gBACX,kBAAkB,GAAG,uBAAuB,MAAM,wBAAwB,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,kBAAkB,GAAG,iDAAiD,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,kBAAkB;QAC3B,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ /** 需求实现状态(spec §3,D1 二值) */
2
+ export type LegacyRequirementStatus = 'implemented' | 'unimplemented';
3
+ /** 审核态(spec §3) */
4
+ export type LegacyRequirementReview = 'pending' | 'confirmed';
5
+ /** 来源类别(spec §3,D3) */
6
+ export type LegacyRequirementKind = 'srs' | 'backlog-file' | 'issue-export';
7
+ /** LLM 判定置信度 */
8
+ export type LegacyRequirementConfidence = 'high' | 'medium' | 'low';
9
+ /** 优先级(用户填) */
10
+ export type LegacyRequirementPriority = 'critical' | 'high' | 'medium' | 'low' | null;
11
+ /** 来源定位 */
12
+ export interface LegacyRequirementSource {
13
+ /** 来源文件,相对仓库根 */
14
+ document: string;
15
+ /** 章节锚 / 标题;无则空字符串 */
16
+ section: string;
17
+ kind: LegacyRequirementKind;
18
+ }
19
+ /** 单条 legacy requirement(legacy-requirements.yaml#requirements[]) */
20
+ export interface LegacyRequirement {
21
+ /** 稳定 ID 'LR-NNNN';draft 里新条目为空字符串 */
22
+ id: string;
23
+ title: string;
24
+ description: string;
25
+ status: LegacyRequirementStatus;
26
+ source: LegacyRequirementSource;
27
+ /** implemented 的代码依据;unimplemented 时为空数组 */
28
+ evidence: string[];
29
+ confidence: LegacyRequirementConfidence;
30
+ priority: LegacyRequirementPriority;
31
+ review: LegacyRequirementReview;
32
+ notes: string;
33
+ }
34
+ /** legacy-requirements.yaml 顶层结构 */
35
+ export interface LegacyRequirementsFile {
36
+ schema: 'forge-legacy-requirements/v1';
37
+ requirements: LegacyRequirement[];
38
+ }
39
+ /** 文件名常量(确认产物 + draft 态) */
40
+ export declare const LEGACY_REQUIREMENTS_FILE = "legacy-requirements.yaml";
41
+ export declare const LEGACY_REQUIREMENTS_DRAFT_FILE = "legacy-requirements-draft.yaml";
42
+ export declare const LEGACY_REQUIREMENTS_DRAFT_MD = "legacy-requirements-draft.md";
43
+ /** 校验任意对象是否合法 LegacyRequirementsFile;非法即抛错 */
44
+ export declare function validateLegacyRequirementsFile(obj: unknown): LegacyRequirementsFile;
45
+ /** 读 forge/legacy-requirements.yaml;文件不存在返回 null;损坏或非法 schema 抛错 */
46
+ export declare function loadLegacyRequirements(forgeRoot: string): Promise<LegacyRequirementsFile | null>;
47
+ /**
48
+ * --finalize 纯逻辑(spec §6.2):
49
+ * 给 id 为空的条目按 max(既有所有 LR-NNNN)+1 顺序分配;整表 review 置 confirmed。
50
+ * 不读盘/不写盘 —— 调用方(CLI)负责 IO。
51
+ */
52
+ export declare function finalizeLegacyRequirements(draft: LegacyRequirement[]): LegacyRequirementsFile;
53
+ //# sourceMappingURL=legacy-requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-requirements.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/legacy-requirements.ts"],"names":[],"mappings":"AAKA,4BAA4B;AAC5B,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG,eAAe,CAAC;AACtE,mBAAmB;AACnB,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,CAAC;AAC9D,uBAAuB;AACvB,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,cAAc,GAAG,cAAc,CAAC;AAC5E,gBAAgB;AAChB,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AACpE,eAAe;AACf,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;AAQtF,WAAW;AACX,MAAM,WAAW,uBAAuB;IACtC,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,qBAAqB,CAAC;CAC7B;AAED,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,uBAAuB,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,2BAA2B,CAAC;IACxC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oCAAoC;AACpC,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,8BAA8B,CAAC;IACvC,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,4BAA4B;AAC5B,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE,eAAO,MAAM,8BAA8B,mCAAmC,CAAC;AAC/E,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E,8CAA8C;AAC9C,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAenF;AAgCD,oEAAoE;AACpE,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAgBxC;AAaD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,sBAAsB,CAW7F"}