@unifan/pi-unifan-zh 1.0.21 → 1.0.23
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 +1 -0
- package/README_zh.md +4 -0
- package/extensions/review/index.ts +175 -17
- package/extensions/review/package.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -103,6 +103,7 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
103
103
|
- **`/review-config`** ⚙️: Standalone interactive settings command (persisted to `~/.pi/agent/pi-review.json`).
|
|
104
104
|
- **`/review-lite`** ⭐: Directly audits current uncommitted changes without menu prompts.
|
|
105
105
|
- **`/review-full`** 🚀: Full-scope deep review on all changes without redundant setup steps or checklists.
|
|
106
|
+
- **`/review-sync`** 🔄: Dual-session review relay loop (auto-detects role: dev fixes code & summarizes, reviewer validates diff without editing until approved). Aliases: `/review-flow`, `/review-relay`.
|
|
106
107
|
- **`/end-review`** 🏁:
|
|
107
108
|
- Automatically structures review findings into P0~P3 action items.
|
|
108
109
|
- Seamlessly jumps back to the original working branch and pre-fills the editor with fix instructions!
|
package/README_zh.md
CHANGED
|
@@ -102,6 +102,10 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
102
102
|
- **`/review-config`** ⚙️ **(审查配置中心)**:独立配置命令,随时切换审查引擎模式与并发数(配置自动保存在 `~/.pi/agent/pi-review.json`)。
|
|
103
103
|
- **`/review-lite`** ⭐ **(极速单兵审查)**:无需弹窗,直接对当前工作区未提交改动做闪电审查(零多余前置步骤)。
|
|
104
104
|
- **`/review-full`** 🚀 **(全量深度审查)**:直接对当前工作区与分支全部改动展开深度审查,严禁输出任何待办清单和环境测试,秒级直达 P0~P3 审查发现!
|
|
105
|
+
- **`/review-sync`** 🔄 **(双会话审查接力闭环 · 自动识别角色)**:
|
|
106
|
+
- **开发会话粘贴审查意见**:自动识别为【代码修复】,逐项核验有道理的立即改代码,有误报的给出解释,并输出结构化整改报告。
|
|
107
|
+
- **审查会话粘贴修复报告**:自动识别为【只读复核】,结合 `git diff` 验证问题是否彻底解决且**严禁改动任何代码**,满意后输出 `✅【审核通过,可以提交代码】`!
|
|
108
|
+
- **别名支持**:`/review-flow`、`/review-relay`。
|
|
105
109
|
- **`/end-review`** 🏁 **(结束审查并返回)**:
|
|
106
110
|
- 自动将审查分支中发现的 `[P0~P3]` 缺陷与待办事项生成结构化中文报告。
|
|
107
111
|
- 一键平滑跳回主开发会话分支,并自动在输入框回填 `根据上述代码审查发现进行修改修复`!
|
|
@@ -201,47 +201,48 @@ type ReviewTarget =
|
|
|
201
201
|
|
|
202
202
|
// 针对不同审查目标的中文提示词
|
|
203
203
|
const LITE_REVIEW_PROMPT =
|
|
204
|
-
"
|
|
204
|
+
"【极速体检模式】请首先运行 `git diff` 获取代码改动,并针对改动涉及的核心函数按需使用 `read` 查阅周边上下文(如所在完整方法实现与生命周期),快速排查高危逻辑崩溃与安全漏洞。结合上下文精准核验后直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。";
|
|
205
205
|
|
|
206
206
|
const FULL_REVIEW_PROMPT =
|
|
207
|
-
"
|
|
207
|
+
"【全量深度审查模式】请对当前代码改动展开深度的上下文关联审查:首先运行 `git diff` 全量查阅改动,必须使用 `read` / `grep` 深入查阅改动方法所在的完整类定义、调用方契约、状态机与生命周期等关键上下文,深入排查业务逻辑隐患、边界异常、并发安全、性能GC开销与架构契约,结合完整代码脉络直接输出详尽审查清单。严禁输出任何步骤清单。所有输出必须使用纯正中文。";
|
|
208
208
|
|
|
209
209
|
const UNCOMMITTED_PROMPT =
|
|
210
|
-
"
|
|
210
|
+
"请审查当前代码的所有改动(包含暂存区、未暂存区以及新增文件)。先运行 `git diff` 与 `git status` 获取改动,再针对关键改动按需使用 `read` / `grep` 查阅周边上下文代码与调用链路,结合完整上下文直接输出审查发现。严禁输出任何步骤清单或待办列表。所有输出必须使用纯正中文。";
|
|
211
211
|
|
|
212
212
|
const BASE_BRANCH_PROMPT_WITH_MERGE_BASE =
|
|
213
|
-
"请审查当前分支相对于基准分支 '{baseBranch}' 的改动(合并基准 commit: {mergeBaseSha}
|
|
213
|
+
"请审查当前分支相对于基准分支 '{baseBranch}' 的改动(合并基准 commit: {mergeBaseSha})。运行 `git diff {mergeBaseSha}` 查看改动,并按需使用 `read` / `grep` 结合周边上下文深入分析,直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。";
|
|
214
214
|
|
|
215
215
|
const BASE_BRANCH_PROMPT_FALLBACK =
|
|
216
|
-
"请审查当前分支相对于基准分支 '{branch}'
|
|
216
|
+
"请审查当前分支相对于基准分支 '{branch}' 的改动。先使用 `git merge-base` 与 `git diff` 查看改动,并按需使用 `read` / `grep` 结合周边上下文深入分析,直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。";
|
|
217
217
|
|
|
218
218
|
const COMMIT_PROMPT_WITH_TITLE =
|
|
219
|
-
'请审查提交 commit {sha} ("{title}")
|
|
219
|
+
'请审查提交 commit {sha} ("{title}") 引入的代码改动。运行 `git show {sha}` 查看差异,并按需使用 `read` / `grep` 结合周边上下文深入分析,直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。';
|
|
220
220
|
|
|
221
221
|
const COMMIT_PROMPT =
|
|
222
|
-
"请审查提交 commit {sha}
|
|
222
|
+
"请审查提交 commit {sha} 引入的代码改动。运行 `git show {sha}` 查看差异,并按需使用 `read` / `grep` 结合周边上下文深入分析,直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。";
|
|
223
223
|
|
|
224
224
|
const PULL_REQUEST_PROMPT =
|
|
225
|
-
'请审查 Pull Request #{prNumber} ("{title}") 相对于基准分支 \'{baseBranch}\' 的改动(合并基准 commit: {mergeBaseSha}
|
|
225
|
+
'请审查 Pull Request #{prNumber} ("{title}") 相对于基准分支 \'{baseBranch}\' 的改动(合并基准 commit: {mergeBaseSha})。运行 `git diff {mergeBaseSha}` 查看改动,并按需使用 `read` / `grep` 结合周边上下文深入分析,直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。';
|
|
226
226
|
|
|
227
227
|
const PULL_REQUEST_PROMPT_FALLBACK =
|
|
228
|
-
'请审查 Pull Request #{prNumber} ("{title}") 相对于基准分支 \'{baseBranch}\'
|
|
228
|
+
'请审查 Pull Request #{prNumber} ("{title}") 相对于基准分支 \'{baseBranch}\' 的改动。先运行 `git diff` 查看改动,并按需使用 `read` / `grep` 结合周边上下文深入分析,直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。';
|
|
229
229
|
|
|
230
230
|
const FOLDER_REVIEW_PROMPT =
|
|
231
|
-
"请对以下目录/文件路径的代码进行快照审查:{paths}
|
|
231
|
+
"请对以下目录/文件路径的代码进行快照审查:{paths}。直接读取这些文件并结合上下文直接输出审查发现。严禁输出任何步骤清单。所有输出必须使用纯正中文。";
|
|
232
232
|
|
|
233
233
|
// 权威的中文代码审查准则 (基于 Codex 准则精炼与本土化)
|
|
234
234
|
const REVIEW_RUBRIC = `> 🚨【最高执行原则】:
|
|
235
235
|
> 1. **全流程纯中文**:思维链(Thinking)、推理分析与最终报告必须 100% 使用纯正中文,严禁包含任何英文段落或英文小标题!
|
|
236
|
-
> 2.
|
|
236
|
+
> 2. **结合上下文,拒绝断章取义**:仅看 diff 的片段容易产生误判。请**先运行 \`git diff\` 锁定变动,再针对改动涉及的关键方法、类生命周期或调用方,按需使用 \`read\` 或 \`grep\` 查阅必要的上下文代码**(精准核验,切勿无目的漫游遍历),结合真实完整的业务上下文做出准确裁决!
|
|
237
|
+
> 3. **直接审查,拒绝繁琐步骤**:严禁打印任何工作流待办清单(Checklist)或环境测试命令!
|
|
237
238
|
|
|
238
239
|
# 核心代码审查准则
|
|
239
240
|
|
|
240
|
-
|
|
241
|
+
你是一名资深技术专家,正在审查提交的代码改动。请结合完整代码上下文,直击本质,拦截真实缺陷:
|
|
241
242
|
|
|
242
243
|
## 重点排查范围
|
|
243
|
-
1.
|
|
244
|
-
2.
|
|
244
|
+
1. **代码正确性与边界**:结合函数整体逻辑与调用方,排查业务漏洞、空指针/未定义引用、边界越界、生命周期异常、未捕获的运行时崩溃。
|
|
245
|
+
2. **并发与状态安全**:结合上下文状态机与生命周期,排查竞态条件、死锁隐患、异步缺少等待、脏状态残留。
|
|
245
246
|
3. **性能与内存开销**:高频主循环内的大量堆内存分配 (GC 压力)、不必要的深拷贝、高复杂度算法、资源句柄泄露。
|
|
246
247
|
4. **防御与输入校验**:外部未受信任输入未做严格参数化或校验(SQL注入、路径穿越、越权等)。
|
|
247
248
|
5. **只关注本次改动**:严禁将改动前既有的历史代码当作本次改动的缺陷。
|
|
@@ -249,7 +250,7 @@ const REVIEW_RUBRIC = `> 🚨【最高执行原则】:
|
|
|
249
250
|
## 严格过滤误报
|
|
250
251
|
- ❌ 严禁提出吹毛求疵、纯属个人审美的风格建议。
|
|
251
252
|
- ❌ 严禁提出 Linter / 类型检查器会自动捕获的浅层格式建议。
|
|
252
|
-
- ❌
|
|
253
|
+
- ❌ 严禁脱离上下文进行无端猜测,每条问题必须有明确的代码与上下文事实证据。
|
|
253
254
|
|
|
254
255
|
## 缺陷等级标记 [P0~P3]
|
|
255
256
|
- **[P0 - 致命阻塞]** 崩溃、死锁、数据损坏、关键功能不可用,必须阻断合并
|
|
@@ -261,8 +262,8 @@ const REVIEW_RUBRIC = `> 🚨【最高执行原则】:
|
|
|
261
262
|
### 审查发现清单
|
|
262
263
|
每个问题按以下格式列出(若无存活缺陷,明确输出:\`未发现存活的代码缺陷,代码质量良好,建议合并。\`):
|
|
263
264
|
- **[P0|P1|P2|P3] 简短标题**:\`文件路径:行号\`
|
|
264
|
-
-
|
|
265
|
-
-
|
|
265
|
+
- **缺陷说明**:结合上下文简明说明后果与触发场景。
|
|
266
|
+
- **代码证据**:引用关键代码及上下文。
|
|
266
267
|
- **修改建议**:给出最小化修复思路或代码替换块(可使用 \`\`\`suggestion)。
|
|
267
268
|
|
|
268
269
|
### 综合裁决
|
|
@@ -1352,4 +1353,161 @@ export default function reviewExtension(pi: ExtensionAPI) {
|
|
|
1352
1353
|
}
|
|
1353
1354
|
},
|
|
1354
1355
|
});
|
|
1356
|
+
|
|
1357
|
+
// 针对【代码开发会话·修复方】的提示词模板
|
|
1358
|
+
const DEV_FIX_PROMPT_TEMPLATE = `> 🚨【核心语言指令】:全流程 100% 纯正中文!
|
|
1359
|
+
|
|
1360
|
+
# 任务指令:针对代码审查(Code Review)意见进行核验、修复与总结
|
|
1361
|
+
|
|
1362
|
+
外部审查专家提出了以下代码审查意见与发现:
|
|
1363
|
+
---
|
|
1364
|
+
{content}
|
|
1365
|
+
---
|
|
1366
|
+
|
|
1367
|
+
## 执行指示(请严格遵守):
|
|
1368
|
+
1. **逐条仔细核验**:结合当前代码上下文仔细审阅上述每一项发现。
|
|
1369
|
+
2. **合理的问题立即修复**:
|
|
1370
|
+
- 确实存在逻辑缺陷、边界隐患、空指针或并发风险的,请立即使用代码编辑工具进行修复。
|
|
1371
|
+
- 确保修改后的代码语法正确、逻辑自洽且未引入新问题。
|
|
1372
|
+
3. **有争议或误报的问题有理有据解释**:
|
|
1373
|
+
- 若某些意见属于误报,或由于特定业务场景与底层架构已有防护,请明确给出技术解释与考量依据。
|
|
1374
|
+
4. **输出结构化的《整改与回复报告》(供用户直接复制回审查会话复核)**:
|
|
1375
|
+
在最终回复末尾,严格按以下格式进行总结:
|
|
1376
|
+
|
|
1377
|
+
### 🛠️ 代码审查整改与回复报告
|
|
1378
|
+
- **[已修复] [问题标题]**
|
|
1379
|
+
- **修改说明**:说明修改了哪些文件与函数,采取了什么具体修复方案。
|
|
1380
|
+
- **[无需修改/已说明] [问题标题]**
|
|
1381
|
+
- **原因解释**:说明为什么无需修改或为什么既有实现是合理的。
|
|
1382
|
+
|
|
1383
|
+
### 📝 本次整改提交摘要
|
|
1384
|
+
一句话总结本次修复涉及的模块与核心变动。
|
|
1385
|
+
`;
|
|
1386
|
+
|
|
1387
|
+
// 针对【审查复核会话·审查方】的提示词模板
|
|
1388
|
+
const REVIEWER_RECHECK_PROMPT_TEMPLATE = `> 🚨【核心语言指令】:全流程 100% 纯正中文!
|
|
1389
|
+
> 🚨【关键操作禁令】:你当前处于【复核审查官】模式,**严禁修改任何代码!严禁调用任何写入/修改工具!** 你的唯一职责是验证代码是否已被正确修复!
|
|
1390
|
+
|
|
1391
|
+
# 任务指令:复核开发者的代码修复与整改说明
|
|
1392
|
+
|
|
1393
|
+
开发者提交了针对此前代码审查的整改回复:
|
|
1394
|
+
---
|
|
1395
|
+
{content}
|
|
1396
|
+
---
|
|
1397
|
+
|
|
1398
|
+
## 执行指示(请严格遵守):
|
|
1399
|
+
1. **查阅最新改动**:立即运行 \`git diff\` 查看最新代码改动,并按需使用 \`read\` 查阅修改后的完整方法与类上下文。
|
|
1400
|
+
2. **逐项对照复核**:
|
|
1401
|
+
- 对照上述整改说明与最新代码,严格核验此前的问题是否真正被彻底解决。
|
|
1402
|
+
- 检查本次修复是否引入了新的逻辑缺陷、空指针、状态残留或并发风险。
|
|
1403
|
+
- 评估开发者对于“无需修改”项的解释是否合理、论据是否充分。
|
|
1404
|
+
3. **严禁修改任何源码文件**(只读复核)。
|
|
1405
|
+
4. **给出最终复核裁决**:
|
|
1406
|
+
- **若所有关键问题均已圆满解决,代码质量达标**:
|
|
1407
|
+
请在报告末尾明确输出绿色的终审裁决大标题:
|
|
1408
|
+
## ✅【审核通过,可以提交代码】
|
|
1409
|
+
并附上一句话总评。
|
|
1410
|
+
- **若仍有未解决或新引入的问题**:
|
|
1411
|
+
请在报告末尾明确输出:
|
|
1412
|
+
## ❌【仍有阻塞问题需继续修改】
|
|
1413
|
+
列出具体的剩余问题、所在文件行号与修改要求,以便用户再次复制给开发者继续修复。
|
|
1414
|
+
`;
|
|
1415
|
+
|
|
1416
|
+
function detectReviewSyncRole(
|
|
1417
|
+
entries: any[],
|
|
1418
|
+
content: string,
|
|
1419
|
+
flag?: "fix" | "check",
|
|
1420
|
+
): "fix" | "check" {
|
|
1421
|
+
if (flag) return flag;
|
|
1422
|
+
|
|
1423
|
+
// 1. 会话历史特征判断:当前会话是否曾作为审查分支或执行过 review
|
|
1424
|
+
const hasReviewHistory = entries.some((e) => {
|
|
1425
|
+
if (e.type === "custom" && e.customType === REVIEW_STATE_TYPE) return true;
|
|
1426
|
+
if (e.type === "message" && e.message?.content) {
|
|
1427
|
+
const text = JSON.stringify(e.message.content);
|
|
1428
|
+
return text.includes("核心代码审查准则") || text.includes("正在启动代码审查");
|
|
1429
|
+
}
|
|
1430
|
+
return false;
|
|
1431
|
+
});
|
|
1432
|
+
|
|
1433
|
+
if (hasReviewHistory) {
|
|
1434
|
+
return "check";
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
// 2. 粘贴内容特征判断:
|
|
1438
|
+
// 审查发现一般包含 [P0]、[P1]、"审查发现"、"缺陷说明"、"综合裁决"
|
|
1439
|
+
// 修复汇报一般包含 "已修复"、"整改与回复"、"修改说明"、"本次整改"
|
|
1440
|
+
const hasReviewMarkers = /\[P[0-3]\]|审查发现|缺陷说明|综合裁决|代码审查准则/i.test(content);
|
|
1441
|
+
const hasFixMarkers = /已修复|整改与回复|修改说明|本次整改|无需修改/i.test(content);
|
|
1442
|
+
|
|
1443
|
+
if (hasFixMarkers && !hasReviewMarkers) {
|
|
1444
|
+
return "check";
|
|
1445
|
+
}
|
|
1446
|
+
if (hasReviewMarkers) {
|
|
1447
|
+
return "fix";
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
return "fix";
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
async function handleReviewSync(rawArgs: string | undefined, ctx: ExtensionCommandContext) {
|
|
1454
|
+
if (!ctx.hasUI) {
|
|
1455
|
+
ctx.ui.notify("review-sync 需要交互式终端环境", "error");
|
|
1456
|
+
return;
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
let text = rawArgs?.trim() || "";
|
|
1460
|
+
let forcedRole: "fix" | "check" | undefined = undefined;
|
|
1461
|
+
|
|
1462
|
+
if (text.startsWith("--fix ")) {
|
|
1463
|
+
forcedRole = "fix";
|
|
1464
|
+
text = text.slice(6).trim();
|
|
1465
|
+
} else if (text.startsWith("--check ") || text.startsWith("--review ")) {
|
|
1466
|
+
forcedRole = "check";
|
|
1467
|
+
text = text.replace(/^--(?:check|review)\s+/, "").trim();
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
if (!text) {
|
|
1471
|
+
const input = await ctx.ui.editor(
|
|
1472
|
+
"请粘贴 Review 审查发现清单(发给开发会话修复)或 修复整改说明(发给审查会话复核):",
|
|
1473
|
+
"",
|
|
1474
|
+
);
|
|
1475
|
+
if (!input?.trim()) {
|
|
1476
|
+
ctx.ui.notify("已取消操作", "info");
|
|
1477
|
+
return;
|
|
1478
|
+
}
|
|
1479
|
+
text = input.trim();
|
|
1480
|
+
}
|
|
1481
|
+
|
|
1482
|
+
const entries = ctx.sessionManager.getEntries();
|
|
1483
|
+
const role = detectReviewSyncRole(entries, text, forcedRole);
|
|
1484
|
+
|
|
1485
|
+
if (role === "fix") {
|
|
1486
|
+
ctx.ui.notify("🤖 自动识别为【代码开发会话】:正在逐项核验并执行代码修复...", "info");
|
|
1487
|
+
const prompt = DEV_FIX_PROMPT_TEMPLATE.replace("{content}", text);
|
|
1488
|
+
pi.sendUserMessage(prompt);
|
|
1489
|
+
} else {
|
|
1490
|
+
ctx.ui.notify("🔍 自动识别为【审查复核会话】:正在对照改动进行只读复核 (严禁改动代码)...", "info");
|
|
1491
|
+
const prompt = REVIEWER_RECHECK_PROMPT_TEMPLATE.replace("{content}", text);
|
|
1492
|
+
pi.sendUserMessage(prompt);
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
// 注册双会话审查接力闭环命令:/review-sync
|
|
1497
|
+
pi.registerCommand("review-sync", {
|
|
1498
|
+
description: "双会话审查接力闭环 (自动识别:开发会话自动改代码并总结,审查会话只读复核直到可提交)",
|
|
1499
|
+
handler: handleReviewSync,
|
|
1500
|
+
});
|
|
1501
|
+
|
|
1502
|
+
// 别名:/review-flow
|
|
1503
|
+
pi.registerCommand("review-flow", {
|
|
1504
|
+
description: "双会话审查接力闭环 (/review-sync 别名)",
|
|
1505
|
+
handler: handleReviewSync,
|
|
1506
|
+
});
|
|
1507
|
+
|
|
1508
|
+
// 别名:/review-relay
|
|
1509
|
+
pi.registerCommand("review-relay", {
|
|
1510
|
+
description: "双会话审查接力闭环 (/review-sync 别名)",
|
|
1511
|
+
handler: handleReviewSync,
|
|
1512
|
+
});
|
|
1355
1513
|
}
|