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-statsgithub.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.jsonprivate: true,不走 npm 发布,所以安装走 clone 加本地构建。声明依赖 @deepseek-ai/dsh-home-paths 已发布至公共 npm registry,pnpm install 直接拉取即可;cordisschemasteryreact 是 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.jsonpathsvitest.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
羽毛球分组比赛记分
小程序二维码

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

小夜