description: "在 agent 运行期间使用你现有的 Claude Code hooks.json 或 settings 钩子配置——阻塞提示词与工具、附加上下文或强制继续——供本桥接的用户与维护者阅读。"
English | 中文
dsh-hooks-claude-code 在 agent(智能体)运行期间执行你现有 Claude Code hooks.json 或 settings 文件中的 command 钩子,无需重写。受支持的钩子会在会话、提示词、工具、停止或子 agent 到达对应时刻时运行。它们可以带模型可见的原因阻塞提示词或工具调用、添加对话上下文,或强制模型再执行一轮。需要在 harness 中复用 Claude Code command 钩子时选择本包;没有 Claude Code 对应物的行为应使用原生插件。
挂载本包并把 configPath 指向你的钩子配置,你已有的钩子就会在 agent 运行中的对应时刻开始触发。在第一个钩子生效之前无需其他设置。
当你持有 Claude Code hooks.json(或 hooks key 存放配置的 settings 文件)、且其中的 command 钩子需要把关提示词、工具与轮次时,使用它。没有 Claude Code 对应物的行为请跳过它:原生插件拥有完整的 harness API,而本桥接只运行参考工具的 command hook 子集。
- name: '@deepseek-ai/dsh-hooks-claude-code'
config:
configPath: ./.claude/hooks.json
pluginRoot: ./.claude/plugins/my-plugin
projectDir: .
| 字段 | 默认值 | 含义 |
|---|---|---|
configPath |
必填 | hooks.json 或 hooks key 存放配置的 settings 文件路径 |
pluginRoot |
— | 替换命令字符串中的 ${CLAUDE_PLUGIN_ROOT} |
projectDir |
会话工作区 | 替换 ${CLAUDE_PROJECT_DIR} 并设置 CLAUDE_PROJECT_DIR 环境变量 |
defaultTimeoutMs |
600,000 |
hook 未设置时的每 hook 超时(即 Claude Code 默认值) |
stderrSummaryMaxChars |
500 |
持久化 hook/result stderr 摘要的字符上限 |
生成的配置目录是每个受支持字段的穷尽式真源。
| 你的钩子 | 运行时机 | 能做什么 |
|---|---|---|
SessionStart |
会话开始时 | 附加该会话中模型可见的上下文 |
UserPromptSubmit |
agent 收到提示词时 | 阻塞提示词,或附加上下文 |
PreToolUse |
工具运行前 | 阻塞工具,或在运行前请求批准 |
PostToolUse |
工具运行后 | 带反馈阻塞结果,或附加上下文 |
Stop |
运行即将停止时 | 带原因强制再执行一步 |
SubagentStart |
子 agent 启动时 | 向仍在运行的子 agent 附加上下文(仅限同进程) |
SubagentStop |
子 agent 结束时 | 只观测——不能阻塞或添加上下文 |
pwd 与相对路径指向你的项目,而非服务器启动目录。${CLAUDE_PLUGIN_ROOT} 与 ${CLAUDE_PROJECT_DIR} 会按你的配置替换,且每个钩子进程都会设置 CLAUDE_PROJECT_DIR。configPath 从启动进程的目录解析。当包级约定不够用时阅读以下页面。它们从共享协议进入桥接设计,以及桥接所面向的扩展点。
SessionStart、已接受提示词、工具后与实时同进程 subagent-start hook 可以添加带源归因的上下文消息;阻塞 Stop hook 将原因添加为下一步 steering(中途引导)。远程 child 注入没有本地目标。
hook 不返回上下文时没有成本。Hook 文本取决于数据,会被记录,并在后续会话请求中重发,直到压缩(compaction)。
仅追加;新可见内容位于可复用请求前缀之后,不会使现有 KV Cache 条目失效。
提供方提供的原因逐字传递。缺失原因时,已拒绝工具变为 Error: blocked by PreToolUse hook,已阻塞工具后反馈精确为 blocked by PostToolUse hook,阻塞 stop 则精确添加 steering continue: blocked by Stop hook;已阻塞提示词不会产生任何模型可见消息,而是以 blocked 结束该轮次。systemMessage 与 updatedInput 会被记录或警告,但在此实现中对模型不可见。
阻塞提示词不会产生该提示词对应的模型请求 token;拒绝或反馈会添加保留的回退或提供方文本;强制 continuation 需要另一个完整请求。
已阻塞提示词不发送请求,不会导致失效。拒绝、反馈与强制 continuation 上下文会追加在可复用前缀之后,不改写前缀。
这些限制描述你的 Claude Code 钩子目前还无法通过本桥接做到的事情,以及行为与参考工具的差异。它们是当前包约束,而非任务积压。
Setup、InstructionsLoaded、UserPromptExpansion、MessageDisplay、PermissionRequest、PostToolUseFailure、PostToolBatch、PermissionDenied、Notification、TaskCreated、TaskCompleted、StopFailure、TeammateIdle、ConfigChange、CwdChanged、FileChanged、WorktreeCreate、WorktreeRemove、PreCompact、PostCompact、SessionEnd、Elicitation 与 ElicitationResult。这些事件的配置会在配置组解析前被忽略,因此不支持的事件既不会使配置失效,也不会注册 hook。比较基线是 Claude Code 官方 hook 事件参考。SessionStart 只支持部分功能——会消费 JSON additionalContext,但不支持纯 stdout 上下文、initialUserMessage、sessionTitle、watchPaths、reloadSkills 与 CLAUDE_ENV_FILE。hook 脱离运行,因此上下文可能错过第一个请求,payload 会省略 model、agent_type 与 session_title 等可选字段。UserPromptSubmit 只支持部分功能——支持阻塞与 JSON additionalContext,但不支持纯 stdout 上下文、sessionTitle 与 suppressOriginalPrompt。除非被覆盖,否则桥接还会使用自身 600 秒默认值,而非 Claude Code 的事件特定 30 秒 command 超时。PreToolUse 只支持部分功能——deny 与 ask 决策可用;allow 不会预审批,defer 不受支持,additionalContext 会被忽略,updatedInput 会被记录 + 警告但不应用(见 pre-tool-input-rewrite Agent Note)。PostToolUse 只支持部分功能——支持阻塞反馈与 JSON additionalContext,但不支持 updatedToolOutput 与 updatedMCPToolOutput,tool_response 会展平为文本。SubagentStart 与 SubagentStop 只支持部分功能——两者均报告常量 agent_type general-purpose,并在 Claude Code 报告父会话的位置使用 child 会话 id。Start 上下文是尽力而为,且只能到达仍在运行的同进程 child;stop 只观测,无法阻塞 subagent 或向其提供上下文。Stop 省略 agent_transcript_path、last_assistant_message、background_tasks 与 session_crons,并始终报告 stop_hook_active: false。Stop 只支持部分功能——阻塞会强制另一个模型轮次,但 stop_hook_active 始终为 false,会省略 last_assistant_message、background_tasks 与 session_crons,且未实现连续阻塞上限。因此,无条件阻塞 hook 会在每个步骤中强制 continuation,除非它自我限制。prompt_id、permission_mode 与 effort,且 transcript_path 永不填充:它始终为空字符串,因为持久化 seam 不暴露产物路径,且默认 zstd 压缩的会话日志无法被 hook 脚本读取。systemMessage 会被记录 + 警告但不呈现;{"continue": false} 会被记录但不会停止运行;suppressOutput、stopReason 与 terminalSequence 不会被应用。http、mcp_tool、prompt 与 agent handler;args、async、asyncRewake、shell、if、once 与 statusMessage 等 command handler 选项不会被遵循。匹配 handler 串行运行且不去重,而 Claude Code 会并行运行并对相同 handler 去重。一个进程级 configPath 会在加载时解析一次;尚未实现 Claude Code 的分层项目、用户、插件与策略发现以及实时重新加载。