前言¶
在 DSH 裏跑工程類任務,任務清單往哪放是個現實問題:拆出來的 Epic、Story、Ticket 散在對話裏,換一輪對話就得重新對齊;放進倉庫裏的 Markdown 文檔,模型每輪都要重新定位和更新,人也缺少一個集中的視圖。
oh-my-ticket(OMT)的思路是把任務樹做成插件的一等公民:層級存進項目目錄,元數據進 SQLite、正文進 Markdown,模型通過工具創建和推進,人通過 UI 瀏覽和管理,批量執行交給 run 機制兜底。下面介紹它的結構、安裝方式和典型用法。
這是什麼¶
oh-my-ticket 是 rqwj 維護的 DSH ticket 管理插件,MIT 許可,當前版本 0.6.4,README 徽章標註平臺爲 DeepSeek Harness(測試版本 0.1.2-alpha.3)。命名上對應三處:README 標題 Oh-My-Ticket (OMT),npm 包名 dsh-oh-my-ticket,倉庫 rqwj/oh-my-ticket,下文統一稱 OMT。
一句話定位:Epic → Story → [SubStory] → Ticket → [SubTicket] 五級任務體系,SQLite 存元數據與層級關係,Markdown 存正文,ticket 隨項目走,人機共用同一份樹,並提供 run 批量執行。
核心功能¶
五級任務體系與歸屬¶
層級固定爲五級,方括號表示可選:Epic → Story → [SubStory] → Ticket → [SubTicket]。
存儲上雙寫:SQLite 存元數據與層級關係,Markdown 存正文。正文在磁盤上可以直接編輯,手工改動後用 omt_reindex 重建索引即可;SQLite 索引本身已 gitignore,隨時可重建。
歸屬規則:
1、工作區根目錄存在 .omt/ 時,ticket 隨項目走,可直接進 git;
2、否則回退全局 home,解析順序爲插件 config > OMT_HOME > ~/.omt;
3、id 跨 home 全局唯一,創建 Epic 時彈窗選擇歸屬。
運行時配置(home / runtime dir)的解析契約爲參數 > 環境變量 > 默認值,多端一致,由跨層 parity 測試鎖定。
三種 UI 外殼與樹交互¶
同一份 ticket 樹提供三種可切換外殼:
- 左側抽屜(
shell.overlay浮層); - 自由拖拽浮窗;
- OMT Tab:與 Chat | Trajectory 並列,可彈出爲浮窗。
三種外殼共享同一套樹交互:類型徽章(E/S/SS/T/ST)、狀態點、優先級信號條(P1–P3)、搜索、類型/狀態/優先級多選過濾、優先級排序、編號顯示開關。過濾器狀態自動保存到工作區 .omt/ui-filters.json。歸檔是獨立於生命週期狀態的只讀維度。
變更推送走自有 SSE 通道 /omt/events,模型改完 UI 立刻刷新。
文檔詳情與雙向聯動¶
選中節點即在詳情面板打開完整文檔,可執行標題/狀態/優先級/歸檔操作、追加進度記錄;「執行」按鈕把 ticket 引用進輸入框提交執行。
模型與 UI 雙向聯動:輸入 @ 觸發器引用 ticket,輸入框上方出現引用條;每輪對話末尾自動展示相關 ticket 列表。
run 批量執行¶
run 把一批 Ticket/SubTicket 快照成有序批次,交給模型逐項認領、執行、如實報告。item 狀態機爲 pending → running → done / failed / blocked / skipped / interrupted,另有信任策略態 awaiting_confirmation——非 report 的裸 done 需要人在 run 詳情裏確認或打回。run 支持 pause / resume / retry。
兩個設計細節:
1、執行上下文注入:claim 成功即讀取祖先鏈正文作爲只讀背景返回,16 KiB 預算內最近父級優先,截斷顯式標記,單點讀取失敗降級不阻塞;
2、祖先激活:ticket 開工自動點亮仍爲 open 的祖先鏈,done/blocked/skipped 祖先永不重開,歸檔祖先靜默跳過。
UI 側,樹行「▸▸」一鍵加入 run;從 UI 觸發「開始執行」會自動喚醒執行會話進入 claim 循環。
模型工具與內嵌 skill¶
插件註冊 12 個 omt_* 模型工具:
- ticket 操作:
omt_create/omt_list/omt_show/omt_update/omt_move/omt_reindex - run 操作:
omt_run_create/omt_run_list/omt_run_show/omt_run_control/omt_run_claim/omt_run_report
其中 omt_run_claim 原子認領下一項並綁定執行者,返回只讀祖先上下文;omt_run_report 報告單項結果(done/failed/blocked/skipped),note 記入 ticket 進度。
內嵌兩個 skill:omt 教 ticket 體系操作規範與狀態流轉約定,omt-runs 教 run 批次紀律。插件啓用後,完整 OMT 操作規範默認寫入系統提示,不必先 load skill;設置頁可追加約定,並從已裝 skill 中勾選拆票 skill。
安裝與啓用¶
從 npm 安裝已發佈版本:
pnpm dsh plugin --profile <profile> add dsh-oh-my-ticket@0.6.4
也可以在本倉庫構建打包後從本地安裝:
pnpm install && pnpm build && npm pack # 產出 dsh-oh-my-ticket-0.6.4.tgz
pnpm dsh plugin --profile <profile> add /path/to/dsh-oh-my-ticket-0.6.4.tgz
啓用要求目標 profile 的 dsh.profile.bundles 依次爲:
1、@deepseek-ai/dsh-base
2、@deepseek-ai/dsh-web-app
3、dsh-oh-my-ticket
daemon 二進制隨主包以 optionalDependency 自動帶入(@oh-my-ticket/darwin-arm64),也可經 brew / install.sh / GitHub Release 獨立獲取。
安裝或升級後需重啓 dsh web 進程,新版本的工具與 UI 纔會生效。
典型用法¶
先讓項目擁有獨立的 ticket 庫。在項目根目錄執行:
mkdir .omt
.omt/ 隨項目進 git,ticket 庫也就跟着項目走。
之後的日常流程大致是:
1、讓模型用 omt_create 拆出 Epic / Story / Ticket 層級;
2、在樹中選中任務行,「▸▸」加入 run,或由模型 omt_run_create 快照一批 Ticket/SubTicket;
3、從 UI 觸發「開始執行」,執行會話進入 claim 循環;
4、模型逐項 omt_run_claim 認領(返回只讀祖先上下文並激活 open 祖先),完成後 omt_run_report 彙報結果,note 記入 ticket 進度。
如果直接在磁盤上手工改了 Markdown 正文,跑一次 omt_reindex 重建 SQLite 索引。
適用場景與注意¶
適合的場景:在 DSH 裏做多步驟工程任務,需要任務樹持久化進項目、模型和人共用一份任務視圖、批量執行有狀態機與信任策略兜底的智能體開發者。
注意幾點:
- 插件以當前 dsh 進程的權限運行,安裝前建議檢查源碼與許可證(本項目爲 MIT);
- daemon 平臺包目前僅提供
@oh-my-ticket/darwin-arm64; - profile 的
dsh.profile.bundles順序有要求,見上文安裝一節; - 歸檔是隻讀維度;SQLite 索引已 gitignore,可用
omt_reindex重建。
小結¶
OMT 把任務管理收進一個 DSH 插件:五級樹、SQLite + Markdown 雙寫、隨項目進 git,模型側 12 個工具加兩個 skill 約束行爲,人側三種外殼瀏覽管理,批量執行有狀態機與信任策略兜底。源碼與目錄頁在:
- GitHub:https://github.com/rqwj/oh-my-ticket
- 目錄頁:https://www.skillhub.cn/plugins/rqwj/oh-my-ticket
目錄頁爲社區獨立維護的插件目錄,與 DeepSeek / 幻方無官方從屬關係。