@accelerator-mzq/forge 1.4.0 → 2.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 (59) 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 +333 -85
  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/index.js +0 -0
  10. package/dist/core/backlog/assets/backlog-readme.md +4 -2
  11. package/dist/core/backlog/index.d.ts +1 -1
  12. package/dist/core/backlog/index.d.ts.map +1 -1
  13. package/dist/core/backlog/index.js +27 -8
  14. package/dist/core/backlog/index.js.map +1 -1
  15. package/dist/core/backlog/render.d.ts +48 -3
  16. package/dist/core/backlog/render.d.ts.map +1 -1
  17. package/dist/core/backlog/render.js +151 -15
  18. package/dist/core/backlog/render.js.map +1 -1
  19. package/dist/core/legacy-bridge/extractor.d.ts +79 -0
  20. package/dist/core/legacy-bridge/extractor.d.ts.map +1 -0
  21. package/dist/core/legacy-bridge/extractor.js +374 -0
  22. package/dist/core/legacy-bridge/extractor.js.map +1 -0
  23. package/dist/core/legacy-bridge/indexer.d.ts +8 -2
  24. package/dist/core/legacy-bridge/indexer.d.ts.map +1 -1
  25. package/dist/core/legacy-bridge/indexer.js +61 -9
  26. package/dist/core/legacy-bridge/indexer.js.map +1 -1
  27. package/dist/core/legacy-bridge/legacy-requirements.d.ts +53 -0
  28. package/dist/core/legacy-bridge/legacy-requirements.d.ts.map +1 -0
  29. package/dist/core/legacy-bridge/legacy-requirements.js +114 -0
  30. package/dist/core/legacy-bridge/legacy-requirements.js.map +1 -0
  31. package/dist/core/legacy-bridge/llm-task.d.ts +54 -0
  32. package/dist/core/legacy-bridge/llm-task.d.ts.map +1 -0
  33. package/dist/core/legacy-bridge/llm-task.js +87 -0
  34. package/dist/core/legacy-bridge/llm-task.js.map +1 -0
  35. package/dist/core/legacy-bridge/mapper.d.ts +8 -9
  36. package/dist/core/legacy-bridge/mapper.d.ts.map +1 -1
  37. package/dist/core/legacy-bridge/mapper.js +24 -39
  38. package/dist/core/legacy-bridge/mapper.js.map +1 -1
  39. package/dist/core/legacy-bridge/quality-judge.d.ts +5 -0
  40. package/dist/core/legacy-bridge/quality-judge.d.ts.map +1 -1
  41. package/dist/core/legacy-bridge/quality-judge.js +25 -21
  42. package/dist/core/legacy-bridge/quality-judge.js.map +1 -1
  43. package/dist/core/legacy-bridge/regenerator.d.ts +21 -1
  44. package/dist/core/legacy-bridge/regenerator.d.ts.map +1 -1
  45. package/dist/core/legacy-bridge/regenerator.js +132 -2
  46. package/dist/core/legacy-bridge/regenerator.js.map +1 -1
  47. package/dist/core/legacy-bridge/runners.d.ts +33 -0
  48. package/dist/core/legacy-bridge/runners.d.ts.map +1 -0
  49. package/dist/core/legacy-bridge/runners.js +77 -0
  50. package/dist/core/legacy-bridge/runners.js.map +1 -0
  51. package/dist/core/legacy-bridge/sync-check.d.ts +8 -0
  52. package/dist/core/legacy-bridge/sync-check.d.ts.map +1 -1
  53. package/dist/core/legacy-bridge/sync-check.js +83 -0
  54. package/dist/core/legacy-bridge/sync-check.js.map +1 -1
  55. package/dist/core/legacy-bridge/types.d.ts +2 -0
  56. package/dist/core/legacy-bridge/types.d.ts.map +1 -1
  57. package/dist/core/templates/commands/archive.md +15 -0
  58. package/dist/core/templates/skills/legacy-bridge-fulfillment.md +22 -0
  59. package/package.json +21 -20
@@ -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"}
@@ -0,0 +1,114 @@
1
+ // Layer 3b:forge-legacy-requirements/v1 schema + load + finalize(spec §3 / §6.2)
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { parse as parseYaml } from 'yaml';
5
+ const STATUS_VALUES = new Set(['implemented', 'unimplemented']);
6
+ const REVIEW_VALUES = new Set(['pending', 'confirmed']);
7
+ const KIND_VALUES = new Set(['srs', 'backlog-file', 'issue-export']);
8
+ const CONFIDENCE_VALUES = new Set(['high', 'medium', 'low']);
9
+ const PRIORITY_VALUES = new Set(['critical', 'high', 'medium', 'low']);
10
+ /** 文件名常量(确认产物 + draft 态) */
11
+ export const LEGACY_REQUIREMENTS_FILE = 'legacy-requirements.yaml';
12
+ export const LEGACY_REQUIREMENTS_DRAFT_FILE = 'legacy-requirements-draft.yaml';
13
+ export const LEGACY_REQUIREMENTS_DRAFT_MD = 'legacy-requirements-draft.md';
14
+ /** 校验任意对象是否合法 LegacyRequirementsFile;非法即抛错 */
15
+ export function validateLegacyRequirementsFile(obj) {
16
+ if (typeof obj !== 'object' || obj === null) {
17
+ throw new Error('legacy-requirements:顶层不是对象');
18
+ }
19
+ const o = obj;
20
+ if (o.schema !== 'forge-legacy-requirements/v1') {
21
+ throw new Error(`legacy-requirements:schema 字段须为 forge-legacy-requirements/v1,实得 ${String(o.schema)}`);
22
+ }
23
+ if (!Array.isArray(o.requirements)) {
24
+ throw new Error('legacy-requirements:requirements 须为数组');
25
+ }
26
+ o.requirements.forEach((r, i) => validateRequirement(r, i));
27
+ return obj;
28
+ }
29
+ /** 校验单条 requirement;非法即抛错(i 用于错误定位) */
30
+ function validateRequirement(r, i) {
31
+ if (typeof r !== 'object' || r === null)
32
+ throw new Error(`requirement[${i}]:不是对象`);
33
+ const o = r;
34
+ const at = `requirement[${i}]`;
35
+ if (typeof o.id !== 'string')
36
+ throw new Error(`${at}.id 须为字符串(新条目用空串)`);
37
+ if (typeof o.title !== 'string' || o.title === '')
38
+ throw new Error(`${at}.title 须为非空字符串`);
39
+ if (typeof o.description !== 'string')
40
+ throw new Error(`${at}.description 须为字符串`);
41
+ if (!STATUS_VALUES.has(o.status))
42
+ throw new Error(`${at}.status 越界:${String(o.status)}`);
43
+ if (!REVIEW_VALUES.has(o.review))
44
+ throw new Error(`${at}.review 越界:${String(o.review)}`);
45
+ if (!CONFIDENCE_VALUES.has(o.confidence)) {
46
+ throw new Error(`${at}.confidence 越界:${String(o.confidence)}`);
47
+ }
48
+ if (o.priority !== null && !PRIORITY_VALUES.has(o.priority)) {
49
+ throw new Error(`${at}.priority 越界:${String(o.priority)}`);
50
+ }
51
+ if (!Array.isArray(o.evidence) || !o.evidence.every((x) => typeof x === 'string')) {
52
+ throw new Error(`${at}.evidence 须为 string[]`);
53
+ }
54
+ if (typeof o.notes !== 'string')
55
+ throw new Error(`${at}.notes 须为字符串`);
56
+ const src = o.source;
57
+ if (typeof src !== 'object' || src === null)
58
+ throw new Error(`${at}.source 须为对象`);
59
+ if (typeof src.document !== 'string')
60
+ throw new Error(`${at}.source.document 须为字符串`);
61
+ if (typeof src.section !== 'string')
62
+ throw new Error(`${at}.source.section 须为字符串(无则空串)`);
63
+ if (!KIND_VALUES.has(src.kind))
64
+ throw new Error(`${at}.source.kind 越界:${String(src.kind)}`);
65
+ }
66
+ /** 读 forge/legacy-requirements.yaml;文件不存在返回 null;损坏或非法 schema 抛错 */
67
+ export async function loadLegacyRequirements(forgeRoot) {
68
+ const path = join(forgeRoot, LEGACY_REQUIREMENTS_FILE);
69
+ let raw;
70
+ try {
71
+ raw = await readFile(path, 'utf8');
72
+ }
73
+ catch (err) {
74
+ if (err.code === 'ENOENT')
75
+ return null;
76
+ throw err;
77
+ }
78
+ let parsed;
79
+ try {
80
+ parsed = parseYaml(raw);
81
+ }
82
+ catch (err) {
83
+ throw new Error(`legacy-requirements.yaml 解析失败:${err.message}`);
84
+ }
85
+ return validateLegacyRequirementsFile(parsed);
86
+ }
87
+ /** 从 'LR-0042' 取数字 42;非法格式返回 0 */
88
+ function parseLrNumber(id) {
89
+ const m = /^LR-(\d{4,})$/.exec(id);
90
+ return m ? Number(m[1]) : 0;
91
+ }
92
+ /** 'LR-' + 4 位零填充 */
93
+ function formatLrId(n) {
94
+ return `LR-${String(n).padStart(4, '0')}`;
95
+ }
96
+ /**
97
+ * --finalize 纯逻辑(spec §6.2):
98
+ * 给 id 为空的条目按 max(既有所有 LR-NNNN)+1 顺序分配;整表 review 置 confirmed。
99
+ * 不读盘/不写盘 —— 调用方(CLI)负责 IO。
100
+ */
101
+ export function finalizeLegacyRequirements(draft) {
102
+ let maxNum = 0;
103
+ for (const r of draft) {
104
+ if (r.id !== '')
105
+ maxNum = Math.max(maxNum, parseLrNumber(r.id));
106
+ }
107
+ const requirements = draft.map((r) => ({
108
+ ...r,
109
+ id: r.id === '' ? formatLrId(++maxNum) : r.id,
110
+ review: 'confirmed',
111
+ }));
112
+ return { schema: 'forge-legacy-requirements/v1', requirements };
113
+ }
114
+ //# sourceMappingURL=legacy-requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-requirements.js","sourceRoot":"","sources":["../../../src/core/legacy-bridge/legacy-requirements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /** 可走双路径的 LLM 操作类型 */
2
+ export type LlmOp = 'map' | 'index' | 'regenerate' | 'extract-facts' | 'quality-judge' | 'sync-check' | 'extract';
3
+ /** 一条已 redact 的输入 */
4
+ export interface LlmTaskInput {
5
+ source: string;
6
+ content: string;
7
+ }
8
+ /** 一个待执行的 LLM 任务(O 仅作输出类型标记,运行时不用) */
9
+ export interface LlmTask<O = unknown> {
10
+ op: LlmOp;
11
+ inputs: LlmTaskInput[];
12
+ prompt: string;
13
+ model: string;
14
+ outputSchema: string;
15
+ outputPath: string;
16
+ __outputType?: O;
17
+ }
18
+ /** agent 路径的交接信封 */
19
+ export interface TaskManifest {
20
+ forge_version: string;
21
+ op: LlmOp;
22
+ round: number;
23
+ tasks: LlmTask[];
24
+ meta?: Record<string, unknown>;
25
+ manifest_hash: string;
26
+ }
27
+ /** JCS 式稳定序列化:递归按键名排序后 JSON.stringify(数组保序) */
28
+ export declare function canonicalize(value: unknown): string;
29
+ /** 算 manifest_hash:覆盖除 manifest_hash 外的全部字段 */
30
+ export declare function computeManifestHash(m: Omit<TaskManifest, 'manifest_hash'>): string;
31
+ /** 组装 manifest 并填好 manifest_hash */
32
+ export declare function buildManifest(args: {
33
+ op: LlmOp;
34
+ round: number;
35
+ tasks: LlmTask[];
36
+ forgeVersion: string;
37
+ meta?: Record<string, unknown>;
38
+ }): TaskManifest;
39
+ /** 重算并比对 manifest_hash;任一字段被篡改即失败 */
40
+ export declare function verifyManifest(m: TaskManifest): {
41
+ ok: true;
42
+ } | {
43
+ ok: false;
44
+ reason: string;
45
+ };
46
+ /** manifest 文件路径:forge/.cache/legacy-bridge-task-<op>.json */
47
+ export declare function manifestPath(forgeRoot: string, op: LlmOp): string;
48
+ /** 写 manifest(创建 .cache 目录) */
49
+ export declare function writeManifest(forgeRoot: string, m: TaskManifest): Promise<void>;
50
+ /** 读 manifest;不存在返回 null;JSON 损坏 / hash 校验失败抛错 */
51
+ export declare function readManifest(forgeRoot: string, op: LlmOp): Promise<TaskManifest | null>;
52
+ /** 消费(移除)manifest —— --apply 成功后调用 */
53
+ export declare function consumeManifest(forgeRoot: string, op: LlmOp): Promise<void>;
54
+ //# sourceMappingURL=llm-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-task.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/llm-task.ts"],"names":[],"mappings":"AAMA,sBAAsB;AACtB,MAAM,MAAM,KAAK,GACb,KAAK,GACL,OAAO,GACP,YAAY,GACZ,eAAe,GACf,eAAe,GACf,YAAY,GACZ,SAAS,CAAC;AAEd,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sCAAsC;AACtC,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,OAAO;IAClC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,CAAC;CAClB;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAanD;AAED,+CAA+C;AAC/C,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,MAAM,CAElF;AAED,oCAAoC;AACpC,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,GAAG,YAAY,CASf;AAED,qCAAqC;AACrC,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAU5F;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG,MAAM,CAEjE;AAED,+BAA+B;AAC/B,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrF;AAED,kDAAkD;AAClD,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmB7F;AAED,sCAAsC;AACtC,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF"}
@@ -0,0 +1,87 @@
1
+ // src/core/legacy-bridge/llm-task.ts
2
+ // 双路径执行模型核心:LlmTask + TaskManifest 信封 + canonical hash
3
+ import { createHash } from 'node:crypto';
4
+ import { mkdir, readFile, writeFile, rm } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ /** JCS 式稳定序列化:递归按键名排序后 JSON.stringify(数组保序) */
7
+ export function canonicalize(value) {
8
+ const norm = (v) => {
9
+ if (Array.isArray(v))
10
+ return v.map(norm);
11
+ if (v && typeof v === 'object') {
12
+ const sorted = {};
13
+ for (const k of Object.keys(v).sort()) {
14
+ sorted[k] = norm(v[k]);
15
+ }
16
+ return sorted;
17
+ }
18
+ return v;
19
+ };
20
+ return JSON.stringify(norm(value));
21
+ }
22
+ /** 算 manifest_hash:覆盖除 manifest_hash 外的全部字段 */
23
+ export function computeManifestHash(m) {
24
+ return createHash('sha256').update(canonicalize(m), 'utf8').digest('hex');
25
+ }
26
+ /** 组装 manifest 并填好 manifest_hash */
27
+ export function buildManifest(args) {
28
+ const base = {
29
+ forge_version: args.forgeVersion,
30
+ op: args.op,
31
+ round: args.round,
32
+ tasks: args.tasks,
33
+ ...(args.meta ? { meta: args.meta } : {}),
34
+ };
35
+ return { ...base, manifest_hash: computeManifestHash(base) };
36
+ }
37
+ /** 重算并比对 manifest_hash;任一字段被篡改即失败 */
38
+ export function verifyManifest(m) {
39
+ const { manifest_hash, ...rest } = m;
40
+ const expected = computeManifestHash(rest);
41
+ if (expected !== manifest_hash) {
42
+ return {
43
+ ok: false,
44
+ reason: `manifest_hash 不匹配(可能被篡改或跨版本):期望 ${expected.slice(0, 12)}…,实得 ${manifest_hash.slice(0, 12)}…`,
45
+ };
46
+ }
47
+ return { ok: true };
48
+ }
49
+ /** manifest 文件路径:forge/.cache/legacy-bridge-task-<op>.json */
50
+ export function manifestPath(forgeRoot, op) {
51
+ return join(forgeRoot, '.cache', `legacy-bridge-task-${op}.json`);
52
+ }
53
+ /** 写 manifest(创建 .cache 目录) */
54
+ export async function writeManifest(forgeRoot, m) {
55
+ await mkdir(join(forgeRoot, '.cache'), { recursive: true });
56
+ await writeFile(manifestPath(forgeRoot, m.op), JSON.stringify(m, null, 2), 'utf8');
57
+ }
58
+ /** 读 manifest;不存在返回 null;JSON 损坏 / hash 校验失败抛错 */
59
+ export async function readManifest(forgeRoot, op) {
60
+ const p = manifestPath(forgeRoot, op);
61
+ let raw;
62
+ try {
63
+ raw = await readFile(p, 'utf8');
64
+ }
65
+ catch (err) {
66
+ // 文件不存在 → 返回 null;其他 IO 错误(权限等)向上抛
67
+ if (err.code === 'ENOENT')
68
+ return null;
69
+ throw err;
70
+ }
71
+ let m;
72
+ try {
73
+ m = JSON.parse(raw);
74
+ }
75
+ catch (err) {
76
+ throw new Error(`manifest ${p} 解析失败(文件可能损坏或截断写入):${err.message}`);
77
+ }
78
+ const v = verifyManifest(m);
79
+ if (!v.ok)
80
+ throw new Error(`manifest ${p} 校验失败:${v.reason}`);
81
+ return m;
82
+ }
83
+ /** 消费(移除)manifest —— --apply 成功后调用 */
84
+ export async function consumeManifest(forgeRoot, op) {
85
+ await rm(manifestPath(forgeRoot, op), { force: true });
86
+ }
87
+ //# sourceMappingURL=llm-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-task.js","sourceRoot":"","sources":["../../../src/core/legacy-bridge/llm-task.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import Anthropic from '@anthropic-ai/sdk';
2
1
  import type { LegacyAnchor, LegacyAnchorsFile } from './types.js';
2
+ import type { LlmTask } from './llm-task.js';
3
3
  /** mapper 输入 */
4
4
  export interface MapperInput {
5
5
  /** 项目根 */
@@ -24,14 +24,13 @@ export interface MapperOutput {
24
24
  /** 扫到但未匹配 role 的文件(让 LLM 标 'unmatched',用户后审) */
25
25
  unmatched: string[];
26
26
  }
27
- /** mapper 客户端最小接口 */
28
- export interface MapperClient {
29
- messages: {
30
- create: (args: Anthropic.Messages.MessageCreateParams) => Promise<Anthropic.Messages.Message>;
31
- };
32
- }
33
- /** 跑 mapping(LLM 推测) */
34
- export declare function runMapper(client: MapperClient, input: MapperInput): Promise<MapperOutput>;
27
+ /** 确定性 prep:扫文件 + 读 preview + redact + 拼 prompt → 一个 LlmTask */
28
+ export declare function buildMapTask(input: MapperInput): Promise<LlmTask>;
29
+ /** 确定性后处理:LLM 分类结果文本 → draft yaml/md + anchors */
30
+ export declare function applyMapResult(llmText: string, allFiles: string[], input: {
31
+ mode: 'merge' | 'overwrite';
32
+ existing?: LegacyAnchorsFile;
33
+ }): MapperOutput;
35
34
  /** 写 draft 到磁盘 */
36
35
  export declare function writeMapperDraft(forgeRoot: string, output: MapperOutput): Promise<{
37
36
  yamlPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/mapper.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAK1C,OAAO,KAAK,EAAE,YAAY,EAAoB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAapF,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,UAAU;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,oBAAoB;IACpB,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;CAC7B;AAED,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,6BAA6B;IAC7B,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACjC,gDAAgD;IAChD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,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;AAkGD,wBAAwB;AACxB,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAmG/F;AAuCD,kBAAkB;AAClB,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ/C"}
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/mapper.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAoB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAY7C,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,UAAU;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,oBAAoB;IACpB,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;CAC7B;AAED,gBAAgB;AAChB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,6BAA6B;IAC7B,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACjC,gDAAgD;IAChD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAkGD,gEAAgE;AAChE,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BvE;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE;IAAE,IAAI,EAAE,OAAO,GAAG,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACnE,YAAY,CAsCd;AAuCD,kBAAkB;AAClB,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ/C"}
@@ -106,21 +106,18 @@ function parseMapperResponse(text, fallbackPaths) {
106
106
  return fallbackPaths.map((p) => ({ path: p, role: 'unmatched' }));
107
107
  }
108
108
  }
109
- /** mapping(LLM 推测) */
110
- export async function runMapper(client, input) {
109
+ /** 确定性 prep:扫文件 + 读 preview + redact + 拼 prompt → 一个 LlmTask */
110
+ export async function buildMapTask(input) {
111
111
  const { projectRoot } = input;
112
112
  const docsPaths = input.docsPaths ?? DEFAULT_DOCS_PATHS;
113
- // 收集文件
114
113
  const allFiles = [];
115
114
  for (const docDir of docsPaths) {
116
115
  const full = join(projectRoot, docDir);
117
116
  if (!existsSync(full))
118
117
  continue;
119
- for await (const f of walk(full, projectRoot)) {
118
+ for await (const f of walk(full, projectRoot))
120
119
  allFiles.push(f);
121
- }
122
120
  }
123
- // 决策 #3a 全自动扫:也扫 src/ 找测试用例(.test / .spec / 测试文件名)
124
121
  if (input.scanSrc) {
125
122
  const srcRoot = join(projectRoot, 'src');
126
123
  if (existsSync(srcRoot)) {
@@ -130,29 +127,24 @@ export async function runMapper(client, input) {
130
127
  }
131
128
  }
132
129
  }
133
- // 读 preview;用 redact mask 敏感数据
134
130
  const entries = [];
135
131
  for (const f of allFiles) {
136
132
  const preview = redact(await readPreview(join(projectRoot, f))).redactedText;
137
133
  entries.push({ path: f, preview });
138
134
  }
139
- // 调 LLM
140
- let classifications;
141
- if (entries.length === 0) {
142
- classifications = [];
143
- }
144
- else {
145
- const mapPrompt = buildMapperPrompt(entries);
146
- // P7-07 修复:LLM 调用前数据传输声明
147
- console.log(`→ sending ${Buffer.byteLength(mapPrompt, 'utf8')} bytes to Anthropic API (provider=anthropic, region: auto, model=${DEFAULT_MODEL}, op=map ${entries.length} files)`);
148
- const result = await client.messages.create({
149
- model: DEFAULT_MODEL,
150
- max_tokens: 4096,
151
- messages: [{ role: 'user', content: mapPrompt }],
152
- });
153
- const block = result.content.find((b) => b.type === 'text');
154
- classifications = parseMapperResponse(block?.text ?? '', allFiles);
155
- }
135
+ return {
136
+ op: 'map',
137
+ inputs: entries.map((e) => ({ source: e.path, content: e.preview })),
138
+ prompt: buildMapperPrompt(entries),
139
+ model: DEFAULT_MODEL,
140
+ outputSchema: '[{ "path": string, "role": string, "modules": string[] }]',
141
+ outputPath: '.cache/legacy-bridge-result-map.json',
142
+ };
143
+ }
144
+ /** 确定性后处理:LLM 分类结果文本 draft yaml/md + anchors */
145
+ export function applyMapResult(llmText, allFiles, input) {
146
+ // 解析 LLM 返回文本;解析失败则全 fallback 为 unmatched
147
+ const classifications = parseMapperResponse(llmText, allFiles);
156
148
  const newAnchors = [];
157
149
  const unmatched = [];
158
150
  // 同 role 第一个标 authoritative=true(简化策略;用户后审)
@@ -164,33 +156,26 @@ export async function runMapper(client, input) {
164
156
  }
165
157
  const isFirst = !roleSeen.has(c.role);
166
158
  roleSeen.add(c.role);
167
- newAnchors.push({
168
- role: c.role,
169
- path: c.path,
170
- authoritative: isFirst,
171
- modules: c.modules,
172
- });
173
- }
174
- // merge 模式:保留 existing 中的 anchor(用户审过部分)
159
+ newAnchors.push({ role: c.role, path: c.path, authoritative: isFirst, modules: c.modules });
160
+ }
161
+ // merge 模式:保留 existing 中已审过的 anchor
175
162
  let preservedAnchors = [];
176
163
  if (input.mode === 'merge' && input.existing) {
177
164
  const existingPaths = new Set(input.existing.anchors.map((a) => a.path));
178
165
  preservedAnchors = input.existing.anchors;
179
- // 新增的 anchor 中,如果 path 已在 existing,跳过(避免重复)
180
- const filteredNew = newAnchors.filter((a) => !existingPaths.has(a.path));
166
+ // 新增中 path 已在 existing 的跳过(避免重复)
167
+ const filtered = newAnchors.filter((a) => !existingPaths.has(a.path));
181
168
  newAnchors.length = 0;
182
- newAnchors.push(...filteredNew);
169
+ newAnchors.push(...filtered);
183
170
  }
184
171
  const finalFile = {
185
172
  schema: 'forge-legacy-anchor/v1',
186
173
  anchors: [...preservedAnchors, ...newAnchors],
187
174
  redact: input.existing?.redact,
188
175
  };
189
- const draftYaml = stringifyYaml(finalFile);
190
- const draftMarkdown = renderMapperOverview(finalFile, unmatched);
191
176
  return {
192
- draftYaml,
193
- draftMarkdown,
177
+ draftYaml: stringifyYaml(finalFile),
178
+ draftMarkdown: renderMapperOverview(finalFile, unmatched),
194
179
  newAnchors,
195
180
  preservedAnchors,
196
181
  unmatched,
@@ -1 +1 @@
1
- {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../src/core/legacy-bridge/mapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../src/core/legacy-bridge/mapper.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,11 @@ export declare function judgeSingleFact(client: JudgeClient, regeneratedBody: st
55
55
  export declare function extractFactsFromOriginal(client: JudgeClient, originalText: string, n?: number): Promise<KeyFact[]>;
56
56
  /** 解析 judge 响应:第 1 行三态,后续 reasoning */
57
57
  export declare function parseFactJudgeResponse(text: string, fact: KeyFact): FactJudgeResult;
58
+ /** 纯函数:三态 judge 结果 + 抽样 → QualityResult。critical 必须 100% 的 gate 在此。
59
+ * 行为等价于原 judgeAllFacts 算分段;抽出后供 judgeAllFacts(LLM 路径) 和
60
+ * applyRound2(agent 路径) 共同复用,不因走 agent 路径软化质量模型。
61
+ */
62
+ export declare function computeQualityResult(judged: FactJudgeResult[], sampling: SamplingOutput, threshold?: number): QualityResult;
58
63
  /** 跑全部 sampled facts 的判定 + 计算 QualityResult。
59
64
  * 注:Promise.all 不 wrap try/catch — 单条 judgeSingleFact API 失败(网络 / 429)时整个 reject;
60
65
  * caller(CLI 层)需自行 wrap try/catch 并归类到 .partial 路径。
@@ -1 +1 @@
1
- {"version":3,"file":"quality-judge.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/quality-judge.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3E,qBAAqB;AACrB,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,iCAAiC;AACjC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,WAAW;AACX,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,mBAAmB;IACnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAuFrE;AAUD,6BAA6B;AAC7B,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC;AAE7D,sBAAsB;AACtB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC1B,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;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,CAAC,GAAE,MAA6B,GAC/B,OAAO,CAAC,OAAO,EAAE,CAAC,CAgDpB;AAED,uCAAuC;AACvC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,eAAe,CAYnF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,cAAc,EACxB,SAAS,GAAE,MAAmC,GAC7C,OAAO,CAAC,aAAa,CAAC,CAyCxB;AAED,iCAAiC;AACjC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAwCzF"}
1
+ {"version":3,"file":"quality-judge.d.ts","sourceRoot":"","sources":["../../../src/core/legacy-bridge/quality-judge.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3E,qBAAqB;AACrB,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,iCAAiC;AACjC,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,WAAW;AACX,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,mBAAmB;IACnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAuFrE;AAUD,6BAA6B;AAC7B,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC;AAE7D,sBAAsB;AACtB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC1B,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;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,CAAC,GAAE,MAA6B,GAC/B,OAAO,CAAC,OAAO,EAAE,CAAC,CAgDpB;AAED,uCAAuC;AACvC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,eAAe,CAYnF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,eAAe,EAAE,EACzB,QAAQ,EAAE,cAAc,EACxB,SAAS,GAAE,MAAmC,GAC7C,aAAa,CA0Bf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,cAAc,EACxB,SAAS,GAAE,MAAmC,GAC7C,OAAO,CAAC,aAAa,CAAC,CASxB;AAED,iCAAiC;AACjC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAwCzF"}
@@ -198,43 +198,47 @@ export function parseFactJudgeResponse(text, fact) {
198
198
  const reasoning = lines.slice(1).join('\n').trim() || undefined;
199
199
  return { fact, state, reasoning };
200
200
  }
201
- /** 跑全部 sampled facts 的判定 + 计算 QualityResult。
202
- * 注:Promise.all wrap try/catch — 单条 judgeSingleFact API 失败(网络 / 429)时整个 reject;
203
- * caller(CLI )需自行 wrap try/catch 并归类到 .partial 路径。
201
+ /** 纯函数:三态 judge 结果 + 抽样 QualityResult。critical 必须 100% 的 gate 在此。
202
+ * 行为等价于原 judgeAllFacts 算分段;抽出后供 judgeAllFacts(LLM 路径)
203
+ * applyRound2(agent 路径) 共同复用,不因走 agent 路径软化质量模型。
204
204
  */
205
- export async function judgeAllFacts(client, regeneratedBody, sampling, threshold = DEFAULT_FIDELITY_THRESHOLD) {
206
- // TODO(v0.3):Anthropic API rate-limit 防护 — 30 条 fact 全并发可能触发 429
207
- // (Tier-1 RPM ~50)。CLI 层加 --concurrency flag,p-limit 包裹。
208
- // 当前 v0.2 acceptable:30 并发在 1 秒内瞬时,实际多数路径分散在 judge 时间内。
209
- const judged = await Promise.all(sampling.sampled.map((f) => judgeSingleFact(client, regeneratedBody, f)));
205
+ export function computeQualityResult(judged, sampling, threshold = DEFAULT_FIDELITY_THRESHOLD) {
210
206
  const critical = judged.filter((r) => r.fact.critical);
211
207
  const nonCritical = judged.filter((r) => !r.fact.critical);
212
- const critPreserved = critical.filter((r) => r.state !== 'lost');
213
- const totalPreserved = judged.filter((r) => r.state !== 'lost');
214
208
  // critical 必须 100%
215
- const criticalRate = critical.length === 0 ? 1.0 : critPreserved.length / critical.length;
209
+ const criticalRate = critical.length === 0
210
+ ? 1.0
211
+ : critical.filter((r) => r.state !== 'lost').length / critical.length;
216
212
  // 总体保真率
217
- const totalRate = judged.length === 0 ? 1.0 : totalPreserved.length / judged.length;
213
+ const totalRate = judged.length === 0 ? 1.0 : judged.filter((r) => r.state !== 'lost').length / judged.length;
218
214
  // per_section_rates
219
215
  const perSectionRates = {};
220
216
  for (const [section, totalInSection] of Object.entries(sampling.perSectionSampled)) {
221
- const sectionJudged = judged.filter((r) => r.fact.section === section);
222
- const preserved = sectionJudged.filter((r) => r.state !== 'lost');
223
- perSectionRates[section] = totalInSection === 0 ? 1.0 : preserved.length / totalInSection;
217
+ const preserved = judged.filter((r) => r.fact.section === section && r.state !== 'lost').length;
218
+ perSectionRates[section] = totalInSection === 0 ? 1.0 : preserved / totalInSection;
224
219
  }
225
- const lostCritical = critical.filter((r) => r.state === 'lost').map((r) => r.fact);
226
- const lostNonCritical = nonCritical.filter((r) => r.state === 'lost').map((r) => r.fact);
227
- const passed = criticalRate >= 1.0 && totalRate >= threshold;
228
220
  return {
229
221
  total_rate: totalRate,
230
222
  critical_rate: criticalRate,
231
223
  per_section_rates: perSectionRates,
232
- lost_critical: lostCritical,
233
- lost_non_critical: lostNonCritical,
224
+ lost_critical: critical.filter((r) => r.state === 'lost').map((r) => r.fact),
225
+ lost_non_critical: nonCritical.filter((r) => r.state === 'lost').map((r) => r.fact),
234
226
  uncovered_sections: sampling.uncoveredSections,
235
- passed,
227
+ passed: criticalRate >= 1.0 && totalRate >= threshold,
236
228
  };
237
229
  }
230
+ /** 跑全部 sampled facts 的判定 + 计算 QualityResult。
231
+ * 注:Promise.all 不 wrap try/catch — 单条 judgeSingleFact API 失败(网络 / 429)时整个 reject;
232
+ * caller(CLI 层)需自行 wrap try/catch 并归类到 .partial 路径。
233
+ */
234
+ export async function judgeAllFacts(client, regeneratedBody, sampling, threshold = DEFAULT_FIDELITY_THRESHOLD) {
235
+ // TODO(v0.3):Anthropic API rate-limit 防护 — 30 条 fact 全并发可能触发 429
236
+ // (Tier-1 RPM ~50)。CLI 层加 --concurrency flag,p-limit 包裹。
237
+ // 当前 v0.2 acceptable:30 并发在 1 秒内瞬时,实际多数路径分散在 judge 时间内。
238
+ const judged = await Promise.all(sampling.sampled.map((f) => judgeSingleFact(client, regeneratedBody, f)));
239
+ // DRY:算分委托 computeQualityResult,行为与重构前完全一致
240
+ return computeQualityResult(judged, sampling, threshold);
241
+ }
238
242
  /** 把 QualityResult 渲染为给用户看的报告 */
239
243
  export function formatQualityReport(role, result) {
240
244
  const lines = [];