dsh-goal-gantt:把長任務的階段進度畫進 DSH 會話

前言

跑長任務時很容易丟進度:對話窗口滾了幾十輪,只知道還在做,不知道做到第幾章、還剩多少、每章產出了什麼。dsh-goal-gantt 就是解決這個的客戶端插件,它把一個 goal 切成若干階段,在會話頂部直接給你一面階段級進度看板:當前階段、四個關鍵數字、甘特時間軸和可摺疊階段清單。維護者是 123David-yang,倉庫打了 dsh-plugin topic,可以走插件市場或 CLI 安裝。

下面介紹它是什麼、怎麼裝、怎麼用,以及幾個需要留意的地方。

一、這是什麼

一句話定位:它是 DeepSeek Harness 的 goal 階段級進度看板,不做單次工具調用的軌跡記錄。

它回答三個問題:

  1. 這個 goal 現在走到第幾章?
  2. 每一章做了什麼、產出什麼、還剩什麼沒做?
  3. 距離目標還有多遠(階段數 / 輪次 / 預估時間)?

看板有中英兩套界面,按系統語言自動切換,也能用 ?lang=zh / ?lang=en 強制指定。

二、核心功能

一屏三件事。 頂部是「目標 + 會話 + 總進度」,然後當前階段以大標題加一句話總結的形式佔主導,並給出四個關鍵數字:進度、已用、檢查項、剩餘階段。其餘指標下放到階段清單裏按需展開。

甘特時間軸。 計劃條用虛線、實際條用實線,二者疊加顯示;刻度按跨度自動切換 15 分鐘 / 1 小時 / 6 小時 / 1 天。縮放檔位有四擋:聚焦現在 / 6h / 24h / 全部。「聚焦現在」以進行中階段的時長爲尺度取窗口,逼近邊緣時自動重新取窗,不會跑出視野。

階段可複用。 同一個 id 寫多條配置會合併成一條泳道,每段單獨畫一根條,適合「間斷優化」這類反覆出現的工作。

** Hero 當前階段。** 自動定位進行中的階段,顯示階段名、一句話總結和四個關鍵數字。

階段清單與分組。 每階段一行,展開纔看到摘要、檢查項和產出物,默認只展開進行中的那條。可以按全部 / 進行中 / 未完成篩選,搜索框按 id、標題、摘要匹配,按 / 直接聚焦搜索。分組按進行中 / 未開始 / 已完成三組,已完成默認摺疊。

篩選可分享。 篩選條件和搜索詞寫進 URL(?q=P3&f=active),「複製鏈接」會一併帶上;Hero 右上角的複製鏈接還能給出 #P3 這種直達地址,打開就定位到該階段並展開。

複製摘要與導出 CSV。 一鍵把當前進度複製成 Markdown(狀態圖標 + 階段列表 + 剩餘時間),可直接貼到 issue 或 IM;階段表可一鍵導出 CSV(id / 標題 / 狀態 / 進度 / 計劃與實際時間 / 耗時 / 檢查項 / 摘要),帶 BOM,可直接用 Excel 打開。

交互細節。 點甘特條或階段行會滾到對應階段並高亮,鍵盤 Enter/Space 同樣可用;甘特條和階段行都能 Tab 聚焦,帶 aria-label / aria-controls。滾動時吸頂頭部的進度環與會話選擇器保持可見。相對時間顯示「5 小時前」/「已 2h36m」,展開狀態和分組狀態記在 localStorage。

主題與降級。 淺色主題跟隨系統 prefers-color-scheme,並支持 prefers-reduced-motion;正文與輔助文字對比度均在 4.5:1 以上。

穩定性。 內容指紋(signature)不變時只移動時間游標,不重建 DOM;沒有 goal 的會話顯示空態提示,不會按對話輪次編造階段;標籤頁不可見時暫停輪詢。壞配置(非法時間、缺 id、phases 不是數組、進度越界)都有收斂處理,不會出現 NaN 或負寬度條形。

三、安裝與啓用

方式一是插件市場:倉庫帶了 dsh-plugin topic,會自動進入市場索引,在 DSH Web GUI 的插件頁搜索 goal-board 一鍵安裝。

方式二是 CLI:

dsh plugin add github:123David-yang/dsh-goal-gantt

方式三是手動腳本,適合裝不進市場的環境:

# Windows
pwsh -File scripts/install.ps1

腳本會定位 $env:DSH_HOME/profiles/web(或 ~/.dsh/profiles/web),把插件複製進 node_modules 並註冊 cordis.patch.yml。

裝完重啓一次 DSH,會話頂部會出現「看板」標籤頁。

四、典型用法

安裝後有兩個入口。一是會話頂部的「看板」標籤頁,就在「對話 / 軌跡」旁邊,點開在當前會話內展示,不跳轉、不新開頁面,切換會話時自動跟隨;渲染走 Shadow DOM,樣式與宿主隔離。二是獨立頁面:

http://127.0.0.1:3080/goal-gantt

頁面每 10 秒自動拉一次 /api/goal-gantt,階段狀態變化會實時反映。

階段數據優先從工作區裏的 goal-board/board.config.json 讀取:

{
  "title": "GOAL 甘特看板",
  "phases": [
    {
      "id": "P1",
      "title": "數據採集層",
      "desc": "一句話說明這一章幹什麼",
      "status": "done",                        // done | active | pending | blocked
      "plannedStart": "2026-11-05T00:05:00+08:00",
      "plannedEnd":   "2026-11-05T00:14:00+08:00",
      "startedAt":    "2026-11-05T00:05:40+08:00",
      "endedAt":      "2026-11-05T00:13:30+08:00",
      "summary": "這一章實際做了什麼(顯示在總結卡上)",
      "checks": [{ "label": "子任務", "done": true }],
      "deliverables": [{ "label": "文件", "path": "relative/or/absolute/path" }]
    }
  ]
}

配置默認只對「同一工作區、且當前有 goal」的會話生效;也可以用 sessionId 或 goalId 精確綁定。沒有配置文件時自動降級:先按 goal_round 輪次切分階段,再沒有就按對話輪次切分。階段進度等於 checks 完成比例,沒有 checks 時按狀態估算(done=100 / active=40 / pending=0)。

複用階段就是同一個 id 寫多條:

{ "id": "P8", "title": "時間軸優化", "status": "done",   "startedAt": "...", "endedAt": "..." },
{ "id": "P9", "title": "文檔",       "status": "done",   "startedAt": "...", "endedAt": "..." },
{ "id": "P8", "title": "時間軸優化", "status": "active", "startedAt": "..." }

甘特圖上 P8 會是一行、兩根條。

五、沒有 goal 的會話:對話即項目

沒有 goal 時不只有空態。插件會把對話本身抽象成項目:按空閒間隔切段(默認 20 分鐘沒動靜算新的一段),四個數字換成本段用時、階段數、總跨度、活躍時長;每段標題取該段第一條用戶消息;每段從最後一條助手回覆裏抽取一句「做成了什麼」(純抽取,不調模型)。頂部標記「自動生成」,不僞造進度百分比。全程零 token,只用事件類型和工具名做規則判定,不調用模型。空態只在「連事件都沒有」時出現。

六、性能、數據來源與隱私

性能上,解析只用得上的事件(turn/start、tool/call、消息、goal 變更),體積最大的 tool/result 先行文本過濾、不進 JSON.parse;投影緩存與日誌都按 mtime + size 緩存。作者給的基準(node test/perf.test.mjs):9.5 MB / 20k 事件的會話,冷啓動約 25 ms,熱調用 < 1 ms,已接入 CI。超過 40 條的分組只渲染前 40 條,其餘摺疊爲「顯示更多」。

數據來源:

數據 位置
goal 狀態、輪次、token、輪次大綱 $DSH_HOME/storages/session_projcache/sessions/*.json
精確事件時間線(turn / tool / goal 變更) $DSH_HOME/sessions/<cwd>/<session>/session.v4.jsonl.zstd

會話日誌是多幀拼接的 zstd(每次寫入一幀),Node 原生的 zstdDecompressSync 只解第一幀。插件按幀魔數 28 B5 2F FD 逐幀解壓再合併——README 把這一段標爲最關鍵的兼容邏輯。

隱私方面:默認只讀,不寫會話、不改已有配置;唯一的寫操作是空態裏點「寫入示例配置」,只新建 <工作區>/goal-board/board.config.json,文件已存在時直接拒絕。離線運行,不發任何網絡請求、無遙測,解析結果只在內存裏按 mtime 緩存 1 秒。路由受 DSH 的 connection.requestRejection 信任圍欄保護(Host/Origin + 登錄 cookie)。

七、適用場景與注意

適合跑多階段長任務、需要對外同步進度、以及想在 DSH 裏直接看甘特而不想切到外部工具的開發者。

幾點注意:

  • 插件以當前 DSH 進程的權限運行,能讀到它能看到的工作區與會話數據。安裝前應打開倉庫覈對源碼與許可證(MIT),確認符合自己的安全約定。
  • 兼容範圍是 DSH Web profile、@deepseek-ai/dsh 0.2.x,Node.js >= 22(依賴 zlib.zstdDecompressSync;更低版本會退化爲只讀投影緩存,日誌事件不可用)。Windows / macOS / Linux 均支持,Windows 是主線開發環境。
  • 會話日誌的逐幀 zstd 解壓是版本敏感邏輯,若 DSH 日誌格式變更導致階段事件缺失,可據此定位。
  • 它只讀不寫、完全離線,這點對不想把會話內容外發的團隊是加分項。

短結尾:如果你已經在用 DSH 跑長任務,這個插件的價值在於把「階段進度」這個信號做進會話界面,而不是另開一套跟蹤系統。它不會替你定義目標,只把已有的 goal 或對話結構攤成一張可讀的進度板。

目錄頁:https://www.skillhub.cn/plugins/123David-yang/dsh-goal-gantt

GitHub:https://github.com/123David-yang/dsh-goal-gantt

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

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

小夜