🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

生命周期钩子 KYinCode/dsh-hooks-plugin

DeepSeek Harnessv0.2.15
KYinCode77 天前有提交已提供中文文档扫描:含敏感能力

在智能体与工具事件上自动执行 shell 命令

33.1/100
综合分
3
GitHub 星标
104
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-hooks-plugin
npm 源 · dsh-hooks-plugin 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · dev
暂无时间戳·判据 →
装得上吗[实装验证]✓
静态安装检查通过
未做真实安装
L4 · 真实安装等级说明 →
数据截至 2026/10/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 77 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-hooks-plugin @ 0.2.15
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/20 14:14:05

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 15 处,展示前 14 条)
  • 读取本地文件
    index.mjs:87
    const s = await stat(file)
  • 删除本地文件
    index.mjs:94
    try { await rm(backup, { force: true }) } catch { }
  • 写入本地文件
    index.mjs:95
    try { await rename(file, backup) } catch { }
  • 写入本地文件
    index.mjs:100
    if (logDirReady === null) logDirReady = mkdir(dirname(LOG_FILE), { recursive: true })
  • 写入本地文件
    index.mjs:105
    await appendFile(LOG_FILE, line)
  • 读取本地文件
    index.mjs:335
    text = await readFile(layer.path, 'utf8')
  • 发起网络请求
    index.mjs:577
    const res = await fetch(hook.url, {
  • 写入本地文件
    index.mjs:920
    mkdirSync(dirname(RECENT_FILE), { recursive: true })
  • 写入本地文件
    index.mjs:929
    appendFileSync(RECENT_FILE, JSON.stringify(entry) + '\n')
  • 读取本地文件
    index.mjs:937
    try { text = await readFile(RECENT_FILE, 'utf8') } catch { return }
  • 写入本地文件
    index.mjs:940
    try { await writeFile(RECENT_FILE, lines.slice(lines.length - RECENT_PERSIST_MAX).join('\n') + '\n') } catch { }
  • 读取本地文件
    index.mjs:951
    try { text = await readFile(RECENT_FILE, 'utf8') } catch { return }
  • 读取本地文件
    index.mjs:1314
    const doc = parseSkillFrontmatter(readFileSync(new URL('./skills/dsh-hooks-authoring/SKILL.md', import.meta.url), 'utf8'))
  • 发起网络请求
    client/index.js:101
    const res = await fetch('/dsh-hooks/recent' + qs, { cache: 'no-store' })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-shell@deepseek-ai/dsh-subprocess
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 智能体事件触发命令
  • 工具事件触发命令
  • 配置文件定义钩子

DSH 钩子,Claude Code 风格:在 .dsh/hooks.json 里配置,让智能体和工具的生命周期事件触发 shell 命令

README

由 DeepSeek 最新模型翻译生成
dsh-hooks-plugin | English 为 DeepSeek Harness 提供 Claude Code 风格的 hooks:在智能体 / 工具生命周期事件上运行 shell 命令,配置来自 .dsh/hooks.json(与 Claude Code hooks 兼容的 JSON 结构)。 产品名是 dsh-hooks;npm / GitHub 包名是 dsh-hooks-plugin(dsh-hooks 已被占用)。运行时 API 与日志路径沿用 dsh-hooks 名:~/.dsh/logs/dsh-hooks/dsh-hooks.log 与 GET /dsh-hooks/recent(见下)。 目录 - 特性(v1) - 安装 - 配置示例 - hook 字段 schema - CC 兼容边界 - stdin / stdout 协议(CC 兼容) - 开发 / 验证 - 明确不做(边界) - License 特性(v1) - 四层配置:全局 ~/.dsh/hooks.json → 预设 /hooks.json → 项目 /.dsh/hooks.json → 项目本地 .dsh/hooks.local.json。
展开完整文档(README 剩余 1 节)
dsh-hooks-plugin

| English

为 DeepSeek Harness 提供 Claude Code 风格的 hooks:在智能体 / 工具生命周期事件上运行 shell 命令,配置来自 .dsh/hooks.json(与 Claude Code hooks 兼容的 JSON 结构)。

产品名是 dsh-hooks;npm / GitHub 包名是 dsh-hooks-plugin(dsh-hooks 已被占用)。运行时 API 与日志路径沿用 dsh-hooks 名:~/.dsh/logs/dsh-hooks/dsh-hooks.log 与 GET /dsh-hooks/recent(见下)。

目录

- 特性(v1)
- 安装
- 配置示例
- hook 字段 schema
- CC 兼容边界
- stdin / stdout 协议(CC 兼容)
- 开发 / 验证
- 明确不做(边界)
- License

特性(v1)

- 四层配置:全局 ~/.dsh/hooks.json → 预设 /hooks.json → 项目 /.dsh/hooks.json → 项目本地 .dsh/hooks.local.json。
- CC 兼容 schema 与协议:matcher[] + hooks[] 结构、stdin JSON 输入 / stdout JSON 决策输出,可复用现有 Claude Code hook 脚本。
- 去重规则对齐 CC 2.1.88 hookDedupKey:command = shell+command+if、http = url+if、prompt/agent = prompt+if;同一 key 跨层只执行一次,最后合并层胜出;callback/function 不去重。
- matcher 语义对齐 CC matchesPattern: 全匹配、A|B 管道精确匹配、其余按正则;if 条件支持权限规则语法(Bash(git )、Read(.ts))。
- 事件:PreToolUse / PostToolUse / PostToolUseFailure / UserPromptSubmit / SessionStart / SessionEnd / Stop / SubagentEnd。
- PreToolUse 决策 deny → 官方工具失败卡片(模型看到 Error: )。
- 子代理:默认触发,输入载荷携带 agent_id / agent_type / delegation_depth;可用 subagents: false 关闭;命令在触发者自己的沙箱上下文执行。
- 热重载:项目配置改动自动重新加载(fs.watchFile),无需重启。
- 免重启热升级:安装 dsh-hot-installer 后,dsh plugin --profile web add @ 当场生效,无需重启。
- 浮动控制台按会话隔离:shell.overlay 上的 🔌 Hooks 浮动控制台只显示当前正在查看的会话的 hooks(含该会话子代理触发的记录,带 subagent·dN 角标,行内显示触发工具名);切换会话即随之更新,头部显示 会话·。
- 最近记录持久化:每条 hook 记录写入 recent.jsonl(限 200 条,DSH_HOOKS_RECENT_MAX 可调),插件热升级/进程重启后自动回填——控制台不丢最近历史。
- 日志轮转:~/.dsh/logs/dsh-hooks/dsh-hooks.log 超过 1 MiB(可用 DSH_HOOKS_MAX_LOG_BYTES 调整)自动滚动为 .1 并续写新文件,不会无限增长。
- 交付形态:profile bundle(cordis.patch.yml 自动插行),用 dsh plugin --profile add 安装。
- 随包自带手册:docs/CONFIGURATION.md(配置 / 协议 / 边界全讲清)随 npm 包装入——装完的 agent 可直接 read 它,不必翻源码猜协议。
- 自动注册作者技能:apply() 把包内 skills/dsh-hooks-authoring 注册进技能注册表(global 层),任意 agent 装完即在其 skill 目录看到 dsh-hooks-authoring;加载即得「四条钉死事实 + 配置/决策 JSON + Windows/沙箱边界」索引,深度问题读随包手册。

安装

从 npm 安装(当前 latest 0.2.14)
dsh plugin --profile web add dsh-hooks-plugin

或本地打包
npm pack
dsh plugin --profile web add ./dsh-hooks-plugin-0.2.14.tgz

安装后新会话自动生效;已有(存活)会话也会生效——插件 apply() 会遍历 agents 注册表为已存活会话补线,因此同进程热装/热升级后无需新建会话;进程重启后继续旧会话同样随 agent 重建自动重新接线(agent/created)。已断开的会话不存在的场合只有一种:进程重启后未重新打开旧会话。

给 agent / 写 hook 的人:装完先 skill dsh-hooks-authoring(自动注册,加载即得作者指南),深度看安装包内 docs/CONFIGURATION.md——两者都随包分发,不用碰源码。

配置示例

/.dsh/hooks.json:

{
"PreToolUse": [
{
"matcher": "Read|Write|Edit",
"hooks": [
{
"type": "command",
"command": "echo hook triggered",
"timeout": 5
}
]
},
{
"matcher": "Read",
"hooks": [
{
"type": "command",
"command": "node -e \"process.stdout.write(JSON.stringify({hookSpecificOutput:{hookEventName:'PreToolUse',permissionDecision:'deny',permissionDecisionReason:'blocked'}}))\"",
"if": "Read(private)",
"timeout": 5
}
]
}
]
}

hook 字段 schema

每条 hook 是一个对象,type 决定判别联合(对齐 CC 2.1.88 schemas/hooks.ts)。

command / prompt / agent / http 公共字段

| 字段 | 类型 | 默认 | 说明 |
| type | "command" \| "http" \| "prompt" \| "agent" | — | hook 类型。v1 实现 command 与 http;prompt/agent 依赖外部 LLM/子代理,v1 不做(parseHookConfig 会拒绝未知类型) |
| if | string | 无 | 权限规则语法过滤器(如 Bash(git )、Read(.ts)),仅工具类事件生效;在 spawn 之前匹配 tool_name + tool_input,不匹配则不启动进程 |
| timeout | number(>0) | 60 | 本命令/请求的超时秒数 |
| statusMessage | string | 无 | 纯展示文案:hook 运行时在 spinner/列表里显示的自定义状态消息;有则取代 command/url/prompt 作为 hook 显示名,不参与去重键、不改变执行与决策 |
| once | boolean | false | 为 true 时执行一次后从运行期集合移除 |

type: "command" 专用

| 字段 | 类型 | 默认 | 说明 |
| command | string(必填) | — | 要执行的 shell 命令 |
| shell | "bash" \| "powershell" | bash | shell 解释器;bash 用 $SHELL(bash/zsh/sh),powershell 用 pwsh。是去重键的一部分 |
| async | boolean | false | 为 true 时后台运行、不阻塞主流程 |
| asyncRewake | boolean | false | 后台运行,且退出码为 2 时唤醒模型并注入阻塞错误;隐含 async |

type: "http" 专用

| 字段 | 类型 | 默认 | 说明 |
| url | string(必填,URL) | — | 向其 POST hook 输入 JSON 的地址 |
| headers | object | 无 | 附加请求头;值可用 $VAR_NAME / ${VAR_NAME} 引用环境变量 |
| allowedEnvVars | string[] | 无 | 允许在 header 值里插值的环境变量名白名单;只列出的变量会被解析,其余 $VAR 引用留空 |

type: "prompt" / type: "agent" 专用(v1 不做,schema 对齐 CC)

| 字段 | 类型 | 说明 |
| prompt | string(必填) | 用 LLM 评估的 prompt / 要验证的内容;$ARGUMENTS 占位 = hook 输入 JSON |
| model | string | 指定模型(如 claude-sonnet-4-6);缺省用小模型 / Haiku |

matcher 结构

{
"": [
{ "matcher": "", "hooks": [ , ... ] },
...
]
}

| 字段 | 类型 | 说明 |
| matcher | string | 事件匹配模式:(或空)全匹配;A\|B 管道精确匹配;其余按正则。DSH 工具名小写,精确匹配大小写不敏感 |
| hooks | hook[] | 该 matcher 命中时串行执行的 hook 列表 |

事件 key 限 CC 27 事件名;v1 实际接线:PreToolUse / PostToolUse / PostToolUseFailure / UserPromptSubmit / SessionStart / SessionEnd / Stop / SubagentEnd。

CC 兼容边界

与 Claude Code 的兼容只停留在“配置结构延续 CC 形状 + 协议能自洽表达决策”;不搬运 CC 专属协议面:

- ✅ 配置结构(matcher[] + hooks[]、if、shell、timeout、statusMessage、once)、stdin JSON 输入 / stdout JSON 决策输出、去重键语义 —— 延用,方便理解与迁移。
- ❌ 不注入 CC 专属环境变量(CLAUDE_PROJECT_DIR、CLAUDE_PLUGIN_ROOT 等)——项目根已在输入 JSON 的 cwd 字段,且 DSH 没有插件/技能目录可指向。
- ❌ 不做 ${CLAUDE_PLUGIN_ROOT} 字符串替换、CLAUDE_PLUGIN_OPTION_*、CLAUDE_ENV_FILE 等插件体系机制。
- DSH 内部决策直接消费 waterfall 返回值,stdout JSON 只是让命令 hook 自己表达决策(如 deny)的协议手段,不是“按 CC 输出解析”。

stdin / stdout 协议(CC 兼容)

输入(命令 stdin 单行 JSON): json { "session_id": "...", "cwd": "F:\\project", "hook_event_name": "PreToolUse", "tool_name": "read",
"tool_input": { "path": "..." },
"tool_use_id": "...",
"agent_id": "",
"agent_type": "",
"delegation_depth": 0
}

输出(stdout JSON 决策): json {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow | deny | ask",
"permissionDecisionReason": "denied by ...",
"additionalContext": "..."
}
}

开发 / 验证

- 纯函数单测:node --test test/
- 热装验证(免重启):dsh-hot-installer 已安装时,dsh plugin --profile web add @ 当场生效。
- 文件日志:~/.dsh/logs/dsh-hooks/dsh-hooks.log;最近记录:GET /dsh-hooks/recent。

明确不做(边界)

不实现卸载生命周期、悬空行提醒、会话级配置档、PreCompact/PostCompact、prompt/agent 型 hook、设置页。配置的生命周期 = 它所在目录的生命周期;若某预设报 Cannot find package,通常是该插件包已卸载而预设行仍在,请手动移除对应行或删除预设目录。

License

MIT
预览分享卡片长什么样 ↓KYinCode/dsh-hooks-plugin
分享 · DeepSeek Harness Hub
KYinCode/dsh-hooks-plugin

在智能体与工具事件上自动执行 shell 命令

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部