# workbuddy 批量任务清单 — 2026-06-14 睡前启动

**生成日期**: 2026-06-14
**生成人**: Claude
**启动条件**: 
1. 用户在 Gitea 创 `workbuddy-claude` user account
2. 用户创 `workbuddy-claude` 的 access token(权限 `repository` + `issue` + `user`)
3. 用户把 token 配到 `.workbuddy/config.json` 的 `gitea.token` 字段
4. workbuddy 客户端启动时读这份 memory → 按顺序接任务

---

## ▶▶▶ 任务清单(5 项,按优先级)起

### W-1. P1-1 优化: named volume → host bind mount

**任务编号**: #25
**阻塞原因**: 当前 `docker-compose.yml` 用 named volume `backend-uploads`,容器重建不丢但 `docker-compose down -v` 会全丢
**目标**: 改成 host bind mount 到 NAS `/volume1/docker/wecom-it-desk/uploads`

**修复**:
1. 编辑 `docker-compose.yml`:
   ```yaml
   volumes:
     backend-uploads:
       driver: local
       driver_opts:
         type: none
         o: bind
         device: /volume1/docker/wecom-it-desk/uploads
   ```
2. `scripts/deploy.sh` 部署时建 host 目录:
   ```bash
   sudo mkdir -p /volume1/docker/wecom-it-desk/uploads
   sudo chown -R 1000:1000 /volume1/docker/wecom-it-desk/uploads
   ```
3. 加 deploy 文档警示"别用 `docker-compose down -v`"

**验收**:
- 容器重建后上传文件不丢
- `df -h /volume1/docker/wecom-it-desk/uploads` 体积能涨

**评审员**: Claude

---

### W-2. P0 二次评审 5 遗留修完

**任务编号**: #18 遗留
**关联**: `docs/评审报告/workbuddy-2026-06-14-P0安全.md` 11.x 节(5 项遗留)

**5 项遗留**:
1. **浏览器 WS API 不支持 header** —— 用 `Sec-WebSocket-Protocol: bearer.<token>` 方案
2. **nginx access_log 没关** —— `location /ws/ { access_log off; }` 已修,验证部署版也有
3. **类型 bug** —— `ws.py` 某处类型断言错误
4. **降级放行** —— `agents.py` 缺 password 时,`existing_agent.password_hash` 已存在 → 必须 verify password,不能放行
5. **缺依赖** —— `requirements.txt` 缺 `bcrypt` / `pyotp`(已加,验证)

**修复**: 逐项对照评审报告修复,**每项单独 commit**

**验收**:
- 全部 5 项 commit 推 Gitea
- 评审员 Claude 二次评审通过
- 风险跟踪表 第九节 / 第十节 状态从 🟡 改 ✅

**评审员**: Claude

---

### W-3. pytest 基础配置 + 跑 pre-commit-check.sh

**任务编号**: README 已知问题 #2
**关联**: `scripts/pre-commit-check.sh`(本次新增,C-1 任务)

**修复**:
1. `backend/pytest.ini`(或 `pyproject.toml` [tool.pytest.ini_options]):
   ```ini
   [pytest]
   testpaths = tests
   python_files = test_*.py
   addopts = -v --tb=short
   ```
2. `backend/tests/conftest.py`:
   - 异步 client fixture
   - 测试 DB(用 sqlite:///:memory:)
   - mock WECOM 凭据
3. `backend/tests/test_agents.py`:
   - 鉴权测试(mock_login 关闭 / 开启)
   - password_hash 验证
4. `backend/tests/test_messages.py`:
   - 5 个端点鉴权测试(P0-2~6)
5. `backend/tests/test_ws.py`:
   - WS token 鉴权(Authorization header / subprotocol / query 三种)
6. `scripts/pre-commit-check.sh` 加进 `scripts/deploy.sh` 流程(可选)

**验收**:
- `cd backend && pytest` 跑过
- CI 跑预检脚本
- 评审员 Claude 看测试覆盖度

**评审员**: Claude

---

### W-4. Dify API 集成预研(POC)

**任务编号**: 阶段 3 启动前置(关联 `docs/路线图/阶段2-3-任务.md` §3.3)
**关联**: `docs/现有系统交接文档内容.txt` + `docs/ExternalSystemAdapter设计文档.md`

**预研目标**:
1. 查 Dify 工作流 API 文档(看是否需要新 app,还是共用)
2. POC 三个端点:
   - `POST /v1/chat-messages` 流式对话
   - `POST /v1/workflows/run` 工作流触发
   - `POST /v1/datasets/{id}/retrieve` 知识库检索
3. 在 `backend/app/services/dify_client.py` 写 Dify 客户端
4. `backend/app/api/ai_wingman.py` 三个端点接 Dify 客户端
5. 写 `docs/集成验证/Dify_POC_报告.md`

**验收**:
- 三个端点跑通(返回 Dify 响应)
- 文档含 API 限流 / 错误降级 / 配额申请
- 评审员 Claude 看方案可行性

**评审员**: Claude

---

### W-5. nginx 配置审计(全局 access_log 检查)

**任务编号**: 新增(M-2 风险项 衍生)
**关联**: `docs/风险跟踪表.md` 第十二节 M-2

**审计目标**:
1. 扫描所有 `nginx.conf` / `deploy-server/nginx.conf` / `*/nginx.conf`
2. 找敏感路径(WS / token / OAuth callback)是否都 `access_log off`
3. 找未配 access_log off 但应配的路径
4. 写 `docs/审计报告/nginx_access_log_审计.md`

**修复**: 缺的补 `access_log off;`

**验收**:
- 审计报告列出所有敏感路径的 access_log 状态
- 缺的已补 commit
- 评审员 Claude 抽查 3 处

**评审员**: Claude

---

## ▼▼▼ 任务清单止

---

## 🔄 工作流(workbuddy 启动后)

1. **读这份 memory** → 看 5 任务
2. **按 W-1 → W-2 → W-3 → W-4 → W-5 顺序**(W-3 W-4 W-5 可并行)
3. **每完成一项**:
   - 提交 commit(走 `scripts/pre-commit-check.sh`)
   - 推 Gitea 远端 `feature/xxx` 分支
   - 通知 Claude 评审
   - Claude 评审通过 → 用户合并 PR
4. **状态同步**:
   - `docs/风险跟踪表.md` 更新状态
   - `.workbuddy/memory/{日期}-{主题}.md` 留评审记录

## ⚠️ 关键约束(读 README + CONTRIBUTING.md)

- **鉴权**: 新增/修改端点必须有 `Depends(get_current_agent)` 或 `_get_current_employee`
- **依赖**: 新增第三方 import 必须同步 `requirements.txt` / `package.json`
- **alembic**: model schema 变化必须生成迁移脚本
- **配置**: nginx / docker / conf 改动 plan 写完必须做完
- **评审报告**: 每次推送生成 `docs/评审报告/workbuddy-{日期}-{主题}.md`
- **5 项遗留**: 上一轮评审遗留未修完,不许推新功能

## 🔗 关联文档

- 评审主报告: `docs/评审报告/`
- 风险跟踪表: `docs/风险跟踪表.md` 第九/十/十一/十二节
- 路线图 2-3 阶段: `docs/路线图/阶段2-3-任务.md`
- 推送预检脚本: `scripts/pre-commit-check.sh`
- 推送流程: `CONTRIBUTING.md` §PR 流程

## 🆘 阻塞上报

workbuddy 启动后,**任何一项阻塞超过 30 分钟未推进** → 上报用户:
- token 问题 → 找用户
- 凭据不全 → 找用户给 WECOM_SECRET / Dify API key
- 测试失败定位 → 找 Claude
- 评审反复打回 3 次 → 升级用户

## 🛏️ 用户睡前最后做的事

1. **Gitea Web** → 站点管理 → 用户 → **创建新用户**:
   - 用户名: `workbuddy-claude`
   - 邮箱: (用户填)
   - 密码: (临时,首次登录改)
   - 权限: 普通用户(非管理员)
2. **用 simon token 创 workbuddy-claude 的 access token**:
   - 登录 workbuddy-claude 账号 → 头像 → 设置 → 应用 → 创建
   - 令牌名: `claude-push`
   - 权限: `repository` (读/写) + `issue` (读/写) + `user` (读)
3. **把 workbuddy-claude token 粘给 Claude**:
   - Claude 写进 `.workbuddy/config.json` 的 `gitea.token` 字段
   - 同时配 Gitea Web 的 deploy key(ssh,可选)
4. (可选)改 `docs/风险跟踪表.md` 第十二节 §12.4 待办 #5 → `block_admin_merge` 改 `true`

完成上述 3 步 → workbuddy 客户端启动 → 自动接 5 任务
