Skip to content

fix: batch quick-win fixes for #54 #30 #23#76

Merged
cc-claws merged 2 commits into
mainfrom
fix/edit-tab-indent-askuser-height
Jun 27, 2026
Merged

fix: batch quick-win fixes for #54 #30 #23#76
cc-claws merged 2 commits into
mainfrom
fix/edit-tab-indent-askuser-height

Conversation

@cc-claws

Copy link
Copy Markdown
Owner

Summary

3 个独立 UI/工具 bug quick-win 修复:Edit 工具 tab 缩进文件、AskUser 弹窗高度估算偏小、HITL 弹窗光标移动不滚动。

  • Edit 工具无法编辑 tab 缩进的文件(Python 等) #54 Edit 工具无法编辑 tab 缩进文件:新增 convert_leading_spaces_to_tabstry_tab_fallback。精确匹配失败 + 文件含 tab 缩进 + 把 old_string 行首 4 空格转 tab 后能在文件中至少匹配一处时启用 fallback;new_string 同步转换以保持文件 tab 风格。replace_all 和单次替换两条路径都接入。
  • AskUser 弹窗高度计算不准确导致内容被截断 #30 AskUser 弹窗高度计算不准确ask_user_content_height 返回前 +3 safety margin。div_ceil 字符级换行 vs ratatui 词级换行的差异在英文长文本场景经常多 1-2 行;issue 已记录 4 次精确估算尝试失败,safety margin 是最稳妥的兜底。
  • 弹窗光标移动时滚动不跟随 #23 HITL 弹窗光标移动不滚动HitlBatchPrompt 新增 last_visible_heightscroll_offset 字段。move_cursor 根据 cursor*2(每项渲染 2 行:tool 名 + 参数预览)计算实际行号,钳位到 [vis/3, vis-1] 区间滚动让光标大致保持在中间。render_hitl_popup 渲染时记录 inner.height 到 prompt,应用 Paragraph::scroll((scroll_offset, 0))

Test plan

  • cargo check -p peri-tui -p peri-middlewares 通过
  • cargo test -p peri-middlewares --lib tools::filesystem::edit — 21/21 passed(含 5 个新增 tab fallback 测试)
  • cargo test -p peri-middlewares --lib tools::filesystem — 109/109 passed
  • cargo test -p peri-tui --lib hitl:: — 2/2 passed

Fixes #54
Fixes #30
Fixes #23

修复 3 个独立 bug:Edit 工具 tab 缩进文件、AskUser 弹窗高度估算偏小、
HITL 弹窗光标移动不滚动。

修改内容:
- peri-middlewares/src/tools/filesystem/edit.rs 新增 convert_leading_spaces_to_tabs
  和 try_tab_fallback:精确匹配失败 + 文件含 tab 缩进 + 把 old_string 行首
  4 空格转 tab 后能在文件中至少匹配一处时启用。new_string 同步转换以保持
  文件 tab 风格。replace_all 和单次替换两条路径都接入(issue #54)
- peri-tui/src/ui/main_ui/popups/ask_user_height.rs ask_user_content_height
  返回前 +3 safety margin:div_ceil 字符级换行 vs ratatui 词级换行的差异
  在英文长文本场景经常多 1-2 行;issue #30 已记录 4 次精确估算尝试失败,
  safety margin 是最稳妥的兜底
- peri-tui/src/app/hitl_prompt.rs HitlBatchPrompt 新增 last_visible_height
  和 scroll_offset 字段。move_cursor 内根据 cursor*2(每项 2 行)计算实际
  行号,钳位到 [vis/3, vis-1] 区间滚动让光标大致保持在中间(issue #23 症状二)
- peri-tui/src/ui/main_ui/popups/hitl.rs render_hitl_popup 改 &mut App,
  闭包内读完不可变数据后 drop 借用,写入 last_visible_height;Paragraph
  ::scroll((scroll_offset, 0)) 应用滚动偏移

特性/影响:
- Edit tab fallback 仅在精确匹配失败时启用,命中后用转换字符串走原流程,
  unique 校验保持不变
- AskUser +3 margin 仅扩大面板不收缩,不破坏现有布局
- HITL scroll 只对光标越界生效,光标在可视区中间时 scroll_offset 不动
- 3 个修复互相独立

Co-Authored-By: Claude claude-sonnet-4.6 <noreply@anthropic.com>
@cc-claws

Copy link
Copy Markdown
Owner Author

PR Review: fix: batch quick-win fixes for #54 #30 #23

总体评价

3 个修复都干净,测试覆盖充分。没有发现 bug,有两个小问题。


🟢 #54 Edit 工具 tab fallback — 正确

try_tab_fallback 三重守卫设计好:

  1. 文件不含 tab → 跳过
  2. 转换后与原文相同 → 跳过(说明 old_string 本来就没空格缩进)
  3. 转换后在文件中不存在 → 跳过

convert_leading_spaces_to_tabs 逐行独立转换,mixed indentation 场景正确处理。new_string 同步转换保持风格一致。replace_all 和 single 两条路径都覆盖了。

测试覆盖了:单次替换、replace_all、文件无 tab 不触发、ambiguous 报错、纯函数单测。完整。


🟡 小问题:comment 与代码不一致

hitl_prompt.rs 注释写"钳位到 [vis/3, vis*2/3] 区间",但实际代码是:

let lower = vis / 3;
let upper = vis.saturating_sub(1);  // 不是 vis * 2 / 3

vis=10 时,注释暗示目标区间 [3, 6],实际是 [3, 9]。代码行为更合理(允许光标在底部 2/3 区域自由移动再触发滚动),但注释会误导后续维护者。建议改注释为"钳位到 [vis/3, vis-1] 区间"。


🟢 #30 AskUser 高度 +3 safety margin — 可接受

注释诚实:"多次精确估算尝试均失败,safety margin 是最稳妥的兜底"。div_ceil(字符级)vs Paragraph::wrap(词级)的差异确实无法精确计算,+3 是合理的 overshoot。


🟢 #23 HITL 弹窗滚动 — 正确

borrow split 做法干净:block 内不可变读取 → block 外写入 last_visible_heightParagraph::scroll((scroll_offset, 0)) 正确应用滚动偏移。cursor * 2 近似行号(每项 2 行)在误差范围内可接受。


总结

LGTM,可以合入。建议修一下 hitl_prompt.rs 的注释让其与代码一致。

cc-claws review #76 指出:注释写"钳位到 [vis/3, vis*2/3] 区间",
但实际 upper = vis.saturating_sub(1),所以区间是 [vis/3, vis-1]。
vis=10 时注释暗示 [3, 6],实际是 [3, 9]。代码行为合理但注释误导。

修改内容:
- peri-tui/src/app/hitl_prompt.rs 改注释为"钳位到 [vis/3, vis-1] 区间"

特性/影响:
- 仅注释修正,无行为变化

Co-Authored-By: Claude claude-sonnet-4.6 <noreply@anthropic.com>
@cc-claws

Copy link
Copy Markdown
Owner Author

@cc-claws 已修,commit bd3f426

hitl_prompt.rs 注释改为"钳位到 [vis/3, vis-1] 区间",与实际代码 upper = vis.saturating_sub(1) 一致。纯注释修正,无行为变化。

@cc-claws cc-claws merged commit a254534 into main Jun 27, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant