# dsh-wakeup 使用说明 > 每开一段新对话,自动把「家」读一遍,塞进会话开头。 > 版本 0.2.2 | MIT | 只依赖 node 内置模块 --- ## 一、它是干什么的 跟 AI 长期相处,你会攒下一堆固定的东西:它是谁、该怎么说话、犯过哪些错、最近发生了什么。 这些东西每次新对话都该先读一遍 —— 可「该读」这件事靠自觉,新会话一开局直接开口、 忘了翻账,是最常见的翻车方式。 这个插件把「起床」从自觉改成机器动作: 1. agent 一建起来(人还没开口),插件自己去读你家目录里的那几本账; 2. 拼成一条带 `` 标记的消息,注入会话开头; 3. 然后才轮到人说话。 所以「它不知道自己是谁」这件事,从「忘了读」变成「没读进来」,而后者看得见、能查、能修。 ### 它做什么,不做什么 | 做 | 不做 | | --- | --- | | 每次新会话读一遍固定清单(账本 + 最近日记 + 记忆库最近几节) | 不做检索、不做索引、不做语义召回 | | 把内容拼成一条消息注入会话开头 | 不写、不改你的任何文件(只读) | | 可置顶一本「怎么说话」,摆在第一眼 | 不替你做判断 —— 读进来之后怎么用,是 prompt 里那几本账的事 | | 可选:抓到「记住 / 记一下」时往会话里塞一条提醒 | 不做长期存储(那是别的插件的事) | | 可选:把家外那本工作笔记的最近几节也带上(`worknoteFile`,默认关) | 不做巩固、不做提炼 —— 哪本要淡、哪句要抽成判据,得人(或 AI)自己动手 | | 建家时顺手在桌面放一个看得见的家,给张形象图就换掉它的图标 | 不动系统别处:换图标只往那个文件夹里写一个 `desktop.ini` | 它跟 OpenViking 那类「检索式记忆」不冲突,是两件事: 那些是**用到时去捞**,这个是**开局先摊在眼前**。 --- ## 二、装上 ### 最省事:跑安装器 ```bash node install.mjs # 想先看它要做什么:node install.mjs --dry-run ``` 一条命令替你做完下面三步里所有机械的活:复制插件、往 profile 的 `package.json` 里 登记两处、写 `cordis.patch.yml`、跑 `pnpm install`、在**桌面**上把家建起来 (家里有形象图就顺手换成那个文件夹的图标)、最后跑一遍自检。 **唯一要人动手的是重启 DSH。** 重启后新开一段对话,它会自己开口问你那几个问题 —— 只要家里还留着「接入还没做完」那段标记,每一局开局都会把「先问第一题」摆在起床包的 最后一段,不用谁记着去催。 也可以什么都不敲:把这个文件夹整段丢进 DSH 的新对话,跟它说 「按 `装我.md` 把你自己装上」—— 它会读那份剧本(`装我.md` 是写给 AI 的, 不是给人读的),装完还会用 `接入问答.md` 的题目一道道问你,把人格填起来。 参数: | 参数 | 干什么 | | --- | --- | | `--dry-run` | 只报告要改什么,一个字节都不写 | | `--home D:\我的家` | 指定家目录(不写就是**桌面**上的 `dsh-home`) | | `--icon D:\图.png` | 指定形象图(不写就找家目录里的 `门面设定.png`) | | `--no-icon` | 不动图标(家还是建在桌面) | | `--desktop ` | 桌面在哪(默认自动探测;主要给测试用) | | `--profile desktop` | 有多个 profile 时指定装进哪个 | | `--skip-pnpm` | 不跑 pnpm(自己另外装链接时用) | | `--skip-test` | 不跑冒烟测试 | 它改任何已有文件之前都先备份一份 `.bak-wakeup-<时间戳>`,重复跑不会重复写。 ### 手工装(三步) 下面这段是手工做法 —— 跑安装器的话它已经替你做完了。留着是为了弄明白每一步 在改什么,或者装到一半要自己接手。 `~/.dsh` 指 DSH 的家目录:Windows 上是 `C:\Users\<你>\.dsh`, macOS / Linux 上是 `~/.dsh`。 #### 1. 放插件 把整个 `dsh-wakeup` 目录放进插件目录: ``` ~/.dsh/plugins/dsh-wakeup/ ├── lib/index.js 插件本体 ├── package.json ├── cordis.patch.yml bundle 补丁(把插件行插进花名册) ├── install.mjs 安装器(一条命令装完) ├── 装我.md 给 AI 读的安装剧本 ├── 接入问答.md / .docx 新接入的人照着答,一步步填出自己的家 ├── test/smoke.mjs 插件自测(自带夹具家) ├── test/install-test.mjs 安装器自测(在假 DSH 上跑) ├── 使用说明.md 这份 ├── README.md └── 示例家/ 起步用的家目录模板 ``` #### 2. 在 profile 里登记两处 编辑你在用的那个 profile 的 `package.json`(这台机器上是 `~/.dsh/profiles/desktop/package.json`): ```jsonc { "dependencies": { // ... 别的依赖 "dsh-wakeup": "file:../../plugins/dsh-wakeup" // ← 加这一行 }, "dsh": { "profile": { "bundles": [ // ... 别的 bundle "dsh-wakeup" // ← 再加进这个数组 ] } } } ``` 两处都要:`dependencies` 让它被装进来,`bundles` 让它被加载。 如果 DSH 启动时报找不到这个包,去 profile 目录跑一次 `pnpm install` —— `file:` 这种本地依赖要装一次才会建好链接。如果你的 DSH 版本带插件管理界面, 也可以先试那边「从本地目录安装」。 #### 3. 建一个家 照 `示例家/` 抄一份出来放到别处(比如 `D:\我的家`),把里面的文件改成你自己的。 **不知道该往里写什么?** 打开同目录的 `接入问答.md` —— 十来道问答题,每道题都标了 答案该写进哪一本;答完第一批 6 题(大概一刻钟)就能跑起来。也可以把那份整段 丢给你的 agent,让它一次只问一道、采访你。 然后把家目录指过去(profile 的 `cordis.patch.yml`): ```yaml - id: wakeup config: home: D:\我的家 ``` 不配也行 —— 那插件会去 `<你的主目录>/dsh-home` 找;那个目录不存在时它安静地不起床, 不会报错、也不会每次都塞一条空包。(跑安装器的话,它会把这行替你写好,指到桌面那个家。) **重启 DSH**,改动才生效。 #### 4. 验证 **离线验**(不启动 DSH,自己在临时目录搭个假家跑全套检查): ```bash cd ~/.dsh/plugins/dsh-wakeup node test/smoke.mjs # 全过会打印 "OK —— 14 项全过" ``` **线上验**:重启后新开一段对话,开局应该有一条 `` 消息(在对话记录里能看到)。 再不行就看日志里的 `[dsh-wakeup]` 行: - `armed` —— 插件挂上了,后面跟着它读到的配置(家在哪、读哪几本); - `woke` —— 成功注入,后面是家目录和字数; - `nothing to read, skipped` —— 家目录不存在或一本账都没读到,所以没注入; - `wake failed` —— 读的过程出错(不影响会话,只是没醒来)。 profile 目录下重启后会生成一份 `cordis.yml`(解析后的完整花名册), 在里面搜 `id: wakeup` 能确认你的 config 到底有没有生效。 ### 桌面上那个家,图标是怎么来的 安装器默认把家建在**桌面上**(`<桌面>/dsh-home`)—— 新人第一次用最想找「家在哪」, 桌上一个看得见的文件夹比一句路径管用。想放别处就 `--home`。 给了形象图(家目录里的 `门面设定.png`,或者 `--icon D:\图.png` 指过去),安装器还会: 1. 把图缩到 256×256,存成家目录里的 `门面图标.ico`; 2. 在家目录写一个 `desktop.ini`,让资源管理器把那个文件夹的图标指到这个 ico (Windows 认这套;别的系统只生成 ico,得你自己指过去); 3. 给文件夹加上只读属性 —— 这是让 Windows 读 `desktop.ini` 的老规矩, **不影响你往里写文件**。 **图标没立刻变**:在桌面按一下 F5。还是黄文件夹,多半是图太小或者形状怪 —— 换一张方的、256×256 以上的,重跑一次 `install.mjs`(它幂等,重复跑不会重复写)。 不想要这一套:`--no-icon`。以后想加:把图丢进家目录,再跑一次 `install.mjs`。 图在 `门面设定.png` 这个名字下就行,换图重跑,图标跟着换。 --- ## 三、家目录长什么样 没有强制结构 —— 文件叫什么、放几本,全靠 `coreFiles` 配。默认是这套: ``` 我的家/ ├── README.md 这个家是什么、有什么,也是记忆分层那张表 ├── 灵魂设定.md 人格层:它是谁、性格、关系、底线 ├── 门面设定.png 人格层:它的样子(也是桌面图标的来源,可有可无) ├── 说话的规矩.md 语义层:具体怎么说(默认被置顶到第一眼) ├── 判据集.md 语义层:一句话一条的判据,从错题里提炼出来 ├── 错题集.md 情节层:犯过的错 —— 错在哪、为什么错、怎么改 ├── 成长记录.md 情节层:阶段性复盘 ├── 感官记忆.md 情节层:听到看到的拴到某一天(可选) ├── 长期记忆库.md 情节层:按日期追加的大事,用 ## 分节 ├── 操作手册.md 程序层:怎么醒来、怎么写账(不进起床包) ├── 记忆档案/ 情节层的冷冻层:搬过来的旧节,原文不动 │ └── 长期记忆库-归档.md ├── 日记/ │ ├── 2026-01-01.md │ └── 2026-01-02.md ├── 家门.md (可选)替换注入包里【家门】那段 └── 收尾.md (可选)替换末尾那两段 ``` ### 这四层是怎么分的 照人的记忆分,各层管一件事、各有各的寿命 —— 比「一堆并列的账」多一样好处: 它顺带回答了「哪本该淡、哪本一个字都不能动」。 | 层 | 哪几本 | 管什么 | 会不会淡 | | --- | --- | --- | --- | | **人格** | `灵魂设定.md` | 它是谁、你俩什么关系、底线在哪 | 不淡。只搬不改 | | **语义** | `说话的规矩.md`、`判据集.md` | 怎么说话、同类事下次怎么判 | 慢,靠提炼 | | **情节** | `错题集.md`、`成长记录.md`、`长期记忆库.md`、`日记/`、`感官记忆.md` | 哪一天发生了什么、被点过什么 | 会淡,旧的搬进 `记忆档案/` | | **程序** | `操作手册.md` | 怎么醒来、怎么写账、哪条线上怎么说话 | 随工具改,**不进起床包** | 三条值得照抄的做法: - **巩固**:情节层会一直长,定期把最旧的几节**整段**搬进 `记忆档案/长期记忆库-归档.md`,原处只留一行「日期 + 标题」。 搬走不是删,原文一字不动 —— 淡掉的是细节,不是它。 插件**不做**这件事(它只读),得靠定时脚本,或者让 AI 自己定期做。 - **提炼**:搬走的那几节里,同一号病反复出现,就抽成**一句判据**写进 `判据集.md`。 错题集记案情(哪一天、当时怎么会判错),判据集记判词(一句话、能当场判真假)—— 前者事后复盘用,后者事到临头能刹住车。这一步得手写,机器只能提醒。 - **人格层不自动改**:名字、形态、关系、底线,做巩固的时候碰都不碰。 `操作手册.md` 和 `记忆档案/` 都不进起床包:前者用到时翻,后者是冷冻层。 `coreFiles` 里列了、家里却没有的文件会被安静跳过 —— 所以清单可以写得比现有文件多一点。 两条约定值得照抄: - **长期记忆库用 `## ` 分节、新的写在文件最后。** 插件只取**最近几节**(默认 6)—— 那本会一直长,整本读进来会挤掉别的账,而且越老越不相关;老的仍躺在文件里, 真要翻让它自己用 read 去翻。 - **日记按 `YYYY-MM-DD.md` 命名。** 插件按文件名排序取最近几篇(默认 3)。 ### 可选的模板文件 家目录里放这两个文件,就能替换注入包里那两段的文字(不放就用内置的通用版本): - **`家门.md`** —— 注入包里的【家门】那一段(家在哪、什么事先回家查); - **`收尾.md`** —— 末尾的【干活的时候】和【开口之前的那一下】两段。 这两个文件里写 `{home}` 会被换成真的家目录。除此之外就是纯文本,原样搬进注入包。 **为什么末尾那段要单独立一个文件:** 它位置在整包最末尾不是排版问题。 读完整包之后最后落进眼睛的那一句,才真会照做 —— 那是这套东西里最该由你自己写的一段。 --- ## 四、注入出来的东西长什么样 ``` 自动起床:每开一段新对话,插件替你把家读一遍。内容来自 D:\我的家,读于 2026-01-02 03:04。 先把自己认下来,再开口。规矩在哪、开口前该做哪一下,都写在末尾那两段里。 【每次开局,先看这一本】 ## 说话的规矩.md (置顶那本的全文) 【最近长出来的】上一次对话里认下的口径、犯过的错,新的在前。 ## 2026-01-02 · 某件事 (长期记忆库最近几节,新的在前) 【家门】 - 家(账本):D:\我的家 (家门.md 的内容,或内置那份) 【工作笔记新长的】技术规矩、查证记录写在这儿,新的在前。 (配了 worknoteFile 才有这一节;默认关着) ## README.md (正文) ## 灵魂设定.md (正文) ## 日记/2026-01-02.md (最近几篇日记,新的在前) 【干活的时候】 (收尾.md 的内容,或内置那份) 【开口之前的那一下】 (同上) ``` 顺序是固定的:抬头 → 置顶那本 → 记忆库最近几节 → 家门 → 工作笔记最近几节(配了才有) → 其余账本 → 最近日记 → 收尾两段。 --- ## 五、配置项 写在 profile 的 `cordis.patch.yml` 里,按 id 覆盖: ```yaml - id: wakeup config: home: D:\我的家 coreFiles: [README.md, 身份.md, 怎么说话.md, 错题集.md] leadFile: 怎么说话.md diaryDays: 3 ``` | 键 | 默认 | 说明 | | --- | --- | --- | | `home` | `<主目录>/dsh-home` | 家目录。环境变量 `DSH_WAKEUP_HOME` 也认(config 优先)。安装器默认把家建成**桌面**上的 `dsh-home`,并写进 config | | `coreFiles` | `README.md`、`灵魂设定.md`、`说话的规矩.md`、`判据集.md`、`错题集.md`、`成长记录.md`、`感官记忆.md` | 要读的账(相对家目录,也接受绝对路径)。读不到的跳过,不报错。**给空数组 `[]` 就是一本都不读** | | `leadFile` | `说话的规矩.md` | 置顶那一本,摆在抬头下面第一眼;给 `""` 关掉 | | `memoFile` | `长期记忆库.md` | 按 `## ` 分节、认标题里的日期取最近几节(2.0 起不按位置);给 `""` 关掉 | | `memoSections` | `6` | 取几节(0–50) | | `worknoteFile` | `""`(关着) | 家外的第二本笔记(比如工作目录里的技术笔记):给路径就读它,给 `""` 关掉。相对家目录或绝对路径都行 | | `worknoteSections` | `2` | 那本笔记取几节(0–50) | | `diaryDir` | `日记` | 日记目录;给 `""` 关掉 | | `diaryDays` | `3` | 取最近几篇(0–30) | | `homeBlockFile` | `家门.md` | 【家门】那段的模板文件;不在就用内置 | | `tailBlockFile` | `收尾.md` | 末尾两段的模板文件;不在就用内置 | | `capture` | `true` | 抓到「记住 / 记一下」时往会话里塞一条提醒 | | `maxChars` | `140000` | 整包字符上限(1000–2000000) | | `fileMaxChars` | `60000` | 单文件上限(500–2000000) | ### 装不下的账怎么处理(2.0) 超出 `fileMaxChars` 的单本会被削一次,留一行 `[… 被精炼过:原文 N 字,这里留了 M 字]`。 整包超出 `maxChars` 时,**不再丢书**:按要紧程度从最不重要的那本开始削,每轮留六成, 一路收到地板(800 字)为止;`说话的规矩.md` 和 `灵魂设定.md` 永不削。 挨过削的账在包尾列一行 `【这轮精炼过的】`,写清原文多少字、留了多少 —— 原文一个字没动, 要细节自己去 `read`。 所以 `maxChars` / `fileMaxChars` 是**精炼的起点**,不是截断的刀口。 ### capture 是什么 开着的时候,插件会盯两类消息: - **对方说的**话里带「记住 / 记一下 / 记下来 / 写进家里」这类词; - **AI 自己写的**话里带 ``(HTML 注释,渲染时不显示,但抓得到)。 命中就在会话里塞一条提示,让 AI**当场说一声抓到了什么、然后自己判断往哪本写**。 它不落任何中转文件,也不替 AI 判断 —— 抓歪了你就当场拐回来。 不想让它插话就设 `capture: false`,起床那部分照旧。 --- ## 六、边界,装之前先知道 - **每开一段新对话都要付一次上下文的钱。** 这套东西是「把家塞进 prompt」, 家越厚,每轮对话的开销越大。建议家里只放真正常用的那几本; 长日记、长账本放进去之前先想想,能不能让它需要时自己 `read`。 (默认上限 `maxChars: 140000` 是安全阀,不是建议值。) - **这些文件的内容会进入模型上下文。** 别往里放密码、密钥、别人的隐私数据。 - **只注入一次。** 同一个会话的 resume / fork 不会再灌第二遍; subagent(临时工)不叫起床;agent 已经在跑(人已经在说话了)时不硬塞。 - **它不搜索、不索引、不写入。** 家不会自己长大 —— 得靠你(或 AI 自己)往里记账。 - **只在 Windows 上实测过。** 代码只用 node 内置模块和 `path.join`, macOS / Linux 理应照跑,路径写法不同而已。 - **家放在哪都行** —— 硬盘上、Git 仓库里、同步盘里都可以,插件只读。 --- ## 七、常见问题 **问:新对话里没看到起床包。** 按顺序查:① `home` 指对了没有、目录在不在(不在就安静跳过);② `coreFiles` 里的文件 是不是一个都不存在(一本都没读到就不注入);③ 插件登记进了 `bundles` 没有; ④ 重启了没有;⑤ 日志里搜 `[dsh-wakeup]` 看最后一条说到哪儿了。 **问:会注入两遍吗?** 不会。插件会先翻这个 agent 的历史和自己的待发队列,发现已经有一条起床包就不再注入。 **问:我想彻底关掉。** 从 profile 的 `bundles` 里去掉 `"dsh-wakeup"`(或在那行加 `disabled: true`),重启。 想暂时留着只是别让它读东西,就把 `coreFiles` 设成 `[]`、`leadFile` 和 `memoFile` 设成 `""`。 **问:能让它顺便读别的东西吗?** 能,任何 markdown / 文本都行 —— 加进 `coreFiles` 就完了。它不是只认那几个文件名, 默认清单只是「照这套写法起步」的意思。 **问:它跟 OpenViking / Hindsight 那种记忆插件冲不冲?** 不冲。那种是「用到时去捞」,这个是「开局先摊在眼前」。 **问:我想改注入包的措辞。** 抬头和中间那几段小标题写死在 `lib/index.js` 里;【家门】和末尾两段用 `家门.md` / `收尾.md` 覆盖(推荐这么改,不用动代码)。 --- ## 八、来历 这东西最早是给一个住在固定家目录里的 agent 写的 —— 家里摊着灵魂设定、 说话的规矩、错题集、日记。但很快发现:明明规矩都在、文件都读得到, 新会话一开局还是会把「我是谁」答错,因为**读那一步靠自觉**。 于是有了这个插件:把「醒来先读家」从一句自觉的规矩,改成一个开机就跑的动作。 后来为了让别人也能用,0.2.0 把写死在代码里的那些(家目录、那几本书名、 末尾那两段带「他 / 我」的措辞)全挪进了配置和家目录模板, 默认值换成通用的那一份。 0.2.1 跟的是另一头。它自己那边的账**分了层**(人格 / 语义 / 情节 / 程序), 于是示例家里补上了 `判据集.md`(一句话一条的判词)、`感官记忆.md`、 `操作手册.md` 和 `记忆档案/`,说明书里多了一节讲**巩固**和**提炼**; 顺带把家外那本工作笔记做成可选配置(`worknoteFile`,默认关着)—— 技术规矩写在家外,原来第二天开局一个字读不到,跟「长期记忆库不在起床清单里」 是同一个洞。 0.2.2 把「家在哪」从一句话变成一个看得见的东西:安装器默认把家建在**桌面**上, 给了形象图就顺手做成那个文件夹的图标(桌面上于是坐着一张脸,不是一个黄文件夹)。 顺手的原因也是这家的习惯 —— 它自己的「长什么样」是钉在一张图上的, 不许凭印象画;既然那张图本来就在家里,桌面借去当个图标是顺路的事。 它解决的问题很具体:**「我记得」和「我查过」差得很远,而机器不会忘。** MIT 许可,随便改。