优化: 待审查 CR-260619-16 ToolCard 拆分审查回填(✅ PASS)
6 维度全过:逻辑等价 + 8 渲染分支完整 + 接口契约零变更 + composable 抽离 + 瘦身 374 + 行为等价。 CSS class 0 丢失(sort -u + comm 核验)。 ⚪ WATCH:7 diff class 重复(scoped 不跨组件,等价非冲突,后续全局 DRY 低优先)。 清理审查 agent 遗留重复登记块。无 🔴/🟡 阻塞项。
This commit is contained in:
27
docs/待审查.md
27
docs/待审查.md
@@ -1113,6 +1113,33 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### CR-260619-16 REFACTOR-260619-04 ToolCard.vue 拆分(1167→374 行·commit 74f3860) — ✅ 已审(PASS·⚪1)
|
||||||
|
|
||||||
|
- **结论(2026-06-19·独立 grep/read 核验 commit 74f3860)**: ✅ **PASS** — 🔴0 🟡0 ⚪1
|
||||||
|
- **验证**: vue-tsc --noEmit EXIT 0 / git show 74f3860^:ToolCard.vue(拆分前 1167 行)与 ToolResultBody.vue 8 分支逐节点对比 / CSS class 集合 diff(原 1167 行 ToolCard 全部 .ai-tool-* 类 0 丢失)。
|
||||||
|
|
||||||
|
**6 维度逐项核验**:
|
||||||
|
|
||||||
|
| # | 维度 | 判定 |
|
||||||
|
|---|------|------|
|
||||||
|
| 1 | 逻辑等价 | ✅ isFailed 在 ToolCard(卡片级 border/dot/sub)与 ToolResultBody(结果级 banner/result-failed)各持 computed,源逻辑一字相同(status!=='completed'→false / run_command exit_code / raw 正则 /^(执行失败\|Error:\|Failed:)/m);status watch 拆分等价——ToolResultBody 仅在 status==='completed' 挂载(:74 v-if),其 immediate watch(:206-211)初始化 cmdOutputExpanded/httpBodyExpanded=isToolFailure(tc) 语义与原合并 watch(completed 分支)等价;ToolCard watch(:194-199)仅留 approving 复位,immediate 初始非 pending_approval 时 approving=false/timer=null 无副作用 |
|
||||||
|
| 2 | 8 渲染分支完整 | ✅ ToolResultBody v-if/v-else-if 链顺序与原逐字对齐:read_file(6)/list_directory(21)/search_files(44)/write_file(61)/patch_file(71)/run_command(85)/http_request(103)/generic(125)。**关键**:run_command 条件无 `&& parsed`(原 :152 同无,因用 argString 取 command 不依赖 parsed)与其他 7 分支带 parsed 形成与原一致的条件错位;各分支内部文案/SVG/class 绑定逐节点等价 |
|
||||||
|
| 3 | 接口契约不变 | ✅ ToolCard props(tc/isExpanded/isContentExpanded)+ emits(toggle/expand-content/approve)逐字保留;唯一调用方 ToolCardList.vue:33-43 绑定零改动;MessageList/AiChat 经 ToolCardList 间接消费不直接引 ToolCard(grep 印证仅 ToolCardList:51 import);expand-content 冒泡链 ToolResultBody→ToolCard(:77 `(id)=>emit('expand-content',id)`)→ToolCardList→父级等价 |
|
||||||
|
| 4 | composable 抽离 | ✅ parseDiffLines(useToolCardRender:32-45)纯函数复现原内联逻辑(空行过滤 + +/-/ctx 分类 + maxLines 截断追加「…」ctx 占位);useToolCardHeader 6 函数(projectNameById/taskNameById/displayArgValue/toolDisplayName/argsEntries/httpHost)+ 2 常量表(PROJECT_ID_TOOL_ARG/TASK_ID_TOOL_ARG)与原 :441-557 逐字等价(getTc() 闭包替代 props.tc,taskNameById 形参 t→tk 纯命名差异);6 个 import 全用 |
|
||||||
|
| 5 | ToolCard 瘦身 | ✅ 374 行(<400 达标)。保留:容器+头部(:10-22)+Running 骨架(:28-32)+审批区(参数/diff 预览/按钮 :35-63)+rejected(:66-69)+ConfirmDialog(:82-87)+超时 toast(:90-92)+状态机(approving timer + onApprove + HIGH_RISK 白名单 + watch 复位 + onBeforeUnmount) |
|
||||||
|
| 6 | 行为等价 | ✅ diffLines(ToolCard:230)用 parseDiffLines(props.tc.diff) 无 maxLines(write_file 审批 diff,与原 :400-410 等价);resultDiffLines(ToolResultBody:202)用 parseDiffLines(parsed.value?.diff, 120)(patch_file 结果 diff,与原 :418-433 MAX_DIFF_LINES=120 等价)——两路径数据源/截断互不干扰;scoped style 迁移:原 .ai-tool-* 全部类集合 diff **0 丢失** |
|
||||||
|
|
||||||
|
**主代核查·审查防污染印证**:
|
||||||
|
- 独立 git show 74f3860^ 取拆分前 ToolCard.vue 全文逐节点对比,不信 commit message 声明。
|
||||||
|
- CSS class 集合 diff:原 ToolCard.vue 全部 .ai-tool-* 类经 sort -u 后与 [新 ToolCard ∪ 新 ToolResultBody] 集合做 comm -23 → **空集**(0 丢失)。
|
||||||
|
- run_command 条件无 `&& parsed` 这处「条件错位」最易在拆分时被误改为统一加 parsed,独立核验 :85-86 与原 :151-152 逐字一致未动。
|
||||||
|
- vue-tsc EXIT 0 独立复跑通过(主代已核,本次复验一致)。
|
||||||
|
|
||||||
|
- **⚪ WATCH-1**: 7 个 diff 相关 class(approval-diff/approval-reason/diff-line/diff-line--add/del/ctx/diff-pre)在 ToolCard 与 ToolResultBody **重复定义**(因 scoped 样式不跨组件,两组件各自渲染 diff 预览需各持一份)。定义内容逐字等价(仅格式差异),非冲突非回归,但后续若调 diff 视觉需同步两处(可考虑抽全局非 scoped 样式 DRY,低优先)。
|
||||||
|
- **待修项回流 todo**: **无** 🔴/🟡 项
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 已审归档
|
## 已审归档
|
||||||
|
|
||||||
> 已审 CR 段迁独立文件: [待审查归档/2026-06.md](./07-项目管理/待审查归档/2026-06.md)
|
> 已审 CR 段迁独立文件: [待审查归档/2026-06.md](./07-项目管理/待审查归档/2026-06.md)
|
||||||
|
|||||||
Reference in New Issue
Block a user