@wuyanbin/ai-code-review-cli-remote 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/dist/core/agent-runtime.d.ts +88 -0
- package/dist/core/agent-runtime.d.ts.map +1 -0
- package/dist/core/agent-runtime.js +187 -0
- package/dist/core/agent-runtime.js.map +1 -0
- package/dist/core/cursor-rules.d.ts +20 -2
- package/dist/core/cursor-rules.d.ts.map +1 -1
- package/dist/core/cursor-rules.js +67 -26
- package/dist/core/cursor-rules.js.map +1 -1
- package/dist/core/default-ignore.d.ts +4 -11
- package/dist/core/default-ignore.d.ts.map +1 -1
- package/dist/core/default-ignore.js +34 -8
- package/dist/core/default-ignore.js.map +1 -1
- package/dist/core/incremental.d.ts +15 -4
- package/dist/core/incremental.d.ts.map +1 -1
- package/dist/core/incremental.js +60 -2
- package/dist/core/incremental.js.map +1 -1
- package/dist/core/model.d.ts +8 -0
- package/dist/core/model.d.ts.map +1 -1
- package/dist/core/model.js +19 -1
- package/dist/core/model.js.map +1 -1
- package/dist/core/prompt.d.ts +3 -0
- package/dist/core/prompt.d.ts.map +1 -1
- package/dist/core/prompt.js +24 -15
- package/dist/core/prompt.js.map +1 -1
- package/dist/core/reviewer.d.ts.map +1 -1
- package/dist/core/reviewer.js +3 -1
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/summarizer.d.ts +4 -1
- package/dist/core/summarizer.d.ts.map +1 -1
- package/dist/core/summarizer.js +4 -2
- package/dist/core/summarizer.js.map +1 -1
- package/dist/core/summary-compose.d.ts +68 -0
- package/dist/core/summary-compose.d.ts.map +1 -0
- package/dist/core/summary-compose.js +205 -0
- package/dist/core/summary-compose.js.map +1 -0
- package/dist/core/verdict.d.ts +39 -2
- package/dist/core/verdict.d.ts.map +1 -1
- package/dist/core/verdict.js +128 -21
- package/dist/core/verdict.js.map +1 -1
- package/dist/core/verification.d.ts +96 -0
- package/dist/core/verification.d.ts.map +1 -0
- package/dist/core/verification.js +363 -0
- package/dist/core/verification.js.map +1 -0
- package/dist/core/verify-tools.d.ts +80 -0
- package/dist/core/verify-tools.d.ts.map +1 -0
- package/dist/core/verify-tools.js +436 -0
- package/dist/core/verify-tools.js.map +1 -0
- package/dist/gitlab/api.d.ts +6 -3
- package/dist/gitlab/api.d.ts.map +1 -1
- package/dist/gitlab/api.js +13 -6
- package/dist/gitlab/api.js.map +1 -1
- package/dist/platform/findings.d.ts +1 -1
- package/dist/platform/findings.d.ts.map +1 -1
- package/dist/platform/findings.js +12 -2
- package/dist/platform/findings.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +79 -19
- package/dist/runner.js.map +1 -1
- package/dist/shared/identity.d.ts +8 -0
- package/dist/shared/identity.d.ts.map +1 -1
- package/dist/shared/identity.js +21 -0
- package/dist/shared/identity.js.map +1 -1
- package/dist/shared/run-budget.d.ts +20 -0
- package/dist/shared/run-budget.d.ts.map +1 -0
- package/dist/shared/run-budget.js +53 -0
- package/dist/shared/run-budget.js.map +1 -0
- package/dist/types.d.ts +31 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/core/verdict.js
CHANGED
|
@@ -1,51 +1,158 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PUBLISH_POLICY_NOTE = exports.DIGEST_MAX_ITEMS = void 0;
|
|
3
4
|
exports.computeVerdict = computeVerdict;
|
|
5
|
+
exports.buildDigestSection = buildDigestSection;
|
|
6
|
+
exports.buildBlockingP0Section = buildBlockingP0Section;
|
|
7
|
+
exports.buildVerificationNotes = buildVerificationNotes;
|
|
8
|
+
exports.buildScopeLines = buildScopeLines;
|
|
4
9
|
exports.buildVerdictMarkdown = buildVerdictMarkdown;
|
|
10
|
+
const summary_compose_1 = require("./summary-compose");
|
|
5
11
|
function computeVerdict(comments) {
|
|
6
12
|
const p0Count = comments.filter((c) => c.severity === "P0").length;
|
|
7
13
|
return p0Count > 0 ? "ACTION_REQUIRED" : "PASSED";
|
|
8
14
|
}
|
|
9
|
-
|
|
15
|
+
/** 摘要里非 P0 提示的展示上限(用户 2026-10-21 拍板:封顶 10 条) */
|
|
16
|
+
exports.DIGEST_MAX_ITEMS = 10;
|
|
17
|
+
/** 摘要每条只展示 message 首行;后面还有实质内容时补「…」提示有省略 */
|
|
18
|
+
function firstLine(message) {
|
|
19
|
+
const [head, ...rest] = message.split("\n");
|
|
20
|
+
return rest.some((line) => line.trim().length > 0) ? `${head}…` : head;
|
|
21
|
+
}
|
|
22
|
+
function sortByLocation(items) {
|
|
23
|
+
return [...items].sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line);
|
|
24
|
+
}
|
|
25
|
+
/** 非 P0 意见只在摘要里汇总:未验证、不发行内评论、不影响准入 */
|
|
26
|
+
function buildDigestSection(comments = [], links) {
|
|
27
|
+
const items = comments.filter((c) => c.severity !== "P0");
|
|
28
|
+
if (items.length === 0)
|
|
29
|
+
return [];
|
|
30
|
+
const shown = sortByLocation(items).slice(0, exports.DIGEST_MAX_ITEMS);
|
|
31
|
+
const lines = [
|
|
32
|
+
`### 🟡 P1 提示 · ${items.length} 条(模型意见,未经取证验证)`,
|
|
33
|
+
"",
|
|
34
|
+
...shown.map((c) => `- ${(0, summary_compose_1.fileRef)(c.file, c.line, links)} ${firstLine(c.message)}`),
|
|
35
|
+
];
|
|
36
|
+
if (items.length > shown.length) {
|
|
37
|
+
lines.push("", `另有 ${items.length - shown.length} 条未列出。`);
|
|
38
|
+
}
|
|
39
|
+
lines.push("");
|
|
40
|
+
return lines;
|
|
41
|
+
}
|
|
42
|
+
/** 需修复的 P0 按文件 / 行号列出:行内线程之外再给一个可点的入口 */
|
|
43
|
+
function buildBlockingP0Section(comments, links) {
|
|
44
|
+
const items = sortByLocation(comments.filter((c) => c.severity === "P0"));
|
|
45
|
+
if (items.length === 0)
|
|
46
|
+
return [];
|
|
10
47
|
return [
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
`| 🟡 P1 (Major) | ${p1} |`,
|
|
15
|
-
`| 🔵 P2 (Minor) | ${p2} |`,
|
|
48
|
+
`### 🔴 需修复的 P0 · ${items.length} 条(已取证验证,见行内评论)`,
|
|
49
|
+
"",
|
|
50
|
+
...items.map((c) => `- ${(0, summary_compose_1.fileRef)(c.file, c.line, links)} ${firstLine(c.message)}`),
|
|
16
51
|
"",
|
|
17
52
|
];
|
|
18
53
|
}
|
|
54
|
+
/** 发布策略说明:有任何 finding 时在页脚提示一次,让研发知道行内评论为什么只剩 P0 */
|
|
55
|
+
exports.PUBLISH_POLICY_NOTE = "<sub>ℹ️ 行内评论只包含经取证验证的 P0;P1 汇总于此,不发行内评论、不影响合入。</sub>";
|
|
56
|
+
/** 验证排除与预算耗尽的提示行;没有可说的返回空数组 */
|
|
57
|
+
function buildVerificationNotes(options = {}) {
|
|
58
|
+
const notes = [];
|
|
59
|
+
const suppressed = options.suppressedCount ?? 0;
|
|
60
|
+
if (suppressed > 0) {
|
|
61
|
+
notes.push(`> 🔍 验证排除 ${suppressed} 条:本次新发现的问题经取证验证未获证实(前提不成立或证据不足),已过滤不展示。`);
|
|
62
|
+
}
|
|
63
|
+
if (options.verificationIncomplete) {
|
|
64
|
+
notes.push("> ⚠️ 部分候选未验证(run 预算耗尽),对应问题已按未证实处理,未发布。");
|
|
65
|
+
}
|
|
66
|
+
return notes.length > 0 ? [...notes, ""] : notes;
|
|
67
|
+
}
|
|
68
|
+
/** 评审范围与相对上次的变化:结论句之后的引用块;没有 scope 时不渲染 */
|
|
69
|
+
function buildScopeLines(options = {}) {
|
|
70
|
+
if (!options.scope)
|
|
71
|
+
return [];
|
|
72
|
+
const lines = [`> ${(0, summary_compose_1.buildScopeLine)(options.scope)}`];
|
|
73
|
+
if (options.delta)
|
|
74
|
+
lines.push(`> ${(0, summary_compose_1.buildDeltaLine)(options.delta)}`);
|
|
75
|
+
lines.push("");
|
|
76
|
+
return lines;
|
|
77
|
+
}
|
|
78
|
+
function buildOverviewSection(summary) {
|
|
79
|
+
if (!summary?.overview)
|
|
80
|
+
return [];
|
|
81
|
+
return ["### 📝 概述", "", summary.overview, ""];
|
|
82
|
+
}
|
|
83
|
+
/** CLI 识别的确定项在前、模型补充在后;摘要可解析但两边都没有时写「无」 */
|
|
84
|
+
function buildChecklistSection(checklist = [], summary) {
|
|
85
|
+
const items = [...checklist.map((item) => `- ${item}`), ...(summary?.checklist ?? [])];
|
|
86
|
+
if (items.length === 0 && !summary?.recognized)
|
|
87
|
+
return [];
|
|
88
|
+
return ["### 📋 合入前检查项", "", ...(items.length > 0 ? items : ["无"]), ""];
|
|
89
|
+
}
|
|
90
|
+
function buildChangesSection(summary) {
|
|
91
|
+
if (!summary?.changes)
|
|
92
|
+
return [];
|
|
93
|
+
return [
|
|
94
|
+
"<details>",
|
|
95
|
+
"<summary>主要变更(按模块)</summary>",
|
|
96
|
+
"",
|
|
97
|
+
summary.changes,
|
|
98
|
+
"",
|
|
99
|
+
"</details>",
|
|
100
|
+
"",
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
function countsSuffix(p0, p1, p2) {
|
|
104
|
+
return `(P0 ${p0} · P1 ${p1}${p2 > 0 ? ` · P2 ${p2}` : ""})`;
|
|
105
|
+
}
|
|
19
106
|
/**
|
|
20
|
-
*
|
|
107
|
+
* 整条摘要 note 的正文(页脚之前的附加段由 options.appendix 传入):
|
|
108
|
+
* 结论与计数 → 评审范围 / 较上次 → 验证说明 → 概述 → 需修复的 P0 → P1 提示 → 合入前检查项
|
|
109
|
+
* → 折叠的主要变更 → 附加段 → 发布策略说明。
|
|
110
|
+
*
|
|
111
|
+
* @param comments 合并后的 OPEN 全集(计数口径)
|
|
21
112
|
* @param blockingComments 参与准入判定的子集;省略时等于 comments(无持久化的降级路径)
|
|
22
113
|
*/
|
|
23
|
-
function buildVerdictMarkdown(verdict, comments, blockingComments) {
|
|
114
|
+
function buildVerdictMarkdown(verdict, comments, blockingComments, options = {}) {
|
|
24
115
|
const p0 = comments.filter((c) => c.severity === "P0").length;
|
|
25
116
|
const p1 = comments.filter((c) => c.severity === "P1").length;
|
|
26
117
|
const p2 = comments.filter((c) => c.severity === "P2").length;
|
|
27
|
-
const
|
|
118
|
+
const blocking = blockingComments ?? comments;
|
|
119
|
+
const blockingP0 = blocking.filter((c) => c.severity === "P0").length;
|
|
28
120
|
const advisoryP0 = p0 - blockingP0;
|
|
121
|
+
const parts = [];
|
|
29
122
|
if (verdict === "PASSED") {
|
|
30
|
-
|
|
123
|
+
parts.push("## ✅ PASSED", "");
|
|
31
124
|
if (advisoryP0 > 0) {
|
|
32
|
-
parts.push(`本次改动范围内无需修复的 P0
|
|
125
|
+
parts.push(`本次改动范围内无需修复的 P0;另有 ${advisoryP0} 个存量 P0 为非阻塞提示,建议排期修复${countsSuffix(p0, p1, p2)}`, "");
|
|
33
126
|
}
|
|
34
|
-
else if (p1 > 0) {
|
|
35
|
-
parts.push(`无 P0
|
|
127
|
+
else if (p1 > 0 || p2 > 0) {
|
|
128
|
+
parts.push(`无 P0 问题,可合入;P1 提示见下方汇总,不影响合入${countsSuffix(p0, p1, p2)}`, "");
|
|
36
129
|
}
|
|
37
130
|
else {
|
|
38
|
-
parts.push("没有 P0/P1 级别的问题,建议合入。", "");
|
|
131
|
+
parts.push("没有 P0 / P1 级别的问题,建议合入。", "");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
parts.push("## ⚠️ ACTION REQUIRED", "");
|
|
136
|
+
parts.push(`发现 ${blockingP0} 个 P0 问题,需修复后再次触发审查${countsSuffix(p0, p1, p2)}`, "");
|
|
137
|
+
if (advisoryP0 > 0) {
|
|
138
|
+
parts.push(`另有 ${advisoryP0} 个存量 P0 为非阻塞提示,不计入准入判定。`, "");
|
|
39
139
|
}
|
|
40
|
-
parts.push(...buildSeverityTable(p0, p1, p2));
|
|
41
|
-
return parts.join("\n");
|
|
42
140
|
}
|
|
43
|
-
|
|
44
|
-
parts.push(
|
|
45
|
-
|
|
46
|
-
|
|
141
|
+
parts.push(...buildScopeLines(options));
|
|
142
|
+
parts.push(...buildVerificationNotes(options));
|
|
143
|
+
parts.push(...buildOverviewSection(options.summary));
|
|
144
|
+
if (verdict !== "PASSED")
|
|
145
|
+
parts.push(...buildBlockingP0Section(blocking, options.links));
|
|
146
|
+
parts.push(...buildDigestSection(options.digestComments, options.links));
|
|
147
|
+
parts.push(...buildChecklistSection(options.checklist, options.summary));
|
|
148
|
+
parts.push(...buildChangesSection(options.summary));
|
|
149
|
+
for (const section of options.appendix ?? []) {
|
|
150
|
+
const trimmed = section.trim();
|
|
151
|
+
if (trimmed)
|
|
152
|
+
parts.push(trimmed, "");
|
|
47
153
|
}
|
|
48
|
-
|
|
154
|
+
if (comments.length > 0)
|
|
155
|
+
parts.push(exports.PUBLISH_POLICY_NOTE, "");
|
|
49
156
|
return parts.join("\n");
|
|
50
157
|
}
|
|
51
158
|
//# sourceMappingURL=verdict.js.map
|
package/dist/core/verdict.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/core/verdict.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/core/verdict.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type RunBudgetSignal } from "../shared/run-budget";
|
|
3
|
+
import type { AIComment, CodeReviewConfig, FindingVerification, ReconciledFinding, VerificationEvidence } from "../types";
|
|
4
|
+
import { type AgentRuntime } from "./agent-runtime";
|
|
5
|
+
import type { ReconcileResult } from "./incremental";
|
|
6
|
+
/**
|
|
7
|
+
* 新 finding 的取证验证:对本次新建的 finding 逐条用带只读工具的 agent 取证,
|
|
8
|
+
* 只有 CONFIRMED 进入发布集与准入判定,其余以 SUPPRESSED 入库、不发评论。
|
|
9
|
+
*
|
|
10
|
+
* 预算(假设值,见 design D7):候选按 P0 > P1 再按文件 / 行号稳定排序取前 10;
|
|
11
|
+
* 并发 4;每条最多 8 轮、90s;整 run 自启动起 10 分钟截止,截止后未开始的记 SKIPPED;
|
|
12
|
+
* 网关按 run 限额返回 403 后停止派发,未完成者 SKIPPED。
|
|
13
|
+
* 验证的任何失败(运行时抛错、模型不可解析、网关不可用)只落为 UNSURE,绝不让流水线失败。
|
|
14
|
+
*/
|
|
15
|
+
export declare const MAX_VERIFICATION_CANDIDATES = 10;
|
|
16
|
+
export declare const VERIFICATION_CONCURRENCY = 4;
|
|
17
|
+
export declare const VERIFICATION_MAX_TURNS = 8;
|
|
18
|
+
export declare const VERIFICATION_CANDIDATE_TIMEOUT_MS = 90000;
|
|
19
|
+
export declare const VERIFICATION_RUN_DEADLINE_MS: number;
|
|
20
|
+
export declare const VERIFY_PURPOSE = "verify";
|
|
21
|
+
export declare const SUBMIT_TOOL_NAME = "submit_verdict";
|
|
22
|
+
declare const verdictSchema: z.ZodObject<{
|
|
23
|
+
verdict: z.ZodEnum<{
|
|
24
|
+
CONFIRMED: "CONFIRMED";
|
|
25
|
+
REFUTED: "REFUTED";
|
|
26
|
+
UNSURE: "UNSURE";
|
|
27
|
+
}>;
|
|
28
|
+
reason: z.ZodString;
|
|
29
|
+
evidence: z.ZodArray<z.ZodObject<{
|
|
30
|
+
file: z.ZodString;
|
|
31
|
+
line: z.ZodNumber;
|
|
32
|
+
snippet: z.ZodString;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export type SubmittedVerdict = z.infer<typeof verdictSchema>;
|
|
36
|
+
export interface VerificationOptions {
|
|
37
|
+
cwd?: string;
|
|
38
|
+
env?: NodeJS.ProcessEnv;
|
|
39
|
+
/** 测试注入;缺省按 config.ai 创建 ToolRunnerRuntime */
|
|
40
|
+
runtime?: AgentRuntime;
|
|
41
|
+
budget?: RunBudgetSignal;
|
|
42
|
+
/** run 启动时刻(ms);整 run 截止 = startedAt + runDeadlineMs */
|
|
43
|
+
startedAt?: number;
|
|
44
|
+
maxCandidates?: number;
|
|
45
|
+
concurrency?: number;
|
|
46
|
+
maxTurns?: number;
|
|
47
|
+
candidateTimeoutMs?: number;
|
|
48
|
+
runDeadlineMs?: number;
|
|
49
|
+
now?: () => number;
|
|
50
|
+
}
|
|
51
|
+
export interface VerificationCounts {
|
|
52
|
+
candidates: number;
|
|
53
|
+
selected: number;
|
|
54
|
+
confirmed: number;
|
|
55
|
+
refuted: number;
|
|
56
|
+
unsure: number;
|
|
57
|
+
skipped: number;
|
|
58
|
+
}
|
|
59
|
+
export interface VerificationSummary {
|
|
60
|
+
/** fingerprint → 结论;没有候选时为空 */
|
|
61
|
+
verdicts: Map<string, FindingVerification>;
|
|
62
|
+
counts: VerificationCounts;
|
|
63
|
+
/** 本次 run 收到过 403 run_budget_exceeded(或启动时已超限) */
|
|
64
|
+
budgetExhausted: boolean;
|
|
65
|
+
}
|
|
66
|
+
export declare function emptyVerificationSummary(): VerificationSummary;
|
|
67
|
+
/**
|
|
68
|
+
* 候选 = 对账结果中本次新建、仍为 OPEN 且 severity 为 P0 的 finding(已知 OPEN 走复核
|
|
69
|
+
* agent,WONT_FIX / SUPPRESSED 粘性);无状态运行(平台 findings 拉取失败)时候选 =
|
|
70
|
+
* 本次模型输出里的 P0。
|
|
71
|
+
*
|
|
72
|
+
* 只验 P0:验证层的目的是让行内评论只剩经证实的严重 bug;P1 / P2 是性能与规范类
|
|
73
|
+
* 提示,不发行内评论、不参与准入,只在摘要里汇总,因此不花验证成本(用户 2026-10-21 拍板)。
|
|
74
|
+
*/
|
|
75
|
+
export declare function selectVerificationCandidates(reconciled: Pick<ReconcileResult, "newFindings"> | null, modelComments: AIComment[]): ReconciledFinding[];
|
|
76
|
+
/** P0 > P1 > P2,再按文件、行号稳定排序 */
|
|
77
|
+
export declare function orderVerificationCandidates(candidates: ReconciledFinding[]): ReconciledFinding[];
|
|
78
|
+
/** run 内稳定(可缓存):角色、判定标准、证据要求、工具结果为数据 */
|
|
79
|
+
export declare function buildVerificationSystemPrompt(): string;
|
|
80
|
+
/** 从 MR 全量 diff 中取出某文件的 section(含 diff --git 头) */
|
|
81
|
+
export declare function extractFileDiff(diff: string, file: string): string;
|
|
82
|
+
/** 候选 finding + 该文件的注解 diff 片段 + MR 元信息 */
|
|
83
|
+
export declare function buildVerificationUserPrompt(candidate: ReconciledFinding, diff: string, env?: NodeJS.ProcessEnv): string;
|
|
84
|
+
/**
|
|
85
|
+
* 读检出校验证据:file 在根内可读、line 在范围内、该行内容包含 snippet(忽略空白差异)。
|
|
86
|
+
* 返回通过校验的证据;不合格的逐条丢弃。
|
|
87
|
+
*/
|
|
88
|
+
export declare function validateEvidence(root: string, evidence: VerificationEvidence[]): Promise<VerificationEvidence[]>;
|
|
89
|
+
/**
|
|
90
|
+
* 对候选执行取证验证,返回 fingerprint → 结论。任何失败只落为 UNSURE / SKIPPED,不抛出。
|
|
91
|
+
*/
|
|
92
|
+
export declare function verifyFindings(candidates: ReconciledFinding[], config: CodeReviewConfig, diff: string, options?: VerificationOptions): Promise<VerificationSummary>;
|
|
93
|
+
/** 无状态运行(没有对账结果)时的结论应用:只留下 CONFIRMED 或未验证的评论 */
|
|
94
|
+
export declare function applyVerificationToComments(comments: AIComment[], verdicts: ReadonlyMap<string, FindingVerification>): AIComment[];
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/core/verification.ts"],"names":[],"mappings":"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"}
|