# 技能详情与审核页文件浏览侧边栏 - 产品需求文档 (PRD)

## 需求说明

### 背景
- 当前技能详情页 `space/global/skill-writer` 与审核详情区块都提供“概览 / 文件 / 版本”三个 Tab，但文件区域仅展示平铺文件列表，无法在页面内浏览目录层级或直接查看文件内容。
- 技能详情页已经具备按路径读取单个文件内容的能力，可用于 README 加载；审核详情页目前仅返回 `files`、`documentationPath`、`documentationContent`，还不具备按任意文件路径读取正文的能力。
- 用户需要在不下载整个 zip 包的前提下，快速查看 skill 包含的目录结构与具体文件内容，提升详情浏览和审核判断效率。

### 业务问题
- 平铺文件列表无法反映目录层级，用户难以理解 skill 包结构。
- 审核人员在审核页中无法点开任意文件验证实现内容，只能依赖 README 或下载压缩包离线查看。
- 现有三个 Tab 的主体内容已经承担不同职责，若继续把文件浏览塞入当前“文件”Tab，会使“概览”与“版本”场景下的跨文件查看成本偏高。

### 目标用户
- 浏览技能详情的普通用户
- 管理技能的作者 / 命名空间成员
- 在审核中心查看技能内容的审核人员与管理员

### 价值主张
- 用统一的侧边文件浏览体验取代当前平铺文件列表，降低理解 skill 包结构的成本。
- 在技能详情页和审核页提供一致的文件预览能力，减少下载操作和上下文切换。
- 保持现有三个 Tab 的主语义不变，同时让用户在任意 Tab 下都能快速查看文件内容。

## 功能概述

### 核心功能
1. 在技能详情页与审核详情页中新增常驻文件浏览侧边栏。
2. 将现有平铺 `files` 列表重构为目录树，支持文件夹展开 / 合并。
3. 点击文件节点后，通过弹窗预览文件内容。
4. 支持 Markdown 文档渲染、常见文本文件源码预览，以及大文件 / 不支持文件类型的不可预览提示。
5. 对不可预览文件提供下载入口。
6. 桌面端使用右侧侧边栏布局，移动端将文件浏览区域下沉到主内容区域下方。

### 本次范围
- 技能详情页：三个 Tab 下都显示同一份基于当前主版本的文件浏览侧边栏。
- 审核详情页：三个 Tab 下都显示文件浏览侧边栏，并支持点击任意文件预览。
- 文件树默认展开第一层目录，其余目录按需展开。
- 侧边栏需要显示文件类型或文件大小等辅助信息。
- 点击文件后使用弹窗预览，不切换当前 Tab。

### 明确不包含
- 侧边栏内置文件名搜索 / 路径过滤。
- 技能详情页中独立切换文件浏览版本。
- 审核页中的版本维度切换浏览权限设计与交互实现。
- 图片、音视频、富二进制文件的内联预览。
- 超大文件截断预览。

### 后续可扩展方向
- 按版本浏览文件树与文件预览，并结合权限控制设计访问策略。
- 侧边栏搜索过滤、最近打开文件、选中文件高亮等增强交互。
- 对 JSON / YAML / TS / JS 等文本文件提供更完整的语法高亮能力。
- 超大文本文件受控截断预览，基于服务端预览接口返回结构化元数据。

## 详细需求

### 用户交互流程

#### 技能详情页
1. 用户进入技能详情页，默认看到“概览 / 文件 / 版本”三个 Tab。
2. 无论当前停留在哪个 Tab，页面都显示文件浏览侧边栏。
3. 侧边栏展示基于当前主版本的目录树，第一层目录默认展开。
4. 用户点击文件夹节点，可展开或收起该目录。
5. 用户点击文件节点，打开文件预览弹窗。
6. 若文件是 Markdown，则按文档样式渲染。
7. 若文件是常见文本文件，则按源码块样式显示。
8. 若文件为二进制、类型不支持或文件过大，则弹窗展示“不可预览”提示，并提供文件下载入口。

#### 审核详情页
1. 审核人员展开审核详情区块。
2. 在“概览 / 文件 / 版本”任一 Tab 下，都能看到文件浏览侧边栏。
3. 审核人员点击任意文件后，打开与技能详情页一致的文件预览弹窗。
4. 若审核页现有接口无法提供目标文件正文，则需通过新增或扩展接口补齐能力。

### 页面布局要求

#### 桌面端
- 主内容区域与文件浏览侧边栏形成双栏布局。
- 三个 Tab 的主内容保持原有语义：
  - 概览：README / 文档主体。
  - 文件：文件树本身可作为主内容补充或说明区域，但不再是唯一的文件入口。
  - 版本：版本列表与生命周期信息。
- 文件预览使用独立弹窗，避免改变主内容布局或跳转当前 Tab。

#### 移动端
- 不保留强制双栏。
- 文件浏览区域下沉到主内容区域之后，仍在三个 Tab 下可见。
- 文件预览弹窗优先采用接近全屏的移动端弹层体验。
- 需避免任何横向滚动作为主要交互方式。

### 文件树行为
- 输入数据源为现有平铺 `SkillFile[]` 列表，前端负责构建树形节点。
- 节点类型分为目录节点与文件节点。
- 目录节点支持展开 / 收起。
- 文件节点支持点击打开预览弹窗。
- 侧边栏中显示文件类型或文件大小信息，帮助用户判断文件性质。
- 第一层目录默认展开；更深层目录默认折叠。

### 文件预览行为
- Markdown 文件：复用现有 Markdown 渲染能力。
- 文本文件：优先以源码 / 纯文本方式渲染，保留可滚动阅读体验。
- 二进制文件：展示“当前文件类型暂不支持预览”。
- 超大文件：展示“文件过大，暂不支持预览”，并给出下载入口。
- 所有不可预览文件都必须提供可触达的下载能力。
- 预览弹窗需要显示当前文件路径，便于用户确认查看对象。

### 数据与接口需求

#### 技能详情页
- 继续复用当前按路径读取文件正文的能力。
- 需要将当前 README 专用的单文件读取能力抽象成“任意文件读取”查询逻辑，供预览弹窗复用。

#### 审核详情页
- 需要补齐按路径读取任意文件正文的能力。
- 可接受的实现方式：
  1. 新增审核场景专用文件读取接口。
  2. 扩展当前 review detail 数据获取链路，增加任意文件按路径读取能力。
- 目标是让审核页的文件预览能力与技能详情页对齐，而不是仅支持 README。

### 开源组件策略
- 实现前需优先评估成熟开源组件是否能满足文件树或代码预览需求。
- 评估前提：样式必须能与当前 React + Tailwind + 现有 UI 体系自然融合。
- 若第三方组件在样式一致性、包体积、移动端适配或维护成本上不满足要求，则回退为轻量自研方案。
- 当前项目已具备 `react-markdown`、`rehype-highlight` 与现有 Dialog 基础能力，应优先复用已有依赖，避免引入风格冲突较大的重型组件。

## 设计决策

### 交互决策
- 采用“常驻文件导航 + 弹窗预览”模式，而不是切换主内容 Tab 或在侧边栏内直接阅读正文。
- 理由：
  - 保持现有三个 Tab 的语义稳定。
  - 允许用户在“概览”或“版本”上下文中快速查看文件。
  - 更适合移动端，将阅读行为独立到弹窗层处理。

### 响应式决策
- 桌面端为右侧常驻侧边栏。
- 移动端为主内容下方文件浏览区 + 接近全屏的预览弹层。
- 需保证 320 / 375 / 414 / 768 / 1024 / 1440 等常见宽度下无异常横向滚动。

### 样式与可用性决策
- 延续当前页面的数据密集型管理界面风格，不引入与现有设计系统冲突的第三方视觉语言。
- 文件树节点、弹窗关闭按钮、下载按钮需具备清晰 hover / focus 状态。
- 交互动效应控制在 150-300ms 范围内，并尊重 `prefers-reduced-motion`。
- 移动端点击目标需满足最小可触达尺寸。

## 技术约束

### 前端约束
- 必须兼容现有技能详情页与审核详情页结构，不破坏当前三个 Tab 的主内容与既有操作。
- 复用现有 Dialog、MarkdownRenderer、i18n、TanStack Query 模式。
- 文件树由前端从平铺文件列表构建，不要求后端返回嵌套目录结构。
- 不允许因为引入新组件导致现有样式体系明显漂移。

### 后端约束
- 本期允许为审核页补充新接口或扩展现有返回结构，但应避免引入数据库 schema 变化。
- 文件读取能力应限定在当前审核上下文可访问的 skill 版本上，不扩大权限边界。
- 对超大文件 / 不支持预览类型应能返回明确错误或元信息，便于前端区分不可预览原因。

### 性能约束
- 打开文件树不应阻塞页面初次渲染。
- 文件预览按需加载，不能一次性拉取所有文件正文。
- 目录树展开 / 收起应保持即时响应，不因大规模重渲染造成明显卡顿。

### 安全约束
- 继续沿用现有技能详情页和审核页的鉴权边界。
- 审核页新增文件正文读取能力时，必须确保仅审核相关角色可访问对应资源。
- 不可通过构造任意路径越权读取 skill 包之外的内容。

### 国际化约束
- 中英文都需补充文件浏览、预览、不可预览、大文件提示、下载操作等文案。

## 风险评估

### 技术风险
1. 审核页缺少任意文件正文读取能力，若后端接口设计不清晰，可能导致前后端联调返工。
2. 第三方文件树 / 代码查看组件可能与现有 Tailwind 风格不匹配，带来样式整合成本。
3. 文件类型判断与大文件判定策略若不统一，可能导致详情页与审核页行为不一致。

### 交互风险
1. 桌面端双栏与移动端单栏切换如果布局边界控制不好，容易出现横向滚动或内容拥挤。
2. 弹窗预览若对长文本处理不当，可能造成滚动区域难用或阅读效率差。

### 缓解措施
- 优先复用现有 Markdown、Dialog 与查询模式，减少引入面。
- 将“按路径读取正文”的能力抽象为共享模型，详情页和审核页统一使用。
- 先定义统一的“可预览 / 不可预览 / 可下载”判定规则，再进入实现。
- 将第三方组件引入作为可选路径，而非前置依赖。

## 验收标准

### 功能验收
- 技能详情页三个 Tab 下均能看到文件浏览侧边栏。
- 审核详情页三个 Tab 下均能看到文件浏览侧边栏。
- 平铺文件列表能正确转换为目录树，且支持文件夹展开 / 收起。
- 点击文件节点后能打开预览弹窗。
- Markdown 文件能正确渲染。
- 常见文本文件能以源码 / 纯文本形式展示。
- 二进制文件或超大文件会显示不可预览提示。
- 不可预览文件提供下载入口。
- 审核页支持点击任意文件并预览，不局限于 README。

### 质量验收
- 桌面端采用右侧侧边栏布局，移动端文件浏览区下沉到主内容下方。
- 页面在常见断点下无异常横向滚动。
- 不影响现有“概览 / 文件 / 版本”Tab 的既有内容与操作。
- 新增文案完成中英文国际化覆盖。

## 执行阶段

### Phase 1: 共享模型与交互方案落地
- 明确文件树节点模型、可预览类型规则、不可预览提示规则。
- 评估是否存在可复用的开源文件树 / 文本预览能力，并完成选型结论。

### Phase 2: 技能详情页集成
- 抽象任意文件读取查询逻辑。
- 将技能详情页平铺文件列表升级为目录树侧边栏。
- 接入弹窗预览与下载能力。

### Phase 3: 审核页能力补齐
- 为审核页补充任意文件正文读取接口或数据链路。
- 在审核详情区块接入共享文件树与预览弹窗。

### Phase 4: 回归与体验完善
- 补充中英文文案。
- 验证桌面端 / 移动端布局、弹窗滚动、不可预览场景。
- 补充回归测试，确保现有 Tab 内容和审核流程不受影响。

## 非本期需求记录
- 文件浏览版本切换需要单独设计权限边界、交互入口和不影响现有功能的约束，本期仅记录，不实现。

## 关联文档

### 需求文档
- [API 接口契约](../requirements/2026-03-20-skill-file-browser-sidebar/05-api-contract.md) - 定义前后端接口规范
- [验收用例](../requirements/2026-03-20-skill-file-browser-sidebar/04-acceptance-cases.md) - 功能验收测试用例

### 执行计划
- [实施计划](../superpowers/plans/2026-03-22-skill-file-browser-sidebar.md) - 详细的开发任务分解与执行步骤

### 技术参考
- 现有组件：
  - `web/src/features/skill/file-tree.tsx` - 当前平铺文件列表实现
  - `web/src/features/skill/markdown-renderer.tsx` - Markdown 渲染器
  - `web/src/shared/ui/dialog.tsx` - 弹窗组件
- 现有 API：
  - `GET /api/v1/skills/{namespace}/{slug}/versions/{version}/file?path=...` - 技能文件读取接口
  - `GET /api/v1/reviews/{id}` - 审核详情接口（需扩展）
