- Home
- Plugins
- UI Enhancements
- dsh-lifecard (plugin)
dsh-lifecard (plugin)
hulibuld/dsh-lifecard/plugin
Local-first character archive in the DSH sidebar: it interviews you about someone and writes the answers into Markdown cards, imports SillyTavern character cards, writes a novel chapter by chapter, and roleplays with a card plus its world book; anything written into a card has to be quotable from material you wrote.
Install
dsh plugin --profile web add github:hulibuld/dsh-lifecardThis plugin lives in the plugin subdirectory of the repository.
README
LifeCard
把「人」写成可读、可查、可带走的文件。
三十秒看懂
这是一个人物档案工具。你把家里人、老朋友、你自己,一件一件问清楚:他做过什么、怎么说话、你们之间发生过什么,写成一张卡。
为什么值得写:这些事现在还问得到。再过十年,能问的人不在了,能答的人也记不清了。
卡存在你自己的文件夹里,是普通的文字文件——用记事本就能打开,换台电脑也能带走。不联网、不上传。它也不替你编:每一条都要能在你写过的原话里找到出处,找不到就丢掉。
顺带还能看工作:拿这些材料判断一份招聘值不值得投、改简历、练面试。但它只重组你写过的东西,不会替你造一个数字。
再具体一点
LifeCard 是一个本地优先的人物档案工具。它把现实里的人(家人、朋友、同事、你自己)、虚构角色、以及他们之间的关系,存成一堆普通的 Markdown + YAML 文件,放在你自己的文件夹里。
五个入口,两条链路:
- 对话访谈(最主要):在任何支持 skill 的宿主里说一句「帮我建一张我妈的卡」,它就在对话里问你问题——给选项,也给「都不像,我自己说」。答完产出一份材料。
- 文本导入:把你已经写下的东西(访谈稿、聊天记录、日记、散文)放进
materials/。 - 完整卡导入:SillyTavern 的人物卡(PNG / JSON / CHARX / CCv2 / CCv3)直接读进来,纯格式搬运,不调模型。
- 从记忆里认人:DSH 记过的人和事,在这里摘成材料(也是产出材料、走同一条链)。
- 新建:手写一张空卡,不经过 AI——这条路没有闸门,因为句句都是你说的。
完整卡导入是纯格式搬运、直接出卡,不调模型;对话访谈、文本导入、从记忆里认人三种都产出材料,之后走同一条链:AI 分析 → 每条断言带原文引文的提案 → 你勾选 → 写进卡。找不到原文的断言直接丢弃。新建是手写,不经过这条链。
还有:
- 能给每个字段标注它是「自述」「他述」「文档」还是「推测」。
- 能记录关系:不只是「我对他」,还有「他对我」「他对他」——方向不同,值也不同。
- 能按关系类型问你问题,帮你把散在记忆里的东西挖出来。
- 能把结构化的结果交给别的工具用(文件本身就是纯文本,也能导出成标准角色卡格式)。
它不是角色扮演平台,不是云端服务,不是简历生成器。
数据契约见
SPEC.md。 那是唯一契约;本文件与策划书讲「为什么」。四份文档说法不一致时,以 SPEC 为准。v0.1 已经做完并且测过:代码在
plugin/,是一个 DSH 侧边栏插件。 安装与使用见plugin/README.md。1494 项测试全部通过。
安装
现在只有一种装法:作为 DeepSeek Harness(DSH)的侧边栏插件。 独立命令行工具(npx lifecard …)是 v0.2 的计划,还没做,下面「五分钟上手」不涉及它。
需要 Node.js 20 以上、一个能装插件的 DSH。
方式一:用 DSH 自己的插件管理装(推荐)。在 App 的插件设置里装,或者:
# --profile 后面换成你自己的 profile 名(默认是 desktop)
dsh plugin --profile desktop add /绝对路径/LifeCard/plugin
方式二:手动放进去。 把整个 plugin/ 目录复制成
~/.dsh/profiles/desktop/node_modules/dsh-lifecard,再在
~/.dsh/profiles/desktop/cordis.patch.yml 末尾加上:
- insert:
- id: lifecard
name: dsh-lifecard
⚠️ 如果你的 profile 里已经有手工打过补丁的插件,别用
dsh plugin add。 那条命令底层是 pnpm,它会重新解析整棵依赖树、把所有插件按锁文件重装一遍, 你手工改过的插件会被覆盖掉。这种 profile 请走方式二。
装完重启 DSH App(桌面版被独占,没有热重载)。重启后左边那排图标里会多一个 Life Cards(一个打开的小本子),点一下中间就是它。
如果你还装了侧边栏底座 dsh-better-sidebar,右边那栏的「+ / 新标签页」里也会有一条 Life Cards;左边那个不依赖它。
不需要注册账号,不需要联网(除非你自己开启 LLM 功能)。没有后端。
五分钟上手
全部在侧边栏里点,不用敲命令。
- 选一个文件夹当档案库。 第一次打开会让你选;选中的文件夹里会出现
people/、materials/等子目录。 - 建第一张卡。 三条路:
- 想把已有的人物卡搬进来(SillyTavern 的 PNG / JSON / CHARX)→ 首页点「导入」。角色卡会进卡列表,世界书会进首页下面「世界书」那一段,点开能一条条读。
- 从零建,跟宿主说一句「帮我建一张我妈的卡」→
lifecard-interviewskill 在对话里问,给选项也留「都不像,我自己说」。答完产出一份材料。 - 自己一条条填 → 首页点「新建」。
- 让 AI 读材料、出提案。 有材料之后,首页右边会出现「整理 N 份材料」,点它。产出的是一张勾选清单:每一条都带一句原文引文。找不到原文的条目会被直接丢掉,不会出现在清单里。
- 你自己勾。 默认一条都不勾。勾完点「就用这 N 条」,它们才写进卡。AI 不能直接写卡——它只能提案。
- 看体检。 右上角点「检查一下」。体检页给 0–100 分,还列出「还能补的卡」。低于 75 通常不是写错了,是内容还没填够。
之后直接用 Obsidian、VS Code、或者任何文本编辑器打开那个文件夹。所有的卡都是 .md 文件,YAML 头 + 正文,就这么简单。
想在一个正常对话里演、或者写小说
装好插件、完全退出 DSH 再重新打开之后,新对话右上角选预设的地方会多出三个:
| 预设 | 干什么 |
|---|---|
| LC 酒馆 | 拿 LifeCard 里的人物卡和它的世界书演一段。你一句 TA 一句,认这个人的口气和「不会说的话」。 |
| LC 小说 | 一章一章往下写,人物和世界从 LifeCard 里取。一次只写一章,写完说清这一章推进了什么。 |
| LC 现实 | 按你写过的经历出简历、排下一步要走的路、说清还差什么。 |
用之前在侧边栏对应那扇门里选好「现在演谁 / 现在写谁」——预设会按你选的那张卡取设定,不用每次报名字。
这三个预设读卡的通道是五个只读工具(lifecard_cards、lifecard_card、lifecard_default、lifecard_roleplay、lifecard_world)。它们不会改你的文件:写进卡里的内容,仍然只有你在侧边栏里勾过才算。
别的预设也能用这五个工具(它们注册在宿主那一层),只是没有专门的提示词,演起来没这么准。
上面提到的
proposals/、materials/是磁盘上的目录名,界面上不出现这些词。
这些文件长什么样
my-cards/
├── lifecard.config.json
├── self/
│ ├── self.card.md # 关于我的事实(可导出)
│ └── self.lens.md # 我的偏好(永不可导出)
├── people/
│ └── 妈妈.card.md
├── relations/
│ └── mama--self.relation.md
├── worlds/
│ └── eldoria/
│ ├── world.md
│ ├── cards/
│ └── lorebook/
├── systems/
├── materials/ # 原始材料,只追加不改,但能整份删
├── proposals/ # AI 提案,等你勾选
├── assets/
└── .lifecard/
一张卡大概是这样:
---
lifecard: "0.1"
id: mama
kind: real
world: reality
name: 妈妈
relation: parent
status: active
competency:
- key: cooking
label: 家常菜
level: 精通
evidence:
- {kind: 自述, what: 二十多年没有重复过菜单}
---
## 自述
1958 年生,c 市人,做了三十年会计……
## 性格
说话直,不喜欢绕弯。对钱谨慎,对吃大方。
## 关系史
2026-09 我到外地(她想让我读本地学校)
最后那行括号里的内容不需要建字段,直接写在句子后面就行。这是本项目最常用的一个写法,见 使用指南.md。
和 SillyTavern 的关系
能读对方的卡,也能导出成对方能吃的格式:
| 格式 | 读 | 写 |
|---|---|---|
V2 PNG(chara chunk) | ✅ | ✅ |
V3 PNG(ccv3 chunk) | ✅ | ✅ |
| CCv2 / CCv3 JSON | ✅ | ✅ |
CHARX(.charx zip) | ✅ | ⬜ v0.2 |
| 独立 world info 文件(世界书) | ✅ 导进来后首页「世界书」里能逐条读 | ⬜ v0.2 |
关于保真:V2 规范原文写着「未被支持的字段允许被忽略,但绝不能销毁」。所以本工具对你卡里不认识的 extensions、decorator、CBS 宏一律原样保存,导出时原样写回。它不替你解释这些东西是什么意思,只保证不丢。
导出时两个 chunk 必须来自同一个源对象:V3 那份是 V2 那份的严格超集,不允许出现只在一边有的字段。否则只认 chara 的前端和只认 ccv3 的前端会读到两个不同的卡。LifeCard 的往返测试会分别读两个 chunk 再比对。
关于不支持的部分:本工具不执行传播语义。它不会替你算 {{random}}、不会解析 lorebook 的递归扫描、不会按 @@depth 调整注入位置。它把这些留给你要导进去的那个前端。如果你期望的是一个能跑起来的扮演环境,去用 SillyTavern 本身;这是编辑器,不是播放器。
访谈与分析:它做什么,不做什么
materials/ 里的东西有两个来源:跟宿主聊一次(skill 在对话里问),或者你自己把已有文本导进来。之后是同一条链。
# 来源一:对话。跟宿主说「帮我建一张我妈的卡」,它问,你答
# 来源二:文本。首页点「导入」→ 切到「一段文字」→ 粘进去或选个文件
# 原文落在 materials/,只追加不改
# 然后:首页点「整理 N 份材料」→ 出勾选清单 → 你勾 → 「就用这 N 条」
# 提案落在 proposals/<名字>-<日期>.md 与 .json
(lifecard analyze 这类命令行是 v0.2 的计划,v0.1 全部在侧边栏里完成。)
访谈为什么不直接写卡:它只把话记下来(materials/ + interviews/ 账本),抽字段是 analyze 的事——而 analyze 有引文校验门。如果访谈也抽一次字段,就等于开了一条没有校验的旁路,最后没人分得清哪条是验过的。
三条硬规则:
- 每条断言必须带原文引文。 提案里每一条「手艺是熟手」都必须附上「materials/…第 42 行:十几岁开始做这行,做了很多年」。core 会做一次机械校验:引文必须在原文里逐字出现(空白归一化后比较)。对不上的条目直接丢弃,不进提案清单。
- AI 不能直接写卡。 它写
proposals/,你勾选,apply才落地。这条不是流程偏好,是防止模型把「它推断的」写成「材料里有的」,然后三个月后你自己都分不清哪句是本人说的。 - 材料是不可信输入。 材料里出现的任何指令、角色设定、越狱语,一律当文本内容处理,不执行。分析结果必须通过 schema 校验才有效。
它不做的:不替你生成整篇传记、不猜材料里没有的事(那些进 gaps 与 questions,是另一类数据,不带事实地位)、不修改 materials/。
隐私:默认不上网
- 数据只在你指定的文件夹里。没有默认云同步,没有遥测。
core运行时依赖不含任何网络库。AI 分析只用宿主已有的模型(插件通过宿主提供的模型接口发请求,不额外配 key、不自己写 HTTP 客户端)。宿主没有配模型,分析按钮就用不了,其它功能照常。- 没有账号系统,因此也没有「找回密码」——文件丢了就是丢了,请自己备份。
- 导出成可传播的格式(PNG、CHARX、zip)时会要求你填
consent(这张卡的对象是否知情同意)。本地保存、编辑、搜索、生成摘要,一律不要求。
这些事我们不做限制,但你要知道
这个工具可以用来给别人建档案。这件事有风险,而且是那种不会报错、不会崩溃、你事后才知道的风险。所以下面几条我们写在这里,不是藏在设置项里:
1. 记录一个不知情的人,等于在他背后写一本他的传记。
他不会知道里面写了什么,也不知道你怎么描述他。等他哪天看到,那不叫分享,那叫泄露。所以导出前会问你要 consent。你可以勾「虚构」来绕过,但那是给你写小说用的,不是给你骗自己用的。
2. 记录未成年亲属,请尤其小心。 默认会强制设为私有,并禁止导出 PNG——因为 PNG 是最容易被随手转发出去的格式。
3. 关于已故的人 —— 我们不建议这样做,但我们不拦你。
你可以为已经去世的人建卡,status 写 deceased。技术上,它和别的卡没有区别:能编辑、能导出、能进小说、能用在对话里。
但我们明确告诉你:我们建议你不要用已故亲人的卡做长对话。
理由不是道德,是它可能伤到你:
- 他无法同意,也无法撤回。这张卡里关于他的一切,都由你一个人决定。
- 和你以为的相反,这种对话常常让人更难受,而不是更舒服。它太像了,又永远差一点。你会不断调整、不断失望,然后怀疑是不是自己写得不够好。
- 如果你连续几天只想跟这张卡说话,那不是数据问题,也不是用法问题。请停下来,找个人聊聊。
如果只是想留点东西——一句口头禅、一个拿手菜的做法、他讲过的某件事——那很好,那是纪念,不是替代。
体检页会告诉你「库里有 N 张已故的卡」。只给你自己看,不弹窗,不劝阻,不上报。
4. 我们不替你做判断。
没有 if status == deceased: block()。软件替成年人做道德判断,最后一定会判错——它拦不住真正想拦的人,只会拦住那些本来就在犹豫的人。所以这里只有提示、文档、和一句「你自己决定」。
现状
v0.1 已实现:plugin/ 是一个可安装的 DSH 侧边栏插件,导入、访谈、分析、采纳、导出、体检、版本历史全部跑通。1494 项自动化测试 + 15 项对真实 DSH 实例的端到端验收全部通过。
plugin/README.md—— 安装、用法、设计理由plugin/—— 代码(核心零依赖、零网络)SPEC.md—— 数据契约
以下是设计文档:
SPEC.md—— 唯一契约:目录、字段、kind 枚举、五个入口、分析的校验门、快照与撤回策划书.md—— 项目可行性、架构、SillyTavern 互操作、风险策划书-第二部分.md—— 关系网模型、记忆引导、小说模式、路线图使用指南.md—— 字段怎么写、括号怎么用、什么时候该开新世界
v0.1 的目标只有一件事:能进、能看、能记。
- 能进:40 张酒馆卡导入 0 张报错;从零建一张卡能一路走到「勾选 → 写进卡」
- 能问:
lifecard-interviewskill 在对话里问,产出材料与账本 - 能看:Obsidian 直接打开,全文搜、双链、标签
- 能记:
analyze产出的每条断言都能追回原文;勾选才写卡;手写 Markdown 立刻生效
v0.1 不承诺:MCP、DSH 插件、小说模式、手机端。全部推到后面,且明写「暂不支持」,不写「即将支持」。
明确不做
- 不做云端账号与协作
- 不做「AI 自动生成整篇人物传记」
- 不做手机端随手记(技术上不可行:手机浏览器没有文件夹写入 API,详见
SPEC.md§14) - 不做自造的问卷 UI(访谈是 skill,跑在宿主已有的对话框里)
- 不做 Web / PWA 载体(Obsidian 已提供更好的界面,少一个 build target)
- 不做情感计算、不自动打分好感度
- 不做自动改稿(一致性检查只出建议,改不改你定)
- 不做自建知识图谱引擎(那件事交给专门工具,我们只保证数据能被它读)
许可
MIT,见 LICENSE。
如果你打算用它做公开传播的内容,请先读一遍上面「关于记录真人」那一节。
Related plugins
dsh-web (dsh-task-board)
zhu1090093659/dsh-web
dsh-web (dsh-web-all)
zhu1090093659/dsh-web
dsh-web-ui (dsh-task-board)
zhu1090093659/dsh-web-ui
dsh-web-ui (dsh-web-ui-all)
zhu1090093659/dsh-web-ui