From a734cdf009affe42104ed8409b106bcf3d45e236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E6=99=BA=E9=B9=8F?= Date: Mon, 20 Jul 2026 20:24:40 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=93=81=E7=89=8C=E9=87=8D?= =?UTF-8?q?=E5=91=BD=E5=90=8D=20+=20maxTokens=20=E6=94=AF=E6=8C=81=20+=20?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=9D=A2=E6=9D=BF=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CodeGuard → Code Purifier / 净码特工(displayName、命令、配置标题) - 新增 ai.maxTokens 配置项,所有 Provider 及 fixer 传入 maxTokens - AI 引擎增强:repairJsonEscapes + JSON 解析 fallback + 详细错误信息 - 设置面板规则管理改为文件级(list/delete .yaml),addRule 改为 AI 从 Markdown 生成 YAML - yaml-parser 简化:移除 config.yaml 的 enable/disable 过滤逻辑 - 审查报告面板:errorBanner 优先显示具体错误、lint 诊断显示 suggestion、移除 translatedDiagnostics 独立渲染 - merger 中 translatedDiagnostics 覆盖原始 lint 诊断 message/suggestion - HTML linter 配置项、测试用例重写、typescript-eslint 移入 dependencies --- README.md | 2 +- _AI_USAGE_LOG.md | 28 ++++ .../specs/2026-07-10-code-reviewer-design.md | 2 +- .../specs/2026-07-10-implementation-plan.md | 2 +- .../15-phase5.1-commands-extension.md | 18 +-- .../16-phase5.2-setup-panel.md | 2 +- eslint.config.mjs | 2 +- jars/pmd/PmdRunner.java | 16 +- package.json | 44 ++++-- scripts/build.mjs | 12 +- scripts/copy-webview-js.mjs | 3 +- scripts/download-pmd.mjs | 49 ++++-- src/adapters/eslint.ts | 24 ++- src/adapters/jsp.ts | 55 ++++++- src/adapters/pmd.ts | 41 +++-- src/adapters/sql-lint.ts | 18 ++- src/adapters/stylelint.ts | 53 ++++++- src/ai/engine.ts | 58 ++++++- src/ai/providers/base.ts | 1 + src/ai/providers/claude.ts | 2 +- src/ai/providers/gemini.ts | 1 + src/ai/providers/openai-compatible.ts | 1 + src/config/ai.ts | 4 + src/extension.ts | 2 +- src/fixer/fixer.ts | 1 + src/merger/merger.ts | 10 +- src/panel/webview.ts | 28 +--- src/rules/yaml-parser.ts | 81 +--------- src/test/extension.test.ts | 19 ++- src/views/setupView.js | 28 ++-- src/views/setupView.ts | 148 ++++++++++-------- 31 files changed, 462 insertions(+), 293 deletions(-) diff --git a/README.md b/README.md index efbd144..b2749be 100644 --- a/README.md +++ b/README.md @@ -13,4 +13,4 @@ VS Code 代码审查与规范检查一体化插件。集成 ESLint、Stylelint ## 配置 -通过 `Ctrl+Shift+P` → `CodeGuard: 打开设置面板` 进行配置,或编辑 `.vscode/settings.json`。 +通过 `Ctrl+Shift+P` → `净码特工: 打开设置面板` 进行配置,或编辑 `.vscode/settings.json`。 diff --git a/_AI_USAGE_LOG.md b/_AI_USAGE_LOG.md index a843ea0..60cc2f7 100644 --- a/_AI_USAGE_LOG.md +++ b/_AI_USAGE_LOG.md @@ -58,3 +58,31 @@ | 2026-07-16 19:06 | ① 用户提出 → ⑤ 编码实现 → ⑥ 审查验证 | 保存并测试连接时,Base URL 未配置也报错提示,不再静默使用默认值 | 无 | src/views/setupView.ts | deepseek-v4-flash | | 2026-07-16 21:18 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 快速开始三步序号动态高亮:完成=绿色(#3fb950)、有后继步骤完成但本步未完成=黄色(#f0883e)、默认=灰色 | 三态逻辑先在"仅步骤3触发才变黄"和"任意后继触发变黄"间迭代一次 | src/views/setupView.ts src/views/setupView.js | deepseek-v4-flash | | 2026-07-16 21:57 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 addRule/deleteRule 不同步规则定义文件:addRule 现在在 .code-review/rules/user-rules.yaml 创建模板定义;deleteRule 从 user-rules.yaml 移除规则项 | 无 | src/views/setupView.ts | deepseek-v4-flash | +| 2026-07-16 22:36 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 | 品牌命名:CodeGuard → 净码特工 · Code Purifier,更新 package.json/extension.ts/README.md 及所有历史文档 | brainstorm 过渡方案: 码鉴 CodeLens / 智评 AIReview / 码析 CodeSense 均被废弃 | package.json src/extension.ts README.md docs/superpowers/specs/*.md | deepseek-v4-flash | +| 2026-07-17 20:21 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 | 设置面板显示所有规则(含禁用):CustomRule 增加 enabled 字段,loadActiveRules 返回全部规则并用 enabled 标记启用状态,设置面板展示全部规则(禁用开关为 off),AI 审查前过滤仅启用规则 | 无 | src/types.ts src/rules/yaml-parser.ts src/activation/commands.ts src/views/setupView.ts src/views/setupView.js | deepseek-v4-flash | +| 2026-07-17 20:39 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 设置面板改为文件列表展示(无开关无规则详情):去掉 enable/disable 机制;新增 listRuleFiles();addRule 改为选择 .md 文件 → AI 生成规则 YAML → 写入文件;deleteFile 删除整个 .yaml 文件 | 方案经历 3 轮迭代:①按文件分组+开关 → ②只显示文件名+删除+添加 → ③添加改为 AI 读取.md 生成 | src/types.ts src/rules/yaml-parser.ts src/activation/commands.ts src/views/setupView.ts src/views/setupView.js | deepseek-v4-flash | +| 2026-07-17 21:03 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | Phase 6.3 测试:7 个测试文件(fixtures/ 3 样本 + 4 测试 suite)+ 修复 webview JS 和 TS 输出碰撞问题 | config.test.ts 按实际 API 调整(getLinterConfig→getLinterForLanguage 等);extension.test.ts 改用 getCommands 绕过 publisher 缺失;发现并修复 setupView.js 被 copy 脚本覆盖 TS 编译产物致扩展无法激活的 bug | src/test/fixtures/sample.js src/test/fixtures/sample.css src/test/fixtures/Sample.java src/test/adapter.test.ts src/test/config.test.ts src/test/merger.test.ts src/test/pipeline.test.ts src/test/extension.test.ts scripts/copy-webview-js.mjs scripts/build.mjs src/views/setupView.ts | deepseek-v4-flash | +| 2026-07-18 14:19 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 | 手动测试样本:每种语言带真实 bug 的文件,供用户安装插件后手动验证审查功能 | 无 | src/test/manual/buggy.js src/test/manual/buggy.css src/test/manual/buggy.sql src/test/manual/Buggy.java src/test/manual/buggy.jsp | deepseek-v4-flash | +| 2026-07-18 14:51 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | bug fix: stylelint 无配置文件导致静态分析跳过 CSS bug。在 StylelintAdapter 中内置 11 条默认规则,检测到 workingDir 无外部 .stylelintrc 时自动 fallback | 无 | src/adapters/stylelint.ts | deepseek-v4-flash | +| 2026-07-18 15:23 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 | 修正内置规则:移除 stylelint v17 无效的 color-hex-case,替换为 color-hex-length + color-named | 先用 color-hex-case('lower')发现无效 → 测试验证后替换 | src/adapters/stylelint.ts | deepseek-v4-flash | +| 2026-07-18 15:42 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | bug fix: import('stylelint') 返回 ESM namespace {default:{lint}},直接调 i.lint 为 undefined 抛 TypeError 被静默吞掉;同时修复静态分析错误不显示的问题(error 挂在 degraded 下,AI成功则不显示) | 第1轮只改 stylelint.ts,用户测试仍无问题→第2轮发现 import 未取 .default + panel 缺独立错误横幅 | src/adapters/stylelint.ts src/panel/webview.ts | deepseek-v4-flash | +| 2026-07-18 15:51 | ① 用户提出 → ⑤ 编码实现 | AI 审查解析失败时附带原始响应文本方便排查;修复错误横幅重复显示(errorBanner + degradedBanner 合并为单条) | 无 | src/ai/engine.ts src/panel/webview.ts | deepseek-v4-flash | +| 2026-07-18 16:20 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 静态分析标签页 linter 消息按 outputLanguage 翻译:在 buildLinterList() 和 reportToMarkdown() 中从 translatedDiagnostics 查找匹配翻译替换原始消息 | 无 | src/panel/webview.ts src/utils/report.ts | deepseek-v4-flash | +| 2026-07-18 16:22 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 ruleId/originalRuleId 不匹配:同时注册带前缀和不带前缀两种 key 到 transMap | 第一次只用 exact match 失效,改为双 key | src/panel/webview.ts src/utils/report.ts | deepseek-v4-flash | +| 2026-07-18 16:24 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 重构:翻译逻辑从视图层移到数据层 merger.ts mergeResults 中直接替换 linterDiagnostics message | 视图层 transMap 方案废弃;改用数据层替换 | src/merger/merger.ts src/panel/webview.ts src/utils/report.ts | deepseek-v4-flash | +| 2026-07-18 16:36 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 静态分析标签页同步显示 translatedSuggestion:merger.ts 匹配翻译时一并设置 suggestion 字段 | 无 | src/merger/merger.ts | deepseek-v4-flash | +| 2026-07-18 16:38 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 静态分析标签页 WebView 渲染 suggestion:buildLinterList 中增加建议行显示 | 无 | src/panel/webview.ts | deepseek-v4-flash | +| 2026-07-18 16:40 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | AI 响应解析失败时附带原始响应文本:catch 中传入 e.message 而非固定字符串 | 无 | src/ai/engine.ts | deepseek-v4-flash | +| 2026-07-18 16:42 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 AI 返回 JSON 中未转义双引号导致解析失败:prompt 增加转义说明 + repairJsonEscapes 容错后处理 | 无 | src/ai/engine.ts | deepseek-v4-flash | +| 2026-07-18 19:17 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | Bug fix: AI 审查标签页不再显示 translatedDiagnostics(静态分析翻译结果重复渲染),只保留 aiFindings | 无 | src/panel/webview.ts | deepseek-v4-flash | +| 2026-07-18 19:28 | ① 用户提出 → ⑤ 编码实现 → ⑥ 审查验证 | 诊断 PMD 报"Java 11+ 未安装"原因(缺少 PMD JAR + PmdRunner.java 未编译 + API 不兼容 PMD 7.26.0);下载 PMD 7.26.0 JAR 包 4 个到 jars/pmd/lib/;重写 PmdRunner.java 适配 7.26.0 API(addRuleSet(Path)→addRuleSet(String),setInputFilePath/setReportWriter→config.createRenderer()+pmd.files().addFile());编译生成 PmdRunner.class | 初版编译原 PmdRunner.java 报 API 不兼容(2 个方法不存在),改为 PMD 7.26.0 新版 API | jars/pmd/lib/pmd-core-7.26.0.jar jars/pmd/lib/pmd-java-7.26.0.jar jars/pmd/lib/pmd-javascript-7.26.0.jar jars/pmd/lib/pmd-jsp-7.26.0.jar jars/pmd/PmdRunner.java jars/pmd/PmdRunner.class | deepseek-v4-flash | +| 2026-07-19 13:38 | ① 用户提出 → ⑤ 编码实现 → ⑥ 审查验证 | 真正根因:缺少 12 个 PMD transitive 依赖(slf4j/antlr/saxon 等);CycloneDX SBOM 解析依赖版本→下载全部 16 JAR;简化 PmdRunner.java;修复 pmd.ts catch 误判(message.includes('java') 太宽);重构 build.mjs 去掉 jars→out 重复拷贝 | 先试 pmd-dist ZIP(404)→改 GitHub Release(网络不通)→最后用 Maven CycloneDX 解析依赖版本 | jars/pmd/lib/*.jar(16) jars/pmd/PmdRunner.java src/adapters/pmd.ts scripts/build.mjs scripts/download-pmd.mjs vscode-code-reviewer-0.0.1.vsix | deepseek-v4-flash | +| 2026-07-19 13:48 | ① 用户提出 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 PmdRunner.class 找不到:重构路径解析为 resolvePmdDir(),探测 4 个候选位置并用 fs.existsSync(PmdRunner.class) 验证;简化 getExtensionRoot 回退逻辑 | 无 | src/adapters/pmd.ts | deepseek-v4-flash | +| 2026-07-19 14:33 | ① 用户提出 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 AI 审查 JSON 解析失败:repairJsonEscapes 漏了 `:` 导致 key 结束 `"` 被误加 `\`;保留 prompt 转义指令,预处理增加 `/\\"/g` → `"` 处理过度转义 | 无 | src/ai/engine.ts | deepseek-v4-flash | +| 2026-07-19 14:56 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | ESLintAdapter 集成 eslint:recommended + @typescript-eslint/recommended 作为内置规则集;typescript-eslint 从 devDependencies 移至 dependencies | 方案 1(只改项目 eslint.config.mjs)被否;方案 2(适配器兜底自定义规则集)用户质疑"谁定义的推荐"→改为官方推荐规则集 | src/adapters/eslint.ts package.json | deepseek-v4-flash | +| 2026-07-19 21:50 | ① 用户提出 → ⑤ 编码实现 → ⑥ 审查验证 | Bug fix: JSP 中 `