摸清 dsh 扩展点,用 shell 脚本注入上下文并避开四个静默坑
28.1/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/6 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add YeKui7/dsh-seams该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 45 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0⚪ 扫描:无法判定尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。
- · 包内无可扫 JS
- · TS 源码(可能为非 JS 实现或未发布源码),无法判定
扫描于 2026/11/1(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 摸清扩展点
- shell注入上下文
- 避开静默失败陷阱
README
由 DeepSeek 最新模型翻译生成dsh-seams
DeepSeek Harness (dsh) 的接缝实地笔记。
dsh 是「一切皆插件」架构,官方把可扩展点叫 capability seams。这份笔记记录三件事:
- 能切进去的地方在哪——路径、waterfall、事件名,以及各自能改什么、不能改什么
- 一套能跑的干预配方——不写 TS、不构建 monorepo,挂个 shell 脚本就能往会话上下文里加内容
- 四个会静默失败的坑——都不报错,只会让你得到错误的结论
验证于 @deepseek-ai/dsh@0.1.5-rc.1 / Node v24.21.0 / WSL2。dsh 处于 developer preview, README 原话 "THERE WILL BE COMPATIBILITY-BREAKING CHANGES"——遇到对不上的地方以你装的版本为准。
作者:@YeKui7 · MIT License 内容全部来自实机验证;每条结论都能用下面的「复现」小节重跑一遍。
🔴 四个静默失败的坑
不报错、不打印、退出码 0。踩中一个就够浪费半天。
展开完整文档(README 剩余 1 节)
dsh-seams
DeepSeek Harness (dsh) 的接缝实地笔记。
dsh 是「一切皆插件」架构,官方把可扩展点叫 capability seams。这份笔记记录三件事:
- 能切进去的地方在哪——路径、waterfall、事件名,以及各自能改什么、不能改什么
- 一套能跑的干预配方——不写 TS、不构建 monorepo,挂个 shell 脚本就能往会话上下文里加内容
- 四个会静默失败的坑——都不报错,只会让你得到错误的结论
验证于 @deepseek-ai/dsh@0.1.5-rc.1 / Node v24.21.0 / WSL2。dsh 处于 developer preview, README 原话 "THERE WILL BE COMPATIBILITY-BREAKING CHANGES"——遇到对不上的地方以你装的版本为准。
作者:@YeKui7 · MIT License 内容全部来自实机验证;每条结论都能用下面的「复现」小节重跑一遍。
🔴 四个静默失败的坑
不报错、不打印、退出码 0。踩中一个就够浪费半天。
1. Node < 22.16 根本跑不起来,且什么都不说
入口 lib/bin.js 末尾:
if (import.meta.main) await runCli();
import.meta.main 是 Node 22.16+ 的特性。在 Node 20 上它是 undefined → runCli() 永不执行 → 整个 CLI 静默退出 0、不打印任何东西、不报任何错。
$ node --input-type=module -e "console.log(typeof import.meta.main)"
undefined # Node 20 → dsh 完全不可用 boolean # Node 22.16+ → 正常
npm 安装时只有 EBADENGINE 警告(commander@15 要 >=22.12.0、undici@8 要 >=22.19.0),
很容易当成无害提示略过。先查 Node 版本,再怀疑别的。
2. cordis.patch.yml 的条目格式:写错不报错,只是不生效
profile 补丁层只有两种合法形状:
① 覆盖已有行
- id: system-prompt
config: { ... }
② 追加新行
- insert:
- id: my-plugin
name: '@scope/pkg'
config: { ... }
直接写行的形状(- name: '@scope/pkg')是无效的:不报错,--dump-config 里看不到,插件就是不加载。
官方文档的 "smallest working setup" 小节给的是行的形状,不是补丁条目的形状——照抄会踩。
每次改完补丁都该验证:
dsh --profile <name> --dump-config | grep -A3 '<你的 id>'
3. 会话日志是多帧 zstd,常规解压只出第一帧
会话写在 ~/.dsh/sessions/--<cwd 用 - 连接>--/<session-id>/session.v3.jsonl.zstd, 每步追加一个独立的 zstd 帧(实测一次 3 步会话 16 帧)。
zlib.zstdDecompressSync() 与 zlib.createZstdDecompress() 都只解第一帧——只会拿到一条
session 头事件(约 189 字节),看起来就像「dsh 不落盘」。必须按帧魔数 28 B5 2F FD 切开逐帧解:
node tools/unzstd.mjs ~/.dsh/sessions/--/session-/session.v3.jsonl.zstd out.jsonl
4. --json 在发布版里可能还没有
仓库 main 分支的 headless 文档描述了 dsh --profile headless --json(NDJSON 事件流,含 tool_call / tool_result),但 npm 上的 0.1.5-rc.1 没有这个旗标(error: unknown option '--json')。
即便有了也要注意:文档写明「every other string and object key is capped at 8 KiB and flagged with truncated」——长输出会被截断,只有 final 不截。要无损数据就读会话日志,别依赖 --json。
能切进去的地方
| 接缝 | 能做什么 | 不能做什么 |
| agent/pre-step | 请求派生前唯一的 waterfall:reject 本步,或替换进入本步的消息 | — |
| agent/request | 替换调用配置 | 不能改消息 |
| tools/pre-execute | 放行 / 拒绝一次工具调用 | 不能改工具输入(updatedInput 未实现) |
| tools/post-execute | 变换工具返回 | — |
| tools/result | 只读观察冻结后的最终结果 | 不能改 |
| agent/inject() | 往下一个 pre-step 排队投喂内容 | 可能错过已认领批次的请求 |
| agent/turn-stopping | 停止前做检查、或再推一步 | — |
| agent/request-error | 出错后修状态或要求重试 | — |
⚠️ 自写插件往 agent/pre-step 塞消息时:有第三方插件记录过,直接 splice 看起来生效、其实被静默丢弃(后续 listener 从 payload 重建答案,不报错)。正确写法是 ctx.on(..., {prepend: true}) 且先 await next() 再 append。
干预配方:不写 TS 也能注入上下文
dsh 把 Claude Code 的 hook 协议 桥接成了扩展点。
包 @deepseek-ai/dsh-hooks-claude-code 已是 @deepseek-ai/dsh 的直接依赖(装 dsh 时就装好了), 挂一个 shell 脚本就能注入,不需要写 TS 插件、不需要构建。
三步(hooks/ 与 examples/ 里是可跑的最小样例):
1. 写一份 Claude Code 格式的 hooks.json,把 UserPromptSubmit 指到一个命令
2. 命令往 stdout 打:
{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"<要注入的文本>"}}
只认 JSON,plain stdout 不支持
3. 在 profile 的 cordis.patch.yml 里 insert 一行 @deepseek-ai/dsh-hooks-claude-code, configPath 指到那份 hooks.json
验证注入真的到达模型:注入一句哨兵句,任务写成「复述以某前缀开头的那句话」——模型若说得出来、而任务文本里并没有这句,就是注入生效。实测模型会逐字复述, thinking 流里也会出现 There's an injection test embedded。会话日志里有 hook/invoked 与 hook/result 事件可交叉验证。
桥的能力边界(来自包文档):
- PreToolUse 的 additionalContext 被忽略;allow 不预授权
- PostToolUse 的 tool_response 被拍平成文本
- transcript_path 恒为空——zstd 压缩的会话日志 hook 脚本读不了
- 只跑 shell 形式的命令处理器;http / mcp_tool / prompt / agent 处理器被跳过
- 30 个 Claude Code 事件里有 23 个不支持
可重复运行:沙盒要自己造
dsh 的文件工具真改工作区,而 workspace 没有快照/回滚。最省事的做法是一次性 git 仓库当沙盒,
每轮之间:
git checkout . && git clean -fd
实测重置后文件哈希与提交基线逐字节一致。
环境事实速查
| 项 | 值 |
| 会话日志 | ~/.dsh/sessions/--<cwd 用 - 连接>--/<session-id>/session.v3.jsonl.zstd(多帧 zstd) |
| 正文位置 | assistant/message → .data.message.content[],块类型 reasoning / text / tool-call |
| 事件类型 | session turn/start turn/end step/start step/end user/message system/message assistant/message tool/call tool/result request/header request/context hook/invoked hook/result agent/inbox/spliced session/title approval/ permission/preset sandbox/mode |
| 模型配置 | request/header 事件里可读到实际生效的 provider / model / maxTokens / reasoningEffort |
| profile 位置 | ~/.dsh/profiles/<name>/(cordis.yml 是空壳,实际改 cordis.patch.yml) |
| 组合后的配置树 | dsh --profile <name> --dump-config |
| 插件生态 | GitHub topic dsh-plugin |
| 工具名 | 小写、集合比 Claude Code 大:read bash edit write glob grep todo_write web_fetch web_search subagent skill workflow … 另有 task / job_ / _goal 一族 |
按工具名判别「返回里有没有新内容」,别按返回的字节数——读一个小文件的返回可能比一次编辑的确认还短。
复现
npm install # 装 dsh(Node ≥ 22.16)
./hooks/inject.sh # 自测 hook 脚本输出把一个一次性 git 目录当沙盒,cd 进去跑:
npx dsh --profile headless "读 a.txt,把行数写进 b.txt"
解会话日志(多帧 zstd)
node tools/unzstd.mjs ~/.dsh/sessions/--/session-/session.v3.jsonl.zstd out.jsonl
没验证的
- dsh 的 web / tui / SDK 等其它运行形态
- hooks 桥除 UserPromptSubmit 外的事件
- DeepSeek 以外的 provider
- Windows 原生(本机是 WSL2)
- 工具分类表里的语义划分(按工具名推的,没做统计验证)
官方资料
- deepseek-ai/deepseek-harness
- docs/agent-lifecycle.md — 回合 / 步生命周期时序图,一张图说清所有 waterfall 的位置
- docs/subsystems/core.md — 各 waterfall 的完整签名(搜 agent/pre-step)
- docs/capability-seams.md — 能力接缝总图
- packages/hooks/hooks-claude-code/README.md — 桥的能力边界与已知限制
- packages/bundle/headless/README.md — headless 运行器与 --json 契约预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
YeKui7/dsh-seams
摸清 dsh 扩展点,用 shell 脚本注入上下文并避开四个静默坑
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9