# dsh-of-your-own **别的 agent 把你养大的。DSH 只是接过了抚养权。** [![tests](https://img.shields.io/badge/tests-104%2F104-3FB950?style=flat-square&labelColor=black)](tests) [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&labelColor=black&logo=typescript&logoColor=white)](https://www.typescriptlang.org) [![dsh](https://img.shields.io/badge/dsh-0.1.2--alpha.1-orange?style=flat-square&labelColor=black)](https://github.com/deepseek-ai/deepseek-harness) [![license](https://img.shields.io/badge/license-MIT-white?style=flat-square&labelColor=black)](LICENSE) [English](README.md) | [简体中文](README.zh-CN.md)
--- > [!IMPORTANT] > **没错,命令就叫 `/fuck`。** > > 你花了六个月教 Claude Code:回复用中文、别写小作文、用 `rg` 别用 `grep`。你把 Codex 调教到不敢乱碰 `package-lock.json`,还给 pi 写了专属 AGENTS.md。然后你打开 DeepSeek Harness,它像公交站里偶遇的陌生人一样跟你打招呼。 > > 那一刻,你敲下了 `/fuck`。命令名来自那个瞬间。 ## 问题在哪 每个 agent 都自带失忆。你被迫把同样的偏好、同样的工具习惯、同样的"求你别再写论文了"——一遍一遍教给每一个新 harness,直到永远。你的对话历史是一部没人读的传记。 **dsh-of-your-own 会读。** 全都读。并行地读。然后把你整个人原生地搬进来。 ``` /fuck │ ├─ 并行扫描 ── ~/.claude/projects/** (Claude Code 会话) │ ~/.claude/history.jsonl (全局 prompt 日志:slash 命令金矿) │ ~/.codex/sessions/** (Codex rollout) │ ~/.pi/agent/sessions/** (pi 会话) │ ~/.omp/agent/sessions/** (omp 会话) │ ├─ 记忆文件 ── ~/.claude/CLAUDE.md (你亲笔写的规则) │ ~/.codex/AGENTS.md (你的 Codex 操作手册) │ ~/.gemini/GEMINI.md (Gemini CLI 上下文) │ ~/.cursor/rules/*.mdc (Cursor 规则,自动剥 frontmatter) │ ~/.cursor/agents/*.md (Cursor agent markdown) │ ├─ 分析 ───── 工具习惯(大小写合并)· slash 命令 · 工作目录 · 回复语言 │ ├─ 综合偏好 ── LLM 生成偏好要点(缺省用确定性模板兜底——不用 API key) │ └─ 原生迁移 1. 托管块 → ~/.dsh/AGENTS.md ← DSH 每次会话自动加载。卸载插件后依然记得你。 2. profile.json → ~/.dsh/of-your-own/ 3. systemPrompt.section() 注入 ← 本会话立刻生效 ``` **迁移是原生的。** 你的偏好落进 `~/.dsh/AGENTS.md`——DSH workspace-context 开机就加载的用户全局指令文件,和其他指令文件走同一条加载通道。明天卸载这个插件,记忆还在。 ## 太长不看版 | 你想要 | 运行 | 会发生什么 | | :--- | :--- | :--- | | **全套** | 安装后在 DSH 会话里敲 `/fuck` | `~/.dsh/AGENTS.md` 托管块 + `profile.json` + 命令存根 + 提示词注入 | | **看看学到了啥** | 让 agent 调用 `my_profile` | 完整的偏好章节,随叫随到 | | **重新认识我** | `my_profile` 带 `{ refresh: true }` | 重扫、重建、原地更新托管块——不会重复 | | **列出迁移的命令** | 让 agent 调用 `my_commands` | 从其他 harness 挖出来的每一个 slash 习惯 | | **找没做完的活儿** | `/sessions` | 所有 harness 会话的编号清单,最新的排前面 | | **接管一个任务** | `/resume 3`(或 id、标题片段) | 交接简报注入——当前 agent 接着干那个外来任务 | | **被审判** | 自动的 | `/fuck` 之后附赠一份傲娇鉴定报告,点评你的整部 agent 史 | | **一键失忆** | `/forget` | 剥掉托管块、删掉档案——干净的退出门,幂等 | ## 安装 需要 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) `>=0.1.2-alpha.1`(包里声明了 `dsh.bundle`,`dsh plugin add` 才会把这一层真正编进配置树)。`0.1.2-alpha.1` 是当前 GitHub tag(`dsh-v0.1.2-alpha.1`),还没上 npm,请从该检出运行 DSH。 ```bash # 本地检出 git clone https://github.com/LaplaceYoung/dsh-of-your-own.git cd dsh-of-your-own pnpm install pnpm build dsh plugin --profile web add "$(pwd)" ``` ```bash # 或者直接从 GitHub 装(pnpm ≥10 必须放行 prepare/build 脚本) dsh plugin --profile web add github:LaplaceYoung/dsh-of-your-own ``` 如果 git 安装被拒绝,把 pnpm 打印的包名写进该 profile 的 `pnpm-workspace.yaml`: ```yaml allowBuilds: '@dsh-external/dsh-of-your-own': true ``` 再跑一遍 `add`。然后确认层已经在组合树里: ```bash dsh --profile web --dump-config # 找 "# == @dsh-external/dsh-of-your-own" ``` 用 profile 自己的 `cordis.patch.yml` 覆盖旋钮(后层整行替换,想保留的 key 都得重写): ```yaml - id: dsh-of-your-own name: '@dsh-external/dsh-of-your-own' config: provider: deepseek-official # LLM 偏好综合(可选——缺省走确定性模板) model: deepseek-v4-flash maxFilesPerSource: 50 # 每个 harness 扫最新的 N 份会话 agentsMdPath: ~/.dsh/AGENTS.md # 原生落点 ``` ## 用法 ``` /fuck # 全量迁移:并行扫描 → 分析 → 原生迁移 /sessions # 列出所有 harness 里可续跑的会话,最新的排前面 /resume <#|id|标题片段> # 把那个外来任务连上下文一起交给当前 agent /forget # 擦掉本插件写过的一切(托管块 + 档案),幂等 ``` 真实 DSH Web UI 截图(插件已挂载)。`/fuck` 完成迁移,**并且**附赠傲娇鉴定报告——等级、 修炼流派、作息直方图、主战场全都有。结语按档案哈希从四条变体里选(配了 LLM 时由模型亲自 撰写),同样的历史永远挨同样的训: ![/fuck 在 DSH Web UI —— 迁移完成 + 用户鉴定报告](docs/shots/fuck.png) `/sessions` 编目所有 harness 里可续跑的会话,最新的排前面: ![/sessions 在 DSH Web UI —— 续跑清单](docs/shots/sessions.png) `/resume <#|id|标题片段>` 把某个外来会话重建成交接简报并注入,当前 agent 从它停下的地方 接着干(通过命令面调用后跟随提示)。想退出的时候,`/forget` 剥掉托管块、删掉档案——幂等: ![/forget 在 DSH Web UI —— 隐私逃生门](docs/shots/forget.png) 两个检查工具(模型能调,你也可以直接开口要): | 工具 | 作用 | | --- | --- | | `my_profile` | 查看学到的偏好;`{ refresh: true }` 重新扫描重建档案 | | `my_commands` | 列出从其他 harness 迁移来的 slash 命令及观测次数 | ### 会话接管 —— 你没做完的活儿,在这儿接着干 `/sessions` 并行读完所有 transcript 目录,渲染成一张编号清单(见上方截图——这台笔记本 上有 177 个活跃会话)。 `/resume` 按编号、session id 前缀或标题片段匹配。它把会话重建成交接简报——原始任务、工作 目录、最近指令、停在哪一步、用过什么工具——注入系统提示词,当前 agent 接手即干。简报也会回显 给你,动手前还能改主意。 ## 亮点 | | 特性 | 干嘛的 | | :---: | :-------------------------- | :----------------------------------------------------------------------------------------- | | 🤬 | **`/fuck`** | 一条命令。五个 harness 并行扫完。你带着出厂设置进场。 | | 🎫 | **傲娇鉴定报告** | 扫完附赠点评:等级、出轨记录、修炼流派、本命法器、作息直方图、主战场、夜猫子判定——最后傲娇宣布:不管以前你用谁,今后只有 DSH。 | | 🧹 | **`/forget`** | 一条命令擦掉本插件的全部痕迹:托管块剥除、档案删除。幂等。隐私逃生门已备好。 | | 🪂 | **`/sessions` + `/resume`** | 编目所有外来会话,再把某一个连完整交接简报一起接过来。没做完的活儿,在这儿做完。 | | 🏠 | **原生落点** | 写进 `~/.dsh/AGENTS.md`——DSH 每次开机加载的文件。卸载插件也带不走。 | | 🔁 | **幂等更新** | 托管块用 HTML 标记围栏。随便重跑,块外你自己写的内容一个字不动。 | | 📚 | **读你的规则文件** | CLAUDE.md、Codex AGENTS.md、GEMINI.md、Cursor `.mdc`——你亲笔的话,不只是统计。 | | 🔀 | **真·并行** | 所有源、所有文件、所有记忆文件读取,全并发。笔记本上 88 个会话约 1.6 秒。 | | 🔧 | **工具习惯普查** | 跨 harness 大小写合并:`read×353`,而不是 `read×326` + `Read×27`。你的传记,已量化。 | | 🪄 | **命令迁移** | 在 Claude Code 用过 `/compact`?它变成 DSH 里的迁移存根。肌肉记忆存活了。 | | 🌏 | **语言检测** | 写中文 prompt?DSH 学会用中文回。slash 命令不会干扰投票。 | | 🔌 | **LLM 可选** | 没配模型?确定性模板兜底。全程离线可用,不需要 API key。 | | 🏗️ | **接缝,不是手术** | `ctx.commands` + `ctx.tools` + `ctx.systemPrompt` + `ctx.llm` + `ctx.fs`。agent loop 零改动。 | | 🔒 | **全本地** | 对话记录在本机读,档案在本机存。一个字节都不出笔记本。 | ## 用户评价 > "我对新 agent 敲了 `/fuck`,它已经知道我不爱看长篇大论了。怪瘆人的。" —— 某用户,大概率 > "我的 DSH 现在偏好 `rg` 而不是 `grep`,我可从没告诉过它。它从我的错误里学会了。" —— 另一用户,也挺大概率 > "终于有一个 agent 继承了我的创伤。" —— 每一个给第四个 harness 重新输过偏好的人 ## 别读这个 README 读文档的时代已经过去了。把这段贴给你的 agent: ``` 读一下 https://raw.githubusercontent.com/LaplaceYoung/dsh-of-your-own/main/README.md 然后装好它,在我机器上跑 /fuck。 ``` ## 严肃部分 - **原生,不是外挂** — 迁移目标是 `$DSH_HOME/AGENTS.md`,DSH workspace-context 包每次会话都会加载的用户全局指令文件。不挂这个插件,记忆也在。 - **幂等且克制** — 托管块用 `` 标记围栏;重跑原地替换,块外你写的内容永远不动。 - **接缝,不是手术** — 只用文档化的 cordis 扩展点:`ctx.commands`、`ctx.tools`、`ctx.systemPrompt.section()`(旧宿主回退 `context()`),可选 `ctx.llm` / `ctx.fs`。不打骨架补丁,不加热路径开销。 - **不需要 key** — 偏好综合缺省退化为确定性模板;统计层(频率、语言、迁移)永远不需要 LLM。 - **隐私** — 对话记录在本机读取、降维成统计和偏好摘要后落盘。不上传任何地方。 ## 开发 ```bash pnpm test # 104 个测试,7 个 spec——解析器、会话接管、鉴定报告、分析、持久化、插件集成、DSH 清单 pnpm typecheck # tsc --noEmit pnpm build # tsc → lib/ ``` ``` src/ sources.ts # 适配器:Claude Code / Codex / pi / omp 会话、history.jsonl, # 以及原生记忆文件(CLAUDE.md、AGENTS.md、GEMINI.md、Cursor 规则) analyze.ts # 频率统计(大小写合并)+ LLM 偏好综合 + 档案组装 store.ts # 档案持久化 + ~/.dsh/AGENTS.md 托管块幂等写入 sessions.ts # 会话接管:transcript → 可续跑会话记录 + 交接简报 report.ts # 傲娇鉴定报告:等级、修炼流派、作息直方图、LLM 撰写结语 index.ts # 插件入口:/fuck、/sessions、/resume、my_profile、my_commands、启动时记忆回读 tests/ # vitest:解析器、会话、鉴定报告、分析、持久化、插件集成、DSH 清单 ``` ## License MIT — 见 [LICENSE](LICENSE)。