# 4-30 VSCode Explorer F2 Inline Rename v1

> 状态：done
> 创建时间：2026-05-15
> 所属主线：04-tree-domain / VSCode Explorer 文件树与垃圾箱闭环
> 来源：`design/10-review/07-vscode-explorer-filetree-trash-gap-review.md` 阶段 7

## 1. 目标

补齐 `wolai-frontend` 文件树 DOM host 的 F2 行内重命名入口，避免键盘路径只触发 reducer 事件但 UI 仍无 inline editor。

## 2. 已落地

- `tree-shell-dom-host.tsx` 为 filetree row 增加行内 `tree-rename-input`。
- F2 不再只转发 `beginRenameFocused`，而是直接进入当前 row 的 inline rename 状态。
- Enter / blur 提交，Escape 取消。
- 页面 / index row 提交到 `/api/tree/commands` 的 `rename`，并通过 `onTreeMutation` 回写 `tree.node.renamed`。
- 普通 asset row 提交到 `/api/media/batch` 的 `rename`，并广播 `wolai:assets-changed`。
- F2 输入框已补行内 validation：空名、非法路径字符、同级重名会在 input 下方显示错误并阻断提交，不再依赖 alert。
- 普通附件重命名时，如果用户输入不带扩展名，会保留原附件扩展名后再提交，例如 `附件.pdf` 输入 `附件新名` 会提交 `附件新名.pdf`。
- jsdom / 旧浏览器环境缺少 `CSS.escape` 时使用本地 fallback，避免 F2 聚焦逻辑抛错。

## 3. 验证命令

```bash
cd /mnt/Data1T/mnote/wolai-frontend
pnpm test src/components/sidebar/tree-shell-host.test.tsx
```

结果：1 个测试文件通过，10 项测试通过；新增测试覆盖 F2 进入 inline input、提交 `tree.node.rename`、空名 / 非法字符 / 同级重名行内阻断，以及附件扩展名保留。

## 4. 待补

- 2026-05-15 已补 3000 主入口真实浏览器 smoke：`MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task430-vscode-explorer-stage7-smoke.js`。
- `task430` 覆盖页面 filetree row F2 inline rename：请求 `/api/tree/commands action=rename`，Convex 标题更新，无需刷新可见。
- `task430` 覆盖普通附件 row F2 inline rename：请求 `/api/media/batch action=rename`，Convex `media_assets.file_name` 更新，无需刷新可见。
- 3000 Rust SSR 主壳已补 F2 inline rename；页面树 fallback 中仍保留 prompt 式重命名，按当前口径不属于 filetree F2 小阶段完成条件。
- 2026-05-15 二次补强：本次只补 `wolai-frontend` DOM host 的行内 validation；Rust SSR srcdoc 路径如继续作为 3000 主入口，需要在后续 smoke 中补同等级 validation parity。
