dsh-skill-stats:看清每個技能被調用了多少次的 DSH 插件

前言

用 DSH 做智能體開發,技能會越攢越多:早期調試用的、試過一次就放下的、被新寫法取代的。時間一長就說不清哪些還在被真正調用——刪了怕後面用到,留着又成了殭屍文件,全憑印象不好判斷。

dsh-skill-stats 解決的就是這個問題:回放歷史會話日誌加即時訂閱,把每個技能被 skill 工具調用的次數數清楚,幫你決定哪些技能值得保留。下面介紹它的功能、安裝和用法。

這是什麼

dsh-skill-stats 是一個只讀的 DSH 統計插件,當前版本 0.1.0,MIT 許可證。它統計每個技能的調用次數,數據來自兩個通道:

  • 歷史回放:啓動時掃描宿主環境的會話日誌(session.jsonl / session.jsonl.zstd),解析 tool/call 事件中的技能調用
  • 即時訂閱:監聽進行中的工具調用事件,即時累加

插件不修改任何會話日誌或技能文件。

倉庫歸屬需要說明一下:主倉庫是 github.com/chen-zz20/dsh-skill-stats,github.com/omdsh-dev/dsh-skill-stats 只是同步主倉庫的只讀社區鏡像,實際歸屬以主倉庫爲準。

核心功能

  • 調用統計:每個技能的累計調用次數、使用過的會話數、首次/最近調用時間、每次調用的具體時間
  • 會話視圖:單個會話用過的技能列表,可排序,每行帶迷你趨勢圖,展開顯示大圖與每次調用時間
  • 全局面板:當前所有技能(含 0 次使用)的統計表,支持排序、SVG 趨勢圖、1/3/7/30 天範圍篩選、每次調用明細
  • 增量緩存:按文件記錄大小與修改時間(size + mtime watermark),重啓只重放發生變化的日誌,不用每次全量重掃
  • 已刪除標記:技能目錄不再存在於任何工作區或全局技能根目錄時標記爲「已刪除」;刪除判定掃描所有工作區與全局技能根目錄,不限於當前工作目錄
  • 加載態:重放未完成時顯示加載提示,不會把統計中的空快照誤報爲「未使用」

安裝與啓用

先克隆倉庫並構建,再把構建產物以 link 方式加進 profile:

git clone git@github.com:chen-zz20/dsh-skill-stats.git
cd dsh-skill-stats && pnpm install && pnpm run build
dsh plugin --profile web add link:/path/to/dsh-skill-stats

這是 bundle 型插件,會自動加入 profile 的 dsh.profile.bundles 層,無需手動配置行。

依賴方面:package.json 裏 private: true,不走 npm 發佈,所以安裝走 clone 加本地構建。聲明依賴 @deepseek-ai/dsh-home-paths 已發佈至公共 npm registry,pnpm install 直接拉取即可;cordis、schemastery、react 是 peerDependencies,其餘運行時 @deepseek-ai/* 包由宿主環境注入。如果 pnpm 10.19+ 的 minimumReleaseAge 攔截了安裝,倉庫裏已帶 pnpm-workspace.yaml 豁免配置。

統計 API

插件暴露一個統計接口 GET /skill-stats/api/stats,支持三種查詢方式:

GET /skill-stats/api/stats                # 全局(含已刪除技能)
GET /skill-stats/api/stats?scope=current  # 當前在磁盤上的技能(含 0 次使用,無已刪除)
GET /skill-stats/api/stats?sessionId=...  # 單會話技能使用

響應結構如下:

{
  "skills": [
    { "name": "file-dsh-issue", "invocations": 5, "sessions": 2,
      "firstUsedAt": 1786000000000, "lastUsedAt": 1786009000000,
      "deleted": false, "callTimes": [1786000000000, 1786009000000] }
  ],
  "archivedSessionCount": 0,
  "ready": true,
  "updatedAt": 1786010000000
}

幾個字段的含義:

  • ready:啓動重放是否已全部完成;未完成時前端顯示加載態,避免把空快照誤報爲「未使用」
  • callTimes:每次調用的時間戳,升序排列(跨會話彙總按時間而非按會話排序)
  • sessionId 參數:按會話查詢;未就緒的會話會在查詢時按需重放其日誌

本地開發

倉庫提供的開發命令:

pnpm install        # 拉取聲明依賴
pnpm run typecheck  # 類型檢查
pnpm test           # 測試
pnpm run build      # 構建 lib/
pnpm run check      # 全部

注意:typecheck 和 test 需要本機有 DSH 檢出。模塊解析通過 tsconfig.json 的 paths 與 vitest.config.ts 映射到本機檢出路徑(../../.dsh/source/current/...),沒有本機檢出的環境只能安裝運行,跑 typecheck/test 前要先配置好 paths。

適用場景與注意

適合這幾類人:

  • 技能攢了一批、想清理殭屍技能的 DSH 用戶
  • 想看單個會話裏技能使用情況的開發者
  • 需要程序化讀取技能統計數據做進一步分析的場景,直接調上面的 API 即可

幾點注意:

  • 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證(MIT)
  • star / issue / PR 請提交到主倉庫 github.com/chen-zz20/dsh-skill-stats,omdsh-dev 下的只是只讀鏡像
  • 插件只做統計,不修改任何會話日誌或技能文件

小結

經過上面的步驟,技能的使用情況就有了連續的數字依據:哪些高頻使用、哪些一次沒被調用、什麼時候開始沒人用了,都能看數據說話,而不是靠印象決定去留。

  • 社區目錄頁(第三方維護):https://www.skillhub.cn/plugins/omdsh-dev/dsh-skill-stats
  • 主倉庫:https://github.com/chen-zz20/dsh-skill-stats
  • 社區鏡像:https://github.com/omdsh-dev/dsh-skill-stats
羽毛球分组比赛记分
小程序二维码

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

小夜