dsh-qiyu-stack 0.15.2 → 0.15.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -128,42 +128,42 @@ characters/小满/ 你的角色包(不进版本库)
128
128
 
129
129
  ---
130
130
 
131
- ## 现在的进度(v0.9)
131
+ ## 进度(v0.15.1,2026-10-23)
132
+
133
+ **已发布**:[npm](https://www.npmjs.com/package/dsh-qiyu-stack) · [GitHub](https://github.com/aesfls/dsh-qiyu-stack)
134
+
135
+ ```bash
136
+ npx dsh-qiyu-stack preflight # 环境体检
137
+ npx dsh-qiyu-stack init # 建角色(向导)
138
+ npx dsh-qiyu-stack deploy --qq <号> # 起 NapCat + 出码
139
+ npx dsh-qiyu-stack install --character <名字> --yes # 装进 DSH
140
+ npx dsh-qiyu-stack doctor # 自检
141
+ ```
132
142
 
133
143
  已经能用:
134
144
 
135
- - [x] **`qiyu init` 向导**:问名字、QQ、称呼、作息、性格、「能不能自己改性格」;
136
- 每个问题都有默认值,回车就过;带名字调用则全用默认值(给脚本用)
137
- - [x] **`qiyu deploy`** 一条命令起 NapCat:查 Docker → 查端口 → 建目录 → 写 OneBot/WebUI 配置
138
- → 拉镜像 → 跑容器 → 等 WebUI → **直接打开二维码**;令牌自动生成并写回 `qiyu.config.json`
139
- - [x] `qiyu doctor` 全链路自检 + **模板体检**(扫出别人的路径/名字/QQ号/令牌)
140
- - [x] `qiyu qr` 取登录二维码并**自动打开**(不是甩个路径让你自己找)
141
- - [x] `tools/merge-settings-tabs.mjs` 一条命令把五六个插件的设置收进「插件」页做页签,
142
- 带 `--dry-run` / `--restore`(见 [docs/settings-tabs.md](docs/settings-tabs.md))
143
- - [x] 部署文档:Docker + NapCat + 一个必勾的「下次登录无需确认」
144
- - [x] 行为层人格模板
145
- - [x] 默认值红线:中性默认 + 本机配置分离(见 [docs/conventions.md](docs/conventions.md))
146
- - [x] **runtime/ 五块已收进仓库**:bridge 全配置驱动、memory/mood/rhythm 原样搬、voice 只搬了脚本
147
- (私人路径/角色名/QQ号/令牌已清干净,见 [runtime/README.md](runtime/README.md))
148
- - [x] **`qiyu install`** 把 runtime 装进 DSH profile:默认只列清单,`--yes` 才动手;
149
- 目标已存在就跳过(`--force` 覆盖且先备份),`profile/package.json` 改动前必留 `.bak`
150
- - [x] **语音拆干净了**:`bridge/lib/voice.mjs` 管「说 + 听」,桥只管「向 NapCat 要 wav」;
151
- `install` 会把转写脚本放到 `~/.dsh/qiyu/`
152
- - [x] **配置收敛到活动角色**:`install --character 小满` 把角色包拷到 `~/.dsh/qiyu/`,
153
- 桥读身份的优先级变成 **`character.json` > `qq-bridge-config.json` > 代码默认值**
154
- (改人只改角色包,不碰插件配置)
155
-
156
- - [x] **端到端真跑过一次**:空白 DSH profile → `qiyu install` → 起独立实例 → 桥接上备号
157
- → 发消息进群 ✅ → 群里 @ 她,话被转进会话 ✅(最后「她回话」那步因测试 profile 没配模型没验)
158
-
159
- 还差的:
160
-
161
- - [x] ~~`memory` / `mood` / `rhythm` 也改读活动角色~~ —— 都接上了:
162
- rhythm 读 `schedule.json` 的时段、mood 读 `名字`/`称呼.主人`、memory 的名字兜底读 `名字`
163
-
164
- > 五块现在**都从活动角色读配置**了:改 `characters/<名字>/` 就能换人,不用碰插件配置。
165
-
166
- > 这一段是**从已验证能跑的实现里抽出来的**,不是照文档重写。
145
+ - [x] **`qiyu init` 向导**:名字 / QQ / 称呼 / 作息 / 性格 /「能不能自己改性格」;
146
+ 每个问题都有默认值;带名字调用则全用默认值(给脚本用)
147
+ - [x] **`qiyu deploy`**:查 Docker(没开就**静默拉起、不弹窗**)→ 选目录(挑非系统盘、查中文路径和空间)
148
+ → 写 OneBot/WebUI 配置 → 跑容器 → **直接打开二维码**;令牌写回 `qiyu.config.json`
149
+ - [x] **`qiyu install`**:把 runtime 四块装进 DSH profile;**按内容判断要不要替换**,
150
+ 换代码时保留用户自己的文件(原图之类),`package.json` 改动前必留 `.bak`
151
+ - [x] **`qiyu preflight`**:Node / Docker / Windows / WSL / 路径 / 空间 / 网络 / 杀软 /
152
+ DSH / 模型凭证 / Python;`--fix` 能修引擎启动、占端口容器、edge-tts
153
+ - [x] **`qiyu doctor`**:全链路自检 + 模板体检 + **runtime 与已装副本的代码一致性**
154
+ - [x] **runtime 四块**:bridge / memory / mood / rhythm(去个性化,配置统一读活动角色)
155
+ - [x] **语音拆干净**:`bridge/lib/voice.mjs` 管说和听,桥只管向 NapCat 要 wav
156
+ - [x] 端到端:空白 profile → install → 独立实例 → 备号收发都通
157
+
158
+ 已知未做:
159
+
160
+ - [ ] **还没有陌生人在干净机器上完整装过一遍**(最该验证的一环)
161
+ - [ ] mood 的「同一句反复记」已修(按消息签名去重),但只在千语身上验证过
162
+ - [ ] `memory` / `mood` / `rhythm` 的其余配置项还没全部接进角色包
163
+ - [ ] `0.0.0-stage` 这个 npm 占位版本还挂在 registry 上(不影响 `npx`)
164
+
165
+ > runtime 两边的代码应当一致,用 `qiyu doctor` 第 7.6 项比对;不一致就 `qiyu install --force`。
166
+ > 配置(QQ 号、称呼、容器名、路径)**永远不同步**,那是使用者自己的东西。
167
167
 
168
168
  ---
169
169
 
package/bin/qiyu.mjs CHANGED
@@ -46,6 +46,7 @@ const 帮助 = `
46
46
  (不假设 Docker 已经装了)
47
47
  --fix 能修的帮你修:启动 Docker 引擎、停掉占端口的容器、装 edge-tts
48
48
  (每一项都会先问一句,非交互环境不动手)
49
+ --json 只输出 JSON(给 agent / 脚本判断用)
49
50
 
50
51
  qiyu deploy 一条命令起 NapCat:建目录、写 OneBot 配置、跑容器、出码
51
52
  --dir <目录> 数据放哪(默认挑非系统盘里空间最大的;会检查空间和中文路径)
@@ -113,7 +114,7 @@ async function 主() {
113
114
  }
114
115
 
115
116
  if (命令 === 'preflight' || 命令 === 'check') {
116
- return await preflight({ 修复: 有开关('--fix') })
117
+ return await preflight({ 修复: 有开关('--fix'), 只输出JSON: 有开关('--json') })
117
118
  }
118
119
 
119
120
  if (命令 === 'qr' || 命令 === 'login') {
@@ -26,6 +26,22 @@ ownerName: z.string().default('小鱿鱼')
26
26
 
27
27
  ## 对用户说的话,还有两条硬规矩
28
28
 
29
+ ### ⓪ 三份 `AGENTS.md`,各管各的,绝不许串
30
+
31
+ 这个项目里有三份同名文件,搞混了就是事故(会把"部署指令"喂给正在聊天的角色):
32
+
33
+ | 文件 | 谁读 | 影响范围 |
34
+ |---|---|---|
35
+ | `~/.dsh/AGENTS.md` | **所有** DSH 会话 | ⚠️ 最广,连别人家已经养着的角色都会读到 |
36
+ | `characters/<名字>/AGENTS.md` | 那个角色自己的会话 | 性格、语气、边界 |
37
+ | `dsh-qiyu-stack/AGENTS.md` | **只有工作目录在这个仓库里的会话** | 只影响"正在装机的助手" |
38
+
39
+ 规矩:
40
+
41
+ - **仓库根那份**开头必须有作用域声明:「如果你是被部署出来的角色,忽略本文件」
42
+ - **任何工具都不许改** `~/.dsh/AGENTS.md` 和已存在的 `characters/<名字>/AGENTS.md`
43
+ - `qiyu install` 只从角色包拷三个文件,**不读仓库根**——所以物理上也串不过去
44
+
29
45
  ### ① 「重启」必须带宾语
30
46
 
31
47
  用户看到「重启一下」会愣住:重启电脑?重启 DSH?重启 Docker?
package/docs/status.md ADDED
@@ -0,0 +1,62 @@
1
+ # 现状与下一步(2026-10-23 收工时的快照)
2
+
3
+ > 这份是给「下次打开这个项目的人 / 我」看的。想知道怎么用,看 [README](../README.md)。
4
+
5
+ ## 一句话状态
6
+
7
+ **能用了,也发出去了,但还没被陌生人验证过。**
8
+
9
+ - npm:`dsh-qiyu-stack@0.15.1`(`latest`),`npx dsh-qiyu-stack help` 实测可跑
10
+ - GitHub:<https://github.com/aesfls/dsh-qiyu-stack>(公开,main)
11
+ - 千语(爸爸本人的实例):正常运行中,桥、NapCat、Docker 都通
12
+
13
+ ## 今天做了什么
14
+
15
+ 1. **NapCat 迁移落地**:Windows 版 NapCat 被 QQ 的文件校验堵死,改走 Docker + Linux QQ,跑通
16
+ 收发、群消息、语音、事件流。部署过程写进 [deployment.md](deployment.md)。
17
+ 2. **抽运行时四块**:bridge / memory / mood / rhythm 从「真在跑的机器」搬进 `runtime/`,
18
+ 清掉私人路径、角色名、QQ 号、令牌。语音拆成 `bridge/lib/voice.mjs`。
19
+ 3. **三条命令做出来**:`preflight`(环境体检 + `--fix`)、`deploy`(起 NapCat)、
20
+ `install`(装进 DSH,按内容判断替换、保留用户文件)。
21
+ 4. **发布**:GitHub 公开仓库 + npm 包。
22
+ 5. **修了一串真问题**(都记在对应文件里):
23
+ - `Docker Desktop.exe` 在引擎已跑时执行会弹面板 → 改成「先查、再决定碰不碰」
24
+ - 心情插件把同一句话反复记 → 加消息签名去重
25
+ - `install` 只增不删导致新旧文件混着 → 改成按内容比对、整份替换
26
+ - `package.json` 带 BOM 导致 npm 发布被"自动纠正" → 全部重写成无 BOM
27
+
28
+ ## 已知没做(按重要性)
29
+
30
+ | # | 事项 | 为什么重要 |
31
+ |---|---|---|
32
+ | 1 | **陌生人在干净机器上完整装一遍** | 唯一没被验证的一环。README 的流程可能还有坑 |
33
+ | 2 | 心情「她回话」那一步 | 隔离测试时测试 profile 没配模型,消息进会话但没跑起来 |
34
+ | 3 | `memory`/`mood`/`rhythm` 其余配置项接进角色包 | 现在只接了名字、称呼、作息时段 |
35
+ | 4 | npm 上的 `0.0.0-stage` 占位版本 | 无害,但看着脏;要清得用有权限的 classic token |
36
+ | 5 | GitHub 与本地历史分叉 | 网络拦了 git 协议(SSL),最后用 API 改文件;下次要 `git pull --rebase` |
37
+
38
+ ## 下一轮建议从哪开始
39
+
40
+ ```bash
41
+ # 1) 先自己按 README 从零走一遍(最像陌生人的做法)
42
+ cd /tmp && npx dsh-qiyu-stack preflight
43
+ npx dsh-qiyu-stack init
44
+ npx dsh-qiyu-stack deploy --qq <另一个号>
45
+ npx dsh-qiyu-stack install --character <名字> --yes
46
+ npx dsh-qiyu-stack doctor
47
+
48
+ # 2) 哪一步卡住,就把那一步的报错抄进 docs/deployment.md 的"常见坑"
49
+ ```
50
+
51
+ ## 两套东西的边界(很容易搞混)
52
+
53
+ | | 千语(爸爸的) | 栖语(给别人的) |
54
+ |---|---|---|
55
+ | 代码 | `~/.dsh/profiles/desktop/node_modules/<插件>` | `W:\AI\project\dsh-qiyu-stack\runtime\` |
56
+ | 配置 | `~/.dsh/*.json`、`qiyu.config.json` | 模板里全空 |
57
+ | 同步规则 | **代码要一致**(`qiyu doctor` 7.6 项会查);**配置永不同步** | |
58
+
59
+ ## 备份在哪
60
+
61
+ - 插件改动前的原文件:`W:\AI\yunqianyu\备份\插件改动备份-20261023.zip`(含清单 csv)
62
+ - 迁移说明与回退步骤:`W:\AI\project\云千语-NapCat迁移交接.md`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-qiyu-stack",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "description": "栖语栈:让一个智能体住进 QQ —— QQ 双向桥、长期记忆、心情、语音、作息,以及把 NapCat 部署这件事一次做对",
5
5
  "type": "module",
6
6
  "bin": {
package/src/install.mjs CHANGED
@@ -401,8 +401,10 @@ export async function install(选项 = {}) {
401
401
  console.log('')
402
402
  console.log('下一步:')
403
403
  console.log(' 1. **重启 DSH**:把 DSH 窗口关掉再打开(是 DSH,不用重启电脑)')
404
- console.log(' 2. 重启后跑 qiyu doctor')
405
- console.log(' 3. 去设置里看看有没有新的设置页')
404
+ console.log(' 2. 重启后:回到这个会话,或者开一个新会话,先跑一遍')
405
+ console.log(' npx dsh-qiyu-stack doctor --json')
406
+ console.log(' 把结果贴回来 —— 东西已经装好了,这一步只是确认,不是重新开始')
407
+ console.log(' 3. 设置里「通到 QQ」应该已经填好了,不用改')
406
408
  console.log('')
407
409
  console.log(灰(' 注:DSH 启动时可能会自己弹一个浏览器窗口 —— 那是 DSH 自己的界面,不是报错。'))
408
410
  console.log(灰(' 里面的「通到 QQ」设置已经帮你填好了(地址和令牌),不用改。'))
package/src/preflight.mjs CHANGED
@@ -362,6 +362,22 @@ export async function preflight(选项 = {}) {
362
362
  const 疑 = 结果.filter((x) => x.级别 === 'warn').length
363
363
  let 坏数 = 坏
364
364
 
365
+ // 给 agent 用的机器可读输出:别让模型去正则扒中文
366
+ if (选项.只输出JSON) {
367
+ const 输出 = {
368
+ ok: 坏 === 0,
369
+ 统计: {
370
+ 好: 结果.filter((x) => x.级别 === 'ok').length,
371
+ 待看: 疑,
372
+ 不通: 坏,
373
+ },
374
+ 结果: 结果.map((x) => ({ 级别: x.级别, 标题: x.标题, 依据: x.依据 || '', 怎么修: x.怎么修 || '' })),
375
+ 下一步: 坏 === 0 ? '可以往下走:init → deploy → install' : '先解决 fail 的项,再往下走',
376
+ }
377
+ console.log(JSON.stringify(输出, null, 2))
378
+ return 坏 ? 1 : 0
379
+ }
380
+
365
381
  console.log('')
366
382
  console.log('栖语栈 · 装之前先看这台机器')
367
383
  console.log('─'.repeat(52))