@wuyanbin/ai-code-review-cli-remote 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,7 +14,7 @@ stdin: git diff <merge-base>..HEAD
14
14
  ├─ 4. 主评审 分片 + 注解 diff + 符号级上下文;首轮 baseline 两趟取并集,增量运行一趟
15
15
  ├─ 5. 对账 保活 / 收口 / 人工 dismiss / 增量准入;已知 OPEN 交复核 agent,新报交语义判重
16
16
  ├─ 6. 取证验证 只对本次新建的 P0:带只读工具的 agent 读仓库核实,CONFIRMED 才发布
17
- ├─ 7. 发布 行内评论 = 经验证的 P0;P1 / P2 只在摘要汇总(封顶 10 条);摘要 = 结论 + 验证说明 + AI 概述
17
+ ├─ 7. 发布 行内评论 = 经验证的 P0;P1 / P2 只在摘要汇总(封顶 10 条);摘要布局见下
18
18
  ├─ 8. 回写 PUT /api/modules/code-review/ci/findings 全量 finding 状态(含验证结论、resolve 时间)
19
19
  └─ 9. 上报 POST /api/modules/code-review/ci/runs 状态、用量、verdict、分项计数、Top 问题
20
20
  ```
@@ -26,6 +26,18 @@ stdin: git diff <merge-base>..HEAD
26
26
  | P0 | 是,只有 `CONFIRMED` 发布 | 是 | 是(任一 OPEN 且 blocking 的 P0 → `ACTION_REQUIRED`) | 是 |
27
27
  | P1 / P2 | 否 | 否,摘要「P1 提示(未验证)」段按文件 / 行号列出,封顶 10 条 | 否 | 是 |
28
28
 
29
+ 飞书卡片(平台渲染)只围绕 P0:未通过时列出需修复的 P0 与平台生成的修复指令,通过时一行结论;P2 不再出现在卡片与阈值配置里,CLI 内部仍把模型标成 P2 的意见按阈值过滤掉(不发布、不入库)。
30
+ 增量运行上报 `findingsDelta { new, fixed, open }`(口径同摘要「较上次」),平台只用于卡片「较上次修复 N」。
31
+
32
+ ### MR 摘要布局(1.4.1 起)
33
+
34
+ 摘要只写一条 note、每次运行原地更新,从上到下:
35
+
36
+ 1. 结论标题(`## ✅ PASSED` / `## ⚠️ ACTION REQUIRED`)→ 一句话结论带各级别计数 → 引用块:评审范围(首轮 / 增量 + commit 区间 + 变更规模 + 送审文件数),增量运行再加「较上次:修复 / 新增 / 待处理 / 人工驳回」→ 验证排除 / 预算耗尽说明(有才显示);
37
+ 2. 「概述」(模型,1–2 句)→ 「需修复的 P0」(ACTION REQUIRED 时)→ 「主要变更」(模型按模块归纳,不折叠)→ `<details>` 折叠的「P1 提示 · N 条(模型意见,未经取证验证)」。P0 与 P1 都是「位置 / 问题 / 建议」三列表格:位置列链到本次评审 commit 的文件行(`CI_PROJECT_URL` 缺失时显示完整路径),问题与建议完整展示(换行转 `<br>`,不截断),P1 封顶 10 行;
38
+ 3. 「合入前检查项」是 GitLab 任务列表(`- [ ]`,可勾选;更新 note 时按文本保留上一版已勾的 `[x]`)= CLI 按文件路径识别的确定项(数据库迁移 / 数据模型、CI、依赖、部署 / 环境、接口契约 / 规格;迁移含 `UPDATE` / `DELETE` / 破坏性 DDL 时加回滚提示,见 `src/core/summary-compose.ts`)+ 模型补充的横切风险(最多 5 条、每条一句可勾选的动作);模型被要求不复述问题清单,不输出受影响文件表(GitLab Changes 页更准);
39
+ 4. 未完整覆盖、敏感代码预警按需追加 → 页脚一行发布策略说明。整条 note 不再有级别表与 `---` 分隔线。
40
+
29
41
  验证结论为 `REFUTED` / `UNSURE` / `SKIPPED` 的 finding 以 `SUPPRESSED` 入库:`REFUTED` / `UNSURE` 对同一指纹粘性,
30
42
  后续 push 不重验;`SKIPPED`(预算、候选上限、时限没排上)不粘性,下次再报重新验证。
31
43
 
@@ -18,11 +18,18 @@ export type AgentStopReason = "submitted" | "max_turns" | "deadline" | "budget_e
18
18
  export type ToolRunOutcome = string | {
19
19
  error: string;
20
20
  };
21
+ /**
22
+ * 工具单次调用的上下文。`signal` 是候选截止信号——与中断进行中 API 请求的是同一个
23
+ * AbortController,由 Tool Runner 透传到每次工具调用;工具据此终止自己的子进程。
24
+ */
25
+ export interface ToolRunContext {
26
+ signal?: AbortSignal;
27
+ }
21
28
  export interface AgentTool<Schema extends z.ZodType = z.ZodType> {
22
29
  name: string;
23
30
  description: string;
24
31
  inputSchema: Schema;
25
- run: (input: z.infer<Schema>) => Promise<ToolRunOutcome> | ToolRunOutcome;
32
+ run: (input: z.infer<Schema>, context?: ToolRunContext) => Promise<ToolRunOutcome> | ToolRunOutcome;
26
33
  /** 收口工具:schema strict,模型调用它即为提交结论并结束运行(不执行 run) */
27
34
  submit?: boolean;
28
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,WAAW,GACX,UAAU,GACV,iBAAiB,GACjB,OAAO,CAAC;AAEZ,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,WAAW,SAAS,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;IAC1E,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,EACtD,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GACtB,SAAS,CAEX;AAED,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,eAAe,CAAC;IAC5B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,wBAAwB;IACvC,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,eAAe;IACf,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElD;AAwED,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,wBAAwB;IAcvC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAoG9D"}
1
+ {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":"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"}
@@ -61,10 +61,11 @@ function toRunnableTool(tool) {
61
61
  name: tool.name,
62
62
  description: tool.description,
63
63
  inputSchema: tool.inputSchema,
64
- run: async (input) => {
64
+ run: async (input, context) => {
65
65
  if (tool.submit)
66
66
  return "结论已收到。";
67
- const outcome = await tool.run(input);
67
+ // Tool Runner 把 toolRunner 选项里的 signal(候选截止)作为 context 传入每次工具调用
68
+ const outcome = await tool.run(input, { signal: context?.signal ?? undefined });
68
69
  if (typeof outcome === "string")
69
70
  return outcome;
70
71
  throw new ToolError_1.ToolError(outcome.error);
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ export declare class PromptBuilder {
27
27
  export declare class SummaryPromptBuilder {
28
28
  private digest;
29
29
  private findings;
30
+ private checklist;
30
31
  /**
31
32
  * 摘要以「变更文件清单 + 增删行统计」为输入,而不是整份 diff。
32
33
  *
@@ -37,6 +38,8 @@ export declare class SummaryPromptBuilder {
37
38
  setDigest(digest: DiffDigest): this;
38
39
  /** 本次评审已产出的 findings:让摘要能点出风险,而不必重读源码 */
39
40
  setFindings(findings: AIComment[]): this;
41
+ /** CLI 按文件路径识别出的合入前检查项:已在摘要里渲染,模型只补充、不重复 */
42
+ setChecklist(items: string[]): this;
40
43
  buildSystem(): string;
41
44
  buildUser(): string;
42
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBlD,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,mDAAmD;IACnD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,0DAA0D;IAC1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKvC,8BAA8B;IAC9B,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKtC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpD;;;OAGG;IACH,WAAW,IAAI,MAAM;IAgCrB,SAAS,IAAI,MAAM;CAqCpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA6D;IAC3E,OAAO,CAAC,QAAQ,CAAmB;IAEnC;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAKnC,yCAAyC;IACzC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI;IAMxC,WAAW,IAAI,MAAM;IAuBrB,SAAS,IAAI,MAAM;CAkCpB"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBlD,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,mDAAmD;IACnD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,0DAA0D;IAC1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKvC,8BAA8B;IAC9B,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKtC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpD;;;OAGG;IACH,WAAW,IAAI,MAAM;IAgCrB,SAAS,IAAI,MAAM;CAqCpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA6D;IAC3E,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAgB;IAEjC;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAKnC,yCAAyC;IACzC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI;IAKxC,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAMnC,WAAW,IAAI,MAAM;IAsBrB,SAAS,IAAI,MAAM;CA0CpB"}
@@ -64,7 +64,7 @@ class PromptBuilder {
64
64
  "",
65
65
  "severity 分级标准(严格遵循):",
66
66
  "- P0 (Critical): 逻辑错误、安全漏洞、潜在 Crash、导致业务异常的 Bug。必须修复。",
67
- "- P1 (Major): 性能隐患、违反团队核心规范。建议修复。",
67
+ "- P1 (Major): 性能隐患、违反团队核心规范。建议修复。P1 的 message 与 suggestion 各用一句话写完整(不超过 80 字),不展开推理过程;P0 可以写清推理与影响。",
68
68
  "- P2 (Minor): 代码风格优化、命名建议、更优雅的语法糖实现。参考即可,不强制。",
69
69
  "",
70
70
  "注意:severity 只能是 P0 / P1 / P2;file 必须使用注解 diff 中 ### 标注的路径;只能评论 [ADD] 行。",
@@ -112,6 +112,7 @@ class SummaryPromptBuilder {
112
112
  constructor() {
113
113
  this.digest = { files: [], totalAdded: 0, totalRemoved: 0 };
114
114
  this.findings = [];
115
+ this.checklist = [];
115
116
  }
116
117
  /**
117
118
  * 摘要以「变更文件清单 + 增删行统计」为输入,而不是整份 diff。
@@ -129,27 +130,31 @@ class SummaryPromptBuilder {
129
130
  this.findings = findings;
130
131
  return this;
131
132
  }
133
+ /** CLI 按文件路径识别出的合入前检查项:已在摘要里渲染,模型只补充、不重复 */
134
+ setChecklist(items) {
135
+ this.checklist = items;
136
+ return this;
137
+ }
132
138
  // 固定指令集中于 system(与评审 prompt 同一缓存策略)
133
139
  buildSystem() {
134
140
  return [
135
141
  "你是一位资深开发工程师,擅长分析代码改动并生成清晰的技术摘要。",
136
- "你会收到本次改动的【变更文件清单与增删行统计】,以及【本次代码审查已发现的问题】,",
142
+ "你会收到本次改动的【变更文件清单与增删行统计】、【本次代码审查已发现的问题】与【已自动识别的检查项】,",
137
143
  "而不是完整 diff。请据此推断改动意图并生成中文 Markdown 汇总报告。",
138
144
  "对无法从文件清单确定的细节,用概括性描述,不要臆造具体实现。",
139
145
  "必须直接输出纯 Markdown 文本,不要返回 JSON,不要用代码块包裹。",
140
146
  "",
141
- "报告结构:",
147
+ "报告只包含以下三段,不要增加其它段落(尤其不要列受影响文件表,GitLab 已有):",
142
148
  "## 概述",
143
149
  "用 1-2 句话说明整体目的和范围。",
144
150
  "",
145
151
  "## 主要变更",
146
- "按目录/模块归纳这次改了哪些部分,说明各自的可能意图。",
152
+ "按目录/模块归纳这次改了哪些部分,说明各自的可能意图;最多 6 条。",
147
153
  "",
148
- "## 受影响文件",
149
- "用表格列出文件路径、增删行数、说明。文件较多时按变更量取前若干条并注明省略数量。",
150
- "",
151
- "## 注意事项",
152
- "结合已发现的问题列出需要关注的风险;没有则写\u201C无\u201D。",
154
+ "## 合入前检查项",
155
+ "只列无法落到某一行代码的横切风险:数据迁移与回滚、配置或环境变量、对外接口契约、兼容与发布顺序、大幅重构需要回归的链路。",
156
+ "【本次代码审查已发现的问题】已在报告其它部分逐条列出,不要复述;【已自动识别的检查项】也不要重复,只补充它们带来的风险。",
157
+ "最多 5 条,每条一句可勾选的动作(如「确认迁移可回滚」),不要子项、不要加粗标题、不要代码块。没有则只写\u201C无\u201D。",
153
158
  ].join("\n");
154
159
  }
155
160
  buildUser() {
@@ -169,11 +174,14 @@ class SummaryPromptBuilder {
169
174
  }
170
175
  if (this.findings.length > 0) {
171
176
  const shownFindings = this.findings.slice(0, MAX_SUMMARY_FINDINGS);
172
- parts.push("", "本次代码审查已发现的问题:", ...shownFindings.map((c) => `- [${c.severity}] ${c.file}:${c.line} ${c.message}`));
177
+ parts.push("", "本次代码审查已发现的问题(已在报告中逐条列出,仅供判断横切风险,不要复述):", ...shownFindings.map((c) => `- [${c.severity}] ${c.file}:${c.line} ${c.message}`));
173
178
  if (this.findings.length > shownFindings.length) {
174
179
  parts.push(`- …另有 ${this.findings.length - shownFindings.length} 条`);
175
180
  }
176
181
  }
182
+ if (this.checklist.length > 0) {
183
+ parts.push("", "已自动识别的检查项(已在报告中列出,不要重复):", ...this.checklist.map((item) => `- ${item}`));
184
+ }
177
185
  return parts.join("\n");
178
186
  }
179
187
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  import type { AIComment, CodeReviewConfig } from "../types";
2
2
  /**
3
3
  * @param findings 本次评审已产出的评论;让摘要能点出风险而无需重读源码
4
+ * @param options.checklist CLI 已识别的合入前检查项;喂给模型避免重复
4
5
  */
5
- export declare function generateSummary(diff: string, config: CodeReviewConfig, findings?: AIComment[]): Promise<string | null>;
6
+ export declare function generateSummary(diff: string, config: CodeReviewConfig, findings?: AIComment[], options?: {
7
+ checklist?: string[];
8
+ }): Promise<string | null>;
6
9
  //# sourceMappingURL=summarizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8B5D;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,SAAS,EAAO,GACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB"}
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8B5D;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,SAAS,EAAO,EAC1B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB"}
@@ -36,8 +36,9 @@ function cleanMarkdownResponse(content) {
36
36
  }
37
37
  /**
38
38
  * @param findings 本次评审已产出的评论;让摘要能点出风险而无需重读源码
39
+ * @param options.checklist CLI 已识别的合入前检查项;喂给模型避免重复
39
40
  */
40
- async function generateSummary(diff, config, findings = []) {
41
+ async function generateSummary(diff, config, findings = [], options = {}) {
41
42
  const effectiveDiff = (0, diff_1.filterDiffByIgnore)(diff, config.ignore);
42
43
  if (!effectiveDiff.trim())
43
44
  return null;
@@ -47,7 +48,8 @@ async function generateSummary(diff, config, findings = []) {
47
48
  // 输入是文件清单与增删统计,不是整份 diff:摘要调用的体量与 diff 总量解耦
48
49
  const prompt = new prompt_1.SummaryPromptBuilder()
49
50
  .setDigest((0, diff_1.summarizeDiffFiles)(effectiveDiff))
50
- .setFindings(findings);
51
+ .setFindings(findings)
52
+ .setChecklist(options.checklist ?? []);
51
53
  const raw = await adapter.call(config.ai.model, prompt.buildSystem(), prompt.buildUser(), { purpose: "summary" });
52
54
  return raw ? cleanMarkdownResponse(raw) : null;
53
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { ReconcileResult } from "./incremental";
2
+ /**
3
+ * MR 摘要的「整合布局」(2026-10-21 用户拍板):
4
+ * - 头部一行评审范围(首轮 / 增量 + commit 区间 + 变更规模 + 送审文件数),增量运行再加一行相对上次的变化;
5
+ * - 行级问题只出现一次且只由 CLI 生成(P0 列表 / P1 汇总),模型不复述;
6
+ * - 模型输出只保留「概述」「主要变更」「合入前检查项」,「受影响文件」表去掉(GitLab Changes 页更准);
7
+ * - 「合入前检查项」= CLI 按文件路径识别的确定项 + 模型补充的横切风险;「主要变更」折叠。
8
+ * 段落顺序:结论与计数 → 范围 / 较上次 → 概述 → 需修复的 P0 → P1 提示 → 合入前检查项 → 主要变更。
9
+ */
10
+ export interface ReviewScopeInfo {
11
+ /** baseline = 首轮全量;incremental = 平台已有 lastReviewedSha;stateless = 平台快照不可用 */
12
+ mode: "baseline" | "incremental" | "stateless";
13
+ /** 上次评审到的 commit(增量运行) */
14
+ fromSha?: string | null;
15
+ /** 本次流水线 head */
16
+ toSha?: string | null;
17
+ /** 整份 MR diff 的文件数与增删行(含被忽略的文件) */
18
+ changedFiles: number;
19
+ added: number;
20
+ removed: number;
21
+ /** 实际送审的文件数(coverage.reviewedFiles) */
22
+ reviewedFiles?: number;
23
+ }
24
+ /** 相对上次评审的 finding 变化(只在增量运行展示) */
25
+ export interface ReviewDeltaInfo {
26
+ new: number;
27
+ fixed: number;
28
+ open: number;
29
+ wontFix: number;
30
+ }
31
+ /** 行级条目的链接基址:GitLab 项目地址 + 本次评审的 commit,缺任一则退化为纯文本 */
32
+ export interface SummaryLinkBase {
33
+ projectUrl?: string | null;
34
+ sha?: string | null;
35
+ }
36
+ export declare function shortSha(sha: string | null | undefined): string | null;
37
+ export declare function buildScopeLine(scope: ReviewScopeInfo): string;
38
+ export declare function buildDeltaLine(delta: ReviewDeltaInfo): string;
39
+ /**
40
+ * 从对账统计派生「相对上次」:
41
+ * - 新增 = 本次新建 − 验证排除(排除的不发布、另有「验证排除 N 条」说明)
42
+ * - 修复 = fixed − severity 迁移(迁移是换键,不是修复)
43
+ * - 仍待处理 = 保活的已知 finding − 复核判定已修复的
44
+ */
45
+ export declare function buildReviewDelta(stats: ReconcileResult["stats"]): ReviewDeltaInfo;
46
+ /** `file:line`,能拼出 blob 链接时指向本次评审 commit 上的那一行 */
47
+ export declare function fileRef(file: string, line: number, links?: SummaryLinkBase): string;
48
+ /** 按文件收集 diff 里的新增行(不含 `+++` 头),只用于迁移文件的风险判断 */
49
+ export declare function addedLinesByFile(diff: string): Map<string, string[]>;
50
+ /** 检查项里的文件用短名:迁移只显示迁移目录名,其余显示末两级路径,避免整行被路径占满 */
51
+ export declare function shortPath(file: string): string;
52
+ /**
53
+ * 从变更文件清单识别需要人工确认的合入 / 发布事项。规则跨语言、只看路径(迁移文件另看新增行),
54
+ * 结果稳定可测;模型只在这之上补充判断性的条目。
55
+ */
56
+ export declare function detectMergeChecklist(files: string[], diff?: string): string[];
57
+ /** 模型写的检查项规整为「- 」列表;写「无」视为空 */
58
+ export declare function normalizeChecklistItems(body: string | null): string[];
59
+ /** 模型摘要的解析结果:概述、折叠展示的主要变更、规整后的检查项 */
60
+ export interface ModelSummary {
61
+ overview: string | null;
62
+ changes: string | null;
63
+ /** 已规整为「- 」列表的模型补充检查项;模型写「无」为空 */
64
+ checklist: string[];
65
+ /** 是否按约定结构解析成功;失败时整段当概述保留,不丢内容 */
66
+ recognized: boolean;
67
+ }
68
+ /** 按二级标题拆模型输出;「受影响文件」段丢弃;空输出返回 null */
69
+ export declare function parseModelSummary(markdown: string | null | undefined): ModelSummary | null;
70
+ /** 任务列表行的文本(去掉「- [ ] / - [x] 」前缀,规整空白),用于跨次更新比对勾选状态 */
71
+ export declare function taskItemKey(line: string): string;
72
+ /** 从已有摘要 note 里收集已被勾选的检查项,让下一次更新 note 时勾选不丢 */
73
+ export declare function extractCheckedItems(markdown: string | null | undefined): Set<string>;
74
+ /** 「- 文本」/「 - 文本」→ GitLab 任务列表「- [ ] 文本」,之前勾过的保持 [x] */
75
+ export declare function toTaskListLine(item: string, checked?: Set<string>): string;
76
+ /** 表格单元格:竖线转义、换行改 <br>,不截断 */
77
+ export declare function tableCell(text: string | null | undefined): string;
78
+ //# sourceMappingURL=summary-compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-compose.d.ts","sourceRoot":"","sources":["../../src/core/summary-compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC;IAC/C,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAe7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAI7D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,eAAe,CAQjF;AAED,kDAAkD;AAClD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,MAAM,CAMnF;AAuBD,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAgBpE;AAED,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAOD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,SAAK,GAAG,MAAM,EAAE,CAyBzE;AA6CD,+BAA+B;AAC/B,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAiBrE;AAED,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kCAAkC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAa1F;AAID,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED,+CAA+C;AAC/C,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAOpF;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,MAAM,CAKrF;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIjE"}
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shortSha = shortSha;
4
+ exports.buildScopeLine = buildScopeLine;
5
+ exports.buildDeltaLine = buildDeltaLine;
6
+ exports.buildReviewDelta = buildReviewDelta;
7
+ exports.fileRef = fileRef;
8
+ exports.addedLinesByFile = addedLinesByFile;
9
+ exports.shortPath = shortPath;
10
+ exports.detectMergeChecklist = detectMergeChecklist;
11
+ exports.normalizeChecklistItems = normalizeChecklistItems;
12
+ exports.parseModelSummary = parseModelSummary;
13
+ exports.taskItemKey = taskItemKey;
14
+ exports.extractCheckedItems = extractCheckedItems;
15
+ exports.toTaskListLine = toTaskListLine;
16
+ exports.tableCell = tableCell;
17
+ function shortSha(sha) {
18
+ const trimmed = sha?.trim();
19
+ return trimmed ? trimmed.slice(0, 8) : null;
20
+ }
21
+ function buildScopeLine(scope) {
22
+ const to = shortSha(scope.toSha);
23
+ const from = shortSha(scope.fromSha);
24
+ let range;
25
+ if (scope.mode === "incremental" && from) {
26
+ range = `增量评审 ${from} → ${to ?? "HEAD"}`;
27
+ }
28
+ else if (scope.mode === "baseline") {
29
+ range = to ? `首轮评审(至 ${to})` : "首轮评审";
30
+ }
31
+ else {
32
+ range = to ? `评审(至 ${to},未对接平台历史)` : "评审(未对接平台历史)";
33
+ }
34
+ const size = `变更 ${scope.changedFiles} 个文件(+${scope.added} / −${scope.removed})`;
35
+ const reviewed = typeof scope.reviewedFiles === "number" ? `,送审 ${scope.reviewedFiles} 个` : "";
36
+ return `${range} · ${size}${reviewed}`;
37
+ }
38
+ function buildDeltaLine(delta) {
39
+ const parts = [`修复 ${delta.fixed}`, `新增 ${delta.new}`, `待处理 ${delta.open}`];
40
+ if (delta.wontFix > 0)
41
+ parts.push(`人工驳回 ${delta.wontFix}`);
42
+ return `较上次:${parts.join(" · ")}`;
43
+ }
44
+ /**
45
+ * 从对账统计派生「相对上次」:
46
+ * - 新增 = 本次新建 − 验证排除(排除的不发布、另有「验证排除 N 条」说明)
47
+ * - 修复 = fixed − severity 迁移(迁移是换键,不是修复)
48
+ * - 仍待处理 = 保活的已知 finding − 复核判定已修复的
49
+ */
50
+ function buildReviewDelta(stats) {
51
+ const nonNegative = (n) => (n > 0 ? n : 0);
52
+ return {
53
+ new: nonNegative(stats.new - stats.suppressed),
54
+ fixed: nonNegative(stats.fixed - stats.severityMigrated),
55
+ open: nonNegative(stats.kept - stats.revalidatedFixed),
56
+ wontFix: stats.wontFix,
57
+ };
58
+ }
59
+ /** `file:line`,能拼出 blob 链接时指向本次评审 commit 上的那一行 */
60
+ function fileRef(file, line, links) {
61
+ const label = `\`${file}:${line}\``;
62
+ const base = links?.projectUrl?.trim().replace(/\/+$/, "");
63
+ const sha = links?.sha?.trim();
64
+ if (!base || !sha)
65
+ return label;
66
+ return `[${label}](${base}/-/blob/${sha}/${encodeURI(file)}#L${line})`;
67
+ }
68
+ // ───────────────────────── 合入前检查项(确定性规则) ─────────────────────────
69
+ const MIGRATION_DIR_RE = /(^|\/)(migrations?|db\/migrate|flyway|liquibase)\//i;
70
+ const MIGRATION_FILE_RE = /\.(sql|ts|js|mjs|cjs|py|rb|xml|ya?ml|kt|java|go)$/i;
71
+ const DATA_MODEL_RE = /(^|\/)schema\.prisma$/;
72
+ const CI_RE = /(^|\/)(\.gitlab-ci\.ya?ml|\.gitlab\/.*|ci-templates\/.*|Jenkinsfile[^/]*|\.github\/workflows\/.*|\.circleci\/.*)$/;
73
+ const DEPS_RE = /(^|\/)(package\.json|package-lock\.json|pnpm-lock\.yaml|yarn\.lock|go\.mod|go\.sum|pom\.xml|build\.gradle(\.kts)?|settings\.gradle(\.kts)?|gradle\/libs\.versions\.toml|Podfile|Podfile\.lock|Package\.swift|Package\.resolved|Cartfile(\.resolved)?|requirements[^/]*\.txt|pyproject\.toml|poetry\.lock|Cargo\.toml|Cargo\.lock|Gemfile(\.lock)?|composer\.(json|lock))$/;
74
+ const DEPLOY_RE = /(^|\/)(\.env(\.[^/]+)?|Dockerfile[^/]*|docker-compose[^/]*\.ya?ml|(k8s|kubernetes|helm|deploy|deployment)\/.*)$/i;
75
+ const CONTRACT_RE = /(^|\/)(openapi[^/]*\.(ya?ml|json)|swagger[^/]*\.(ya?ml|json)|[^/]*\.proto|schema\.graphql|openspec\/specs\/.*)$/i;
76
+ /** 存量数据修改或破坏性 DDL:这些迁移不能只靠「再跑一次」回滚 */
77
+ const DATA_CHANGE_RE = /\b(UPDATE\s+\S+\s+SET|DELETE\s+FROM|TRUNCATE\s+(TABLE\s+)?\S+|DROP\s+(TABLE|COLUMN|INDEX)|ALTER\s+TABLE\s+\S+\s+(DROP|MODIFY|CHANGE|RENAME))\b/i;
78
+ function isMigrationFile(file) {
79
+ return (MIGRATION_DIR_RE.test(file) && MIGRATION_FILE_RE.test(file)) || DATA_MODEL_RE.test(file);
80
+ }
81
+ /** 按文件收集 diff 里的新增行(不含 `+++` 头),只用于迁移文件的风险判断 */
82
+ function addedLinesByFile(diff) {
83
+ const out = new Map();
84
+ let current = null;
85
+ for (const line of diff.split("\n")) {
86
+ const header = /^diff --git a\/(.+?) b\/(.+)$/.exec(line);
87
+ if (header) {
88
+ current = header[2];
89
+ if (!out.has(current))
90
+ out.set(current, []);
91
+ continue;
92
+ }
93
+ if (!current)
94
+ continue;
95
+ if (line.startsWith("+") && !line.startsWith("+++")) {
96
+ out.get(current).push(line.slice(1));
97
+ }
98
+ }
99
+ return out;
100
+ }
101
+ /** 检查项里的文件用短名:迁移只显示迁移目录名,其余显示末两级路径,避免整行被路径占满 */
102
+ function shortPath(file) {
103
+ const migration = /(?:^|\/)migrations?\/([^/]+)\/[^/]+$/.exec(file);
104
+ if (migration)
105
+ return migration[1];
106
+ const parts = file.split("/");
107
+ return parts.length > 2 ? parts.slice(-2).join("/") : file;
108
+ }
109
+ function listFiles(files, max = 3) {
110
+ const shown = files.slice(0, max).map((f) => `\`${shortPath(f)}\``);
111
+ return files.length > max ? `${shown.join("、")} 等 ${files.length} 个` : shown.join("、");
112
+ }
113
+ /**
114
+ * 从变更文件清单识别需要人工确认的合入 / 发布事项。规则跨语言、只看路径(迁移文件另看新增行),
115
+ * 结果稳定可测;模型只在这之上补充判断性的条目。
116
+ */
117
+ function detectMergeChecklist(files, diff = "") {
118
+ const items = [];
119
+ const unique = [...new Set(files)];
120
+ const migrations = unique.filter(isMigrationFile);
121
+ if (migrations.length > 0) {
122
+ const added = addedLinesByFile(diff);
123
+ const risky = migrations.some((f) => (added.get(f) ?? []).some((line) => DATA_CHANGE_RE.test(line)));
124
+ items.push(`数据库迁移 / 数据模型变更:${listFiles(migrations)}${risky ? ";含存量数据修改或破坏性 DDL,确认可回滚与上线顺序" : ""}`);
125
+ }
126
+ const ci = unique.filter((f) => CI_RE.test(f));
127
+ if (ci.length > 0)
128
+ items.push(`CI / 流水线配置变更:${listFiles(ci)}`);
129
+ const deps = unique.filter((f) => DEPS_RE.test(f));
130
+ if (deps.length > 0)
131
+ items.push(`依赖变更:${listFiles(deps)}`);
132
+ const deploy = unique.filter((f) => DEPLOY_RE.test(f));
133
+ if (deploy.length > 0)
134
+ items.push(`部署 / 环境配置变更:${listFiles(deploy)}`);
135
+ const contracts = unique.filter((f) => CONTRACT_RE.test(f));
136
+ if (contracts.length > 0)
137
+ items.push(`接口契约 / 规格变更:${listFiles(contracts)}`);
138
+ return items;
139
+ }
140
+ function normalizeTitle(raw) {
141
+ return raw.replace(/^[^\p{L}\p{N}]+/u, "").trim();
142
+ }
143
+ /** 只按二级标题切分;三级标题属于所在段落的正文 */
144
+ function splitSections(markdown) {
145
+ const result = { overview: null, changes: null, checklist: null, recognized: false };
146
+ let currentKey = null;
147
+ const buffers = { overview: [], changes: [], checklist: [] };
148
+ for (const line of markdown.split("\n")) {
149
+ const heading = /^##\s+(.+?)\s*$/.exec(line);
150
+ if (heading) {
151
+ const title = normalizeTitle(heading[1]);
152
+ if (title.includes("概述"))
153
+ currentKey = "overview";
154
+ else if (title.includes("主要变更"))
155
+ currentKey = "changes";
156
+ else if (title.includes("合入前检查项") || title.includes("注意事项"))
157
+ currentKey = "checklist";
158
+ else
159
+ currentKey = "ignored";
160
+ if (currentKey !== "ignored")
161
+ result.recognized = true;
162
+ continue;
163
+ }
164
+ if (currentKey && currentKey !== "ignored")
165
+ buffers[currentKey].push(line);
166
+ }
167
+ const body = (lines) => {
168
+ const text = lines.join("\n").trim();
169
+ return text ? text : null;
170
+ };
171
+ result.overview = body(buffers.overview);
172
+ result.changes = body(buffers.changes);
173
+ result.checklist = body(buffers.checklist);
174
+ return result;
175
+ }
176
+ const EMPTY_CHECKLIST_RE = /^[\s\-*•]*(无|没有|无。|none|n\/a)[\s。.]*$/i;
177
+ /** 模型写的检查项规整为「- 」列表;写「无」视为空 */
178
+ function normalizeChecklistItems(body) {
179
+ if (!body)
180
+ return [];
181
+ if (EMPTY_CHECKLIST_RE.test(body.trim()))
182
+ return [];
183
+ const items = [];
184
+ for (const raw of body.split("\n")) {
185
+ if (!raw.trim())
186
+ continue;
187
+ const indented = /^\s+[-*•]\s+/.test(raw);
188
+ if (indented) {
189
+ items.push(raw.replace(/^\s+[-*•]\s+/, " - "));
190
+ continue;
191
+ }
192
+ const line = raw.trim();
193
+ if (/^\d+[.、)]\s+/.test(line))
194
+ items.push(`- ${line.replace(/^\d+[.、)]\s+/, "")}`);
195
+ else if (/^[-*•]\s+/.test(line))
196
+ items.push(`- ${line.replace(/^[-*•]\s+/, "")}`);
197
+ else
198
+ items.push(`- ${line}`);
199
+ }
200
+ return items;
201
+ }
202
+ /** 按二级标题拆模型输出;「受影响文件」段丢弃;空输出返回 null */
203
+ function parseModelSummary(markdown) {
204
+ const raw = markdown?.trim() ?? "";
205
+ if (!raw)
206
+ return null;
207
+ const sections = splitSections(raw);
208
+ if (!sections.recognized) {
209
+ return { overview: raw, changes: null, checklist: [], recognized: false };
210
+ }
211
+ return {
212
+ overview: sections.overview,
213
+ changes: sections.changes,
214
+ checklist: normalizeChecklistItems(sections.checklist),
215
+ recognized: true,
216
+ };
217
+ }
218
+ // ───────────────────────── 合入前检查项:可勾选任务列表 ─────────────────────────
219
+ /** 任务列表行的文本(去掉「- [ ] / - [x] 」前缀,规整空白),用于跨次更新比对勾选状态 */
220
+ function taskItemKey(line) {
221
+ return line
222
+ .replace(/^\s*[-*]\s+\[[ xX]\]\s*/, "")
223
+ .replace(/\s+/g, " ")
224
+ .trim();
225
+ }
226
+ /** 从已有摘要 note 里收集已被勾选的检查项,让下一次更新 note 时勾选不丢 */
227
+ function extractCheckedItems(markdown) {
228
+ const checked = new Set();
229
+ if (!markdown)
230
+ return checked;
231
+ for (const line of markdown.split("\n")) {
232
+ if (/^\s*[-*]\s+\[[xX]\]\s/.test(line))
233
+ checked.add(taskItemKey(line));
234
+ }
235
+ return checked;
236
+ }
237
+ /** 「- 文本」/「 - 文本」→ GitLab 任务列表「- [ ] 文本」,之前勾过的保持 [x] */
238
+ function toTaskListLine(item, checked = new Set()) {
239
+ const indent = /^(\s*)/.exec(item)?.[1] ?? "";
240
+ const text = item.replace(/^\s*[-*]\s+(\[[ xX]\]\s*)?/, "").trim();
241
+ const box = checked.has(taskItemKey(text)) ? "[x]" : "[ ]";
242
+ return `${indent}- ${box} ${text}`;
243
+ }
244
+ /** 表格单元格:竖线转义、换行改 <br>,不截断 */
245
+ function tableCell(text) {
246
+ const trimmed = (text ?? "").trim();
247
+ if (!trimmed)
248
+ return "—";
249
+ return trimmed.replace(/\|/g, "\\|").replace(/\r?\n+/g, "<br>");
250
+ }
251
+ //# sourceMappingURL=summary-compose.js.map