前言¶
在 DeepSeek Harness(DSH)裏跑智能體時,常見需求是:工具調用前做攔截、編輯文件後跑 lint、一輪對話結束時發通知。若每次都在插件裏寫 TypeScript 並打包客戶端,成本偏高。Claude Code、Codex 等環境已把「配置驅動生命週期鉤子」做成熟悉模式;DSH 側已有 tools/pre-execute、tools/post-execute、session/event 等接縫,但缺少一個體量小、貼近宿主配置方式的鉤子插件。下面介紹社區插件 dsh-hooks-lite(維護者 xuedipiaofei,分類:工作流),它用 YAML/JSON 聲明 event → shell command,不寫插件業務代碼、不打包 Web GUI、無運行時 npm 依賴。
這是什麼¶
dsh-hooks-lite 的定位是:面向 DeepSeek Harness 的輕量、配置驅動生命週期鉤子。在 cordis.patch.yml 或 $DSH_HOME/hooks.json 裏列出鉤子;宿主在對應事件觸發時用 Node 子進程執行 run 指定的命令,並向 stdin 寫入穩定 JSON 契約,同時注入 DSH_HOOK_* 等環境變量。它不是 .claude/settings.json 的兼容層;需要多 harness 格式時應另選適配器,本插件保持 DSH 原生、可讀的配置形態。
核心功能¶
事件與攔截能力¶
on |
時機 | 能否阻斷 |
|---|---|---|
pre-tool |
模型工具調用前 | 可以:非零退出碼拒絕本次調用 |
post-tool |
工具調用結束後 | 否 |
turn/end |
一輪結束 | 否;可用 when 按 reason 過濾 |
step/end |
一步結束 | 否 |
user/message |
出現用戶角色消息 | 否 |
session/title |
會話標題變更 | 否 |
pre-tool / post-tool 可用 tools 限定工具名;match 用字段路徑到正則(如 args.command);turn/end 可用 when: [error, aborted] 等形式過濾。
配置字段要點¶
id:穩定唯一標識(默認hook-N)。on(別名event)、run(別名command):必填。timeoutMs默認10000;pre-tool超時視同阻斷。cwd:默認插件進程 cwd;session表示會話 cwd。stdin默認true;block對pre-tool默認true(非零退出即拒絕)。enabled、env等見倉庫 README 字段表。
內聯 config.hooks 與文件 $DSH_HOME/hooks.json 可並用;文件鉤子先加載,內聯追加。可通過插件行的 configFile 覆蓋文件路徑(相對路徑相對 $DSH_HOME)。
斜槓命令¶
/hooks:查看已配置鉤子、配置告警與近期運行。/hooks-reload:重新讀取$DSH_HOME/hooks.json(內聯鉤子不變)。
運行環境¶
package.json 聲明 DSH 引擎:>=0.2.1-rc.3 <0.3.0。當前 npm 包版本 0.1.0,許可證 MIT。
安裝與啓用¶
從 npm 安裝到 web profile:
dsh plugin --profile web add dsh-hooks-lite
從 GitHub 安裝:
dsh plugin --profile web add github:xuedipiaofei/dsh-hooks-lite
本地開發路徑安裝示例:
dsh plugin --profile demo add ./dsh-hooks-lite
安裝後 bundle 會插入一條 dsh-hooks-lite 插件行;在 profile patch 裏補充 config.hooks,或單獨維護 $DSH_HOME/hooks.json。
典型用法¶
在 profile patch 中聲明鉤子¶
下面這段來自倉庫 README,展示攔截危險 rm -rf、編輯後 lint、回合完成通知三類鉤子:
- id: dsh-hooks-lite
name: dsh-hooks-lite
config:
hooks:
- id: guard-rm
on: pre-tool
tools: [bash, pwsh]
match:
args.command: 'rm\s+-rf'
run: node hooks/guard.mjs
- id: lint-after-edit
on: post-tool
tools: [edit, write]
run: npm run lint -- --quiet
timeoutMs: 30000
- id: notify-done
on: turn/end
when: completed
run: node hooks/notify.mjs
pre-tool 拒絕調用¶
命令從 stdin 讀取 JSON;pre-tool 非零退出時,stderr(或 stdout)作爲拒絕原因。README 中的 guard 示例邏輯如下:
// hooks/guard.mjs
const payload = JSON.parse(await new Promise((resolve) => {
let body = ''
process.stdin.on('data', (chunk) => (body += chunk))
process.stdin.on('end', () => resolve(body))
}))
if (payload.args.command.includes('rm -rf')) {
console.error('refusing destructive command')
process.exit(1)
}
stdin 載荷示例(字段以實際運行爲準):
{
"source": "dsh-hooks-lite",
"event": "pre-tool",
"eventName": "PreToolUse",
"hookId": "guard-rm",
"sessionId": "session-...",
"cwd": "/path/to/project",
"toolName": "bash",
"args": { "command": "rm -rf build" }
}
環境變量包括:DSH_HOOK_ID、DSH_HOOK_EVENT、DSH_HOOK_CWD、DSH_SESSION_ID、DSH_TOOL_NAME、CLAUDE_PROJECT_DIR。
獨立 hooks.json¶
{
"hooks": [
{
"id": "from-file",
"on": "post-tool",
"tools": ["edit"],
"run": "npm run lint"
}
]
}
默認路徑:$DSH_HOME/hooks.json。
適用場景與注意¶
適合誰:希望在 DSH 裏用 shell/Node 腳本做工具前後檢查、CI 式 lint、會話事件通知,且不想維護完整插件代碼與客戶端 bundle 的開發者。
安全與權限:README 明確說明,鉤子是受信任的主機配置——命令以 DSH 宿主進程權限運行,不在模型工具沙箱內。只啓用自己編寫或審閱過的鉤子;pre-tool 可阻斷工具調用,post/session 鉤子爲 fire-and-forget,不會改變模型輸出。安裝前建議閱讀源碼與 MIT 許可證。
生態說明:DSH 採用「一切皆插件」思路;社區插件目錄爲獨立站點(如 SkillHub 上的條目頁),與 DeepSeek / 幻方無官方從屬關係,本文不將其描述爲官方應用商店。
參考鏈接¶
- 社區目錄頁:https://www.skillhub.cn/plugins/xuedipiaofei/dsh-hooks-lite
- 源碼與文檔:https://github.com/xuedipiaofei/dsh-hooks-lite
經過上面的步驟,你可以在 profile 或 $DSH_HOME/hooks.json 裏用聲明式配置把 DSH 已有生命週期接縫接到日常 shell 工作流上,並保持零運行時依賴與可熱重載的文件配置。