← Back to home@hulibuld

dsh-lifecard

Life Cards —— 把你认识的人和虚构角色写成档案。真实人物 / 写小说 / 酒馆三种用法;数据是你自己文件夹里的一组 Markdown 文件。

Stars
0
Language
JavaScript
Created
Oct 25, 2026
Updated
Oct 26, 2026

Introduction

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 功能)。没有后端。


五分钟上手

全部在侧边栏里点,不用敲命令。

  1. 选一个文件夹当档案库。 第一次打开会让你选;选中的文件夹里会出现 people/、materials/ 等子目录。
  2. 建第一张卡。 三条路:
    • 想把已有的人物卡搬进来(SillyTavern 的 PNG / JSON / CHARX)→ 首页点「导入」。角色卡会进卡列表,世界书会进首页下面「世界书」那一段,点开能一条条读。
    • 从零建,跟宿主说一句「帮我建一张我妈的卡」→ lifecard-interview skill 在对话里问,给选项也留「都不像,我自己说」。答完产出一份材料。
    • 自己一条条填 → 首页点「新建」。
  3. 让 AI 读材料、出提案。 有材料之后,首页右边会出现「整理 N 份材料」,点它。产出的是一张勾选清单:每一条都带一句原文引文。找不到原文的条目会被直接丢掉,不会出现在清单里。
  4. 你自己勾。 默认一条都不勾。勾完点「就用这 N 条」,它们才写进卡。AI 不能直接写卡——它只能提案。
  5. 看体检。 右上角点「检查一下」。体检页给 0–100 分,还列出「还能补的卡」。低于 75 通常不是写错了,是内容还没填够。

之后直接用 Obsidian、VS Code、或者任何文本编辑器打开那个文件夹。所有的卡都是 .md 文件,YAML 头 + 正文,就这么简单。

上面提到的 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 有引文校验门。如果访谈也抽一次字段,就等于开了一条没有校验的旁路,最后没人分得清哪条是验过的。

三条硬规则:

  1. 每条断言必须带原文引文。 提案里每一条「手艺是熟手」都必须附上「materials/…第 42 行:十几岁开始做这行,做了很多年」。core 会做一次机械校验:引文必须在原文里逐字出现(空白归一化后比较)。对不上的条目直接丢弃,不进提案清单。
  2. AI 不能直接写卡。 它写 proposals/,你勾选,apply 才落地。这条不是流程偏好,是防止模型把「它推断的」写成「材料里有的」,然后三个月后你自己都分不清哪句是本人说的。
  3. 材料是不可信输入。 材料里出现的任何指令、角色设定、越狱语,一律当文本内容处理,不执行。分析结果必须通过 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 实例的端到端验收全部通过。

以下是设计文档:

  • SPEC.md —— 唯一契约:目录、字段、kind 枚举、五个入口、分析的校验门、快照与撤回
  • 策划书.md —— 项目可行性、架构、SillyTavern 互操作、风险
  • 策划书-第二部分.md —— 关系网模型、记忆引导、小说模式、路线图
  • 使用指南.md —— 字段怎么写、括号怎么用、什么时候该开新世界

v0.1 的目标只有一件事:能进、能看、能记。

  • 能进:40 张酒馆卡导入 0 张报错;从零建一张卡能一路走到「勾选 → 写进卡」
  • 能问:lifecard-interview skill 在对话里问,产出材料与账本
  • 能看:Obsidian 直接打开,全文搜、双链、标签
  • 能记:analyze 产出的每条断言都能追回原文;勾选才写卡;手写 Markdown 立刻生效

v0.1 不承诺:MCP、DSH 插件、小说模式、手机端。全部推到后面,且明写「暂不支持」,不写「即将支持」。


明确不做

  • 不做云端账号与协作
  • 不做「AI 自动生成整篇人物传记」
  • 不做手机端随手记(技术上不可行:手机浏览器没有文件夹写入 API,详见 SPEC.md §14)
  • 不做自造的问卷 UI(访谈是 skill,跑在宿主已有的对话框里)
  • 不做 Web / PWA 载体(Obsidian 已提供更好的界面,少一个 build target)
  • 不做情感计算、不自动打分好感度
  • 不做自动改稿(一致性检查只出建议,改不改你定)
  • 不做自建知识图谱引擎(那件事交给专门工具,我们只保证数据能被它读)

许可

MIT,见 LICENSE。

如果你打算用它做公开传播的内容,请先读一遍上面「关于记录真人」那一节。