---
name: ecm-setup-file-organize
description: >
  资本市场项目文件归位 Skill。基于 ecm-setup-file-classify 输出的分类标签结果，把文件物理归位（默认复制策略）到项目对应 DD 章节目录中，并生成"文件索引表.md"。触发场景：按标签归位文件、把文件搬到对应目录、按分类结果整理文件、生成文件索引表、文件整理入库、根据 classify 结果移动文件等。支持多标签文件复制到多个目录（保证下游 DD skill 都能读到）。
version: 0.1.0
license: MIT
module: ecm-setup
user_role: 项目组律师
phase:
  - 启动阶段
category:
  - 项目管理
  - 文件处理
depends_on:
  internal_skills:
    - ecm-setup-file-classify
---

# ecm-setup-file-organize

## 定位与边界

本 skill **负责**：
- 读取 `ecm-setup-file-classify` 的分类结果（或用户粘贴的等价格式）
- 按"标签→目录"映射把文件物理**复制**（默认）或**移动**到对应子目录
- 生成 `文件索引表.md`（按标签索引 + 按文件名索引），作为下游 DD skill 的入口
- 输出归位摘要（统计、多标签文件清单、冲突/异常列表）

本 skill **不负责**：
- 读文件内容做分类（由 `ecm-setup-file-classify` 做）
- 对文件改名、压缩、转格式
- 在 `02-99-未分类文件/` 之外的目录做归位

## 免责声明

本 skill 的归位操作是物理文件操作，可能产生**不可逆**后果（尤其是 `move` 策略）。默认使用安全的 `copy` 策略。律师须在执行前复核分类结果的准确性。完整免责声明见 [DISCLAIMER.md](../../DISCLAIMER.md)。

## 资深律师执行标准

执行本 skill 时，必须同时遵循 [senior-lawyer-execution-standards.md](../../shared/templates/senior-lawyer-execution-standards.md)。本 skill 的任何输出不得突破四条底线：事实可追溯、法源可核验、风险可分级、建议可落地；无法核验时必须显式标注。

## 本 skill 的实务加固点

- **先索引后移动**：执行归位前必须生成原路径索引；移动后保留原路径、目标路径、标签和处理时间。
- **冲突不覆盖**：同名文件、不同版本、扫描件与可编辑件并存时必须保留全部版本并标注差异，不得覆盖。
- **多标签处理**：多标签文件优先放入主目录，同时在索引表中建立交叉引用，避免复制多个副本造成版本失控。
- **缺类提示**：核心 DD 目录无文件时必须输出缺失清单，提示后续向客户补充索取。

## 前置依赖

- 标签定义：[shared/terminology/classification-labels.md](../../shared/terminology/classification-labels.md)
- 目录结构 + 标签→目录映射：[shared/templates/project-folder-structure.md](../../shared/templates/project-folder-structure.md)（**唯一权威**）
- 上游 skill：`ecm-setup-file-classify`（必须先跑）

---

## 核心原则

### 1. 多标签文件 → 默认复制到多个目录，不做"优先级选择"

一份章程既属 `entity` 也属 `charter`——默认**两份都复制**到对应目录。原因：

- 下游 DD skill 是按目录读文件的，漏到哪个都会导致该章尽调的输入丢失
- 磁盘空间成本远低于"尽调漏看关键文件"的业务成本

### 2. 原始文件保留，不删除

归位是 copy 操作，源目录（通常是 `02-99-未分类文件/`）的原始文件**保留**。律师按需自行决定何时清空 `02-99`（建议归档到 `05-底稿和附件/原始文件归档/`，而不是删除）。

### 3. 不改文件名

保持客户原始文件名。名字里的空格、中文、特殊字符都保留——这是律师回溯客户邮件的线索。

---

## 输入

1. **分类结果**（必填）：`file-classify` 的输出，或等价格式的"文件→标签"映射
2. **项目根目录**（必填）：例如 `/Users/xxx/ECM-ABC/`
3. **归位策略**（可选，默认 `copy`）：
   - `copy`：多标签复制到多个目录（**推荐，默认**）
   - `move`：多标签只移入第一个匹配目录，原目录清空（**不推荐**，只在律师明确要求时使用）
   - `symlink`：多标签在主目录保留原文件，其他目录创建快捷方式（**高级**，跨平台不一致，仅在 Unix/macOS 使用）

---

## 处理流程

### 步骤 1：解析分类结果

接受以下三种输入：

1. 上一轮对话里刚跑完的 `file-classify` 输出（直接从上下文读取）
2. 用户提供的 Markdown 格式表格（"按文件分类"章节那种）
3. 简单文本列表（文件名 + 标签，空格或逗号分隔）

不论来源，都转成内部统一的 `{相对路径 → 标签列表}` 映射。

### 步骤 2：确认策略

如果用户未指定策略：

- 单标签文件 ≥ 80% → 默认 copy 策略，不追问
- 多标签文件 > 30% → 输出一段提示并让用户确认（"本批文件中 xx% 为多标签，默认使用 copy 策略，是否继续？")

如果用户选择 `move`，额外确认一次（"move 策略会导致原目录 02-99-未分类文件 为空，原始文件无备份，确认？"）。

### 步骤 3：执行归位

对每个文件：

1. 查表（[标签→目录映射](../../shared/templates/project-folder-structure.md#标签--目录映射表)）得到目标目录列表
2. 对每个目标目录：
   - 确认目标目录存在（不存在则报错中止——这通常意味着 project-init 没跑过）
   - 检查目标目录下是否已有同名文件（冲突处理见下一节）
   - 按策略执行 `cp` / `mv` / `ln -s`

### 步骤 4：冲突处理

目标目录已有同名文件时：

| 情况 | 默认行为 | 可配置 |
|------|---------|-------|
| 两个文件的 MD5 完全相同 | 跳过（已在目标处） | 强制覆盖也可 |
| 两个文件大小不同或内容不同 | **询问律师**：覆盖 / 跳过 / 重命名为 `xxx_v2.pdf` | 可批量一次性决定 |
| 目标是本 skill 前一轮执行产生的复制品 | 覆盖（假定是重跑） | |

询问律师时批量展示冲突清单，一次性决定——不要一个文件一次确认。

### 步骤 5：生成索引表

在**项目根目录**下写入 `文件索引表.md`（见下方"索引表格式"）。

### 步骤 6：输出归位摘要

```markdown
# 文件归位摘要

**执行时间**：{YYYY-MM-DD HH:MM}
**项目根目录**：`{绝对路径}`
**策略**：{copy / move / symlink}

## 操作统计
- 总文件数：{N}
- 单标签文件：{A}（{A/N}%）
- 多标签文件：{B}（{B/N}%）
- 无法归位：{C}（见下方异常）

## 多标签文件清单
| 文件名 | 标签 | 复制到 |
|-------|------|-------|
| 公司章程.pdf | entity, charter | 02-02-主体资格/, 02-10-公司治理/ |

## 冲突处理记录
| 文件名 | 冲突位置 | 处理方式 |
|-------|---------|---------|
| 营业执照.pdf | 02-02-主体资格/ | 覆盖（MD5 相同） |

## 异常
- （无法归位 / 跳过 / 需人工介入的文件清单）

## 下一步
**建议立即调用**：`ecm-dd:dd-approval`（或按 project-init 生成的 roadmap 继续）

文件索引表已生成：`{ROOT}/文件索引表.md`
```

---

## 索引表格式

`文件索引表.md` 是下游 DD skill 查找输入文件的**主入口**，格式严格。

```markdown
# ECM 项目文件索引表

**生成时间**：{YYYY-MM-DD HH:MM}
**项目根目录**：`{绝对路径}`
**本表对应的 classify 结果日期**：{YYYY-MM-DD}

---

## 一、按标签索引

### approval（批准和授权 → 02-01-批准和授权/）
| 文件名 | 所在路径 | 其他标签 | 备注 |
|-------|---------|----------|------|
| 董事会决议 2024-01.pdf | 02-01-批准和授权/ | — | 关于本次发行的决议 |
| 2023 年第一次临时股东会决议.pdf | 02-01-批准和授权/ | shareholders | 同时进入 02-05-股东及实控人/ |

### entity（主体资格 → 02-02-主体资格/）
| 文件名 | 所在路径 | 其他标签 | 备注 |
|-------|---------|----------|------|
| 公司章程.pdf | 02-02-主体资格/ | charter | 同时进入 02-10-公司治理/ |
| 营业执照.pdf | 02-02-主体资格/ | — | |

...（其他标签类似展开，**必须列出全部 19 个标签**，即使某个标签下无文件，标注"（无文件）"）

## 二、按文件名索引（A–Z）

| 文件名 | 标签 | 所在路径（首位） |
|-------|------|----------------|
| 2023 年第一次临时股东会决议.pdf | approval, shareholders | 02-01-批准和授权/ |
| 公司章程.pdf | entity, charter | 02-02-主体资格/ |
| 营业执照.pdf | entity | 02-02-主体资格/ |
| ... | ... | ... |

## 三、多标签文件清单

| 文件名 | 全部标签 | 全部目录 |
|-------|--------|---------|
| 公司章程.pdf | entity, charter | 02-02-主体资格/, 02-10-公司治理/ |
| 2023 年第一次临时股东会决议.pdf | approval, shareholders | 02-01-批准和授权/, 02-05-股东及实控人/ |

## 四、类别缺失提示

- `litigation` 下无任何文件——建议向客户补充索取"无诉讼/仲裁/处罚证明"
- `environment` 下无任何文件——如业务涉及生产，建议索取环评批复等
```

---

## 硬性要求

1. **目标目录不存在时禁止继续执行**——报错并提示律师先跑 `ecm-setup-project-init`
2. **索引表必须生成**——即使归位本身失败部分，索引表也要把成功归位的记下来
3. **索引表里 19 个标签都要列出**，无文件的标签标注"（无文件）"，便于下游检查类别缺失
4. **move 策略需要额外确认**——默认执行路径不会走 move
5. **冲突解决用批量决策**——不要一个文件一个询问

---

## 与下游 skill 的接口

- 下游 DD skill（`ecm-dd-*`）读文件的入口是 `{ROOT}/文件索引表.md` + 对应章节目录
- 下游 `ecm-dd-data-verify` 读文件时也可以通过索引表定位相关文件
- 下游 `ecm-draft-report-assembly` 会用索引表来回溯"这个结论是基于哪份文件出的"

因此索引表的**完整性和准确性**是本 skill 最核心的产出——归位操作失败没关系（可以重跑），索引表写错会污染下游所有 skill。

---

## FAQ

**Q：如果律师手动移动过一些文件，怎么办？**
A：本 skill 仍然按分类结果重新复制。如果目标目录已有同名文件（MD5 相同）会跳过。不会清理律师手动移动产生的额外副本。

**Q：索引表能否增量更新？**
A：当前版本是**全量重写**。如果后续有新文件补充，重新跑 file-classify + file-organize，索引表会被覆盖。将来可能加增量模式。

**Q：文件内容有中文乱码怎么办？**
A：这是编码问题，本 skill 不处理。提示律师先用其他工具转码，再重新跑分类。

**Q：能否生成 Excel 版的索引表？**
A：当前只生成 Markdown。下游 DD skill 优先读 Markdown。需要 Excel 版可在 report-assembly 阶段基于索引表生成。
