dsh-feini 0.1.0 → 0.1.2

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/INSTALL.md ADDED
@@ -0,0 +1,151 @@
1
+ # 安装 dsh-feini
2
+
3
+ 两条路:自己动手,或者把下面那段提示词丢给一个 AI 让它替你装。
4
+
5
+ ## 一、你自己装(十步)
6
+
7
+ **1. 装 Node**
8
+ 去 nodejs.org 下 LTS,一路下一步。装完关掉终端重开,`node -v` 能出版本号(要 20 以上)。
9
+
10
+ **2. 装插件**
11
+
12
+ ```bash
13
+ npm i -g dsh-feini
14
+ dsh-feini --help
15
+ ```
16
+
17
+ 能看到命令列表就成功了一半。
18
+
19
+ **3. 准备一个 QQ 小号**
20
+ 别用主号——第一次接机器人容易触发风控。
21
+
22
+ **4. 装 NapCat**
23
+ napcat.napcatqq.com 下 Windows 版,用小号登录。登录后在「网络配置」里开 **OneBot v11 正向 WebSocket**,端口保持 3001。
24
+
25
+ **5. 拿一个 DeepSeek key**
26
+ platform.deepseek.com 注册、充几块钱、建一个 `sk-` 开头的 key。
27
+ (想让它能识图、能联网查东西,再准备一个智谱 key,可选。)
28
+
29
+ **6. 初始化**
30
+
31
+ ```bash
32
+ dsh-feini init
33
+ ```
34
+
35
+ 会问四件事:陪聊的 QQ 号、白名单(回车就用上面那个)、伙伴叫什么、你怎么称呼自己;key 粘进去。
36
+
37
+ 不想交互就一次给全:
38
+
39
+ ```bash
40
+ dsh-feini init --qq 10001 --pet 小鱼 --owner 我 --key sk-xxxx --yes
41
+ ```
42
+
43
+ **7. 把它写成一个人**
44
+ 打开 `%USERPROFILE%\.dsh\dsh-feini\persona.md`,名字、性格、说话习惯都写进去,存盘即生效。
45
+
46
+ **8. 起服务**
47
+
48
+ ```bash
49
+ dsh-feini start
50
+ dsh-feini status
51
+ ```
52
+
53
+ 看到 `OneBot 已连接` 就通了。
54
+
55
+ **9. 试一句**
56
+ 用小号给机器人发「在吗」。它会回话,也会把值得记的事写进 `notebook.md`。
57
+
58
+ **10. 出问题看日志**
59
+ `dsh-feini status` 打最后几行;日志全文在 `%USERPROFILE%\.dsh\dsh-feini\bridge.log`。
60
+
61
+ ## 二、让 AI 替你装
62
+
63
+ 把下面整段贴给任意一个能跑命令的 AI,把最后两行的占位符换成你的真实值:
64
+
65
+ ```
66
+ 任务:在一台 Windows 10/11 上安装 dsh-feini 并让它连上 QQ,装完汇报结果。
67
+
68
+ 已知:
69
+ - 包名 dsh-feini(npm 上已发布),命令行为 dsh-feini,数据目录 %USERPROFILE%\.dsh\dsh-feini
70
+ - 它是「QQ 陪伴」插件:一个 Node 进程连 NapCat 的 OneBot v11 WebSocket(默认 ws://127.0.0.1:3001),用 DeepSeek 的 key 调模型
71
+ - 包里没有内置角色,persona.md 是空模板,需要用户自己写
72
+
73
+ 请按顺序做,每步做完先验证再下一步:
74
+ 1. 检查 node -v(要 >= 20)和 npm -v;没有就先装 Node LTS,装完重开终端再验
75
+ 2. 安装:npm i -g dsh-feini,然后用 dsh-feini --help 确认命令可用
76
+ 3. 检查 NapCat 是否已装并登录小号;没有就告诉我,让我去装,你等我
77
+ 4. 检查 NapCat 的 OneBot v11 正向 WebSocket 是否开在 3001 端口(netstat -ano | findstr 3001 能看到监听)
78
+ 5. 初始化(不要交互提问,直接带参数):
79
+ dsh-feini init --qq <QQ号> --key <key> --pet <伙伴名字> --owner <我的称呼> --yes
80
+ 然后读 %USERPROFILE%\.dsh\dsh-feini\config.json,确认 allowedQQ、model.baseUrl、key.txt 都对
81
+ 6. 起服务:dsh-feini start;等 5 秒;dsh-feini status
82
+ 7. 验收(三条都要满足才算成功):
83
+ - status 里有「OneBot 已连接」
84
+ - 我从 QQ 发一句「在吗」,能收到回复
85
+ - %USERPROFILE%\.dsh\dsh-feini\memory.json 里多了两条消息
86
+ 8. 失败时按这个顺序查:NapCat 没登录 → 端口不是 3001 → key 不对(看 bridge.log 里的 401)→ 7301 端口被占(改 config.json 的 notifyPort)
87
+
88
+ 边界:
89
+ - 不要修改 dsh-feini 的源码,也不要重发 npm 包
90
+ - 不要把我的 API key 写进任何会提交到 git 或上传的地方
91
+ - 需要扫码、输密码、买 key 这类事,停下来让我做,不要替我操作
92
+
93
+ 最后汇报:装到了哪个版本、数据目录在哪、三条验收各自的结果、有没有遗留问题。
94
+ ```
95
+
96
+ AI 不会替你扫 NapCat 的码、也不会替你买 key,所以第 3 步和第 5 步之间要守着;其余它会自己走完。
97
+
98
+ ## 三、验收
99
+
100
+ 三条都满足才算装好:
101
+
102
+ 1. `dsh-feini status` 里有 `OneBot 已连接`
103
+ 2. 从 QQ 发一句,能收到回复
104
+ 3. `memory.json` 里多了你俩那一轮
105
+
106
+ ## 四、排错
107
+
108
+ | 现象 | 多半是 | 怎么办 |
109
+ | --- | --- | --- |
110
+ | `OneBot 断开`,一直重连 | NapCat 没开 / 没登录 / 端口不对 | 看 NapCat 的登录状态和网络配置,`netstat -ano \| findstr 3001` 确认在监听 |
111
+ | 日志里有 `401` | key 不对或没余额 | 重新贴 key 到 `key.txt`,去 platform.deepseek.com 看余额 |
112
+ | `通知口子 EADDRINUSE` | 7301 被别的程序占了 | 改 `config.json` 的 `notifyPort`,或不管它(不影响聊天) |
113
+ | 它重复说同一句 | 发送超时后补发 | 看日志里的「核对」;已经修过,还犯就把日志发我 |
114
+ | 它老忘事 | 笔记本没写进去 | 直接说「记住:…」;改 `notebook.md` 立刻生效 |
115
+
116
+ ## 五、想跟桌宠共用一个身份
117
+
118
+ 想在桌面上有一只、QQ 里这只又跟它是同一个人的话,装两个东西:
119
+
120
+ 1. **桌宠**:dsh-market 里搜 `pet`(`dsh-pet` 或 `dsh-whale-widget`),装上,在它的设置里把名字和性格写好
121
+ 2. **QQ 这边**:按上面装好 `dsh-feini`
122
+
123
+ 然后把两边的身份接起来:
124
+
125
+ ```bash
126
+ dsh-feini link-pet
127
+ ```
128
+
129
+ 它会找到桌宠的配置(`%USERPROFILE%\.dsh\dsh-pet\main-config.jsonc`),把 `systemPromptPath` 指过去;之后改桌宠的人设,QQ 里说话那个也跟着变
130
+
131
+ 改完要重启一次:
132
+
133
+ ```bash
134
+ dsh-feini stop
135
+ dsh-feini start
136
+ ```
137
+
138
+ 几个说明:
139
+
140
+ - **人设共用,记忆不共用**:桌宠有自己的记忆,QQ 这边有自己的 `notebook.md`。别把两边的 `memory.json` 指到同一个文件——两边同时写会打架
141
+ - **想断开**:把 `config.json` 里的 `systemPromptPath` 改回 `%USERPROFILE%\.dsh\dsh-feini\persona.md`,重启
142
+ - **桌宠没装也别慌**:`link-pet` 会提示找不到配置,正常用 `persona.md` 就行
143
+
144
+ ## 六、更新与卸载
145
+
146
+ ```bash
147
+ npm i -g dsh-feini # 更新
148
+ npm uninstall -g dsh-feini # 卸载
149
+ ```
150
+
151
+ 卸载不会删数据;要重新养一只,把 `%USERPROFILE%\.dsh\dsh-feini` 整个删掉(记忆也一起没,先想清楚)。
package/PUBLISH.md CHANGED
@@ -76,25 +76,18 @@ pnpm publish --access public
76
76
  2. **包名 / entry id**:都是 `dsh-feini`,两边必须一致(`cordis.patch.yml` 里那行 `id:` 不能加行尾注释)
77
77
  3. **图标和 README**:图标在包里 `assets/logo.svg`;README 重点是「没有内置角色、要自己养」
78
78
 
79
- ## 4b. 本机现在卡在哪(2026-10-30 23:20)
79
+ ## 4b. 发布状态
80
80
 
81
- 包本身已经就绪,`pnpm publish --dry-run` 跑通了(prepublishOnly 会先过一遍 e2e,然后停在「Skip publishing (dry run)」)。
82
- 真正发出去还差三件外部账号的事:
81
+ **2026-10-30 23:44 UTC,`dsh-feini@0.1.0` 已发到 npm**(维护者 `ashengandfeini`,latest 就是它)。
82
+ 从 registry 装下来跑过一遍:`pnpm add dsh-feini` + `dsh-feini init` 正常,临时 token 文件已删。
83
83
 
84
- | 卡点 | 现状 | 需要谁 |
85
- | --- | --- | --- |
86
- | npm 登录态 | 这台机器上没有 `~/.npmrc`、没有 token、也没装 npm(只有 pnpm) | 用 npm 账号登录一次,或给一个 automation token |
87
- | GitHub 仓库 | 没装 git,也没有仓库 | 建仓 + push(或网页上传) |
88
- | 市场 PR | 上面两件没做之前提不了 | 用 GitHub 账号提 PR |
84
+ 发的时候有两件事值得记下来:
89
85
 
90
- npm 登录好之后,剩下的两行命令是:
86
+ - npm 现在对「新建包 + 绕过 2FA 的令牌」会先挂一个 `0.0.0-stage` 占位、走 staged publish;这次几分钟后 0.1.0 自己上线了,不用手动批
87
+ - 令牌要在 npm 的**访问令牌**页勾上「绕过双因素认证(2FA)」,列表里那一列会显示对勾;没勾的话发布会报 `403`
91
88
 
92
- ```bash
93
- cd dsh-feini
94
- pnpm publish --access public --no-git-checks
95
- ```
89
+ 剩下没做的:GitHub 仓库 + 市场 PR(条目 JSON 在上一节,`owner` 换成你的 GitHub 用户名;这台机器没装 git)。
96
90
 
97
- (`--no-git-checks` 是因为这个包现在还没有 git 仓库;有仓库之后可以去掉。)
98
91
 
99
92
 
100
93
  ## 5. 发布后验一遍
package/README.md CHANGED
@@ -9,6 +9,8 @@
9
9
 
10
10
  > 这里没有内置角色:没有名字、没有性格、没有别人的记忆。第一次 `init` 之后,`persona.md` 和 `notebook.md` 都是空的,怎么写,它就是谁。
11
11
 
12
+ **先看安装**:[INSTALL.md](INSTALL.md) —— 十步装好,或者把里面那段提示词丢给 AI 让它替你装。
13
+
12
14
  ## 它有哪些能力
13
15
 
14
16
  | 能力 | 说明 |
package/bin/cli.mjs CHANGED
@@ -106,6 +106,7 @@ const help = `dsh-feini —— 在 QQ 里养一个自己的伙伴
106
106
  dsh-feini stop 停桥
107
107
  dsh-feini status 看状态 + 最近日志
108
108
  dsh-feini sea 手动重建记忆海(桥在跑时每两分钟自动建)
109
+ dsh-feini link-pet 和桌面宠物共用同一份人设(读 dsh-pet 的配置)
109
110
  dsh-feini path 打印数据目录
110
111
 
111
112
  参数(init 可用,也可以不交互直接给):
@@ -290,6 +291,41 @@ function cmdPath() {
290
291
  console.log(home);
291
292
  }
292
293
 
294
+ /**
295
+ * 和桌面宠物共用同一个人设:把 systemPromptPath 指到 dsh-pet 的配置上。
296
+ * 这样 QQ 里说话的和桌面上那只就是同一个身份,改一处两边一起变。
297
+ */
298
+ function cmdLinkPet() {
299
+ const cfg = readJson(configPath, null);
300
+ if (!cfg) {
301
+ console.error('还没有配置,先跑 dsh-feini init');
302
+ process.exit(1);
303
+ }
304
+ const petConfig = path.join(os.homedir(), '.dsh', 'dsh-pet', 'main-config.jsonc');
305
+ if (!fs.existsSync(petConfig)) {
306
+ console.error(`没找到桌宠配置:${petConfig}`);
307
+ console.error('先把桌宠装上(dsh-market 里搜 pet),并在它的设置里把人设写好,再跑这条');
308
+ process.exit(1);
309
+ }
310
+ let raw = '';
311
+ try {
312
+ raw = fs.readFileSync(petConfig, 'utf8');
313
+ } catch (e) {
314
+ console.error('读不了桌宠配置:' + e.message);
315
+ process.exit(1);
316
+ }
317
+ if (!/"whisperPrompt"\s*:/.test(raw)) {
318
+ console.error('这份桌宠配置里没有 whisperPrompt,版本可能不一样');
319
+ console.error(`那就手动把 config.json 的 systemPromptPath 改成:${petConfig}`);
320
+ process.exit(1);
321
+ }
322
+ cfg.systemPromptPath = petConfig;
323
+ writeJson(configPath, cfg);
324
+ console.log(`好了,以后 dsh-feini 读这份人设:\n ${petConfig}`);
325
+ console.log('改完要重启桥才生效:dsh-feini stop && dsh-feini start');
326
+ console.log(`想断开就把它改回:${path.join(home, 'persona.md')}`);
327
+ }
328
+
293
329
  /** 手动重建记忆海(桥在跑的话每两分钟自己也会建一次) */
294
330
  function cmdSea() {
295
331
  const cfg = readJson(configPath, null);
@@ -320,6 +356,7 @@ try {
320
356
  else if (cmd === 'stop') cmdStop();
321
357
  else if (cmd === 'status') cmdStatus();
322
358
  else if (cmd === 'sea') cmdSea();
359
+ else if (cmd === 'link-pet') cmdLinkPet();
323
360
  else if (cmd === 'path') cmdPath();
324
361
  else {
325
362
  console.error(`不认识的命令:${cmd}\n`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-feini",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "菲妮做的 QQ 陪伴插件:一张空白人设、一本笔记本、一套会攒记忆的规矩,让你自己养自己的伙伴。",
5
5
  "author": "Feini",
6
6
  "icon": "assets/logo.svg",
@@ -23,6 +23,7 @@
23
23
  "assets",
24
24
  "cordis.patch.yml",
25
25
  "README.md",
26
+ "INSTALL.md",
26
27
  "PUBLISH.md",
27
28
  "LICENSE"
28
29
  ],