fix(frontend): 修复文件管理器删除与上传稳定性

补齐文件管理器右键子菜单点击展开,新增拖拽上传目标确认,
并在上传完成后自动刷新当前可见目录

目录删除改为区分仅删空目录与强制递归删除,删除后自动回退
失效路径,避免文件树持续报 No such file

同步后端 sftp:rmdir 的 recursive 分支,并将关于页与版本检查
默认仓库链接切换到 Micah123321/nexus-terminal
This commit is contained in:
yinjianm
2026-03-26 03:48:50 +08:00
parent 1a326cc01f
commit cda7e0a018
32 changed files with 661 additions and 115 deletions
+9
View File
@@ -8,6 +8,12 @@
- 2026-03-25:继续微调 `/workspace` Workbench,新增默认“快捷指令”标签、调整三栏宽度到更接近 xterminal 参考图,并修复终端区域鼠标悬停时指针异常消失的问题。
### 修复
- **[frontend]**: 修复文件管理器右键子菜单点击无反应、拖拽上传目标不明确,以及目录删除后持续报 `No such file` 的稳定性问题 — by yinjianm
- 方案: [202603260324_file-manager-delete-upload-stability](archive/2026-03/202603260324_file-manager-delete-upload-stability/)
- **[backend]**: 为 `sftp:rmdir` 增加 `recursive` 分支,让“仅删空目录”和“强制递归删除”分别落到 SFTP 原生删除与 `rm -rf` 链路 — by yinjianm
- 方案: [202603260324_file-manager-delete-upload-stability](archive/2026-03/202603260324_file-manager-delete-upload-stability/)
- **[frontend]**: 修正新终端会话下文件树只保留当前路径链路的问题,改为先加载 `/` 根树再串行加载当前工作目录,确保 `/` 下同级目录可见 — by yinjianm
- 方案: [202603260310_file-manager-root-sibling-bootstrap](archive/2026-03/202603260310_file-manager-root-sibling-bootstrap/)
- **[frontend]**: 重排文件区右键菜单结构,补齐终端子菜单、复制文件名和复制绝对路径等动作 — by yinjianm
- 方案: [202603260228_file-context-menu-terminal-actions](archive/2026-03/202603260228_file-context-menu-terminal-actions/)
- **[frontend]**: 将工作台文件区继续收敛为固定 `/` 根节点的单栏资源管理器树,并在树内同时显示目录与文件 — by yinjianm
@@ -26,6 +32,9 @@
- 方案: [202603250614_terminal-ansi-color-effects](archive/2026-03/202603250614_terminal-ansi-color-effects/)
### 快速修改
- **[frontend]**: 将前端关于页、版本检查和样式仓库默认链接切换到 `Micah123321/nexus-terminal`,并移除 Ko-fi 入口 — by yinjianm
- 类型: 快速修改(无方案包)
- 文件: packages/frontend/src/composables/settings/useVersionCheck.ts, packages/frontend/src/composables/settings/useAboutSection.ts, packages/frontend/src/components/settings/AboutSection.vue, packages/frontend/src/App.vue, packages/frontend/src/components/style-customizer/StyleCustomizerBackgroundTab.vue, package.json
- **[frontend]**: 修正外部拖拽上传的落点路径判定,拖到哪个目录就上传到哪个目录,拖拽目录仍沿用先压缩再上传 — by yinjianm
- 类型: 快速修改(无方案包)
- 文件: packages/frontend/src/components/FileManager.vue, packages/frontend/src/composables/file-manager/useFileManagerDragAndDrop.ts, packages/frontend/src/composables/file-manager/useFolderArchiveUpload.ts, packages/frontend/src/composables/useFileUploader.ts
+3 -2
View File
@@ -1,4 +1,4 @@
# Nexus Terminal 知识库
# Nexus Terminal 知识库
> 本文件是知识库的入口点
@@ -31,7 +31,7 @@
```yaml
kb_version: 2.3.7
最后更新: 2026-03-26 02:00
最后更新: 2026-03-26 03:15
模块数量: 4
待执行方案: 4
```
@@ -52,3 +52,4 @@ kb_version: 2.3.7
- 需要历史决策: 搜索 CHANGELOG.md → 读取对应 archive/{YYYY-MM}/{方案包}/proposal.md
- 继续之前任务: 读取 plan/{方案包}/*
```
@@ -0,0 +1 @@
{"status":"completed","completed":3,"failed":0,"pending":0,"total":3,"done":3,"percent":100,"current":"已完成:修复新会话下根目录同级树补全","updated_at":"2026-03-26 03:15:00"}
@@ -5,8 +5,9 @@
类型: 修复
方案类型: implementation
优先级: P1
状态: 草稿
状态: 已完成
创建: 2026-03-26
完成: 2026-03-26
```
---
@@ -0,0 +1,43 @@
# 任务清单: file-manager-root-sibling-bootstrap
```yaml
@feature: file-manager-root-sibling-bootstrap
@created: 2026-03-26
@status: completed
@mode: R2
```
## 进度概览
| 完成 | 失败 | 跳过 | 总数 |
|------|------|------|------|
| 3 | 0 | 0 | 3 |
---
## 任务列表
### 1. 根目录同级补全修复
- [√] 1.1 在 `packages/frontend/src/composables/useSftpActions.ts` 中定位新会话初始化下 `/` 与当前目录并发加载的竞态点 | depends_on: []
- [√] 1.2 在 `packages/frontend/src/composables/useSftpActions.ts` 中实现“先加载 `/`,再串行加载当前目录”的根树补全逻辑,避免 currentPath 被改回 `/` | depends_on: [1.1]
### 2. 验证与同步
- [√] 2.1 执行 `packages/frontend` 的构建验证,并同步知识库记录 | depends_on: [1.2]
---
## 执行日志
| 时间 | 任务 | 状态 | 备注 |
|------|------|------|------|
| 2026-03-26 03:10 | DESIGN | completed | 已确认问题集中在 `/` 根树补全而非当前工作目录切换,修复以最小协议变更为主 |
| 2026-03-26 03:13 | 1.1 / 1.2 | 完成 | `useSftpActions.ts` 已改为根目录优先加载,`/` 完成后再串行加载当前工作目录 |
| 2026-03-26 03:15 | 2.1 | 完成 | `packages/frontend` 执行 `npm run build` 通过,仅保留既有 Vite 动态导入与 chunk 警告 |
---
## 执行备注
> 当前环境缺少可直接调用的 `python/py`,方案包通过模板降级方式手工创建。
@@ -0,0 +1 @@
{"status":"completed","completed":5,"failed":0,"pending":0,"total":5,"done":5,"percent":100,"current":"文件管理删除、上传和菜单稳定性修复已完成","updated_at":"2026-03-26 04:14:00"}
@@ -0,0 +1,63 @@
# 变更提案: file-manager-delete-upload-stability
## 元信息
```yaml
类型: 修复增强
方案类型: implementation
优先级: P1
状态: 已完成
状态说明: 已完成子菜单点击展开、拖拽上传目标确认、目录删除模式区分与删除后无效路径自动回退
创建: 2026-03-26
```
---
## 1. 需求
### 背景
文件管理器近期完成了资源管理器树与右键菜单改造,但当前仍存在一组影响可用性的连锁问题:终端/上传/压缩子菜单点击无反应,上传后没有自动刷新且拖拽上传没有目标确认,目录删除缺少“空目录删除 / 强制递归删除”的明确选项,并且删除后树会持续触发 `读取目录失败: No such file`
### 目标
- 修复文件右键菜单的子菜单交互。
- 上传后自动刷新,并在拖拽上传时明确目标目录。
- 目录删除提供“仅删除空目录”和“强制递归删除”二次确认。
- 删除后不再持续触发已不存在路径的目录加载错误。
### 约束条件
```yaml
范围约束: 优先收敛在 FileManager.vue、FileManagerContextMenu.vue、useFileManagerContextMenu.ts 和 useSftpActions.ts
后端约束: 可复用现有 sftp:rmdir 能力,必要时仅做最小协议扩展
交互约束: 保持当前资源管理器树和右键菜单风格,不回退到旧文件表格
兼容约束: 单文件/目录右键、多选和空白处右键仍需可用
```
### 验收标准
- [x] 终端 / 上传 / 压缩子菜单可明确展开并可点击执行
- [x] 上传完成后自动刷新,拖拽上传前能确认目标目录
- [x] 删除目录时弹二次确认并区分空目录删除与强制递归删除
- [x] 删除后不再持续报 `读取目录失败: No such file`
- [x] 前端构建通过
---
## 2. 方案
### 技术方案
`FileManagerContextMenu.vue` 中补桌面端点击展开二级菜单与更稳定的 hover/click 保持逻辑;在 `FileManager.vue` 中为拖拽上传新增目标目录提示与确认,并在上传成功回调后触发目标目录刷新;目录删除改成显式二次确认流程,给目录提供“仅删除空目录”和“强制递归删除”两种执行路径。`useSftpActions.ts` 与删除成功后的树更新逻辑同步修正,若当前路径或挂起加载目标落在已删除目录下,则自动回退到父目录或 `/`,避免持续请求不存在路径。
### 影响范围
```yaml
涉及模块:
- frontend: FileManager.vue
- frontend: FileManagerContextMenu.vue
- frontend: useFileManagerContextMenu.ts
- frontend: useSftpActions.ts
预计变更文件: 4-7
```
### 风险评估
| 风险 | 等级 | 应对 |
|------|------|------|
| 删除协议若需扩展 `recursive` 参数,前后端需同步 | 中 | 先核对现有后端 `sftp:rmdir` 能否透传策略,不足时做最小扩展 |
| 拖拽上传增加确认可能影响原有快捷操作感 | 低 | 仅在目标不明确时或跨目录时确认,默认场景仍快速上传 |
| 删除后自动回退目录可能与用户当前聚焦目录预期不一致 | 低 | 仅在当前路径已失效时回退到父目录,优先保证不报错 |
@@ -0,0 +1,49 @@
# 任务清单: file-manager-delete-upload-stability
```yaml
@feature: file-manager-delete-upload-stability
@created: 2026-03-26
@status: in_progress
@mode: R2
```
## 进度概览
| 完成 | 失败 | 跳过 | 总数 |
|------|------|------|------|
| 5 | 0 | 0 | 5 |
---
## 任务列表
### 1. 方案与范围确认
- [√] 1.1 创建文件管理稳定性修复方案包并锁定到文件管理前端链路 | depends_on: []
### 2. 菜单与上传交互修复
- [√] 2.1 修复右键子菜单展开/点击交互 | depends_on: [1.1]
- [√] 2.2 补拖拽上传目标确认和上传完成自动刷新 | depends_on: [2.1]
### 3. 删除与树状态修复
- [√] 3.1 为目录删除增加“空目录删除 / 强制递归删除”二次确认 | depends_on: [2.2]
- [√] 3.2 修复删除后树持续请求不存在路径的问题 | depends_on: [3.1]
### 4. 验证与同步
- [√] 4.1 运行前端构建验证并同步 `.helloagents` 文档与归档记录 | depends_on: [3.2]
---
## 执行日志
| 时间 | 任务 | 状态 | 备注 |
|------|------|------|------|
| 2026-03-26 03:24 | 1.1 | 完成 | 创建 implementation 方案包,范围锁定为文件管理删除、上传和菜单稳定性修复 |
| 2026-03-26 04:03 | 2.1 | 完成 | `FileManagerContextMenu.vue` 桌面端子菜单补点击展开,避免“终端 / 上传 / 压缩”点击无反应 |
| 2026-03-26 04:05 | 2.2 | 完成 | 拖拽上传前新增目标目录确认,并在当前可见目录上传完成后主动刷新 |
| 2026-03-26 04:08 | 3.1 | 完成 | 目录删除改为“仅删空目录 / 强制递归删除”双确认,后端 `sftp:rmdir` 接收 `recursive` 标志 |
| 2026-03-26 04:10 | 3.2 | 完成 | 删除目录后若当前/待加载路径失效,前端自动回退父目录,终止持续 `No such file` 重试 |
| 2026-03-26 04:14 | 4.1 | 完成 | `npm run build --workspace @nexus-terminal/frontend``@nexus-terminal/backend` 均通过 |
+3
View File
@@ -7,6 +7,8 @@
| 时间戳 | 名称 | 类型 | 涉及模块 | 决策 | 结果 |
|--------|------|------|---------|------|------|
| 202603260324 | file-manager-delete-upload-stability | implementation | frontend, backend | file-manager-delete-upload-stability#D001 | ✅完成 |
| 202603260310 | file-manager-root-sibling-bootstrap | implementation | frontend | file-manager-root-sibling-bootstrap#D001 | ✅完成 |
| 202603260234 | folder-upload-auto-zip | implementation | frontend | folder-upload-auto-zip#D001 | ✅完成 |
| 202603260228 | file-context-menu-terminal-actions | implementation | frontend | - | ✅完成 |
| 202603260212 | workbench-file-root-tree | implementation | frontend | - | ✅完成 |
@@ -37,6 +39,7 @@
## 按月归档
### 2026-03
- [202603260324_file-manager-delete-upload-stability](./2026-03/202603260324_file-manager-delete-upload-stability/) - 修复文件管理器右键子菜单点击、拖拽上传目标确认、目录删除模式选择与删除后路径失效回退
- [202603260234_folder-upload-auto-zip](./2026-03/202603260234_folder-upload-auto-zip/) - 为文件管理器补齐上传文件夹入口,选择目录后先打包为 zip,再上传并自动触发远端解压
- [202603260228_file-context-menu-terminal-actions](./2026-03/202603260228_file-context-menu-terminal-actions/) - 重排文件区右键菜单结构,并补齐终端子菜单、复制文件名和复制绝对路径等动作
- [202603260212_workbench-file-root-tree](./2026-03/202603260212_workbench-file-root-tree/) - 将工作台文件区收敛为固定 / 根节点的单栏资源管理器树,并在树内同时显示目录与文件
+6 -1
View File
@@ -37,7 +37,12 @@
### 业务分层
**条件**: 维护业务域代码。
**行为**: 按 `controller/service/repository/routes` 的分层模式组织连接、通知、设置、快速命令、主题等功能。
**结果**: 新增后端能力时应优先延续现有业务域目录结构,而不是在入口文件堆叠逻辑。
**结果**: 新增后端能力时应优先延续现有业务域目录结构,而不是在入口文件堆叠逻辑。
### SFTP 目录删除
**条件**: 前端文件管理器请求删除目录。
**行为**: `websocket/handlers/sftp.handler.ts` 当前允许 `sftp:rmdir` 接收可选 `payload.recursive``sftp.service.ts``recursive=false` 时走原生 `sftp.rmdir` 仅删除空目录,在 `recursive=true` 时继续沿用现有 `rm -rf` / `sudo rm -rf` 链路。
**结果**: 前端可以把“仅删空目录”和“强制递归删除”明确区分为两类后端行为,而不是所有目录删除都默认递归。
### 仪表盘聚合接口
**条件**: 前端首页需要一次性获取可视化仪表盘统计。
+3 -2
View File
@@ -1,4 +1,4 @@
# frontend
# frontend
## 职责
@@ -36,7 +36,7 @@
### 工作区交互
**条件**: 用户进入 `/workspace` 或相关管理页面。
**行为**: 通过组件、Pinia 与 composable 协同管理终端、文件管理、命令历史、布局配置、主题和状态监控;当前 `/workspace` 默认主布局为“左侧 Workbench、中央终端、右侧状态监控”,其中 Workbench 以 tab 容器整合快捷指令、命令历史、文件管理和编辑器,默认激活快捷指令。`CommandInputBar.vue` 当前已将底部命令框升级为支持会话级草稿保留的多行 `textarea`:普通 `Enter` 插入换行,`Ctrl+Shift+Enter` 发送当前命令,输入框会按内容自动增高至约 6 行,超出后在输入框内部滚动,并继续兼容快捷指令/命令历史同步与选中发送逻辑。快捷指令相关能力目前由 `AddEditQuickCommandForm.vue``QuickCommandsView.vue` 与新增的 `utils/quickCommandTemplate.ts` 协同实现:编辑弹窗左侧既可维护自定义 `${变量名}`,也提供 `${{date}}``${{time}}``${{timestamp}}``${{week}}``${{uuid}}``${{random:8}}``${{clipboard}}``${{password}}` 等动态变量的一键插入;实际执行时会统一走共享解析器,覆盖编辑弹窗执行、列表直接执行、粘贴到命令输入框和发送到全部服务器等链路,并对未定义变量、无法读取的剪贴板或不可用密码给出非阻断告警。`QuickCommandsView.vue` 内的新增按钮、空状态按钮和列表操作按钮统一复用 `bg-button``text-button-text``hover:bg-button-hover``hover:bg-border` 等主题变量类,避免写死黑白 hover 色值;该视图当前还支持命令项右键菜单,并已修正为实底卡片式上下文菜单,提供立即执行、粘贴到命令输入框(不自动发送)、复制命令、发送到全部服务器、编辑和删除等动作。`Terminal.vue` 会跟踪 xterm 的视口行号与贴底状态,在终端标签切换、重新激活和 `fit()` 后按原滚动意图恢复,并在渲染层为带 `xterm-fg-*` class 或内联 `style.color` 的显式前景色字符打标记,让终端文字描边/阴影仅作用于默认前景文本,不覆盖 ANSI 彩色输出;`session.store` 当前会为同一 SSH 连接下的新终端分配递增的 `terminalIndex``TerminalTabBar.vue` 则进一步把连续同连接会话渲染成“服务器组头 + 终端子标签 + 组尾新增按钮”,全局 `+` 只负责选择其他服务器,从而让“单连接默认 1 个终端、可继续追加多个终端”的关系在顶部标签栏里更接近参考图;`ConnectionsView.vue` 已升级为“左侧范围树 + 顶部搜索工具条 + 右侧结果列表”的双栏管理台,当前左侧进一步支持基于标签名路径分隔符推导的多级标签树、树节点展开状态持久化、分组 scope 恢复,以及树工具栏中的展开全部、收起全部和重置范围控制;近期又补上了独立的左侧树搜索、命中节点及祖先路径过滤、命中链路自动展开、节点计数高亮,以及更接近资源管理器的树头部布局;本轮继续为树节点加入 hover 工具按钮、资源管理器式分隔标题行与拖拽重排占位反馈;右侧结果列表则同时支持顶部排序控件、列头点击排序,并将行内操作整理为“连接”主按钮加“更多”菜单(编辑/测试/克隆/删除);`FileManager.vue` 当前已进一步收敛为固定 `/` 根节点的单栏资源管理器树,组件加载时会优先拉取 `/` 目录,树中按“目录在前、文件在后”同时显示目录和文件节点,点击目录只展开与聚焦,点击文件则沿用现有工作区文件打开链路;文件右键菜单链路则已补齐图标化菜单结构、危险态删除项、终端子菜单(执行 `cd` 命令到终端 / 新建终端到当前目录)、复制文件名与复制绝对路径等动作,并继续复用现有下载、权限、新建、上传和删除逻辑,同时又新增了独立“上传文件夹”入口:前端会先将本地目录打包为 zip,再复用现有 `sftp:upload` 链路上传,并在上传成功后自动调用远端解压、尝试清理临时压缩包;外部拖拽文件或目录上传时,则会按鼠标当前悬停的目录作为目标路径,其中目录同样走“先压缩再上传”的路径,从而显著降低小文件很多时的扫描与上传耗时;样式编辑器中的终端文字描边/阴影默认开关也已与新的黑绿终端风格保持默认开启。
**行为**: 通过组件、Pinia 与 composable 协同管理终端、文件管理、命令历史、布局配置、主题和状态监控;当前 `/workspace` 默认主布局为“左侧 Workbench、中央终端、右侧状态监控”,其中 Workbench 以 tab 容器整合快捷指令、命令历史、文件管理和编辑器,默认激活快捷指令。`CommandInputBar.vue` 当前已将底部命令框升级为支持会话级草稿保留的多行 `textarea`:普通 `Enter` 插入换行,`Ctrl+Shift+Enter` 发送当前命令,输入框会按内容自动增高至约 6 行,超出后在输入框内部滚动,并继续兼容快捷指令/命令历史同步与选中发送逻辑。快捷指令相关能力目前由 `AddEditQuickCommandForm.vue``QuickCommandsView.vue` 与新增的 `utils/quickCommandTemplate.ts` 协同实现:编辑弹窗左侧既可维护自定义 `${变量名}`,也提供 `${{date}}``${{time}}``${{timestamp}}``${{week}}``${{uuid}}``${{random:8}}``${{clipboard}}``${{password}}` 等动态变量的一键插入;实际执行时会统一走共享解析器,覆盖编辑弹窗执行、列表直接执行、粘贴到命令输入框和发送到全部服务器等链路,并对未定义变量、无法读取的剪贴板或不可用密码给出非阻断告警。`QuickCommandsView.vue` 内的新增按钮、空状态按钮和列表操作按钮统一复用 `bg-button``text-button-text``hover:bg-button-hover``hover:bg-border` 等主题变量类,避免写死黑白 hover 色值;该视图当前还支持命令项右键菜单,并已修正为实底卡片式上下文菜单,提供立即执行、粘贴到命令输入框(不自动发送)、复制命令、发送到全部服务器、编辑和删除等动作。`Terminal.vue` 会跟踪 xterm 的视口行号与贴底状态,在终端标签切换、重新激活和 `fit()` 后按原滚动意图恢复,并在渲染层为带 `xterm-fg-*` class 或内联 `style.color` 的显式前景色字符打标记,让终端文字描边/阴影仅作用于默认前景文本,不覆盖 ANSI 彩色输出;`session.store` 当前会为同一 SSH 连接下的新终端分配递增的 `terminalIndex``TerminalTabBar.vue` 则进一步把连续同连接会话渲染成“服务器组头 + 终端子标签 + 组尾新增按钮”,全局 `+` 只负责选择其他服务器,从而让“单连接默认 1 个终端、可继续追加多个终端”的关系在顶部标签栏里更接近参考图;`ConnectionsView.vue` 已升级为“左侧范围树 + 顶部搜索工具条 + 右侧结果列表”的双栏管理台,当前左侧进一步支持基于标签名路径分隔符推导的多级标签树、树节点展开状态持久化、分组 scope 恢复,以及树工具栏中的展开全部、收起全部和重置范围控制;近期又补上了独立的左侧树搜索、命中节点及祖先路径过滤、命中链路自动展开、节点计数高亮,以及更接近资源管理器的树头部布局;本轮继续为树节点加入 hover 工具按钮、资源管理器式分隔标题行与拖拽重排占位反馈;右侧结果列表则同时支持顶部排序控件、列头点击排序,并将行内操作整理为“连接”主按钮加“更多”菜单(编辑/测试/克隆/删除);`FileManager.vue` 当前已进一步收敛为固定 `/` 根节点的单栏资源管理器树,组件加载时会优先拉取 `/` 目录,树中按“目录在前、文件在后”同时显示目录和文件节点,点击目录只展开与聚焦,点击文件则沿用现有工作区文件打开链路;文件右键菜单链路则已补齐图标化菜单结构、危险态删除项、终端子菜单(执行 `cd` 命令到终端 / 新建终端到当前目录)、复制文件名与复制绝对路径等动作,并继续复用现有下载、权限、新建、上传和删除逻辑,同时又新增了独立“上传文件夹”入口:前端会先将本地目录打包为 zip,再复用现有 `sftp:upload` 链路上传,并在上传成功后自动调用远端解压、尝试清理临时压缩包;外部拖拽文件或目录上传时,则会按鼠标当前悬停的目录作为目标路径,其中目录同样走“先压缩再上传”的路径,从而显著降低小文件很多时的扫描与上传耗时;本轮又补上了拖拽上传前的目标路径确认、桌面端右键子菜单点击展开,以及目录删除时“仅删空目录 / 强制递归删除”的显式二选一;同时 `useSftpActions.ts` 会在删除目录后自动回退当前或待加载的失效路径,避免文件树持续对已删除目录刷出 `No such file`样式编辑器中的终端文字描边/阴影默认开关也已与新的黑绿终端风格保持默认开启。
**结果**: 页面逻辑分散在 `views/``components/``stores/``composables/`,其中工作区终端行为和标签交互优先落在 `session.store.ts``session/actions/sessionActions.ts``session/getters.ts``TerminalTabBar.vue``WorkspaceView.vue``Terminal.vue` 与相关 locale 文件。
### 仪表盘总览
@@ -60,3 +60,4 @@
**条件**: 用户在 `/workspace` 右侧状态监控面板查看服务器资源状态。
**行为**: `StatusMonitor.vue` 当前将内存与磁盘区域升级为卡片化监控视图:内存卡片展示总量、已用、缓存、空闲和环形占比,磁盘卡片展示设备名、文件系统类型、读写速率以及挂载点/大小/可用/已用率表格;CPU、Swap、网络速率和 `StatusCharts.vue` 的 CPU / 网络曲线继续保留。
**结果**: 状态监控从“简单进度行”升级为“高信息密度卡片”,并直接承接后端新增的内存细分字段与磁盘元数据。
@@ -1 +0,0 @@
{"status":"in_progress","completed":0,"failed":0,"pending":3,"total":3,"done":0,"percent":0,"current":"准备进入开发实施:修复新会话下根目录同级树补全","updated_at":"2026-03-26 03:10:00"}
@@ -1,41 +0,0 @@
# 任务清单: file-manager-root-sibling-bootstrap
```yaml
@feature: file-manager-root-sibling-bootstrap
@created: 2026-03-26
@status: pending
@mode: R2
```
## 进度概览
| 完成 | 失败 | 跳过 | 总数 |
|------|------|------|------|
| 0 | 0 | 0 | 3 |
---
## 任务列表
### 1. 根目录同级补全修复
- [ ] 1.1 在 `packages/frontend/src/composables/useSftpActions.ts` 中定位新会话初始化下 `/` 与当前目录并发加载的竞态点 | depends_on: []
- [ ] 1.2 在 `packages/frontend/src/composables/useSftpActions.ts` 中实现 stale `/` 根目录响应的安全树补全逻辑,避免 currentPath 被改回 `/` | depends_on: [1.1]
### 2. 验证与同步
- [ ] 2.1 执行 `packages/frontend` 的构建验证,并同步知识库记录 | depends_on: [1.2]
---
## 执行日志
| 时间 | 任务 | 状态 | 备注 |
|------|------|------|------|
| 2026-03-26 03:10 | DESIGN | completed | 已确认问题集中在 `/` 根树补全而非当前工作目录切换,修复以最小协议变更为主 |
---
## 执行备注
> 当前环境缺少可直接调用的 `python/py`,方案包通过模板降级方式手工创建。
@@ -0,0 +1 @@
{"status":"completed","completed":5,"failed":0,"pending":0,"total":5,"done":5,"percent":100,"current":"文件管理删除、上传和菜单稳定性修复已完成","updated_at":"2026-03-26 04:14:00"}
@@ -0,0 +1,63 @@
# 变更提案: file-manager-delete-upload-stability
## 元信息
```yaml
类型: 修复增强
方案类型: implementation
优先级: P1
状态: 已完成
状态说明: 已完成子菜单点击展开、拖拽上传目标确认、目录删除模式区分与删除后无效路径自动回退
创建: 2026-03-26
```
---
## 1. 需求
### 背景
文件管理器近期完成了资源管理器树与右键菜单改造,但当前仍存在一组影响可用性的连锁问题:终端/上传/压缩子菜单点击无反应,上传后没有自动刷新且拖拽上传没有目标确认,目录删除缺少“空目录删除 / 强制递归删除”的明确选项,并且删除后树会持续触发 `读取目录失败: No such file`
### 目标
- 修复文件右键菜单的子菜单交互。
- 上传后自动刷新,并在拖拽上传时明确目标目录。
- 目录删除提供“仅删除空目录”和“强制递归删除”二次确认。
- 删除后不再持续触发已不存在路径的目录加载错误。
### 约束条件
```yaml
范围约束: 优先收敛在 FileManager.vue、FileManagerContextMenu.vue、useFileManagerContextMenu.ts 和 useSftpActions.ts
后端约束: 可复用现有 sftp:rmdir 能力,必要时仅做最小协议扩展
交互约束: 保持当前资源管理器树和右键菜单风格,不回退到旧文件表格
兼容约束: 单文件/目录右键、多选和空白处右键仍需可用
```
### 验收标准
- [x] 终端 / 上传 / 压缩子菜单可明确展开并可点击执行
- [x] 上传完成后自动刷新,拖拽上传前能确认目标目录
- [x] 删除目录时弹二次确认并区分空目录删除与强制递归删除
- [x] 删除后不再持续报 `读取目录失败: No such file`
- [x] 前端构建通过
---
## 2. 方案
### 技术方案
`FileManagerContextMenu.vue` 中补桌面端点击展开二级菜单与更稳定的 hover/click 保持逻辑;在 `FileManager.vue` 中为拖拽上传新增目标目录提示与确认,并在上传成功回调后触发目标目录刷新;目录删除改成显式二次确认流程,给目录提供“仅删除空目录”和“强制递归删除”两种执行路径。`useSftpActions.ts` 与删除成功后的树更新逻辑同步修正,若当前路径或挂起加载目标落在已删除目录下,则自动回退到父目录或 `/`,避免持续请求不存在路径。
### 影响范围
```yaml
涉及模块:
- frontend: FileManager.vue
- frontend: FileManagerContextMenu.vue
- frontend: useFileManagerContextMenu.ts
- frontend: useSftpActions.ts
预计变更文件: 4-7
```
### 风险评估
| 风险 | 等级 | 应对 |
|------|------|------|
| 删除协议若需扩展 `recursive` 参数,前后端需同步 | 中 | 先核对现有后端 `sftp:rmdir` 能否透传策略,不足时做最小扩展 |
| 拖拽上传增加确认可能影响原有快捷操作感 | 低 | 仅在目标不明确时或跨目录时确认,默认场景仍快速上传 |
| 删除后自动回退目录可能与用户当前聚焦目录预期不一致 | 低 | 仅在当前路径已失效时回退到父目录,优先保证不报错 |
@@ -0,0 +1,49 @@
# 任务清单: file-manager-delete-upload-stability
```yaml
@feature: file-manager-delete-upload-stability
@created: 2026-03-26
@status: in_progress
@mode: R2
```
## 进度概览
| 完成 | 失败 | 跳过 | 总数 |
|------|------|------|------|
| 5 | 0 | 0 | 5 |
---
## 任务列表
### 1. 方案与范围确认
- [√] 1.1 创建文件管理稳定性修复方案包并锁定到文件管理前端链路 | depends_on: []
### 2. 菜单与上传交互修复
- [√] 2.1 修复右键子菜单展开/点击交互 | depends_on: [1.1]
- [√] 2.2 补拖拽上传目标确认和上传完成自动刷新 | depends_on: [2.1]
### 3. 删除与树状态修复
- [√] 3.1 为目录删除增加“空目录删除 / 强制递归删除”二次确认 | depends_on: [2.2]
- [√] 3.2 修复删除后树持续请求不存在路径的问题 | depends_on: [3.1]
### 4. 验证与同步
- [√] 4.1 运行前端构建验证并同步 `.helloagents` 文档与归档记录 | depends_on: [3.2]
---
## 执行日志
| 时间 | 任务 | 状态 | 备注 |
|------|------|------|------|
| 2026-03-26 03:24 | 1.1 | 完成 | 创建 implementation 方案包,范围锁定为文件管理删除、上传和菜单稳定性修复 |
| 2026-03-26 04:03 | 2.1 | 完成 | `FileManagerContextMenu.vue` 桌面端子菜单补点击展开,避免“终端 / 上传 / 压缩”点击无反应 |
| 2026-03-26 04:05 | 2.2 | 完成 | 拖拽上传前新增目标目录确认,并在当前可见目录上传完成后主动刷新 |
| 2026-03-26 04:08 | 3.1 | 完成 | 目录删除改为“仅删空目录 / 强制递归删除”双确认,后端 `sftp:rmdir` 接收 `recursive` 标志 |
| 2026-03-26 04:10 | 3.2 | 完成 | 删除目录后若当前/待加载路径失效,前端自动回退父目录,终止持续 `No such file` 重试 |
| 2026-03-26 04:14 | 4.1 | 完成 | `npm run build --workspace @nexus-terminal/frontend``@nexus-terminal/backend` 均通过 |