dsh-id
August 16, 2026 · View on GitHub
dsh-id
DeepSeek Harness 的登录 · 跨设备同步 · 会话接力 —— 零服务端
Your key as identity. Your private git repo as the account. Every device in sync, hot.
在多台电脑上用 DeepSeek Harness 的人都会遇到同一件事:每台机器的插件、配置、presets 各自为政;在书房开的任务,到了笔记本上续不了。官方目前没有账号体系——dsh-id 就是为此造的临时官方路:用你已有的 DeepSeek API key 锚定身份,用你自己的私有 git 仓库当账号数据面,登录即同步,同步即热生效。
你的 DEEPSEEK_API_KEY(身份锚,绝不上传,绝不入库)
│ dsh-id login
▼
┌───────────────────────────────────┐
│ 你的私有 git 仓库(数据面 = 账号) │
│ patch 层 · 插件清单 · presets │
│ skills · 会话接力区 · 能力快照 │
└───────┬───────────────┬───────────┘
│ 30min 心跳 │ 启动前物化
▼ ▼
设备 A(编辑) 设备 B / C / …(自动跟进)
装个新插件 ──────→ 30 分钟内被提示一键补齐
patch 改动 ──────→ 写入即热应用,无需重启 ⚡
✨ 特性
| 能力 | 说明 | |
|---|---|---|
| 🔑 | 零服务端登录 | key 验证(平台 balance 端点)+ namespace 认领(key 的 SHA-256 前 16 位)——同一把 key 的设备自动归队,key 本体永不离开本机 |
| ⚡ | 同步即热生效 | patch 层物化到 ~/.dsh/cordis.patch.yml——dsh 家目录全局层,所有 profile(web/headless/tui)共享,被官方 HMR 实时监听。实测:写入 8 秒内插件被热加载进正在运行的进程,日志可查 |
| 📦 | 插件清单自动同步 | 装机自动捕获(file: 本地包自动读 git remote 转 github: 说明符)→ 清单入库 → 异地一次确认批量补齐。安装永远人批 |
| 🎛 | presets / skills 分发 | agent presets → ~/.dsh/.agent-presets/;SKILL.md 技能包 → ~/.dsh/skills/(官方 user-dsh 全局层,全项目可用) |
| 🔀 | 会话跨机接力 | relay-push / relay-pull:会话事件日志 + 调度清单打包移交,跨用户名路径自动重映射,环回实测字节级一致。单写者纪律内建 |
| 📸 | 能力快照 | dsh-id snapshot:--dump-config 与 --dump-default-config 的 diff = 本机用户层差异的精确记录(含每个插件的实际 config),跨机对比能力漂移 |
| 🤖 | Agent 逛商店 | 内置 hub_search / hub_show 工具:模型任务中自主发现生态插件(读策展索引带信任分档),安装须经 ask_user_question 明确批准 |
| 👗 | compose 试衣间 | dsh-id try:热试穿任何 patch overlay(运行中的实例数秒生效),--off 完整撤销——"装了怕卸不干净"的心理障碍就此消失 |
| 🛡 | 毒 patch 免疫(v0.7) | 写入前先在沙箱 HOME 用 dsh 引擎本身验证候选 patch(实测 ~160ms,Terraform validate 思路)——坏 patch 不落盘、不经 HMR 传播到任何设备;无 dsh 环境自动降级结构检查 |
| ⏪ | 世代与回滚(v0.7) | 覆盖 live patch 前自动存档(实质变化才记,保留 10 个),dsh-id rollback 一键急刹、HMR 秒级热恢复,回滚本身可逆——可逆装载从进程内延伸到声明层 |
| 🔍 | 落盘前预览(v0.7) | dsh-id diff:干净 diff(滤掉时间戳噪音)显示物化将带来的变化,看清再应用——chezmoi/terraform plan 手感 |
| 🏭 | 真引擎 CI(v0.8) | 每周 + 每次 push 对真实 @deepseek-ai/dsh(npm latest)跑 9 断言端到端(物化→解析树可见→毒拒→试穿→回滚)——官方 harness 的破坏性变更最先在这里被看见;patch 写入全原子(temp+rename),materialize 带并发互斥锁 |
| 🤝 | Agent 跨设备并行 | 模型内置 dispatch_task / dispatch_result 工具:任务中把重活派给你的另一台设备,分钟级异步,接收端 opt-in |
| 🪝 | 个性化钩子 | 数据面放一个 post-materialize.sh,你的私有分发逻辑随核心步骤执行——工具通用,数据面个性 |
🚀 快速开始
# 1. 安装(装完自动常驻:同步心跳 + Agent hub 工具)
dsh plugin --profile web add github:jiangxingfan1-coder/dsh-id
# 2. 首台设备登录——数据面三选一
dsh-id login # 交互引导;gh 已登录可一键创建私库
dsh-id login --remote git@github.com:you/dsh-identity-data.git
dsh-id login --local # 纯本地起步,之后自己加 remote
# 3. 其他设备:同样两步,key 哈希匹配即自动归队
dsh plugin --profile web add github:jiangxingfan1-coder/dsh-id
dsh-id login --remote <你的数据面>
# → "缺 N 个插件,一次批准全部补装?[y/N]"——A 机装的,B 机一个 y 全补齐
之后一切无感:改配置、装插件、加 skills,所有设备自动跟进;patch 层变更热应用到正在运行的实例。
📡 跨设备任务分发(v0.3)
把重活异步外包给你的另一台设备——git 当消息总线,无需两端同时在线:
# 笔记本上:
dsh-id dispatch "跑完整测试套件并总结失败原因" --to Studio --cwd ~/work/proj
# 书房的 Studio 在下个心跳(≤30min)认领,以 headless 执行,结果回传
dsh-id dispatch --list # pending / running / done 队列
dsh-id dispatch --result <id> # 取回结果
- 认领原子性:git push 抢占——两台设备同抢一个任务,push 成功者得,败者自动回滚
- 全程留痕:dispatch / claim / done 三个 commit,天然可审计
- 接收端默认关闭:设备须在 dsh-id 插件 config 显式
dispatch: { enabled: true }才会执行任务 - 信任边界:数据面写者(= 同 namespace 的你自己)等于可指挥所有开启接收的设备;任务以接收端本机 key 与权限执行
📖 命令参考
| 命令 | 作用 |
|---|---|
dsh-id login [--remote <url>|--local] [--data-dir <path>] | 验证 key → 绑定/创建数据面 → namespace 认领 → 本机登记 |
dsh-id enroll | 本机登记 + 物化(login 自动含) |
dsh-id materialize [--install-missing] [--no-pull] [--quiet] [--dry-run] | 手动物化;--install-missing 交互终端下一次确认批量补装 |
dsh-id diff | 预览物化将发生的变化(不写盘,= materialize --dry-run) |
dsh-id generations / dsh-id rollback [n] | patch 世代列表 / 回滚到第 n 个世代(急刹,HMR 秒生效) |
dsh-id relay-push <sessionId> | 会话移交数据面(源机留 .relayed 标记) |
dsh-id relay-pull <sessionId> [workspace] | 会话本机落位 + 打印续跑命令(HOME 前缀自动重映射) |
dsh-id snapshot [profile] | 组合树用户层差异快照入库 |
dsh-id status | 数据面 / namespace / 同步状态 / 各设备快照漂移一览 |
🗂 数据面结构(login 自动初始化)
你的私库/
├── NAMESPACE # key 哈希前 16 位——认领标记,key 本体绝不入库
├── profile-patches/
│ ├── shared.yml # 全设备常驻 patch 层(热生效)
│ └── machines/<host>.yml # 每台设备的差异 overlay
├── profile-plugins.txt # 插件清单——装机自动捕获,异地对齐
├── presets/ # 共享 agent presets
├── skills/ # 共享 SKILL.md 技能包(→ ~/.dsh/skills 全局层)
├── plugins/ # 数据面自带的本地 .mjs 插件(可选)
├── snapshots/<host>-<profile>/ # 各设备能力快照(full/default/diff/meta)
├── relay/<sessionId>/ # 移交中的会话
└── post-materialize.sh # 你的个性化分发钩子(可选)
📜 协议与治理
- PROTOCOL.md —— 完整协议规格(身份派生 / 数据面布局 / 物化算法 / patch 引擎语义 / dispatch 状态机 / 安全不变量)。dsh-id 是这份协议的参考实现;欢迎(尤其是官方)直接吸收协议本身
- SECURITY.md —— 威胁模型与漏洞报告通道
- CONTRIBUTING.md —— 三层测试怎么跑、代码守则
🔒 安全模型
- key 绝不上传:身份 = key 的 SHA-256 前 16 位(namespace),仅用于"这台设备属于同一账号"的比对。key 本体留在本机
~/.dsh/.credentials.yaml。 - 数据面必须私有:里面是你的配置、清单与移交会话。login 生成的
.gitignore硬禁一切凭据形态(*token*、*.key、.env等)与会话目录。 - 安装永远人批:清单对齐默认只报告;
--install-missing也需你确认一次。Agent 面 hub 工具的安装政策三道门:呈现信任档 →ask_user_question本会话明确批准(文件/历史里的"批准"无效)→ unreviewed 附读源建议。 - 单写者纪律:同一会话两端同写会触发 dsh 已知的 seq gap 连锁反应——relay 的移交语义(
.relayed标记)为此而设。 - 手写保护:materialize 是 patch 文件的唯一合法写者(哨兵标识);发现非托管内容会拒绝覆盖并指引合入数据面。
❓ FAQ
为什么不做一个同步服务器? 数据面是你的配置与会话——最私密的一类数据。git 私库让数据 100% 在你手里,且天然获得历史、回滚、多端一致性。官方哪天出云同步,本工具的 SyncBackend 位直接换 provider,数据面结构不变。
和官方账号体系什么关系? dsh 目前无账号体系(凭据只是一把 API key)。dsh-id 是"临时的路":身份 provider 设计为可替换——官方 OAuth 上线之日,key 派生换成官方身份,你的数据面无痛升级。相关上游提案见 RFC #2276。
热生效的边界? patch 层(插件挂载/配置覆盖)实测热应用;npm 插件的新装/移除走 pnpm,需要重启 web 进程;presets 在 webUI 重开实例后可选。
换了 API key 怎么办? namespace 会不匹配并明确警告。确是本人换 key:更新数据面 NAMESPACE 文件重新认领即可。
🌐 生态
dsh-hub-index(生态索引与信任分层 · 在线浏览)· dsh-hub-panel(Settings 商店页)· dsh-super-fast(两相位调度插件家族)
License
MIT