前言¶
CI 紅了之後,常見動作是打開 GitHub Actions,點進失敗的 job,在幾千行日誌裏找真正的報錯。時間戳、容器 id、重試序號會把同一類失敗拆成看起來完全不同的幾段文字,翻完一輪還不一定分得清是測試掛了、依賴拉不下來,還是基礎設施超時。
DeepSeek Harness(dsh)的架構是「一切皆插件」:工具、會話、技能都可以以外掛形式接到智能體循環裏。社區站點 DeepSeek Harness 插件庫 收錄了大量這類插件,它是獨立目錄,與 DeepSeek / 幻方沒有官方從屬關係。其中 dsh-ci-doctor 做的事情很具體:監視 GitHub Actions 上新出現的失敗,把原始構建日誌收成對話裏的診斷卡,並給錯誤做歸一化簽名。
本文依據插件目錄頁、GitHub 倉庫 README(含中文版)、npm 頁面和 DeepSeek Harness 官方倉庫 交叉覈對後整理。
這是什麼¶
dsh-ci-doctor 是一款 DeepSeek Harness 插件,由 jkrandom-sudo 維護,許可證爲 MIT,主要語言是 TypeScript。社區目錄把它歸在「會話與消息」分類;截至 2026-08-18,GitHub 星標爲 3。npm 上當前版本是 0.1.2(2026-08-14 發佈)。
它解決的是「日誌還沒打開,先把失敗說清楚」這件事。插件向智能體註冊兩個工具:ci_watch 負責盯新失敗,ci_diagnose 負責出診斷卡。底層只通過本機已登錄的 GitHub CLI(gh)調用 gh api 讀取狀態,不另配一套 GitHub Token。
核心功能¶
監視新失敗:ci_watch¶
ci_watch 會啓動一個後臺作業,按間隔輪詢 GitHub Actions。第一次輪詢只建立基線,歷史上已經紅掉的運行不會當成新告警。可以顯式傳入 repo,也可以省略,監視當前工作目錄所在倉庫。
README 給出的調用參數形如:
{ "repo": "owner/name", "branch": "main", "intervalSeconds": 30, "timeoutMinutes": 60 }
目錄頁和 README 對行爲邊界寫得很清楚:
- 狀態行隨時可讀,作業可以隨時取消。
- 瞬時錯誤指數退避;連續 5 次失敗則放棄;認證錯誤立即失敗。
- 發現新失敗後,會給出下一步:對對應
repo和runId調用ci_diagnose。
結構化診斷:ci_diagnose¶
ci_diagnose 可以指向某一次運行,也可以默認取最近一次失敗運行。返回的是一張 markdown 診斷卡,出現在對話裏,而不是讓你自己去 Actions 頁面翻日誌。
參數示例:
{ "repo": "owner/name", "runId": 31782742089 }
診斷卡里會包含這些已覈實的內容:
- 歸一化錯誤簽名:掩碼時間戳、十六進制 id 和數字,同一類失敗在不同運行裏得到同一個 id。
- 失敗類別:test / build / lint / typecheck / dependency / network / permission / timeout / infra。
- 嫌疑文件:從日誌裏挖路徑,並自動剔除 vendor 路徑。
- 日誌摘錄:按預算裁剪,用
… (skipped N lines) …標明跳過了多少行,文檔寫明不會編造內容。
倉庫 README 裏的示例卡如下(示例倉庫是 cli/cli,來自項目文檔,不是筆者實測):
## CI diagnosis: cli/cli run #31782742089
**Conclusion:** failure · [run](https://github.com/cli/cli/actions/runs/31782742089)
### Job: Issue Triage (skills-driven)
**Failed steps:** triage
**Signatures:**
- `81a0edf32878` (timeout, first time seen) — server:http_server Session timeout configured…
**Suspect files:** `script/triage.ts`
失敗簽名賬本¶
每個診斷過的簽名會被記住:見過幾次、首次和最近出現時間、最近一次所在倉庫和運行鏈接。復發時報告裏會寫成 seen 3×,而不是當成全新問題。
持久化依賴宿主是否提供 storage domain:有的話寫入 DSH 存儲目錄下的 ci_doctor 單元;沒有則只放在內存裏。配置項 ledgerEnabled 默認開啓。
只讀契約¶
兩個工具按文檔約定只讀 GitHub 狀態,不會 push、合併、取消、重跑,也不會改倉庫內容。每條結果帶 repositoryWrites: false。包裏還導出可選伴隨插件 dsh-ci-doctor/invariant:在提供 invariants 服務的宿主上,如果這個標記丟了會直接報錯。倉庫的 cordis.patch.yml 註明,默認 web/base profile 沒有該服務,所以 invariant 沒有寫進默認補丁,以免卡住啓動。
安裝與啓用¶
社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行:
dsh plugin add github:jkrandom-sudo/dsh-ci-doctor
需要可復現安裝時,按目錄頁說明固定 commit 哈希(把 commit 換成實際哈希):
dsh plugin add github:jkrandom-sudo/dsh-ci-doctor#commit
倉庫 README 另外寫了一種按 npm 包名、指定 web profile 的裝法:
dsh plugin --profile web add dsh-ci-doctor
兩種寫法都能在公開資料裏找到。目錄頁命令以頁面原文爲準;若你平時用 web profile 裝 npm 插件,可以對照 README。
前置條件:本機已安裝並登錄 GitHub CLI:
gh auth login
插件複用這次登錄會話,README 寫明沒有其他必填配置。
可調選項(README 與源碼 src/config.ts 一致):
| 選項 | 默認值 | 含義 |
|---|---|---|
pollIntervalSeconds |
30 | 監視輪詢間隔(秒,最小 5) |
watchTimeoutMinutes |
60 | 單次監視存活時長(分鐘,最小 1) |
maxLogLines |
200 | 每個失敗 job 的日誌摘錄行數(最小 20) |
ghBin |
gh |
GitHub CLI 可執行文件 |
ledgerEnabled |
true | 是否把簽名寫入賬本 |
典型用法¶
裝好後用自然語言即可,README 給出的對應關係是:
- 「幫我盯着這個倉庫的 CI,掛了告訴我」→ 啓動
ci_watch後臺作業。 - 「nightly 構建爲什麼掛了?」→ 對最近一次失敗運行跑
ci_diagnose。 - 「診斷一下 cli/cli 的 31782742089 這次運行」→ 針對指定 run 做定向診斷。
監視發現新失敗後,作業會收尾成調用 ci_diagnose 的下一步,智能體可以接着把診斷卡貼進對話。
適用場景與注意事項¶
比較適合這些情況:
- 日常在 dsh 裏寫代碼,希望 CI 紅燈先變成結構化摘要,而不是先打開 Actions。
- 同一類失敗反覆出現,需要靠歸一化簽名和賬本判斷是不是老問題。
- 只想讀日誌、定位類別和嫌疑文件,不希望插件去改遠程倉庫。
使用前要注意:
- 權限與安全。 目錄頁寫明:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查 GitHub 源碼倉庫和許可證(本插件爲 MIT)。
- 只覆蓋 GitHub Actions。 文檔描述的是通過
gh api讀 GitHub 狀態,不要把它理解成通用的 Jenkins / GitLab CI 診斷器。 - 它不負責修代碼。 工具是隻讀的,不會重跑 workflow,也不會自動提交修復;後續改代碼仍由智能體或開發者完成。
- 依賴本機
gh登錄。 認證失敗會立即退出監視,沒有登錄就談不上輪詢。 - 賬本不一定落盤。 沒有 storage domain 時只在內存裏,進程重啓後復發統計會丟。
- 社區插件,不是官方應用商店貨架。 DeepSeek Harness 官方倉庫強調一切皆插件;本插件由社區維護者發佈,目錄站也是獨立站點。
小結¶
dsh-ci-doctor 把「盯 CI」和「讀日誌」收成兩個工具:ci_watch 只報告基線之後的新失敗,ci_diagnose 把原始日誌收成帶簽名、類別、嫌疑文件和誠實摘錄的診斷卡。對經常在 GitHub Actions 上翻紅燈的 dsh 用戶,它省掉的是打開日誌之前那一輪檢索,而不是替你改倉庫。
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-ci-doctor/
GitHub:https://github.com/jkrandom-sudo/dsh-ci-doctor
npm:https://www.npmjs.com/package/dsh-ci-doctor