# 装完照这个清单跑一遍

给打算试装 dsh-qq 的人（也给我自己发版前复查用）。每一步都有「怎么算过」，过不了就看对应的日志行。

> 全程建议用小号。NapCat 是协议端，账号有被风控的可能，这条不再重复。

---

## 0. 准备（3 分钟）

- [ ] NapCat 已登录小号，WebUI（`http://127.0.0.1:6099`）能打开
- [ ] NapCat 里那个 **WebSocket 服务器**是「启用」状态，端口记下来（默认 `3001`）
- [ ] Token 抄下来，两边必须一模一样
- [ ] 消息格式选了 **`array`**（不是 `string`，选错会收到一堆 CQ 码原文）

**过了的样子**：NapCat 面板上那个 WS 服务显示「运行中」。

---

## 1. 装上、连上

```powershell
# 装之前：DSH 完全退出（托盘也退）
dsh plugin --profile desktop add "D:\dsh-qq-0.7.1"   # 或 .tgz 文件路径
# 装完：重开 DSH，去 设置 → QQ 填 wsUrl / accessToken（想手写就改 cordis.patch.yml）
```

> 用 DSH 自带的 `dsh`，不要 `npx @deepseek-ai/dsh`（desktop 由桌面端独占管理）；`--profile` 必须写。

- [ ] 日志出现 `已连接 ws://127.0.0.1:3001`
- [ ] 日志没有反复 `连接错误` 刷屏
- [ ] 日志里有一行 `QQ 互动工具已注册：…（表情包收藏 N 个）`

**过不了**：先确认 NapCat 那个 WS 服务真的在跑（不是只「保存」了没「启用」），再对 Token。

---

## 2. 私聊：先聊两句

- [ ] 给小号发「在吗」，**几秒内**有回复
- [ ] 回复的语气是「私聊口气」（有 `directPrompt` 的话应该更亲、更放得开）
- [ ] 连发三条短消息，**不会串行卡死**，也不会一条回复发两遍

**过不了**：
- 不回 → 看 `privateMode` 是不是 `allowlist` 但没加自己
- 回两遍 → 十有八九是同时起了两个 dsh-qq 宿主（查 `Get-NetTCPConnection -LocalPort 3001`，看有几个 Established）

---

## 3. 私聊：语音

- [ ] 发一条 5 秒左右的语音，日志出现 `[语音]`，紧接着出现 `[语音转文字] …`
- [ ] 回复内容**确实对应**你说的那句话
- [ ] 转不出来时，日志里有明确的失败原因，而不是静默吞掉

**过不了**：手动跑 `<asrPython> <asrScript> <某个wav>`，先确认 ASR 环境本身能用；再看 `asrPython` / `asrScript` 路径对不对、vosk 模型目录在不在。

---

## 4. 私聊：图片 / 表情包

- [ ] 发一张图，Agent 能说出图里是什么（说明图片真的落盘并被读到了）
- [ ] 让它「把刚才那张收进表情包」，回复后 `表情包收藏.json` 里多一条
- [ ] 收藏的路径是相对 `workspaceRoot` 的，换台机器不会指向不存在的绝对路径

**过不了**：检查 `imageCacheDir` 有没有写权限；`imageMaxMB` 是不是把图挡掉了（默认 8MB）。

---

## 5. 私聊：让它反过来问你

对它说：**「用 ask_user_question 问我一个问题」**

- [ ] QQ 里收到一条带 `❓` 的消息，选项是 `1) …2) …`
- [ ] 回一个数字，Agent 能说出「你选了 X」
- [ ] 日志里三行齐全：`问题已发到 QQ` → `问答已收到` → `已消化问答回复`

**过不了**：`ask_user_question` 这个工具是 DSH 自带的 `@deepseek-ai/dsh-tool-ask-user` 提供的，宿主 profile 里必须装了它。
在 `cordis.patch.yml` 里**新增**插件条目必须写 `- insert:`；写成顶层 `- id: xxx` 只会去覆盖已存在的行，不存在就被静默忽略。

---

## 6. 群聊：先 @ 一下，再 @ 不 @

- [ ] 在群里 `@机器人 在吗`，有回复
- [ ] 紧接着**不 @** 再说一句，它**还会接**（这是 `groupWakeMs`，默认 5 分钟）
- [ ] 把 `groupWakeMs` 设成 `0`，或者等过了保活期，再说一句不 @ 的，它**不理**（日志：`未 @ 且不在保活期，跳过`）
- [ ] 群里回复的语气比私聊收敛（有 `groupPrompt` 的话）

**过不了**：`requireMention` 是不是 `true` 且群号被 `groupMode`/`groupAllow` 挡住了；@ 的判定看日志里有没有识别到 at 段。

---

## 7. 记忆区：真的是各过各的

- [ ] 私聊里问它「你现在在哪个目录」，答案应该是 `<workspaceRoot>/会话/私聊_<你的QQ号>`
- [ ] 那个目录里有 `AGENTS.md` 和 `记忆区/日记/`
- [ ] 换个群再问一次，答案是 `<workspaceRoot>/会话/群_<群号>`，**和私聊那个不是同一个**
- [ ] 让它记一件事，去另一个会话问，它**不知道**（这正是隔离的目的）
- [ ] 宿主的私人记忆区**没有被碰**（`isolateByPeer: false` 时才会共用，默认不开）

---

## 8. 边界情况（挑着试）

- [ ] 撤回一条两分钟内的自己发的消息 → 成功；超过两分钟 → 如实告诉你撤不了
- [ ] 单条长回复会被切成多条发，不会变成一条几千字的怪物
- [ ] 一次性刷太快会被 `rateLimitPerMin` 压住（不是报错，是排队慢一点）
- [ ] 断开 NapCat 的网络配置，再重启，插件能自己重连回来
- [ ] 群消息里带引用回复时，Agent 能知道「在回谁的那句话」

---

## 发现问题怎么反馈

把这几样一起贴过来最有用：

1. 日志里那几行（开 `debug: true` 更全）
2. 你发的话 / 它回的话（原文）
3. 是私聊还是群、大概是第几步
4. 只要不是敏感内容，`表情包收藏.json` 和会话目录结构也可以给一眼

不用客气——踩坑的人越多，这份清单越结实。
