feat: AI 修复链路扩展 + 修复预览两步确认 + 自定义规则/AI 审查条目支持 AI 修复

- AI 修复:无原生 fix 的 linter 条目走 AI 修复(aiFixEngine/fixPrompt,AI 重检收敛),自定义规则与 AI 审查条目新增 AI 修复按钮(customFixEngine),自定义规则条目展开显示 AI 建议(suggestion 字段)

- 修复预览:面板触发修复先用内置 diff 预览,面板内「应用/取消」两步确认后才写入(fixPreview/fixPending,单条与分 tab 批量均支持)

- 修复面板交互:linter/custom/ai 分 tab「全部修复」、已修复+撤销、pending 按钮状态同步

- bug 修复:修复按钮失败后卡  不恢复;custom/ai 修复不稳定(空修复重试、AI 重检收敛判定放宽、降级接受最后一次有效修复)

- 移除 AI codeDiff 展示块
This commit is contained in:
范智鹏
2026-08-20 22:26:30 +08:00
parent 3d8119d9c9
commit d16d680f0f
20 changed files with 1655 additions and 85 deletions
+18 -15
View File
@@ -105,7 +105,8 @@ function buildCustomRuleSystemPrompt(): string {
return `あなたはコードルールレビュアーです。以下のカスタムルールに違反しているかどうかのみを評価してください。
意味を理解し、テキストの一致ではなく判断してください。
JSONのみを出力、形式:
{ "customRuleResults": [{ "ruleId": "ルールID", "line": 行番号, "severity": "error|warning|info", "message": "違反の説明" }] }
{ "customRuleResults": [{ "ruleId": "ルールID", "line": 行番号, "severity": "error|warning|info", "message": "違反の説明", "suggestion": "具体的な修正提案" }] }
"suggestion" は実行可能な修正提案を必ず含めてください。
ルールに違反していない場合は空の配列を返してください。
出力言語:ja`;
@@ -114,7 +115,8 @@ JSONのみを出力、形式:
return `You are a code rule reviewer. Only evaluate whether the following custom rules are violated.
Understand semantics, not text matching.
Output JSON only, format:
{ "customRuleResults": [{ "ruleId": "rule id", "line": line number, "severity": "error|warning|info", "message": "violation description" }] }
{ "customRuleResults": [{ "ruleId": "rule id", "line": line number, "severity": "error|warning|info", "message": "violation description", "suggestion": "concrete fix suggestion" }] }
Always include a concrete actionable "suggestion" for each violation.
If no rules are violated, return an empty array.
Output language: en`;
@@ -122,7 +124,8 @@ Output language: en`;
return `你是代码规则审查员,只评估以下自定义规则是否被违反。
理解语义而非文本匹配。
仅输出 JSON,格式:
{ "customRuleResults": [{ "ruleId": "规则ID", "line": 行号, "severity": "error|warning|info", "message": "触发描述" }] }
{ "customRuleResults": [{ "ruleId": "规则ID", "line": 行号, "severity": "error|warning|info", "message": "触发描述", "suggestion": "具体的修复建议" }] }
每条违规都必须给出可执行的 "suggestion" 修复建议。
如果没有违反任何规则,返回空数组。
输出语言:zh-CN`;
@@ -146,8 +149,8 @@ translatedDiagnosticsの要件:
JSONのみを出力。文字列内の二重引用符は \\" でエスケープしてください。
形式:
{
"translatedDiagnostics": [{ "originalRuleId": "元のID", "translatedMessage": "翻訳メッセージ", "translatedSuggestion": "提案", "codeDiff": "任意" }],
"findings": [{ "ruleId": "kebab-case", "severity": "error|warning|info", "category": "bug|performance|security|style|design", "title": "タイトル", "description": "説明", "suggestion": "提案", "codeDiff": "任意", "line": 行番号 }]
"translatedDiagnostics": [{ "originalRuleId": "元のID", "translatedMessage": "翻訳メッセージ", "translatedSuggestion": "提案" }],
"findings": [{ "ruleId": "kebab-case", "severity": "error|warning|info", "category": "bug|performance|security|style|design", "title": "タイトル", "description": "説明", "suggestion": "提案", "line": 行番号 }]
}
出力言語:ja`;
@@ -168,8 +171,8 @@ translatedDiagnostics requirements:
Output JSON only. Double quotes in strings must be escaped with \\".
Format:
{
"translatedDiagnostics": [{ "originalRuleId": "original id", "translatedMessage": "translated message", "translatedSuggestion": "suggestion", "codeDiff": "optional" }],
"findings": [{ "ruleId": "kebab-case", "severity": "error|warning|info", "category": "bug|performance|security|style|design", "title": "title", "description": "description", "suggestion": "suggestion", "codeDiff": "optional", "line": line number }]
"translatedDiagnostics": [{ "originalRuleId": "original id", "translatedMessage": "translated message", "translatedSuggestion": "suggestion" }],
"findings": [{ "ruleId": "kebab-case", "severity": "error|warning|info", "category": "bug|performance|security|style|design", "title": "title", "description": "description", "suggestion": "suggestion", "line": line number }]
}
Output language: en`;
@@ -189,8 +192,8 @@ translatedDiagnostics 要求:
仅输出 JSON,字符串中的双引号必须用 \\" 转义。
格式:
{
"translatedDiagnostics": [{ "originalRuleId": "原始ID", "translatedMessage": "翻译", "translatedSuggestion": "建议", "codeDiff": "可选" }],
"findings": [{ "ruleId": "kebab-case", "severity": "error|warning|info", "category": "bug|performance|security|style|design", "title": "标题", "description": "描述", "suggestion": "建议", "codeDiff": "可选", "line": 行号 }]
"translatedDiagnostics": [{ "originalRuleId": "原始ID", "translatedMessage": "翻译", "translatedSuggestion": "建议" }],
"findings": [{ "ruleId": "kebab-case", "severity": "error|warning|info", "category": "bug|performance|security|style|design", "title": "标题", "description": "描述", "suggestion": "建议", "line": 行号 }]
}
输出语言:zh-CN`;
@@ -426,7 +429,8 @@ Report violations in "customRuleResults".\n\n`
"ruleId": "original rule id",
"line": line_number,
"severity": "error|warning|info",
"message": "violation description"
"message": "violation description",
"suggestion": "concrete fix suggestion"
}
],\n`
: '';
@@ -463,7 +467,6 @@ ${ruleOutput} "findings": [
"title": "issue title",
"description": "detailed description",
"suggestion": "fix suggestion",
"codeDiff": "optional fix diff",
"line": line_number,
"path": "trigger path description, e.g. if(order==null) -> NPE on .getId()"
}
@@ -487,7 +490,8 @@ function buildMethodSystemPromptZh(hasRules: boolean): string {
"ruleId": "原始规则 ID",
"line": 行号,
"severity": "error|warning|info",
"message": "违规描述"
"message": "违规描述",
"suggestion": "具体的修复建议"
}
],\n`
: '';
@@ -524,7 +528,6 @@ ${ruleOutput} "findings": [
"title": "问题标题",
"description": "详细描述",
"suggestion": "修复建议",
"codeDiff": "可选的修复 diff",
"line": 行号,
"path": "触发路径描述,如 if(order==null) -> NPE on .getId()"
}
@@ -548,7 +551,8 @@ function buildMethodSystemPromptJa(hasRules: boolean): string {
"ruleId": "元のルールID",
"line": 行番号,
"severity": "error|warning|info",
"message": "違反の説明"
"message": "違反の説明",
"suggestion": "具体的な修正提案"
}
],\n`
: '';
@@ -585,7 +589,6 @@ ${ruleOutput} "findings": [
"title": "問題のタイトル",
"description": "詳細な説明",
"suggestion": "修正提案",
"codeDiff": "オプションの修正diff",
"line": 行番号,
"path": "トリガーパス説明、例: if(order==null) -> .getId() で NPE"
}