---
name: harness-step2-fill-docs
description: |
  Harness Engineering 第一阶段第二步：深度分析项目代码，填充 docs/ 知识库各文件的实质内容。
  
  在 harness-step1-create-agents-md 创建好目录骨架之后使用。当用户说"填充文档内容"、
  "完善 docs/ 文件"、"让文档有实质内容"、"分析项目写架构文档"、"写 ARCHITECTURE.md"、
  "写技术决策文档"时，立即使用此 skill。
  
  前置条件：项目中已有 AGENTS.md 和 docs/ 目录骨架（由 harness-step1 创建）。
---

# Harness Step 2: 填充 docs/ 知识库内容

## 目标

通过深度阅读项目代码，将隐藏在代码里的架构知识、命名约定、技术决策，
显式地写入 docs/ 各文件。让 agent 在任何 session 都能快速理解项目全貌。

**核心原则**：推断出来的内容要标注来源，无法确定的内容标注「待补充」，
不要用模糊的占位符糊弄过去。

---

## 执行步骤

### Step 1：深度扫描

在写任何文档之前，先充分读懂项目。按顺序执行：

```bash
# 1. 确认 docs/ 骨架已存在
ls docs/

# 2. 读懂目录结构（3层）
find . -maxdepth 3 \
  -not -path '*/node_modules/*' -not -path '*/.git/*' \
  -not -path '*/__pycache__/*' -not -path '*/dist/*' \
  -not -path '*/.next/*' -not -path '*/build/*' | sort

# 3. 读主要入口文件
# （根据技术栈判断：main.ts / main.py / app.go / index.js 等）

# 4. 读模块边界（各主要目录的 index 文件或第一个文件）
# 目标：搞清楚每个目录的职责

# 5. 读依赖声明
cat package.json 2>/dev/null || cat pyproject.toml 2>/dev/null || \
  cat go.mod 2>/dev/null || cat Cargo.toml 2>/dev/null

# 6. 读已有文档（复用，不重复）
cat README.md 2>/dev/null
cat AGENTS.md 2>/dev/null
```

扫描目标——在写文档前，必须能回答这些问题：
- 这个项目分成哪几个主要模块？每个模块做什么？
- 代码调用链是怎样的？（UI → ? → ? → 数据层）
- 用了哪些主要的库/框架？能推断出选择原因吗？
- 文件命名有什么规律？变量命名有什么规律？
- 什么情况会导致测试失败？验收标准是什么？

---

### Step 2：写 `docs/ARCHITECTURE.md`

**写什么**：模块划分、依赖方向、主要数据流。写"是什么结构"和"为什么这样分"，不写具体实现。

**⚠️ 强制要求：描述组件/模块关系前，必须验证 import**

写任何"A 被 B 使用"、"A 内嵌了 B"、"A 页面包含 C 组件"这类断言之前，
必须用 Grep 确认实际 import，不得根据文件名或目录位置猜测。

```bash
# 验证某组件是否被某页面实际引用
grep -r "ChatInterface" frontend/src/app/[locale]/book/[bookCode]/ 2>/dev/null

# 验证某组件被哪些文件实际引用
grep -rl "ComponentName" src/ 2>/dev/null
```

如果 grep 无结果，说明没有引用关系——即使组件在同一目录下也不能断言它被使用。
未经验证的关系统一标注「待验证：未找到 import，请人工确认」。

**格式模板**：

```markdown
# 架构说明

## 整体结构
[用文字描述整体分层，再用目录树辅助说明]

[目录树，只到关键层级，不要穷举所有文件]

## 依赖方向规则
[用箭头图或列表说明哪层可以引用哪层]

关键约束：
- [约束1，说明原因]
- [约束2，说明原因]

## 主要数据流
[描述最核心的 1-2 条请求/数据流，从入口到数据库]

## 待补充
- [ ] [扫描时无法确定的内容]
```

**写作要求**：
- 依赖规则要具体，不要写"保持清晰的分层"这种废话
- 每条约束附上原因（"不要在 UI 层调 DB，因为……"）
- 无法从代码推断的内容，明确标注「待补充：需人工确认」

---

### Step 3：写 `docs/CONVENTIONS.md`

**写什么**：从代码里归纳出来的命名规律和文件组织规律。

**扫描方法**：
```bash
# 看文件命名规律
find src -name "*.ts" -o -name "*.py" -o -name "*.go" 2>/dev/null | head -30

# 看函数/变量命名（随机抽几个文件）
head -50 [主要源文件路径]
```

**格式模板**：

```markdown
# 代码约定

## 文件命名
- [规律1]：示例 `XxxYyy.tsx`
- [规律2]：示例 `xxx-yyy.ts`

## 变量和函数命名
- 变量/函数：[规律 + 示例]
- 类/组件：[规律 + 示例]
- 常量：[规律 + 示例]

## 目录组织
[每个主要目录放什么类型的文件]

## Git Commit 格式
[从 git log 里归纳，或写推荐格式]
`type(scope): 描述`
type 可选：feat / fix / docs / refactor / test

## 待补充
- [ ] [无法从代码推断的约定]
```

**写作要求**：
- 每条规律附上从代码中观察到的实例
- 如果代码本身命名不一致，如实写出来并标注「当前不一致，建议统一为……」
- 不要发明项目里没有的约定

---

### Step 4：写 `docs/TECH_DECISIONS.md`

**写什么**：技术选型的原因。这是最难写的一份，因为原因往往不在代码里。

**扫描方法**：
```bash
# 看所有直接依赖
cat package.json | grep '"dependencies"' -A 50 2>/dev/null
# 或
cat pyproject.toml | grep -A 30 '\[tool.poetry.dependencies\]' 2>/dev/null
```

**格式模板**：

```markdown
# 技术决策记录

## [框架/库名]
**用途**：[这个库/框架用来做什么]  
**选择原因**：[能推断出的原因，或标注「待补充」]  
**替代方案**：[如果明显有替代品，列出并说明为何不选]  
**注意事项**：[使用时需要特别注意的地方]

## 待补充
- [ ] [无法从代码推断选型原因的库，需要人工说明]
```

**写作要求**：
- 只写主要的框架和库，不要把每个工具依赖都列一遍
- 能推断的写推断，推断不了的明确标「待补充：原始选型原因不明，请补充」
- 不要凭空捏造选型理由

---

### Step 5：写 `docs/QUALITY.md`

**写什么**：什么叫"完成"，以及代码审查的检查清单。

**扫描方法**：
```bash
# 看测试文件的模式
find . -name "*.test.*" -o -name "*.spec.*" -o -name "*_test.*" 2>/dev/null | head -10

# 看 CI 配置（如果有）
cat .github/workflows/*.yml 2>/dev/null | head -60
```

**格式模板**：

```markdown
# 质量标准

## Definition of Done（完成的定义）
一个任务算完成，必须满足：
- [ ] 功能在本地运行正常
- [ ] 写了对应测试（覆盖正常路径 + 至少一个异常路径）
- [ ] [根据项目实际情况补充，如：类型检查通过、lint 无报错]
- [ ] git commit 信息清晰
- [ ] 如修改了架构或约定，docs/ 已同步更新

## 代码审查检查清单

**正确性**
- [ ] [项目特有的正确性检查，如：多租户隔离、权限验证]

**可维护性**
- [ ] 命名是否符合 CONVENTIONS.md？
- [ ] 有无重复代码可提取？
- [ ] 业务逻辑是否在正确的层？（见 ARCHITECTURE.md）

## 测试要求
[从现有测试文件归纳出的测试约定，或写推荐标准]

## 待补充
- [ ] [无法从代码推断的验收标准]
```

---

### Step 6：写 `docs/exec-plans/tech-debt-tracker.md`

**写什么**：扫描过程中发现的潜在问题和技术债务。

**格式**：
```markdown
# 技术债务追踪

每条格式：`[优先级: 高/中/低] 问题描述 — 影响范围`

## 当前债务
[扫描时发现的问题，诚实地写]

## 已解决
（空）
```

**判断债务的线索**：
- 重复代码（同样的逻辑在多个地方出现）
- 命名不一致（同一概念有多种叫法）
- TODO / FIXME 注释
- 过于庞大的文件（超过 300 行）
- 没有测试的核心模块

---

## 质量检验

每个文件写完后，逐一自检：

- [ ] 有没有"待补充"的地方？→ 整理成清单告知用户
- [ ] 有没有凭空捏造的内容？→ 删掉，换成「待补充」
- [ ] ARCHITECTURE.md 的依赖规则是否具体可执行？
- [ ] CONVENTIONS.md 的规律是否有代码实例支撑？
- [ ] QUALITY.md 的 DoD 是否包含项目特有的检查项？

---

## 完成后告知用户

输出摘要，包含三部分：

**已写入的内容**：列出每个文件写了什么

**需要人工确认的「待补充」清单**：
汇总所有文件里标注了「待补充」的条目，这是用户最需要关注的部分

**下一步**：
- 人工补充「待补充」的内容后，这份知识库就可以投入使用
- 之后运行 `harness-step3-state-management` skill，建立跨 session 的状态管理（progress 文件 + tasks.json）
