dsh-hooks-lite:用配置聲明 DSH 生命週期鉤子

前言

在 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 工作流上,並保持零運行時依賴與可熱重載的文件配置。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜