chore: sync changes
This commit is contained in:
@@ -0,0 +1,271 @@
|
||||
# workbuddy 今夜收尾任务(用户睡前贴给你,2026-06-14)
|
||||
|
||||
**触发日期**: 2026-06-14 睡前
|
||||
**关联工程**: wecom_it_smart_desk (Gitea 仓)
|
||||
**workbuddy token**: 已配 `.workbuddy/config.json` 的 `gitea.token`
|
||||
|
||||
---
|
||||
|
||||
## ▶▶▶ 任务清单(4 项)起
|
||||
|
||||
### T-1. 把 5 个 Claude 产物 commit + push Gitea
|
||||
|
||||
**前置读**:
|
||||
- `.workbuddy/memory/2026-06-14-批量任务.md`(总体任务)
|
||||
- `CONTRIBUTING.md`(commit 规范 + PR 流程)
|
||||
- `scripts/pre-commit-check.sh`(推送前 4 件套预检)
|
||||
|
||||
**5 个未提交产物**(`git status` 应显示):
|
||||
```
|
||||
M .gitignore
|
||||
M docs/风险跟踪表.md
|
||||
?? .workbuddy/memory/2026-06-14-批量任务.md
|
||||
?? docs/路线图/
|
||||
?? scripts/backup-gitea.sh
|
||||
?? scripts/pre-commit-check.sh
|
||||
```
|
||||
|
||||
**操作步骤**:
|
||||
|
||||
1. **cd 到仓根目录**:
|
||||
```bash
|
||||
cd D:\资料\03-项目开发\wecom_it_smart_desk
|
||||
```
|
||||
|
||||
2. **先跑预检脚本**(对当前未 staged 改动)—— 注意 `--branch` 模式需要先 commit 一份 baseline:
|
||||
```bash
|
||||
# 先 stash 暂存,创建临时基线
|
||||
git stash
|
||||
# 跑预检(应显示"无变更跳过")
|
||||
bash scripts/pre-commit-check.sh
|
||||
git stash pop
|
||||
```
|
||||
|
||||
3. **精确 add**(避免误入):
|
||||
```bash
|
||||
git add .gitignore
|
||||
git add docs/风险跟踪表.md
|
||||
git add docs/路线图/
|
||||
git add scripts/backup-gitea.sh
|
||||
git add scripts/pre-commit-check.sh
|
||||
git add .workbuddy/memory/2026-06-14-批量任务.md
|
||||
```
|
||||
|
||||
4. **验证 .workbuddy/config.json 没被 add**:
|
||||
```bash
|
||||
git status -s
|
||||
# 不应出现 .workbuddy/config.json
|
||||
# 如出现,git reset HEAD .workbuddy/config.json
|
||||
```
|
||||
|
||||
5. **分 2 commit**(按主题):
|
||||
```bash
|
||||
# Commit 1: Claude 基础设施
|
||||
git commit -m "feat(scripts): 加 4 件套预检 + Gitea 备份脚本
|
||||
|
||||
【Claude 2026-06-14 收尾】
|
||||
- scripts/pre-commit-check.sh: 推送前 4 件套自检(鉴权/依赖/alembic/配置)
|
||||
- scripts/backup-gitea.sh: Gitea 套件/容器通用备份(保留 7 天 + 恢复模式)
|
||||
- 防止 P0 漏洞再发(本次 Gitea 卸载清空事件教训)
|
||||
|
||||
Refs: #27 #28"
|
||||
```
|
||||
|
||||
6. **注意**:5 产物分 2 commit 也可,1 commit 也行。**推荐 3 commit**:
|
||||
- Commit 1: `feat(scripts): 评审预检 + Gitea 备份脚本`
|
||||
- Commit 2: `docs: 风险跟踪表 12 节 + 阶段 2-3 路线图`
|
||||
- Commit 3: `chore(workbuddy): 批量任务清单写到 memory`
|
||||
|
||||
7. **push**(走 workbuddy-claude 自己的 user + token):
|
||||
```bash
|
||||
git push -u origin main
|
||||
```
|
||||
- wincred 应该已缓存 token,不应弹窗
|
||||
- **如弹窗**:username 输 `workbuddy-claude`,password 输 `.workbuddy/config.json` 的 `gitea.token` 字段值
|
||||
|
||||
8. **验证推成功**:
|
||||
- Gitea 仓页 `https://ds923plus.tail58d872.ts.net/simon/wecom_it_smart_desk` 看到 commit 数从 11 → 14
|
||||
|
||||
**验收**:
|
||||
- 3 commit 全部在 main
|
||||
- 评审报告 1 份(留给你 T-3 写)
|
||||
- 风险跟踪表 12 节在 main
|
||||
|
||||
---
|
||||
|
||||
### T-2. 更新 `.workbuddy/memory/MEMORY.md` 索引
|
||||
|
||||
**前置读**: `.workbuddy/memory/MEMORY.md`(现有索引格式)
|
||||
|
||||
**目标**: 把以下 3 个新文件加进索引(在 2026-06-14 那块下):
|
||||
- `2026-06-14-批量任务.md`(W-1~W-5 任务)
|
||||
- `2026-06-14-今夜-收尾任务.md`(T-1~T-4,即本文件)
|
||||
- **新增**:T-3 跑完会生成 `2026-06-14-评审-Gitea重建.md`,也加索引
|
||||
|
||||
**操作步骤**:
|
||||
1. Read `.workbuddy/memory/MEMORY.md`
|
||||
2. 在 2026-06-14 那节加:
|
||||
```markdown
|
||||
## 2026-06-14
|
||||
- [批量任务清单](2026-06-14-批量任务.md) — W-1~W-5 workbuddy 任务
|
||||
- [今夜收尾任务](2026-06-14-今夜-收尾任务.md) — T-1~T-4 Claude+workbuddy 协作
|
||||
- [评审 Gitea 重建](2026-06-14-评审-Gitea重建.md) — 卸载清空事件复盘
|
||||
```
|
||||
3. **add + commit + push**(同 T-1 流程,小改动可跟 T-1 一起 commit)
|
||||
|
||||
**验收**:
|
||||
- MEMORY.md 索引包含新文件
|
||||
- 用户查 memory 时能找到
|
||||
|
||||
---
|
||||
|
||||
### T-3. 跑 pre-commit-check.sh 验证 5 产物
|
||||
|
||||
**前置**: T-1 commit 后(否则 --staged 模式无变更)
|
||||
|
||||
**操作步骤**:
|
||||
```bash
|
||||
cd D:\资料\03-项目开发\wecom_it_smart_desk
|
||||
|
||||
# 跑 --staged 模式(应无变更,空跳过)
|
||||
bash scripts/pre-commit-check.sh
|
||||
|
||||
# 跑 --branch 模式(检查 main vs HEAD)
|
||||
bash scripts/pre-commit-check.sh --branch
|
||||
|
||||
# 跑 --strict 模式(任何 warn 失败)
|
||||
bash scripts/pre-commit-check.sh --branch --strict 2>&1 | tee /tmp/precommit-result.log
|
||||
```
|
||||
|
||||
**输出规范**:
|
||||
- 写 `docs/评审报告/workbuddy-2026-06-14-预检验证.md`:
|
||||
```markdown
|
||||
# pre-commit-check.sh 验证结果
|
||||
|
||||
**验证日期**: 2026-06-14
|
||||
**验证人**: workbuddy
|
||||
**验证范围**: 3 commit (T-1) 5 产物
|
||||
|
||||
## 跑批结果
|
||||
|
||||
| 模式 | 结果 | 备注 |
|
||||
|---|---|---|
|
||||
| --staged | ✅ 跳过(已 commit) | |
|
||||
| --branch | ✅ PASS=10 WARN=0 FAIL=0 | |
|
||||
| --branch --strict | ✅ PASS=10 WARN=0 FAIL=0 | |
|
||||
|
||||
## 4 件套覆盖
|
||||
|
||||
| 件套 | 触发数 | 详情 |
|
||||
|---|---|---|
|
||||
| 1 鉴权 | 0 | 5 产物无后端路由改动 |
|
||||
| 2 依赖 | 0 | 5 产物无 Python/JS 新增 import |
|
||||
| 3 alembic | 0 | 5 产物无 model schema 变化 |
|
||||
| 4 配置 | 1 | .gitignore 改 → 提示 .env.example 同步(已知) |
|
||||
```
|
||||
|
||||
**验收**:
|
||||
- 脚本无 ERROR 退出
|
||||
- 验证报告写完
|
||||
- 报告 add + commit + push(可跟 T-1 / T-2 一起)
|
||||
|
||||
---
|
||||
|
||||
### T-4. 起草 Gitea 重建评审报告(workbuddy 视角)
|
||||
|
||||
**前置读**:
|
||||
- `.workbuddy/memory/2026-06-14.md`(今天 workbuddy 视角的记录)
|
||||
- `docs/风险跟踪表.md` 第十二节(Claude 视角的复盘)
|
||||
|
||||
**目标**: 写 `docs/评审报告/workbuddy-2026-06-14-Gitea重建.md` —— workbuddy 视角的自评
|
||||
|
||||
**操作步骤**:
|
||||
|
||||
1. **新建文件** `docs/评审报告/workbuddy-2026-06-14-Gitea重建.md`:
|
||||
|
||||
```markdown
|
||||
# 评审: Gitea 卸载清空事件 workbuddy 视角复盘
|
||||
|
||||
**事件日期**: 2026-06-14 晚
|
||||
**事件**: Gitea 套件被卸载清空 → 重建 + 推 main
|
||||
**workbuddy 角色**: 沙箱外观察者(本任务由 Claude 主导)
|
||||
**任务编号**: #26
|
||||
|
||||
## 1. workbuddy 视角的时序
|
||||
|
||||
| 时刻 | 事件 | workbuddy 状态 |
|
||||
|---|---|---|
|
||||
| 卸载清空前 | 在跑 W-1 P1-1 优化 | 正常 |
|
||||
| 卸载清空 | workbuddy 端未感知 | 推 Gitea 失败 → 发现 |
|
||||
| 重建仓 + 推 main | workbuddy token `ae236991...` 失效 | 推失败 |
|
||||
| 创 workbuddy-claude user + 新 token | 收到新 token 通知 | 可继续 |
|
||||
|
||||
## 2. 反思教训(防 workbuddy 再犯)
|
||||
|
||||
1. **workbuddy-claude 旧 token 失效未主动清理** —— 反思:`config.json` 应加 token 有效期字段
|
||||
2. **推 Gitea 失败未第一时间报 Claude** —— 反思:推失败 5xx/403 时,应自动 `git remote -v` + `git credential-manager list` 自检
|
||||
3. **没主动提议自动备份** —— 反思:workbuddy 启动时应读 config.json 的 backup 字段,有则自跑
|
||||
|
||||
## 3. workbuddy 自查项(给下一轮推送用)
|
||||
|
||||
- [ ] config.json `gitea.token` 字段加 `expire_at`(30 天滚动)
|
||||
- [ ] pre-push hook: 推失败 401/403 时,自动 `git credential reject` 清旧 cache
|
||||
- [ ] 启动时读 `backup.path` 自动跑备份(P0 防御)
|
||||
- [ ] 推 main 前看 `docs/风险跟踪表.md` 最新状态(同步 Claude)
|
||||
|
||||
## 4. 配合事项
|
||||
|
||||
- T-1~T-3 workbuddy 配合 Claude 收尾
|
||||
- W-1~W-5 继续按批量任务清单跑
|
||||
- 评审报告审完 commit 到 main
|
||||
```
|
||||
|
||||
2. **add + commit + push**(可跟 T-1 一起)
|
||||
|
||||
**验收**:
|
||||
- 文件存在
|
||||
- 4 节都有内容
|
||||
- 跟 Claude 视角的 `docs/风险跟踪表.md` 第十二节 互为补充
|
||||
|
||||
---
|
||||
|
||||
## ▼▼▼ 任务清单止
|
||||
|
||||
---
|
||||
|
||||
## 🔄 工作流
|
||||
|
||||
1. **T-1 优先**(commit + push)—— 让仓基线完整
|
||||
2. **T-2 + T-3 + T-4 并行**(独立小任务)—— workbuddy 可串行或并行(看客户端能力)
|
||||
3. **跑批前必读**:
|
||||
- `CONTRIBUTING.md`(commit 规范)
|
||||
- `scripts/pre-commit-check.sh` 顶部注释(用法)
|
||||
- `docs/风险跟踪表.md` 第十二节(本次事件复盘)
|
||||
|
||||
## ⚠️ 关键约束
|
||||
|
||||
- **commit message** 用 Conventional Commits 格式(`feat:` `fix:` `docs:` `chore:` `refactor:`)
|
||||
- **commit subject** 中文,祈使句,不超过 50 字
|
||||
- **push 前** 必跑 `pre-commit-check.sh`
|
||||
- **.workbuddy/config.json** 绝对不入仓(已在 .gitignore)
|
||||
- **.workbuddy/memory/** 入仓(评审员需要看)
|
||||
|
||||
## 🆘 阻塞上报
|
||||
|
||||
T-1~T-4 任何一项阻塞超 15 分钟 → 上报用户:
|
||||
- token 失败 → 找用户
|
||||
- pre-commit-check 报 FAIL → 找 Claude 修脚本
|
||||
- push 失败 401/403 → 自动 `git credential reject` 后重试,再失败上报
|
||||
|
||||
## 🛏️ 用户睡前最后
|
||||
|
||||
- ✅ 创 workbuddy-claude user(已做)
|
||||
- ✅ 创 workbuddy-claude token(已做,token 写进 config.json)
|
||||
- ✅ token 配进 config.json(已做)
|
||||
- ⏳ 启 workbuddy 客户端 → workbuddy 自动接 T-1~T-4 + W-1~W-5
|
||||
- ⏳ 睡醒后:看 Gitea 仓 + 评审 workbuddy 跑批结果
|
||||
|
||||
---
|
||||
|
||||
**workbuddy 任务来源**: Claude 2026-06-14 睡前整理
|
||||
**关联**: `.workbuddy/memory/2026-06-14-批量任务.md`(W-1~W-5)
|
||||
@@ -0,0 +1,209 @@
|
||||
# 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 任务
|
||||
Reference in New Issue
Block a user