用 dsh-automation 讓 DeepSeek Harness 按計劃跑獨立編碼任務

前言

在 DeepSeek Harness(DSH)裏寫代碼,很多工作其實不該綁在當前這段對話上。工作日早上覆查一遍本地測試、每週掃一次倉庫健康狀況、過幾小時再驗證一次不穩定失敗——這些任務需要的是一份寫清楚的完整指令,以及一次可以事後檢查的運行結果,而不是十分鐘後回到同一個 Session 裏接着聊。

DSH 自帶的 Core Schedule 適合提醒:例如「十分鐘後回到這個 Session 繼續檢查」。另一類需求則不同:任務必須能獨立理解,每次執行都要落在明確的工作區和權限邊界裏,跑完還要留下記錄。社區插件 dsh-automation 做的就是這件事:把編碼任務按計劃丟進全新的 root Agent 與 Session,而不是在舊對話裏續跑。

本文按插件目錄頁、GitHub 倉庫 README / package.json 以及 DeepSeek Harness 官方倉庫交叉覈對後整理。目錄站點是社區收錄,與 DeepSeek / 幻方沒有官方從屬關係;安裝前仍應自己看源碼和許可證。

這是什麼

dsh-automation 是一款面向 DeepSeek Harness 的工作流與自動化插件,由 titanwings 維護,倉庫爲 titanwings/dsh-automation,許可證 MIT,主要語言 TypeScript。npm 包名是 @dsh-external/dsh-automation,當前版本 0.1.5。社區目錄把它歸在「工作流與自動化」分類,收錄日期爲 2026-08-15;GitHub 倉庫創建於 2026-08-13,截至 2026-08-17 約 45 星。

它解決的問題可以收成一句話:把一份自包含的編碼任務、運行計劃和權限邊界保存下來,每次到期都在全新 root Agent 與 Session 中執行,並留下可審計的運行歷史。

用戶和符合條件的 root Agent 都可以創建、暫停、恢復、立即運行和查看這些規則。真正被調度出去的每一次 occurrence,用的是保存下來的 prompt,而不是創建規則時那段對話的歷史。

DeepSeek Harness 官方倉庫的核心理念是「一切皆插件」(Everything is a Plugin)。dsh-automation 是獨立社區插件,實現基於 DSH 與 Cordis,沒有 patch DSH Core。README 說明產品模型受到 Codex Scheduled tasks 的啓發,尤其是「回到原對話」和「啓動一次獨立運行」的區分;實現本身並不複製 Codex 內部代碼。

核心功能

一個控制面,兩種入口

安裝後不需要再單獨跑一個 bot、daemon 界面或第三方調度器,管理入口有兩個:

  • DSH Web:在對話裏,Chat 和 Trajectory 旁邊有一個「自動化」Tab,用來創建規則、暫停或恢復、立即運行、刪除,以及查看最近運行。
  • 符合條件的 root Agent:用自然語言提出要求。插件提供六個限定範圍的工具,Agent 只能管理自己當前 canonical workspace 裏的規則,不能傳入任意路徑越界。

六個工具及其用途如下:

工具 用途
automation_create 創建綁定當前 workspace 的獨立規則
automation_list 讀取規則、下次 occurrence 和最近歷史
automation_update 修改名稱、prompt、節奏、權限,或切換 active / paused
automation_run_now 按相同邊界排隊一次手動運行
automation_runs 讀取有限數量的運行歷史、錯誤、摘要和 Session ID
automation_delete 刪除規則定義,同時保留持久化的運行記錄

Agent 創建或擴大未來無人值守工作時,插件會額外要求人工確認。只讀查詢,以及僅把規則暫停的更新,不會加這一步。

人能讀懂的運行計劃

規則支持四種節奏:單次、固定間隔、每天、每週。每天和每週使用 IANA 時區(例如 Asia/Shanghai);界面上的友好表單會規範化成經過校驗的 RFC 5545 RRULE,再用於持久化和檢查。

間隔調度有兩個值得注意的約束:最短間隔是五分鐘;創建後不會立刻跑第一次,第一次發生在完整間隔之後。每天 / 每週按該時區的本地 HH:mm 計算;夏令時裏不存在的本地時間會跳過,而不會被平移到下一分鐘。

每次都是乾淨的執行邊界

每次真正 dispatch 的 occurrence 都會拿到:

  • 一個新的 Session ID 和全新的 root Agent
  • 保存下來的 prompt,而不是來源對話的歷史
  • 創建時捕獲的 workspace、cwd、Agent preset、model target 與 permission preset
  • 明確的 automation 消息來源,帶上 automation ID、run ID 和計劃時間
  • 從真實 DSH turn 結束狀態派生的最終結果,而不是把「消息已經送達」當成成功

權限只有兩種:read-onlyworkspace-write。無人值守模式不接受 danger-full-access。每個新 Session 的 approval policy 都是 never:仍需要交互式批准的工具會直接失敗,而不是一直等,也不會靜默提權。

失敗和成功一樣可解釋

一次運行會經歷 queuedrunning,最終進入 succeededfailedskippedcancelled。每條記錄會保留 definition revision、prompt 與目標快照、計劃時間、結果 Session ID、有限長度的摘要,以及結構化錯誤。

修改規則會遞增 revision,所以歷史記錄仍能說明當時執行的是哪一版定義。刪除規則不會立刻抹掉這些運行記錄。保留策略只清理最舊的終態記錄;仍處於 queued / running 的記錄不會被裁掉。

安裝與啓用

社區目錄頁給出的安裝命令是:

dsh plugin add github:titanwings/dsh-automation

dsh CLI 會從 GitHub 解析插件並裝進當前配置。目錄頁同時提醒:如需可復現安裝,應固定 commit 哈希:

dsh plugin add github:titanwings/dsh-automation#commit

#commit 換成實際審閱過的 commit SHA。

倉庫 README 的推薦寫法更具體:這個插件帶 Web 客戶端,需要裝進 DSH Web profile,然後重啓 dsh web。當前可復現的版本 tag 是 v0.1.5

dsh plugin --profile web add github:titanwings/dsh-automation#v0.1.5

如果是從 DSH 源碼目錄運行,把 dsh 換成 pnpm dsh

從本地 checkout 安裝時,需要 Node.js 22.19 或更高版本:

git clone https://github.com/titanwings/dsh-automation.git
cd dsh-automation
pnpm install
pnpm check

cd /path/to/deepseek-harness
pnpm dsh plugin --profile web add /absolute/path/to/dsh-automation

倉庫已隨附構建好的 Host 與 Web bundle。通過 Git 安裝時不會跑包構建腳本,也不需要添加 allowBuilds

插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前請檢查源代碼倉庫和許可證。

典型用法

從 DSH Web 創建

  1. 打開一個已經連接到目標 workspace 的 Session。
  2. 在 Chat 和 Trajectory 旁選擇「自動化」。
  3. 填寫可以獨立理解的任務、schedule、IANA 時區,以及權限邊界。
  4. 正式依賴定時運行前,先點一次「立即運行」,檢查結果 Session 和 run record。

讓 Agent 創建

安裝完成後,符合條件的 root Agent 會拿到上面那組管理工具。README 給出的示例是:

給當前工作區創建一個只讀 automation,名字是“工作日迴歸分診”。
每週一到週五 09:30 在 Asia/Shanghai 運行。檢查最新本地測試證據,
識別迴歸並返回簡短報告。不要修改文件。

一條高質量任務應寫清:目標、要檢查的證據、允許的修改、驗證方式、停止條件。不要寫「繼續我們剛纔討論的內容」或「把所有問題都修好」——定時運行不會繼承創建它的那段對話。

調度與恢復時實際會發生什麼

這些語義來自倉庫 README,0.1 版本按 at-most-once 派發,而不是承諾外部副作用 exactly-once:

情況 行爲
重疊 每條規則同時最多一個 active run;前一次仍在 queued / running 時,到期 occurrence 記爲 skipped(overlap)
Host 延遲重啓 默認 15 分鐘 grace window 內最多補跑最新一次,不會把舊任務重放成寫入 backlog
運行超時 默認 60 分鐘後取消 Agent,並把該次運行記爲失敗
Host 崩潰 恢復時,持久化的 queued / running 會變成 failed(host_interrupted),不會偷偷重跑
重試 只能手動點「立即運行」;沒有可能重複副作用的自動重試

任務啓動時 DSH Host 必須正在運行。0.1 版本不是操作系統 daemon,也不會協調多個 Host 爭搶同一個 storage 目錄。

倉庫內 cordis.patch.yml 的默認配置是:maxConcurrentRuns 爲 2(這是當前 Host 的全局容量,單條規則仍禁止 overlap)、runTimeoutMinutes 爲 60、misfireGraceMinutes 爲 15、historyLimit 爲 200。需要改這些值時,應改 deployment profile 裏的 plugin row。提高併發或超時等於擴大無人值守工作量,應把它當成策略決定,而不是純性能參數。

適用場景與注意事項

倉庫把「值得定時」的任務寫成可重複、有邊界、容易驗證。官方示例包括:

任務 建議權限 做什麼
工作日迴歸分診 read-only 檢查本地測試證據、歸類失敗,在新 Session 裏留下診斷
每週倉庫健康報告 read-only 看陳舊 TODO、依賴清單、被忽略的失敗和測試缺口,不改代碼樹
單次延遲驗證 read-only 稍後重查一次 flaky failure,留下與當前對話無關的證據
生成代碼刷新 workspace-write 重建範圍明確的生成產物,跑聚焦檢查,報告準確 diff
維護修復窗口 workspace-write 復現一個有邊界的問題,做經過驗證的最小修復,滿足驗收後停止

下面幾類目前不適合交給它:任務依賴沒有寫出來的歷史對話;運行中途必須等人批准;應該由文件、HTTP、進程狀態而不是時間觸發。同對話裏的 reminder / heartbeat 仍應使用 DSH Core Schedule。

0.1 版本刻意不提供:raw cron 或任意 shell action、無人值守 full access、對可能已有副作用的自動重試、Git worktree 創建與清理、多 workspace / DAG / 跨 run 隱藏記憶、外部郵件短信或推送,以及外部副作用 exactly-once 保證。當前只實現本機執行。

安全邊界需要單獨強調一次。無人值守編碼的信任範圍比交互聊天更小:運行不會繼承來源對話的 history、inbox、grant 或歷史 approval;fresh Agent 只允許一組精簡的編碼工具,交互問答、計劃、目標、嵌套 Agent、運行時掛載插件、終端 / 後臺任務、遞歸管理 automation,以及未知第三方工具,都會被拒絕;管理 RPC 只接受 loopback。這些約束並不會把所有第三方 DSH 工具自動變成沙箱——前臺 Shell 與網絡行爲仍取決於所選 Agent preset、tool set 和 DSH guards。啓用無人值守寫入前,務必先用「立即運行」看一遍真實行爲。

最後,插件以當前 dsh 進程的權限運行。社區目錄和倉庫都按 MIT 開源,可以免費查看源碼再決定是否安裝;安裝前應檢查倉庫與許可證,需要可復現環境時固定 commit 或版本 tag。

小結

dsh-automation 把「稍後獨立跑完一份編碼任務,並留下可檢查的結果」收進 DSH 自己的 Web 界面和 Agent 工具裏。它不是把舊對話叫醒,而是每次開一個新的 root Agent 與 Session,權限默認收得很緊,運行歷史按 revision 保留。

如果你已經在用 DeepSeek Harness,並且手頭有可重複、寫得清楚、能在只讀或 workspace 寫入邊界內驗收的任務,可以從目錄頁或倉庫按上面的命令裝進 Web profile,先用「立即運行」驗證一次,再打開定時。

  • 目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-automation/
  • GitHub:https://github.com/titanwings/dsh-automation
  • DeepSeek Harness:https://github.com/deepseek-ai/deepseek-harness
羽毛球分组比赛记分
小程序二维码

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

小夜