# Changelog: 文件管理器 P1 — Composable 拆分 + 目录缓存

**日期**: 2026-06-02  
**类型**: 重构 (Refactor)  
**影响范围**: `frontend/src/pages/FilesPage.vue`、`frontend/src/stores/files.ts`、`frontend/src/composables/files/*`

---

## 变更摘要

按 `docs/design/specs/2026-06-02-files-refactor-design.md` 完成 P1：将 1500+ 行 `FilesPage.vue` 业务逻辑拆分为 Pinia store 与域 composable；页面 script 约 110 行，仅负责装配与模板绑定。

---

## 动机

- 单文件难以维护，三处 `browse()` 入口难追踪
- 为 P2 组件拆分、P3 缓存、P4 REST API 打基础

---

## 主要改动

| 模块 | 说明 |
|------|------|
| `stores/files.ts` | 服务器/路径/列表/权限状态；5s TTL 目录缓存（LRU 50 项） |
| `useFilesBrowse.ts` | 浏览、路由同步、序号与 in-flight 去重 |
| `useFilesNavigation.ts` | 面包屑、初始化、路由 watch、服务器切换 |
| `useFilesPermissions.ts` | capability、权限横幅、一键 sudo |
| `useFilesActions.ts` | 上传/删除/重命名/压缩/剪贴板等 |
| `useFilesEditor.ts` | 预览、Monaco 编辑 |
| `useFilesPage.ts` | 页面级装配入口 |
| `FilesPage.vue` | 模板不变，script 瘦身为 `useFilesPage()` |

---

## 行为变化

- **重复进入同一目录（5s 内）**：命中内存缓存，0 次 `/sync/browse`
- **写操作后**：`invalidateCache` 强制下次 `browse({ force: true })`
- 其余 UX 与 P0 后一致

---

## 是否需迁移 / 重启

- 仅前端重新构建部署
- 后端无变更

---

## 验证方式

1. `cd frontend && npx vite build`
2. 部署后 `prune_frontend_assets.py`
3. 文件管理：切换服务器、进目录、上传/删除/编辑/粘贴/sudo 配置
4. Network：同目录 5s 内二次进入无 browse 请求
