Files
Claude-Code-Workflow/.codex/skills/issue-discover/phases/04-quick-execute.md
catlog22 e44a97e812 feat: update empty state messages and hints in English and Chinese locales
refactor: rename variables for clarity in ReviewSessionPage and SessionsPage

fix: update version check logic in SettingsPage

chore: remove unused imports in TeamPage and session-detail components

fix: enhance error handling in MCP server

fix: apply default mode in edit-file tool handler

chore: remove tsbuildinfo file

docs: add Quick Plan & Execute phase documentation for issue discovery

chore: clean up ping output file
2026-02-12 23:15:48 +08:00

242 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase 4: Quick Plan & Execute
> 来源: 分析会话 `ANL-issue-discover规划执行能力-2026-02-11`
## Overview
直接将高置信度 discovery findings 转换为 `.task/*.json` 并内联执行。
跳过 issue 注册和完整规划流程,适用于明确可修复的问题。
**Core workflow**: Load Findings → Filter → Convert to Tasks → Pre-Execution → User Confirmation → Execute → Finalize
**Trigger**: Phase 2/3 完成后,用户选择 "Quick Plan & Execute"
**Output Directory**: 继承 discovery session 的 `{outputDir}`
**Filter**: `confidence ≥ 0.7 AND priority ∈ {critical, high}`
## Prerequisites
- Phase 2 (Discover) 或 Phase 3 (Discover by Prompt) 已完成
- `{outputDir}` 下存在 discovery 输出 (perspectives/*.json 或 discovery-issues.jsonl)
## Auto Mode
When `--yes` or `-y`: 自动过滤 → 自动生成任务 → 自动确认执行 → 失败自动跳过 → 自动 Done。
## Execution Steps
### Step 4.1: Load & Filter Findings
**加载优先级** (按顺序尝试):
```
1. perspectives/*.json — Phase 2 多视角发现 (每个文件含 findings[])
2. discovery-issues.jsonl — Phase 2/3 聚合输出 (每行一个 JSON finding)
3. iterations/*.json — Phase 3 迭代输出 (每个文件含 findings[])
→ 如果全部为空: 报错 "No discoveries found. Run discover first." 并退出
```
**过滤规则**:
```
executableFindings = allFindings.filter(f =>
(f.confidence || 0) >= 0.7 &&
['critical', 'high'].includes(f.priority)
)
```
- 如果 0 个可执行 findings → 提示 "No executable findings (all below threshold)",建议用户走 "Export to Issues" 路径
- 如果超过 10 个 findings → ASK_USER 确认是否全部执行或选择子集 (Auto mode: 全部执行)
**同文件聚合**:
```
按 finding.file 聚合:
- 同文件 1 个 finding → 生成 1 个独立 task
- 同文件 2+ findings → 合并为 1 个 task (mergeFindingsToTask)
```
### Step 4.2: Generate .task/*.json
对每个 filtered finding (或 file group),生成 task-schema.json 格式的任务文件。
#### 单 Finding 转换 (convertFindingToTask)
```
Finding 字段 → Task-Schema 字段 → 转换逻辑
─────────────────────────────────────────────────────────────
id (dsc-bug-001-...) → id (TASK-001) → 重新编号: TASK-{sequential:3}
title → title → 直接使用
description+impact+rec → description → 拼接: "{description}\n\nImpact: {impact}\nRecommendation: {recommendation}"
(无) → depends_on → 默认 []
(推导) → convergence → 按 perspective/category 模板推导 (见下表)
suggested_issue.type → type → 映射: bug→fix, feature→feature, enhancement→enhancement, refactor→refactor, test→testing
priority → priority → 直接使用 (已匹配 enum)
file + line → files[] → [{path: file, action: "modify", changes: [recommendation], target: "line:{line}"}]
snippet + file:line → evidence[] → ["{file}:{line}", snippet]
recommendation → implementation[] → [recommendation]
(固定) → source → {tool: "issue-discover", session_id: discoveryId, original_id: finding.id}
```
**Type 映射**:
```
suggested_issue.type → task type:
bug → fix, feature → feature, enhancement → enhancement,
refactor → refactor, test → testing, docs → enhancement
perspective fallback (无 suggested_issue.type 时):
bug/security → fix, test → testing, quality/maintainability/best-practices → refactor,
performance/ux → enhancement
```
**Effort 推导**:
```
critical priority → large
high priority → medium
其他 → small
```
#### 合并 Finding 转换 (mergeFindingsToTask)
同文件 2+ findings 合并为一个 task:
```
1. 按 priority 排序: critical > high > medium > low
2. 取最高优先级 finding 的 priority 作为 task priority
3. 取最高优先级 finding 的 type 作为 task type
4. title: "Fix {findings.length} issues in {basename(file)}"
5. description: 按 finding 编号逐条列出 (### Finding N: title + description + impact + recommendation + line)
6. convergence.criteria: 每个 finding 独立生成 criterion
7. verification: 选择最严格的验证命令 (jest > eslint > tsc > Manual)
8. definition_of_done: "修复 {file} 中的 {N} 个问题: {categories.join(', ')}"
9. effort: 1个=原始, 2个=medium, 3+=large
10. source.original_id: findings.map(f => f.id).join(',')
```
#### Convergence 模板 (按 perspective/category 推导)
| Perspective | criteria 模板 | verification | definition_of_done |
|-------------|--------------|-------------|-------------------|
| **bug** | "修复 {file}:{line} 的 {category} 问题", "相关模块测试通过" | `npx tsc --noEmit` | "消除 {impact} 风险" |
| **security** | "修复 {file} 的 {category} 漏洞", "安全检查通过" | `npx eslint {file} --rule 'security/*'` | "消除 {impact} 安全风险" |
| **test** | "新增测试覆盖 {file}:{line} 场景", "新增测试通过" | `npx jest --testPathPattern={testFile}` | "提升 {file} 模块的测试覆盖" |
| **quality** | "重构 {file}:{line} 降低 {category}", "lint 检查通过" | `npx eslint {file}` | "改善代码 {category}" |
| **performance** | "优化 {file}:{line} 的 {category} 问题", "无性能回退" | `npx tsc --noEmit` | "改善 {impact} 的性能表现" |
| **maintainability** | "重构 {file}:{line} 改善 {category}", "构建通过" | `npx tsc --noEmit` | "降低模块间的 {category}" |
| **ux** | "改善 {file}:{line} 的 {category}", "界面测试验证" | `Manual: 检查 UI 行为` | "改善用户感知的 {category}" |
| **best-practices** | "修正 {file}:{line} 的 {category}", "lint 通过" | `npx eslint {file}` | "符合 {category} 最佳实践" |
**低置信度处理**: confidence < 0.8 的 findingsverification 前缀 `Manual: `
**输出**: 写入 `{outputDir}/.task/TASK-{seq}.json`,验证 convergence 非空且非 vague。
### Step 4.3: Pre-Execution Analysis
> Reference: analyze-with-file/EXECUTE.md Step 2-3
复用 EXECUTE.md 的 Pre-Execution 逻辑:
1. **依赖检测**: 检查 `depends_on` 引用是否存在
2. **循环检测**: 无环 → 拓扑排序确定执行顺序
3. **文件冲突分析**: 检查多个 tasks 是否修改同一文件 (同文件已聚合,此处检测跨 task 冲突)
4. **生成 execution.md**: 任务列表、执行顺序、冲突报告
5. **生成 execution-events.md**: 空事件日志,后续记录执行过程
### Step 4.4: User Confirmation
展示任务概要:
```
Quick Execute Summary:
- Total findings: {allFindings.length}
- Executable (filtered): {executableFindings.length}
- Tasks generated: {tasks.length}
- File conflicts: {conflicts.length}
```
ASK_USER:
```javascript
ASK_USER([{
id: "confirm_execute",
type: "select",
prompt: `${tasks.length} tasks ready. Start execution?`,
options: [
{ label: "Start Execution", description: "Execute all tasks" },
{ label: "Adjust Filter", description: "Change confidence/priority threshold" },
{ label: "Cancel", description: "Skip execution, return to post-phase options" }
]
}]);
// Auto mode: Start Execution
```
- "Adjust Filter" → 重新 ASK_USER 输入 confidence 和 priority 阈值,返回 Step 4.1
- "Cancel" → 退出 Phase 4
### Step 4.5: Direct Inline Execution
> Reference: analyze-with-file/EXECUTE.md Step 5
逐任务执行 (按拓扑排序):
```
for each task in sortedTasks:
1. Read target file(s)
2. Analyze current state vs task.description
3. Apply changes (Edit/Write)
4. Verify convergence:
- Execute task.convergence.verification command
- Check criteria fulfillment
5. Record event to execution-events.md:
- TASK_START → TASK_COMPLETE / TASK_FAILED
6. Update .task/TASK-{id}.json _execution status
7. If failed:
- Auto mode: Skip & Continue
- Interactive: ASK_USER → Retry / Skip / Abort
```
**可选 auto-commit**: 每个成功 task 后 `git add {files} && git commit -m "fix: {task.title}"`
### Step 4.6: Finalize
> Reference: analyze-with-file/EXECUTE.md Step 6-7
1. **更新 execution.md**: 执行统计 (成功/失败/跳过)
2. **更新 .task/*.json**: `_execution.status` = completed/failed/skipped
3. **Post-Execute 选项**:
```javascript
// 计算未执行 findings
const remainingFindings = allFindings.filter(f => !executedFindingIds.has(f.id))
ASK_USER([{
id: "post_quick_execute",
type: "select",
prompt: `Quick Execute: ${completedCount}/${tasks.length} succeeded. ${remainingFindings.length} findings not executed.`,
options: [
{ label: "Retry Failed", description: `Re-execute ${failedCount} failed tasks` },
{ label: "Export Remaining", description: `Export ${remainingFindings.length} remaining findings to issues` },
{ label: "View Events", description: "Display execution-events.md" },
{ label: "Done", description: "End workflow" }
]
}]);
// Auto mode: Done
```
**"Export Remaining" 逻辑**: 将未执行的 findings 通过现有 Phase 2/3 的 "Export to Issues" 流程注册为 issues进入 issue-resolve 完整管道。
## Edge Cases
| 边界情况 | 处理策略 |
|---------|---------|
| 0 个可执行 findings | 提示 "No executable findings",建议 Export to Issues |
| 只有 1 个 finding | 正常生成 1 个 TASK-001.json简化确认对话 |
| 超过 10 个 findings | ASK_USER 确认全部执行或选择子集 |
| finding 缺少 recommendation | criteria 退化为 "Review and fix {category} in {file}:{line}" |
| finding 缺少 confidence | 默认 confidence=0.5,不满足过滤阈值 → 排除 |
| discovery 输出不存在 | 报错 "No discoveries found. Run discover first." |
| .task/ 目录已存在 | ASK_USER 追加 (TASK-{max+1}) 或覆盖 |
| 执行中文件被外部修改 | convergence verification 检测到差异,标记为 FAIL |
| 所有 tasks 执行失败 | 建议 "Export to Issues → issue-resolve" 完整路径 |
| finding 来自不同 perspective 但同文件 | 仍合并为一个 taskconvergence.criteria 保留各自标准 |