feat: 方法级代码审查 + 模板导入/预览增强 + SQLFluff 方言 + AI 空响应报错修复

- 方法级审查:CodeLens 触发 + 单次 AI 调用(规则匹配 + 6 维度深度审查),新增 method-extractor / status-cache / codeLensProvider
- 模板导入:severity 保留原始值 + 占位 id、去重对照统一 known-rules、重复提示条双语翻译、箭头展开/折叠 UI、520 条静态规则补 zh/ja 翻译
- SQL:sql-lint 重命名 sqlfluff + sqlfluff.dialect 方言可配置 + 默认方言调整
- ESLint:v9 flat config 接线修复(overrideConfigFile)+ legacy 迁移提示
- AI:空响应 EmptyContentError + 重试一次 + max_tokens 截断专用报错
- JSP:整文件检查走 PMD JSP 规则集 + scriptlet 包装解析 + 行号映射
- 诊断按 severity + 行号排序
This commit is contained in:
范智鹏
2026-08-03 22:53:20 +08:00
parent 5848eaa82a
commit 247f19fd44
46 changed files with 6143 additions and 937 deletions
+19
View File
@@ -155,3 +155,22 @@
| 2026-07-30 22:38 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 | 实现模板导出/导入功能全链路 | 无 | src/rules/import-types.ts, src/rules/export-service.ts(新), src/rules/converters/template-converter.ts(新), src/rules/converters/dedup-prompt.ts(新), src/rules/import-service.ts, src/rules/import-preview.ts, src/views/setupView.ts, src/views/setupView.js, src/activation/commands.ts, package.json, src/i18n/messages.ts | deepseek-v4-pro |
| 2026-07-30 23:03 | ① 用户提出 → ⑤ 编码实现 | 导出按钮图标 📤→↓ 与 ➕添加 风格统一;复选框移至 field-hint 同行右对齐 | 图标迭代 📤→⬇→↓;复选框初版在 field-hint 下方独立一行,被要求移到提示文字右侧 | src/views/setupView.ts, src/i18n/messages.ts | deepseek-v4-pro |
| 2026-07-30 23:08 | ⑥ 审查验证 | 闭环校验模板文件:rowNumber 计算 bug 修复(先 filter 后 map 导致空行后索引偏移,改为先记行号再 filter | 无 | src/rules/converters/template-converter.ts | deepseek-v4-pro |
| 2026-07-31 19:43 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 模板导入预览中错误规则改为可编辑+可「添加」:错误卡片复用完整编辑表单(id/severity/description/message/languages/excludeLanguages),新增「添加」按钮——扩展端先格式校验(id/description/message 非空、severity 合法),再 id 冲突拦截(对照预览已有有效规则),随后单条 AI 去重(dedupSingleRule 复用 buildDedupOnlyPrompt,失败重试 1 次,仍失败降级 none);前端收 ruleAdded 消息后做 DOM 手术(去 data-error、换保留/注释按钮、移入 exact/overlap/none 分区、更新计数),确认写盘时 hasEdits 或 addedRules>0 即回传 editedRules 走 renderRulesToYaml 保证已添加规则不丢失;convertContentWithAI 增加 quiet 参数抑制去重失败 toast;分区容器加 data-section 属性、确认按钮改 JS 动态控制 | 初版用 JS 字符串拼接构造保留/注释按钮('...toggleKeep(\\'' + id ...),tsc 下编译后转义链断裂(browser 端 SyntaxErrornode --check 验证),改为 createElement + addEventListener 闭包规避全部转义问题;错误卡片初版设计只读展示改为完整表单;renderSection 计数初版把 i18n 计数模板拼进 HTML 出错,改为 data-section-title 空 span 由 JS 填充 | docs\superpowers\specs\2026-07-31-import-error-rule-edit-design.md, src/rules/import-service.ts, src/rules/import-preview.ts, src/views/setupView.ts, src/i18n/messages.ts | deepseek-v4-flash |
| 2026-07-31 20:07 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 导入预览错误规则报红从「整卡红边+半透明+顶部 issues 横幅」改为字段级:整卡恢复普通样式(仅保留错误徽标);按 validationIssues.field 把红框+原因文字定位到对应输入控件(id/severity/description/message,字段下方 .field-error-msg);删除顶部 issues 横幅;validateRule 改返回 {field,message}addError 消息新增 field 字段(id 冲突→field:'id');document 委托监听 input/change 实时清除红框(id/description/message 非空、severity change 即清);moveCardToSection 时 clearCardFieldErrors 清理全部字段错误;新增 CSS .field-error-input/.field-error-msg/.id-row flex-wrap | 字段定位 wrap 初版用 el.closest('.edit-field')id 输入框所在 .id-row 匹配不到导致 id 错误提示不显示,改为 closest('.edit-field, .id-row') 并给 .id-row 加 flex-wrap 让提示独占一行;初版测试断言预置了 field-error 类导致结果失真,重写 mock(支持后代选择器/逗号选择器/className setter/document.createElement)后 15 用例全绿 | docs\superpowers\specs\2026-07-31-import-field-error-design.md, src/rules/import-preview.ts | deepseek-v4-flash |
| 2026-07-31 21:37 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 | 编写方法级代码审查实施计划书:CodeLens 行内触发 + 单次 AI 调用合并规则匹配与 6 维度深度审查;后迭代回加自定义规则审核(补全 prompt builder 签名/命令处理器规则加载/结果合并/验收标准),再为 CodeLens 文案加 Code Purifier 品牌前缀 | 5 方案头脑风暴中 4 个被淘汰(全文件扫描/Git diff 触发/保存自动触发/命令面板选择);审查流程从「静态分析+自定义规则+AI」简化为「AI-only」后又回加自定义规则;MethodReviewResult 初版只有 findings 后加 customRuleResultsbuildMethodUserPrompt 签名漏 customRules 参数后补全;命令处理器初版未加载规则、mergeResults 传空 customRuleResults 后补全 loadActiveRules+filterForDocument;对比表输出结构从「findings only」修正为「customRuleResults + findings」;CodeLens 文案从无品牌改为加 Code Purifier 前缀 | docs\superpowers\specs\2026-07-31-method-level-review-plan.md | Trae 内部模型 |
| 2026-07-31 22:05 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 方法级代码审查功能编码实现:新增 method-extractorSymbol API+正则回退+调用链粗匹配)/status-cache/CodeLensProviderengine.ts 新增 runMethodReview 单次 AI 调用(规则匹配+6 维度深度审查,en/zh/ja 三分支 prompt);commands.ts 新增 codeReviewer.reviewMethod(含右键光标 fallback、方法相对行号→文件行号偏移);extension.ts 注册 CodeLens+状态缓存;webview AI 标签页渲染 pathi18n 新增 6 keypackage.json 命令/配置/右键菜单 | 类型兼容方案多轮迭代:初按设计书 MethodFinding[] 直接传 aiFindings 编译失败 → 讨论「不混入全文件审查」后定案加宽 AIFinding.category 联合为 8 值 + MethodFinding extends AIFinding6 维度收窄)+ path 可选;面板展示迭代:先按用户要求方案 A 独立 methodReview 标签页,用户改口「不多加标签页,还是显示在 ai 审核里面」,退回 AI 标签页内渲染;runMethodReview 初版照设计书写 result.status==='fulfilled'chat 实际返回 Promise<string>)→ 改为 try/catchCodeLens 构造器初版传 symbol.range.startPosition)→ 改为单行 Range;自审查发现 AI 返回方法内相对行号未偏移导致面板跳错行 → customRuleResults 偏移 +methodLine、aiFindings 偏移 +methodLine-1(对齐 mergeResults 与面板各自的换算);method-extractor 零宽范围回退路径取文本为空 → 统一 expandToMethodBody 后用完整范围算调用链 | src/scope/method-extractor.ts(新), src/scope/status-cache.ts(新), src/views/codeLensProvider.ts(新), src/ai/schema.ts, src/ai/engine.ts, src/activation/commands.ts, src/extension.ts, src/panel/webview.ts, src/i18n/messages.ts, package.json | deepseek-v4-flash |
| 2026-07-31 23:02 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 模板导入(Excel)两处体验修复:①错误规则卡片的 severity 不再误导性显示降级后的 warning——ImportableRule 新增 originalSeverity/idPlaceholderparseTemplate 保留降级前原始 severity、空 id 行生成唯一占位 idrule-<行号>)并打 id 缺失 issue、过滤条件改为「id/description/message 三者全空才丢弃」(原为空 id 即丢弃);预览卡片 severity 标签改红色错误样式显示原始值或「severity 缺失」,select 增加禁用占位项「请选择 severity」迫使用户显式选择;handleAddErrorRule 增加占位 id 未改动即拒绝的守卫(杜绝 rule-N 泛化 id 与降级 warning 静默落盘);severity 非法提示文案改用 i18nmessages.ts 新增 import.idMissing/severityMissing/severitySelectHint 三语 key | 临时验证测试 src/test/template-parse-verify.test.tsXLSX 内存构造 fixture 断言占位 id/全空丢弃/原始 severity)验证通过后删除;模板路径决策在「错误区手动补 id(推荐)」与「自动占位直接导入」间二选一,用户选前者;测试运行受既有 stylelint-config-recommended 无 exports main 环境问题阻碍(extension 激活失败),临时移开 adapter.test.ts + 清理 out 陈旧产物后 54 用例全绿,adapter 问题与本次改动无关 | src/rules/import-types.ts, src/rules/converters/template-converter.ts, src/rules/import-preview.ts, src/i18n/messages.ts | deepseek-v4-flash |
| 2026-07-31 23:30 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 统一所有导入路径的去重对照源:新建共享模块 known-rules.tsbuildKnownRulesSection,按 linter 分组渲染 static-rules.json 的 520 条内置静态规则 + custom/ 前缀自定义规则,三语文案);prompt-builder.ts 删除本地 buildDedupPromptSection 及其 4 个 label 字段,buildSystemPrompt 改调共享函数(AI 转换路径行为不变);dedup-prompt.ts 的 buildDedupOnlyPrompt 改调共享函数补上静态规则区块(修复模板批量去重与预览单条添加去重仅对照自定义规则的缺口),删除 existingTitle/noExisting 字段,三语 taskLines 措辞改为「对照内置静态分析规则与已导入的自定义规则」;新增测试 src/test/dedup-prompt.test.ts(断言含 pmd/AvoidDeeplyNestedIfStmts、eslint/no-unused-vars、sql-lint/AL01 与 custom/ 条目) | 三路径对比后确认②模板批量与③单条添加本就是同一 buildDedupOnlyPrompt,①AI 转换因转换+去重融合无法复用纯去重提示词,仅「已知规则清单」渲染可抽公共件;测试断言首次写成 !includes('custom/') 被 taskLines 的 custom/my-rule 字样误触发,改为断言 '- custom/' 前缀;测试运行仍受既有 stylelint-config-recommended 激活失败阻碍,沿用移开 adapter.test.ts 方案,56 用例全绿 | src/rules/converters/known-rules.ts(新), src/rules/converters/prompt-builder.ts, src/rules/converters/dedup-prompt.ts, src/test/dedup-prompt.test.ts(新) | deepseek-v4-flash |
| 2026-07-31 23:57 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 导入预览展开区重复提示升级:展开后 id 下方不再只显示重复对象 id(与 id 行撞车),改为彩色提示条——exact 红底「完全重复」+ 与规则「{0}」完全重复 + description 具体信息 + 默认动作提示;overlap 橙底「部分重叠」+ 与规则「{0}」部分重叠 + description + 重叠原因;新增 resolveDupDescriptioncustom/<id> 从工作区 loadActiveRules 查、<linter>/<id> 从 static-rules.json 查,查不到省略该行),renderRuleCard 内构建;新增 .dup-banner/.dup-exact/.dup-overlap 等 CSSmessages.ts 新增 import.dupExactTitle/dupOverlapTitle/dupExactText/dupOverlapText/dupDescriptionLabel/dupExactHint 六条三语 key(重叠原因复用 import.overlapReason | 方案讨论中用户澄清问题不在折叠而在「展开后 id 下方展示不够直接、与 id 重复」→ 明确只改展开区这一块,头部徽章、分区标题、汇总条、moveCardToSection 单条添加路径均不改;resolveDupDescription 初版考虑在单条添加消息中透传 description,用户限定范围后放弃;测试运行仍受既有 stylelint-config-recommended 激活失败阻碍,沿用移开 adapter.test.ts 方案,56 用例全绿(含 I18n 三语完整校验) | src/rules/import-preview.ts, src/i18n/messages.ts | deepseek-v4-flash |
| 2026-08-01 00:53 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 统一导入预览折叠/展开箭头为标准惯例:卡片初始图标由「错误卡▲/正常卡▼」反直觉改为「展开▼/折叠▶」;toggleCard 展开设▼、折叠设▶;分区初始箭头 renderSection 由写死「▶」改为按 show 状态「展开▼/折叠▶」,修复正常分区默认展开时箭头与实际不符、且与错误分区初始「▼」约定矛盾的问题;错误分区保持▼,toggleSection 不变;全文件 7 处箭头统一为 折叠▶/展开▼ | 分析发现卡片用「折叠▼/展开▲」与分区用「折叠▶/展开▼」两套相反约定且卡片反直觉,用户确认按标准惯例(向右=可展开、向下=已展开)统一 | src/rules/import-preview.ts | deepseek-v4-flash |
| 2026-08-01 00:58 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 箭头加丝滑过渡:把「切换 ▶/▼ 字符」改为固定 ▼ 字形 + CSS transform rotate(-90deg/0deg) + transition 0.15s ease 旋转过渡;卡片与分区统一通过 expanded 类控制方向(默认折叠=向右,加 expanded 类=向下);toggleCard/toggleSection 由改 textContent 改为 card.classList / section-wrapper.classList 切换 expandedrenderRuleCard/renderSection/renderErrorSection 初始按状态带 expanded 类,箭头统一渲染 ▼;moveCardToSection 目标分区展开时补 expanded 类 | 直接切换字符无法过渡,需改字形+旋转方案;moveCardToSection 初版只设 display 未加 expanded 类导致移入卡片后分区箭头状态不符,补充 wrap.classList.add('expanded') | src/rules/import-preview.ts | deepseek-v4-flash |
| 2026-08-01 01:06 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 重复提示条 description 按界面语言附加翻译括号:static-rules.json 全部 520 条内置规则新增 descriptionZh/descriptionJa 字段(中文/日文翻译);import-preview.ts 的 resolveDupDescription 引入 getLanguage——zh-CN 时返回「英文 (中文)」、ja 时返回「英文 (日本語)」、en 时仅返回英文不加括号;自定义规则无翻译字段保持原样;新增 7 个翻译数据文件 scripts/translations/{eslint,ts-eslint,stylelint,pmd-1,pmd-2,pmd-jsp,sql-lint}.mjs 与合并脚本 scripts/add-static-translations.mjs520 条全部命中,missing 0) | 范围澄清:只改重复提示条(不涉卡片头部预览),翻译来源选 static-rules.json 内置字段;初稿合并后用 PowerShell 校验显示乱码「?」疑似编码损坏,经 Node latin1/utf8 双读确认文件实为完好 UTF-8PowerShell 5.1 控制台按 ANSI 读取显示所致),JSON.parse 通过、样例中文/日文正确;测试运行仍受既有 stylelint-config-recommended 激活失败阻碍,沿用移开 adapter.test.ts 方案,56 用例全绿 | src/rules/static-rules.json, src/rules/import-preview.ts, scripts/translations/eslint.mjs(新), scripts/translations/ts-eslint.mjs(新), scripts/translations/stylelint.mjs(新), scripts/translations/pmd-1.mjs(新), scripts/translations/pmd-2.mjs(新), scripts/translations/pmd-jsp.mjs(新), scripts/translations/sql-lint.mjs(新), scripts/add-static-translations.mjs(新) | deepseek-v4-flash |
| 2026-08-01 01:17 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复规则 id 为纯数字(如 123)的卡片无法展开:根因是 AI 去重重新输出 YAML 时把 `id: 123` 序列化为 `id: '123'`(带引号),parseSimpleYaml/parseYamlSimple 对标量值原样保留引号,导致 id 变成字面量 `'123'`,内联处理器 `toggleCard(''123'')` 等生成 JS 语法错误、点击失效;新增 stripQuotes 统一剥离标量前后匹配引号(import-service.ts 与 yaml-parser.ts 两处解析器);同时把 webview 内联事件处理器从「把 rule.id 拼进 JS 字符串」全部改为「传 this + 从卡片 data-ruleid 取 id」(toggleCard/syncId/toggleKeep/updateRule/addErrorRule/collectCardRule),彻底消除 id 含特殊字符破坏处理器的隐患;新增 2 个回归测试(id 带引号剥离、scalar 字段引号剥离) | 初判以为是 id 特殊字符破坏内联 onclick,用户澄清「文件 id 是 123,显示却带单引号」→ 定位到 YAML 标量引号未剥离的根因;内联处理器重构的 toggleKeep/updateRule/syncId 均改为从 el.closest('.rule-card').dataset.ruleid 取值;测试运行仍受既有 stylelint-config-recommended 激活失败阻碍,沿用移开 adapter.test.ts 方案,58 用例全绿 | src/rules/import-service.ts, src/rules/yaml-parser.ts, src/rules/import-preview.ts, src/test/import-dedup.test.ts | deepseek-v4-flash |
| 2026-08-02 21:44 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 ESLint v9 配置接线全瘫 bugresolveEslintConfig 三条路径全坏(eslintConfigPath/项目配置传 v9 已移除的 configFile 选项抛「Unknown options: configFile」;无配置只传 overrideConfig 时 v9 仍向上查找 eslint.config.js 找不到抛「Could not find config file」,内置规则从未生效)。改为判别联合 EslintConfigResult + v9 合法选项:eslintConfigPath 存在(fs.existsSync 校验+相对路径解析)→ overrideConfigFile;项目 eslint.config.*(新增 cjs/ts/mts/cts)→ overrideConfigFile;只有 legacy .eslintrc.* → 执行错误框提示迁移(adapter.eslintLegacyConfig 三语);无配置 → overrideConfigFile:true + 内置规则。同步设置面板:projectConfigFileName 改 eslint.config.js、getEslintTemplate 改 flat 格式(languageOptions 替代 env/root)、PROJECT_CONFIG_FILES 移除 .eslintrc.*、eslintGuide 与 package.json 描述更新。lint/compile 通过;临时目录三场景实测:flat 项目配置命中 no-var、legacy 报迁移提示、内置规则命中 no-var/eqeqeq/no-empty;全量测试套件 61 用例全绿(临时新增 src/test/eslint-adapter-verify.test.ts 3 用例覆盖内置兜底/legacy 报错/项目 flat 配置,验证后删除并还原 adapter.test.ts、extension.test.ts | 方案迭代:初版「configFile 存在性校验」被实测推翻(v9 已删 configFile 选项,报错是 Unknown options 而非 Could not find config file);「内置规则是否有效」经 18 条诊断实测确认规则本身没问题、纯接线 bug;legacy 处理用户先选 B(报错提示迁移)再在设置面板同步问题上确认 scope 扩大;flat 模板先考虑 module.exports 对象(legacy 风格)后改数组;setupView PROJECT_CONFIG_FILES 决策点 A(保留 legacy 展示)B(移除)用户选 B;验证脚本先因 PowerShell 引号嵌套失败改 base64 注入 | src/adapters/eslint.ts, src/views/setupView.ts, src/i18n/messages.ts, package.json | deepseek-v4-flash |
| 2026-08-02 22:04 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 AI 空响应被静默吞掉的问题:三个 provideropenai-compatible/claude/gemini)对空内容返回 `?? ''`parseJsonResponse('') 抛「响应中未找到 JSON」且原始响应为空、诊断信息全丢;连接测试只查不抛异常、掩盖问题。改动:base.ts 新增 EmptyContentError 标记类;三 provider 空内容(content 缺失/null/trim 空)抛 EmptyContentError 附诊断(openai-compatible 带 finish_reason/choices 数/error.messageclaude 带 stop_reasongemini 带 candidates 数/blockReason),消息用 adapter.emptyContent 三语包裹;engine.ts 新增 chatWithRetry(对 EmptyContentError 重试一次,仍空透传)并接入 runAIReview 双并行请求与 runMethodReviewparseJsonResponse 对空白串抛独立 engine.emptyResponsesetupView 连接测试校验返回内容非空否则抛 setup.emptyResponse。lint/compile 通过;新增正式测试 src/test/ai-empty-response.test.ts 5 用例(空串抛空响应提示/正常 JSON 解析/空内容重试一次/重试仍空透传 EmptyContentError/非空内容错误不重试)全绿,全量套件 63 用例通过(沿用移开 adapter/extension 测试文件 workaround,已还原)。另确认 fixer/import-service 两处 provider.chat 调用点均有 try/catchEmptyContentError 安全 | 方案讨论中确认用户实际配置模型 deepseek-v4-flash(非 DeepSeek 官方公开模型名 deepseek-chat/deepseek-reasoner,很可能是空响应上游根因,属配置问题非代码问题);测试初版第 4 用例用正则 /空内容\|empty content/ 断言但测试内直接 new EmptyContentError('finish_reason=length') 消息不匹配,改为 assert.rejects(..., EmptyContentError) 构造函数断言;重试范围最初考虑覆盖 fixer/import-service,用户批准方案未含,维持仅审查引擎 | src/ai/providers/base.ts, src/ai/providers/openai-compatible.ts, src/ai/providers/claude.ts, src/ai/providers/gemini.ts, src/ai/engine.ts, src/views/setupView.ts, src/i18n/messages.ts, src/test/ai-empty-response.test.ts(新) | deepseek-v4-flash |
| 2026-08-02 22:21 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | B 方案:AI 输出被 max_tokens 截断的专用报错。用户实测根因为 maxTokens(默认8192) 太小、模型被截断(finish_reason=length, choices=1, content 空,重试同果)。openai-compatible.ts 在空内容且 finish_reason==='length' 时抛专用 EmptyContentErroradapter.maxTokensTruncated 三语「AI 输出被 max_tokens 截断(当前 {0}),请调大设置 ai.maxTokens 或更换模型」(带当前 options.maxTokens 值),区别于通用空内容错误;其余分支不变。新增测试:ai-empty-response.test.ts 第 6 用例 mock global.fetch 返回 finish_reason=length + content null,断言抛 EmptyContentError 且消息含 max_tokens 与 8192。lint/compile 通过;全量套件 64 用例全绿(沿用移开 adapter/extension workaround,已还原) | 用户先手动调大 maxTokens 后确认根因是 token 太小,退回要求只做 B(代码报错更可操作),未选 C 自动加码重试;claude/gemini 的 stop_reason/max_tokens 等价处理未纳入 B 范围(仅 openai-compatible),留作潜在后续 | src/ai/providers/openai-compatible.ts, src/i18n/messages.ts, src/test/ai-empty-response.test.ts | deepseek-v4-flash |
| 2026-08-03 21:24 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 全量重命名 sql-lint → sqlfluff:适配器文件/类名/id、规则前缀 sql-lint:→sqlfluff:、config 读取键 sqlfluff.configFile、orchestrator 引用、setupView 面板元数据/settingsTarget/监听、package.json 配置键(linters.sql/plsql 默认值与枚举、sqlfluff.configFile、linter.sqlfluff.enabled)、static-rules.json 命名空间与 75 条规则 ID、dedup-prompt 测试断言、翻译脚本重命名 | 中间产物:无(插件未发布,无需旧配置迁移);测试沿用既有 stylelint-config-recommended 阻碍的移开 adapter.test.ts 方案,64 用例通过(1 个既有 extension 激活失败与本变更无关) | src/adapters/sqlfluff.ts(改名自 sql-lint.ts), src/config/linter.ts, src/orchestrator/orchestrator.ts, src/views/setupView.ts, package.json, src/rules/static-rules.json, src/test/dedup-prompt.test.ts, scripts/translations/sqlfluff.mjs(改名), scripts/add-static-translations.mjs | deepseek-v4-flash |
| 2026-08-03 21:51 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | SQL 方言可配置化:新增配置 sqlfluff.dialectenum 28 方言,空=自动);方言优先级改为「显式设置 > 全局/项目配置 > 语言映射」——仅显式设置时才传 --dialect,修复 CLI --dialect 无条件覆盖配置文件方言的 bugplsql 映射 postgres→oracle;内置配置常量 BUILTIN_SQLFLUFF_CONFIG 改为 buildBuiltinConfig(dialect) 动态生成(兜底时按语言映射注入方言);runSqlfluff dialect 参数改为可选;非法方言静默回退 | 中间产物:无;实证验证(sqlfluff 4.2.2):MySQL 反引号 SQL 用 config dialect=mysql 无 --dialect 解析通过,+--dialect postgres 产生 PRS 解析错误,证实配置方言生效且 CLI 覆盖配置;测试沿用移开 adapter.test.ts 方案 64 用例通过(1 个既有 extension 激活失败与本变更无关) | src/adapters/sqlfluff.ts, src/config/linter.ts, package.json | deepseek-v4-flash |
| 2026-08-03 22:11 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 默认方言调整:DIALECT_MAP sql 映射 ansi→mysqlplsql 保持 oracle),setupView 项目配置模板 dialect postgres→mysql;优先级不变(显式 sqlfluff.dialect > 全局/项目配置 > 语言映射兜底) | 中间产物:无;实证(sqlfluff 4.2.2):反引号 MySQL 脚本在适配器内置配置(dialect=mysql)下正常解析无 PRS(此前 ansi 会 PRS 失败),验证中途发现 PowerShell 转义将反引号变双引号导致的 PRS 误报(MySQL 双引号=字符串,非产品问题);测试沿用移开 adapter.test.ts 方案 64 用例通过(1 个既有 extension 激活失败与本变更无关) | src/adapters/sqlfluff.ts, src/views/setupView.ts | deepseek-v4-flash |
| 2026-08-03 22:18 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 JSP 适配器两处缺陷:(1) 整文件检查改用 PMD JSP 规则集(新增 pmd.ts checkJsp(),优先级 getPMDJspRulesetPath > 内置 pmd-jsp-ruleset.xml,此前该配置零使用导致整文件 files:[]);(2) 提取的 <% %> Java 片段裸语句无法被 PMD 按编译单元解析(ParseException)→ 按 scriptletKind 包装成 package jsp; class JspScriptlet{...} 再交 PMD,用 codeLineOffset 映射回原文行号并过滤合成包装噪音(NoPackage/AtLeastOneConstructor 等);jsp-extractor.ts 区分 5 种标签(注释/指令跳过、declaration/expression/statement 标记 kind);PmdRunner.java 新增第 3 参数指定 stdin 临时文件扩展名(jsp 用 .jsp,未保存 JSP 也可走 JSP 语言模块)并重编译 | 中间产物:无;实证(PMD 7.26.0):含违规 JSP 检出 JspEncoding/NoScriptlets + EmptyControlStatement/UnusedLocalVariable/UnusedPrivateField 等,行号正确映射、无合成噪音;stdin+.jsp 扩展名路径验证通过;测试沿用移开 adapter.test.ts 方案 64 用例通过(1 个既有 extension 激活失败与本变更无关) | src/jsp/jsp-extractor.ts, src/adapters/jsp.ts, src/adapters/pmd.ts, jars/pmd/PmdRunner.java(重编译 PmdRunner.class) | deepseek-v4-flash |
| 2026-08-03 22:42 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 诊断按严重度+行号排序:mergeResults 集中排序(error<warning<info<其他,同级按 range.start.line 升序,Node 22 稳定排序),linterDiagnostics/customRuleDiagnostics/aiFindings 三数组统一;翻译映射在排序前完成;fixableLinterIndices/fixableCustomIndices 基于排序后数组重算;新增 merger.test.ts 排序测试 | 中间产物:测试断言首次行号基准错误(customRuleDiagnostics range 为 line-1 0 基,断言误用 1 基)→ 修正为 error:1/info:8;测试沿用移开 adapter.test.ts 方案 65 用例通过(新增排序用例,1 个既有 extension 激活失败与本变更无关) | src/merger/merger.ts, src/test/merger.test.ts | deepseek-v4-flash |