你问得正好:这台机器上我把 DSH 的实际安装包 拆开看了(app.asar 里 18000+ 文件、170 多个 @deepseek-ai/* 插件包),下面讲的是你这台机器上真实存在的机制 ,不是宣传话术。版本 0.2.1-rc.2(Electron 44.7.0 壳),当前 profile 是 desktop。
0. 一句话讲清和 Codex 的根本差别
Codex 是一个产品 :固定的 agent loop + 固定的工具集 + 沙箱 + approval。
DSH 是一个可组装的 agent 运行时(harness):连"agent loop"、"压缩策略"、"沙箱后端"、"Web UI"都是插件。你的 profile 就是一张 YAML 的插件树:
yaml
# C:\Users\PC\.dsh\profiles\desktop\package.json
"dsh": { "profile": { "bundles": [
"@deepseek-ai/dsh-base", # 核心:agent loop / fs / shell / 工具
"@deepseek-ai/dsh-web-app", # 加一层:HTTP + 前端 + Web GUI
"dsh-wps-plugin" # 你的 WPS 云文档插件
]}}
然后 cordis.patch.yml 是你的覆盖层 ,最后生效。三层叠加顺序:bundle 层 → 你的 patch → --patch 临时覆盖。
这意味着两件事,是整个 DSH 体验的地基:
- 加能力不用等官方发版,写完 YAML 保存即热加载(你笔记里已验证过)。
- 能力边界可精确裁剪,同一个模型可以配成"只读代码审查员"或"能开浏览器点按钮的 E2E 机器人"。
配套的工程化命令(CLI 层面很硬):
| 命令 | 用途 |
|---|---|
dsh --dump-config |
打印合成后的完整插件树(排查"到底谁生效了") |
dsh --dump-config-schema |
打印插件配置的 JSON Schema(写 YAML 不用猜字段) |
dsh --patch ./x.yml |
一次性叠加实验配置,不污染主 profile |
dsh rescue --from-default-profile web |
profile 改崩了,一键恢复出厂 |
dsh plugin --profile <p> add <pkg> |
用 pnpm 往 profile 里装插件 |
⚠️ 你这台机器上
desktopprofile 被 Electron 独占,CLI 不能--dump-config/boot 它(我试过,报managed exclusively by the Electron application)。要试验配置就建一个新 profile,或用 GUI 的 Plugins 面板。
1. 上下文与"长任务不崩":四层防线(这是 Codex 最弱、DSH 最强的地方)
你的痛点在 Java 全栈项目上会特别明显:一个 Spring 多模块工程,随便读十几个文件就爆上下文。DSH 是四道防线叠着上:
| 层 | 机制 | 表现 |
|---|---|---|
| ① Spill | dsh-spill / spill-policy |
工具输出超预算 → 原文落盘,只回一个"定位符 + 摘要"给我。你看到 Output too large, saved to ... 就是它 |
| ② 裁剪 | compaction-tool-result-pruner |
对历史工具结果做头/中/尾 三段裁剪,不调模型、可重放安全。省钱省时 |
| ③ 压缩 | compaction-basic + token-meter |
token 计量器驱动,到阈值自动 LLM 摘要;/compact 可手动触发 |
| ④ 图像卸载 | compaction-image-offload |
截屏类历史图片换成占位符再重试,不塞爆 vision 预算 |
对你的用法建议 :长任务(升级 Spring Boot 版本、批量改 30 个 Vue 组件)不要一个会话硬扛到底 。用 /compact 在"阶段之间"手动压一次,比让它自动压在中途更干净------自动压缩会把中间的 diff 细节糊掉。
另外 dsh-output-retention 会明确告诉你"保留了什么、省略了什么",比静默截断诚实。
2. 会话是一份事件日志,不是一个聊天框
dsh-session 是 event-sourced (事件溯源):每一次工具调用、审批、模型请求都是不可变事件,落成 JSONL;并且有 session-checkpoint-policy ------ 在每次模型请求前、每个工具有副作用前打语义检查点。
实际收益:
- 崩溃/断电/我卡死 → 会话能恢复到"上一个安全点",不是回到开头。
- 会话可导出 (
session-log-export,带下载对话框)、可做跨会话检索 、可被@session引用。 - Web 侧有 trajectory(轨迹瀑布图) :每个工具耗时一条,一眼看出是
mvn慢还是我瞎试慢。 token-meter+session-stats+turn-outline:每个回合的 token/时长统计(你现在 profile 里performanceUsage: detailed已开)。
跨会话记忆(这块默认没开,但强烈建议你开):
yaml
# cordis.patch.yml 追加
- insert:
- id: session-search
name: '@deepseek-ai/dsh-experimental-session-search'
背后的 session-query-sqlite 是 SQLite FTS5 全文索引 。对你这种"上周那个鉴权 bug 我们怎么改的来着"场景,等于给项目装了长期记忆。配合 @session 引用,可以把旧会话的快照作为标记为不可信的上下文拉进新会话。
3. 权限模型:四档 preset,比 Codex 的 approval 更细
有 /permission 命令(也能在设置里设成新会话默认):
| Preset | 行为 |
|---|---|
read-only |
只读,任何写/改都被沙箱拒 |
workspace-write |
你现在这档。写只允许工作区 + 临时目录,读不限 |
danger-full-access |
全机可写(写 ~/.dsh、装东西时才用) |
auto(EXP) |
无沙箱 ,但每次工具调用前用同一个模型做一次授权审查,审查拒绝的才问你 |
Windows 上的 workspace-write 不是软限制,是 sandbox-windows-acl:受限令牌 + capability SID 写白名单 的真实内核级限制。所以你在 Codex 里习惯的"approval 提示"在这里是两套东西叠加:沙箱(能不能) × 审批策略(要不要问) ,permission-presets 把它们打包成一个下拉框。
auto 那档的取舍很明确:更快、无沙箱、烧额外 token、可能误放行。我建议你只在"纯读代码 + 跑测试"的会话里开,改生产代码别开。
4. Plan / Goal / Todo:三个不同层次,别混用
这是 DSH 独有的三段式,Codex 只有前两个的弱化版:
| 机制 | 生命周期 | 谁驱动 | 适合什么 |
|---|---|---|---|
todo_write |
单回合内 | 我自己维护 | 3~8 步的小任务清单,你能看到进度条 |
/plan → exit_plan_mode |
单回合内,带人工审批闸门 | 我出计划 → 你点批准/驳回 → 批准后我才动手 | 跨层改动、破坏性重构、你不想被"惊喜"的时候 |
create_goal → goal 状态机 |
跨回合,会话级持久 | 系统自动续轮(goal-round-driver) |
"把这个模块升到 Java 21 并全绿"这种要跑几十轮的目标 |
/plan 的用法值得一提,它是个真闸门不是装饰:
/plan
(我进入计划模式,只读不写,出 markdown 计划)
(GUI 弹审批卡:Approve / 我自己改口)
驳回时你的反馈会回到工具结果里,我改完再提交一次。这是你审架构改动的最省力位置------审 20 行计划,比审 400 行 diff 便宜得多。
goal 的细节:max_goal_rounds 可限轮;只有同一个阻塞条件连续 3 轮 才算 blocked;update_goal resume 需要你发话才重新武装(这是防我跑飞)。
5. 并行与委派:三种力度,这是全栈开发的放大器
| 机制 | 上下文 | 适合 |
|---|---|---|
subagent |
全新,只带我写的 prompt | 独立的、可自包含的活("审这个 module 的空指针风险") |
subagent_fork |
继承当前对话 | 基于我们已经聊过的上下文继续("照刚才的方案把这层也改了") |
workflow |
JS 脚本编排几十个 subagent | 批量 × 并行:一个仓库 20 个模块,每个 agent 审一个,结构化返回 |
三者都是 in-process 子 agent,能 send_message 继续对话、interrupt_agent 打断、list_agents 看整棵树;subagent 的设置里还能限递归深度 、并行容量 、子 agent 可选模型(比如子 agent 全用便宜的跑扫描,主线用强模型做决策)。
workflow 是重点,因为它解决"批量"这个真问题
js
// 我写给你看的形态:一个 Spring 多模块仓库的安全+质量双审
phase("扫描");
const mods = ["user-service","order-service","gateway","common"];
const reports = await pipeline(mods,
m => agent(`审 ${m} 模块:SQL 注入、缺失的 @Transactional、N+1 查询。返回 JSON`, { schema: {...}, label: m }),
r => agent(`复核上面这份结论,剔除误报:${JSON.stringify(r)}`, { schema: {...} })
);
关键点:并行无屏障 (pipeline 不等所有人)、结构化 schema 校验 (不是自由文本,进不了幻觉)、脚本里没有 fs/网络 (只能靠 agent 干活,边界干净)、可后台跑。
你的场景里,这一招能一次干完:全模块依赖审计、批量补 JUnit 用例、Vue 组件 props/emits 一致性检查、OpenAPI 与 Controller 签名漂移检测。
6. 后台作业与定时:把"慢"从对话里摘出去
| 机制 | 用法 |
|---|---|
run_in_background + job_output/job_list/job_kill |
mvn clean install、npm run build、pnpm test 全丢后台,我不阻塞,边跑边干别的,完成时我被通知 |
schedule_* |
Host 级持久提醒 ,支持 after_seconds / every_seconds / daily / weekly / cron |
schedule 的本质是"到期往原会话投一条 prompt ",不是外部 cron job。它适合:每天早上 9 点"跑一遍依赖 CVE 扫描并汇报"、每周五"生成这周 diff 的变更说明"。注意:它触发的是新的对话回合,机器关机就错过(重启只补最近一次)。
7. Skills:能力沉淀的最小单元(你已经有 27 个在用)
扫描优先级(5 级,前覆盖后):
| 顺序 | 位置 | 语义 |
|---|---|---|
| 1 | <repo>/.dsh/skills/ |
项目专属 |
| 2 | <repo>/.agents/skills/ |
项目内跨 agent 共享 |
| 3 | customSkillDirs |
配置指定 |
| 4 | ~/.dsh/skills/ |
本机 DSH 专属(你现在 1 个:agent-reach) |
| 5 | ~/.agents/skills/ |
跨 agent 共享(你现在 26 个目录) |
机制要点:
description是唯一路由依据------写"什么时候必须用我",不写功能简介。这决定了我会不会加载它。- 热生效,放文件夹进去,下一次工具调用后 catalog 自动刷新,不用重启。
- 正文里可以
references/挂子文档,按需读,不占常驻上下文。
⚠️ 一个必须提醒你的坑 :你
~/.agents/skills里那 26 个是 Cursor / Codex 的 skill (canvas、autopilot、origin、update-cursor-settings、share、tabbit、new-repo...)。DSH 照读不误,但其中一部分在 DSH 里是半失效的 :origin/share/new-repo依赖 Codex 的云仓库服务,update-cursor-settings改的是 Cursor 设置,canvas/autopilot依赖 Codex 专有运行时。它们现在占着 catalog 位、可能误触发。建议:把通用 的留共享(
create-skill、review、shell),Codex 专有 的挪到~/.cursor/skills或~/.codex/skills,别让两个 harness 互相污染。
8. MCP:本机已经接了一个,这是接你后端世界的口子
dsh-mcp-client 支持 stdio 和 streamable-http,带重连策略(reconnect{enabled,maxAttempts,...})和超时。工具自动挂成 mcp__<serverName>__<tool>,另有 mcp-resources 做资源读取。
你这台机器已经装了 Windows-MCP (21 个工具:截屏、鼠标键盘、注册表、PowerShell、文件系统、进程),会在我需要操作桌面/拿系统信息时用上(沙箱里 Get-CimInstance 被拒,就走它的 PowerShell)。
对你 Java/Vue 栈,值得再接的:
| MCP | 解决的问题 |
|---|---|
| MySQL / PostgreSQL MCP | 让我直接看表结构、跑只读 SQL 验证你的 Entity 和真实 schema 是否漂移 |
| Playwright MCP | 真正的浏览器 E2E,点你的 Vue 页面、读 console、断言 DOM |
| Redis / Kafka MCP | 排查"消息没消费"这类只有运行时才知道的问题 |
| Jira / Confluence MCP | 从需求单直接起活,回写实现说明 |
配置模板(追加到 profile patch 即可热生效):
yaml
- insert:
- id: mcp-mysql
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: mysql # 决定工具前缀
transport: stdio
command: 'C:\...\mysql-mcp.exe'
args: ['--dsn','...']
toolCallTimeoutMs: 60000
9. 内建工具面(我实际拿到的,不是清单宣传)
| 类 | 工具 | 对你有用的点 |
|---|---|---|
| 文件 | read write edit glob grep |
grep/glob 走打包的 ripgrep ,比 Codex 的搜索快且支持 hidden/ignored;read 带行号 |
| 文件策略 | fs-observation-policy |
读后写 (不读不许改)+ 版本守卫(文件被别人改了会拒绝我的编辑,防覆盖) |
| Shell | pwsh |
沙箱内执行;环境里有托管 DSH_* 变量可给脚本用 |
| 网络 | web_search web_fetch |
走 DeepSeek 搜索 provider,不依赖你本机那个坏掉的 TLS |
| 交付 | present |
声明"这是最终产物",GUI 出文件卡(可预览/原生打开) |
| 依赖 | load_workspace_dependencies |
自带 Python + Node + pnpm(含 numpy/pandas/openpyxl/python-docx/python-pptx/Pillow),跑脚本不污染你的环境 |
| 问人 | ask_user_question |
结构化选项提问,比纯文本追问省一轮 |
| 办公 | office-* skills + LibreOffice Kit |
docx/xlsx/pptx 的创建、改、校验、重算公式缓存、渲染成图 |
默认没开但你可以点名要的(这些包都在,只是没进 profile):
| 包 | 给你什么 |
|---|---|
dsh-experimental-terminal-bundle |
让我操作持久 PTY 终端 (mvn spring-boot:run 后保持活着,我能继续往里敲) |
dsh-experimental-tool-worktree |
让我 git worktree 开新树干脏活,主线工作区不受污染(并行改两个 feature 时神器) |
dsh-experimental-agent-team-profile |
Agent 团队:名册 + 互相发消息 + 共享任务 DAG(比 subagent 更接近"多 agent 协作") |
dsh-experimental-session-search |
跨会话全文检索(上面第 2 节) |
dsh-experimental-ralph-bundle |
"重复干活用全新 agent"------适合无脑批量(改 200 个 import) |
dsh-experimental-inspector-profile |
调试 DSH 自己:原始 Session 日志 + Chat 节点检查器 |
10. 多入口:同一套能力,四种外壳(这条很多人不知道)
| 入口 | 命令 | 用途 |
|---|---|---|
| Web GUI(你在用的) | dsh web |
三栏界面,会话树/文件树/终端/浏览器页签/diff 卡 |
| TUI | dsh tui |
纯终端里跑 |
| Headless | dsh headless "跑测试并修失败" |
一次任务、打结果、退出。→ 塞进 Jenkins / GitLab CI / pre-commit 的钩子里 |
| ACP | dsh acp |
Agent Client Protocol over JSON-RPC stdio(Zed 等编辑器可直接把 DSH 当 agent 后端) |
| SDK | dsh sdk |
同上是 stdio JSON-RPC,带 dsh-sdk-protocol 类型定义 → 你的 Java 进程可以 spawn 它、用 JSON-RPC 驱动,把 DSH 当一个"会写代码的子进程"用 |
最后一条对你是真机会:不用等官方 Java SDK,JSON-RPC + newline-delimited 的协议自己写个 Java client 就能把 DSH 嵌进你的内部工具链(比如"运维后台一键让 agent 排查线上日志")。
11. GUI 里最该用的五个地方
- 右侧 changed-files 卡 :每个文件一个 diff 页签 + 整轮对比。审我改的东西在这里审,不要翻聊天记录。
- 右侧文件树 / 终端 / 浏览器页签:文件树能直接开文档预览(Office/PDF/Markdown/代码/图片),浏览器页签是沙箱化的。
- 左侧会话树 + 搜索:多级树、按状态点分组,长项目按 feature 分会话比一个大对话强得多。
@引用 :@文件(模糊匹配工作区)+@会话(历史会话快照,标记不可信)。比你手打路径快。- Plugins 面板 (含 Discover 市场):装/停/重试插件,改配置不改文件。你装 MCP、开实验特性优先走这里,比手改 YAML 安全。
12. 给你的 Java / Vue 具体打法(可照抄)
A. 跨层改动(Controller → Service → Mapper → Vue store → 组件)
/plan ← 我先出计划,你在审批卡上改/批
(批准后)todo_write 挂 6 步,逐步执行
(结束)看右侧 changed-files 卡逐文件审
关键:别让我"边想边改"。这类改动最贵的不是写代码,是"改到一半发现方案错了"。
B. 多模块批量审计
workflow + pipeline:每模块一个 agent 审 + 一个 agent 复核,结构化 JSON 回来。20 个模块 ~几分钟,上下文不炸。
C. 慢命令
mvn -T 4 clean verify / pnpm build 一律 run_in_background,我继续做静态分析,job_output 增量收。
D. 大目标(跨几十轮)
create_goal("把 auth 模块迁到 Spring Security 6 并全绿") + max_goal_rounds。我会自动续轮,你只在 diff 上把闸。
E. 前端联调
装 Playwright MCP,让我真点你的页面;配合右侧浏览器页签看状态。比让我"猜 CSS"强一个数量级。
F. 规范沉淀(性价比最高的一件事)
在项目根 写 AGENTS.md(dsh-agent-instructions 会自动加载,支持 AGENTS.md/CLAUDE.md),写清:包结构约定、Result<T> 统一返回、异常码规范、Vue 用 <script setup> + Pinia 的约定、提交信息格式。这比每次在 prompt 里重复要求有效 100 倍 ,而且 Codex / Cursor / Claude Code 全都认这个文件名。
你现在有一个全局的 AGENTS.md(讲这台机器的环境事实),项目规范要另写一份放在 repo 根,两层会叠加。
G. 团队共享
把项目级 skill 放 <repo>/.dsh/skills/(进 git):比如"生成 XxxMapper.xml"、"按我们的 DTO 规范写 VO"。同事拉代码就有,description 写清触发词即可。
13. Codex 心智对照表(迁移时最容易踩的思维惯性)
| 维度 | Codex 习惯 | DSH 里要改成 |
|---|---|---|
| 能力扩展 | 改配置 + 装 MCP | 同一个 YAML 里加插件行,bundles/patch 两层,热生效 |
| 长任务 | 一个会话硬扛 | /compact 分阶段 + goal 自动续轮 + subagent 隔离 |
| 批量 | 手动重复 prompt | workflow 脚本化 fan-out(这是最大的效率差) |
| 审批 | approval 模式 | /permission 四档,且沙箱是内核级 ACL 不是提示 |
| 计划 | 让它先说 | /plan 是带审批闸门的真模式,驳回会回灌给我 |
| 记忆 | AGENTS.md | AGENTS.md + session search 跨会话检索 + @session 引用 |
| 事件钩子 | hooks.json |
没有。等价物:profile 插件 / skills / AGENTS.md |
| 产物交付 | 说一句"改好了" | present + 右侧 diff 卡(这里有结构化交付) |
| 跑在云上 | 有些任务云端跑 | 纯本地(除 DeepSeek 模型 API 外,全在你机器上) |
14. 这台机器上你需要注意的坑(都是实测)
curl/Invoke-WebRequest必挂 (SchannelSEC_E_NO_CREDENTIALS)→ 联网只能走 Python / pip / pnpm / 我自己的web_fetch。你笔记第 2 节写得很清楚。- 写
~/.dsh会弹授权 (workspace-write 只管工作区)→ 改 profile 时把多个写操作合并成一条命令,少弹几次。 desktopprofile 被 Electron 独占,CLI 不能 dump / boot 它。要试验配置就新建 profile。~/.agents/skills串味(Codex skill 混进 DSH catalog),见第 7 节。- 实验特性默认全关 ,且
auto权限档是 EXP------别在改生产代码的会话里开 auto。 - 改 profile 前先备份 (你已有
cordis.patch.yml.bak-20261020的习惯,保持)。 - 模型 :当前
deepseek-flash+reasoningEffort: high(在 patch 里写死)。真要跑大重构,考虑在设置里临时切到更强档,或给 subagent 单独配模型跑扫描。
如果你只记三件事
/plan用来省你的审阅成本,goal用来扛跨轮长任务,workflow用来吃掉批量 ------ 这三个是 Codex 没有的杠杆。- profile YAML 就是能力清单 ,加/减/换都是改两处文件(
package.json的 bundles +cordis.patch.yml的 insert),热生效,改崩了dsh rescue能救。 - 项目根写
AGENTS.md,比任何 prompt 技巧都值钱。
需要我接着做的话,可以任选(说一句就行):
- 落地配置 :把
session-search+worktree+ 持久终端这三个建议插件写进你的 profile(会弹 1~2 次授权) - 清理 skills :把
~/.agents/skills里 Codex 专有的挪走,只留跨 agent 通用的 - 起一个模板 :给某个具体 Java/Vue 仓库写一份项目级
AGENTS.md+ 2 个团队 skill - 写进文件 :把上面这份整理成
DSH-机制手册.md放工作区,方便以后翻