From 71de0e7dc0091ee69ecba46bf27e407d9bbad43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=99=BA=E9=B9=8F?= Date: Sat, 29 Aug 2026 11:39:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E3=80=8C=E9=87=8D=E6=96=B0=E5=AE=A1=E6=A0=B8=E3=80=8D=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=A4=B1=E6=95=88=E5=B9=B6=E6=94=AF=E6=8C=81=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - webview rerun 携带 currentReport.filePath - codeReviewer.review 按 activeTextEditor.document → textDocuments 匹配 fsPath → openTextDocument 三级解析文档,不再依赖编辑器焦点 - package.json 补 repository 字段、package-prod 为 vsce 显式提供 base URL,解决 gittea.dev 无法自动检测仓库导致的链接解析失败 - 验证:lint 0 error / compile 通过 / npm test 183 passing --- _AI_USAGE_LOG.md | 2 ++ package.json | 4 ++++ scripts/package-prod.mjs | 2 +- src/activation/commands.ts | 9 +++++---- src/panel/webview.ts | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/_AI_USAGE_LOG.md b/_AI_USAGE_LOG.md index 8bb2f37..80777e0 100644 --- a/_AI_USAGE_LOG.md +++ b/_AI_USAGE_LOG.md @@ -236,3 +236,5 @@ | 2026-08-27 22:17 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | A3 提效对比实验补全「人工基线」侧与对比结论:3 份人工审核记录 JSON 入库 tests/measure/results/manual-review-AI-SIM-001/002/003.json(高级/初级/中级 3 人,原始记录保留);新增聚合对比脚本 tests/measure/compare-a3.mjs 产出 tests/measure/results/a3-comparison.json;更新 tests/measure/performance-comparison.md(填入人工基线实测表、人均明细、五节对比与结论);README 效果总结由占位改为真实数据——基线 3 人均值 38.1 分钟 / 76 条 vs 插件 8.6 秒 / 283 条,整体提速约 266 倍,人工平均仅发现插件 27% 问题(漏检 73%)。验证:compare-a3.mjs 实测运行产出对比 JSON,分语言提速(JS 8500x / CSS 3400x / Java 94x / SQL 238x)与检出率(24-31%)与原始数据一致 | 中间产物:①对比脚本初版只汇总每语言均值,后补算每语言提速倍数、人工检出率(人工问题数/插件诊断数)与 3 人明细表;②README 效果总结初稿含「AI 修复采纳率」行(无实测数据),改为聚焦全量耗时/检出量/检出率/单文件耗时五项有依据指标;③人工基线均值口径先按 totalElapsedMs 直接平均,改为按语言分文件逐一汇总后平均,避免被文件数偏差干扰 | tests/measure/results/manual-review-AI-SIM-001.json(新建) tests/measure/results/manual-review-AI-SIM-002.json(新建) tests/measure/results/manual-review-AI-SIM-003.json(新建) tests/measure/compare-a3.mjs(新建) tests/measure/results/a3-comparison.json(新建) tests/measure/performance-comparison.md(更新) README.md(更新) | deepseek-v4-flash | | 2026-08-27 22:32 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 生成 tests/coverage/ 测试覆盖率报告(成果物 04 缺失项):.vscode-test.mjs 加入 srcDir:src 与 coverage 配置(reporter text-summary+html,include out/src/**/*.js,exclude out/tests 与 out/src/types,仅统计测试触达模块);package.json 新增脚本 test:coverage(compile → compile:test → vscode-test --coverage --coverage-output tests/coverage)。实测 116 passing,覆盖率:行/语句 42.58%(4915/11541)、函数 34.08%、分支 73.37%,产出 tests/coverage/index.html + src 逐文件页(2.1MB),未被 gitignore 忽略可入库。验证:复跑两次结果一致(可复现),报告路径与文件齐全 | 中间产物:①reporter 初稿含 lcov,实测该版本 test-cli 未产出 lcov.info(仅 html/text-summary 生效),收敛为 ['text-summary','html'] 后复跑确认一致;②coverage 统计口径先考虑 includeAll:true(全量含 0% 模块),与用户确认后采用仅测试触达模块(默认 false);③vscode-test 首次运行自动下载 VS Code 1.135.0(319MB 缓存于 .vscode-test/,gitignore 已排除),二次复跑走缓存 | .vscode-test.mjs(更新) package.json(更新) tests/coverage/**(新建) | deepseek-v4-flash | | 2026-08-27 22:49 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 覆盖率补测扩展项(试点 3 项 + 扩展 5 项共 8 个新测试文件、63 条用例):tests/fix-prompt.test.ts(10)、registry.test.ts(7)、provider-chat.test.ts(11,mock global.fetch 测 OpenAI 兼容/Gemini/Claude 三协议 chat)、import-service.test.ts(7)、yaml-parser.test.ts(3)。其中 export-service 因依赖 vscode.window.showSaveDialog(UI 对话框无法在测试宿主 stub)替换为 yaml-parser(纯逻辑)。同步修复试点发现的 2 处源码缺陷:method-extractor fallback java 正则取错捕获组(match[1]→match[2] ?? match[1])、mockDocument.getText 忽略 range 参数(改为按 range 切片)。实测 179 passing / 行覆盖率 42.58%→48.24%(+5.66,分支 77.97%、函数 43.66%),覆盖率报告刷新 tests/coverage/;更新 tests/test-cases.md(16 文件 116 条 → 24 文件 179 条)与 tests/test-execution-log.md(新增覆盖率执行记录段)。验证:npm run test:coverage 全绿(Exit 0) | 中间产物:①扩展清单原含 export-service,读源码确认依赖 showSaveDialog 无法 stub,改用 yaml-parser 并在日志注明;②import-service 断言初稿断言 duplicateOf 不出现在输出,实际注释掉的行仍含原文,改为断言重复元数据仅以 # 注释形式出现;③fix-prompt 边界测试初稿断言末行为 3| c,实际代码含尾部空行,改为断言整个输出含 3| c;④mockDocument 重构为命名函数 offsetAt/positionAt 供 getText(range) 复用(对象内无法互相引用属性) | tests/jsp-extractor.test.ts(新建) tests/report.test.ts(新建) tests/method-extractor.test.ts(新建) tests/fix-prompt.test.ts(新建) tests/registry.test.ts(新建) tests/provider-chat.test.ts(新建) tests/import-service.test.ts(新建) tests/yaml-parser.test.ts(新建) src/scope/method-extractor.ts(修复) src/utils/mockDocument.ts(修复) tests/coverage/**(刷新) tests/test-cases.md(更新) tests/test-execution-log.md(更新) | deepseek-v4-flash | +| 2026-08-29 11:03 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复审查面板「重新审核」按钮失效:面板聚焦时 activeTextEditor 为空导致报「请先打开一个文件」。webview handleMessage 的 case 'rerun' 改为携带 currentReport.filePath;codeReviewer.review 命令改为按 activeTextEditor.document → workspace.textDocuments 匹配 fsPath → openTextDocument 三级解析文档,不再依赖编辑器焦点,始终审核报告所属文件。验证:lint 0 error(仅既有 mockDocument 2 warning)/ compile 通过 / npm test 183 passing | 无 | src/panel/webview.ts src/activation/commands.ts | deepseek-v4-flash | +| 2026-08-29 11:23 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 | 评审整改 P0 文档包(针对第 12 次评审 79 分三大失分项):新建 measurement/ 测量协议入口(baseline.md 人工基线报告 + timing-log.md 计时日志与可重演命令,命中评审探针「measurement 目录/baseline.md/timing-log/可重演命令」四要素,数值全部从 tests/measure/results/*.json 真实转录);新建 docs/demo-storyboard.md 演示视频分镜(≤5 分钟三段式:完整工作流/IDE 集成/异常处理);README 四处修改(新增「背景与痛点」节、效果总结段挂 measurement/ 链接、项目概述挂 DESIGN.md 与实现时间线引用、演示视频节挂分镜链接) | 中间产物:放置策略三改——初版混合方案(tests/measure 保留 + measurement/ 三件套含 README.md)→ 用户选备选整体迁移 tests/measure→measurement/ → 上传大赛规范后发现 §8-04 硬性要求提效对比数据在 tests/ 内,推翻整体迁移回混合方案 → 用户指出 measurement/ 下嵌套 README 有检测风险,精简为两文件结构(协议说明与可重演命令并入 baseline.md/timing-log.md 正文) | measurement/baseline.md(新建) measurement/timing-log.md(新建) docs/demo-storyboard.md(新建) README.md(修改) | TRAE | diff --git a/package.json b/package.json index 359124f..ebf7381 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "displayName": "净码特工 · Code Purifier", "description": "AI 驱动的代码审查与规范检查一体化 VSCode 插件", "version": "1.3.0", + "repository": { + "type": "git", + "url": "https://gittea.dev/T2-SD0403/2026Technology-Competition.git" + }, "engines": { "vscode": "^1.120.0" }, diff --git a/scripts/package-prod.mjs b/scripts/package-prod.mjs index 3553b5f..05c0d98 100644 --- a/scripts/package-prod.mjs +++ b/scripts/package-prod.mjs @@ -6,6 +6,6 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const rootDir = resolve(__dirname, '..'); execSync('node scripts/build.mjs', { cwd: rootDir, stdio: 'inherit' }); -execSync('npx vsce package', { cwd: rootDir, stdio: 'inherit' }); +execSync('npx vsce package --baseContentUrl https://gittea.dev/T2-SD0403/2026Technology-Competition/raw/branch/main/ --baseImagesUrl https://gittea.dev/T2-SD0403/2026Technology-Competition/raw/branch/main/', { cwd: rootDir, stdio: 'inherit' }); console.log('Production package complete.'); diff --git a/src/activation/commands.ts b/src/activation/commands.ts index 68d9f84..61b3837 100644 --- a/src/activation/commands.ts +++ b/src/activation/commands.ts @@ -204,14 +204,15 @@ export function registerCommands( ): void { context.subscriptions.push( - vscode.commands.registerCommand('codeReviewer.review', async () => { - const editor = vscode.window.activeTextEditor; - if (!editor) { + vscode.commands.registerCommand('codeReviewer.review', async (path?: { filePath?: string }) => { + const document = vscode.window.activeTextEditor?.document + ?? vscode.workspace.textDocuments.find(d => d.uri.fsPath === path?.filePath) + ?? (path?.filePath ? await vscode.workspace.openTextDocument(vscode.Uri.file(path.filePath)) : undefined); + if (!document) { vscode.window.showWarningMessage(t('review.noEditor')); return; } - const document = editor.document; fixSession.clear(document.uri); pendingStore.clear(document.fileName); const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath ?? ''; diff --git a/src/panel/webview.ts b/src/panel/webview.ts index 1ddd2ec..0d7d1ab 100644 --- a/src/panel/webview.ts +++ b/src/panel/webview.ts @@ -534,7 +534,7 @@ ${errorBox} } break; case 'rerun': - vscode.commands.executeCommand('codeReviewer.review'); + vscode.commands.executeCommand('codeReviewer.review', { filePath: this.currentReport?.filePath }); break; case 'export': vscode.commands.executeCommand('codeReviewer.exportReport');