@unifan/pi-review-zh 1.0.17 → 1.0.18

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 (2) hide show
  1. package/index.ts +157 -0
  2. package/package.json +1 -1
package/index.ts CHANGED
@@ -1353,4 +1353,161 @@ export default function reviewExtension(pi: ExtensionAPI) {
1353
1353
  }
1354
1354
  },
1355
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
+ });
1356
1513
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unifan/pi-review-zh",
3
- "version": "1.0.17",
3
+ "version": "1.0.18",
4
4
  "description": "Pi 交互式 AI 代码审查扩展(支持单模型与多 Subagent 并发 2~6 专家自由切换,Codex 经典架构)",
5
5
  "type": "module",
6
6
  "license": "MIT",