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 +151 -0
- package/PUBLISH.md +7 -14
- package/README.md +2 -0
- package/bin/cli.mjs +37 -0
- package/package.json +2 -1
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.
|
|
79
|
+
## 4b. 发布状态
|
|
80
80
|
|
|
81
|
-
|
|
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
|
-
|
|
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
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.
|
|
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
|
],
|