dsh-skill-dossier
English · 中文
你是不是下载过很多 skills,但到用的时候却总是缺漏? 你是不是坐拥几百种 skills,却忘了它们究竟是用来做什么的?
给 DeepSeek Harness(DSH)用的技能档案与工作汇报插件:把散在 ~/.dsh/skills、.dsh/skills、~/.agents/skills 里的技能收成一份可读、可核对、可保鲜的档案,并把每天的工程简报汇成日报/周报/月报。
一个包,三个板块:
| 板块 | 做什么 |
|---|---|
| 技能 | 浏览、搜索、按方向分类筛选(与档案页同轴)、看详情、一键把 /name 填进输入框;文件夹技能的停用(进 trash,可逆)· 重装 · 删除(一步到位,带二次确认) |
| 档案 | 每个技能的档案:方向(10 类)、使用范围、能力边界、应用场景、来源标注、调用统计、实测成败、目录 token 成本、保鲜复审、评测结论 |
| 汇报 | 只读三个视图:日报(明细)、周报(本周一~周日)、月报(当月)。周报/月报 = 贡献图(一格一天,越深=当天做得越多)+ 每个项目四行,数据源是 reporter/brief/YYYY-MM-DD.md |
汇报
把工作区里散落的每日简报读成三个视图:日报 / 周报 / 月报。
它只读——不改你的任何文件、不留状态、不需要调度器。插件不做复盘、不做导出、不做运行记录:复盘是 agent 该干的事(让它直接读 brief),导出是复制粘贴能替代的,运行记录是给一个不存在的调度器准备的。三者都要额外状态、额外写盘、额外失败面,而日报与区间汇总本身只需要读。
汇报是可选模块:
dataRoot/briefDir可配置,默认读工作区里的reporter/brief/。不去用就只是一块没人点的面板,不影响技能与档案。
数据从哪来
<dataRoot>/<briefDir>/YYYY-MM-DD.md,由 brief skill 负责写。每个 ## 项目名 一个区块,字段名就是解析契约,五个名字不能改:
---
date: 2026-09-11
---
## 项目名
- 作用:一句话说明它是什么
- 实现:技术形态
- 今日进度:
- 一条现状(覆盖写,不是追加流水)
- 待办:
- 最多 3 条
- 问题:
- 只写真卡点
日期取 frontmatter 的 date:,缺失时退回文件名。
三个视图
| 视图 | 区间 | 给什么 |
|---|---|---|
| 日报 | 今天;今天没有简报就回退到最近有数据的一天 | 每个项目的完整明细:作用 / 实现 / 当天全部进度条目 / 待办 / 问题,外加一行统计(N 个项目 · N 条进度 · N 条待办 · N 条问题) |
| 周报 | 本周一 ~ 周日;本周无数据就回退到最近有数据的那一周 | 贡献图 + 每个项目四行 |
| 月报 | 当月 1 号 ~ 今天 | 同上,横轴为整月,而不是挤在一周里 |
回退会明说:用到回退时会标出数据实际来自哪一天 / 哪一周,不会假装今天有记录。
贡献图怎么读
一格一天,颜色越深 = 那天做得越多。
- 深浅口径 = 当天所有项目的进度条目数合计,四档:
≤9/≤29/≤59/>59 - 底色取 DSH 原生蓝令牌(
--dsw-alias-state-business-primary),用color-mix与背景混合出四档 - 悬停能看到那天涉及哪些项目
- 未来的日子不画——那不是「没记录」,是「还没到」
- 区间里没写简报的日历日照样占一格,但是空白:空白 = 那天没写,不是读取失败
为什么区间视图只有四行
作用:这个项目是什么
进度:最后一天写下的那句现状
待办:最后一天记的待办
难点:最后一天记的问题
取「最后一天」而不是「区间内所有」,是刻意的:简报里的 今日进度 本身就是覆盖写的现状,所以区间视图回答的是「这些项目现在各自到哪了」,不是「这周做了什么」——后者翻日报。
为什么是「档案」
建档的目的只有一个:让 AI 和人明白现有 skill 是干什么的。
技能目录里只有名称和描述,看不出边界、场景与新鲜度——人要靠翻文件,模型只能靠猜。本插件给每个技能写一份档案,两边都读得懂:
- 人:档案页按方向筛选,每张卡写清使用范围 / 能力边界 / 应用场景 / 来源 / 调用记录
- AI:模型用
skill_dossier工具按名读档案,在决定加载某个技能全文之前就知道它管什么、不管什么
同类插件大多止步于「列出来、开/关」。本插件多走一步:给技能建档,并且用实测而不是模型自述来核对它。
- 档案字段:方向 / 使用范围 / 能力边界 / 应用场景 / 来源(自创·外来·系统·未标注)/ 建档时间 / 复审时间 / 正文哈希
- 实测成败:监听 DSH 官方的
tools/result事件,skill工具加载成功记 ✅、失败记 ❌ 并留下错误原因——不是「模型说它有用」,而是「它到底跑起来没有」 - 目录成本:估算每个技能名称+描述常驻系统提示的 ≈token 数,回答「谁最占上下文」
- 保鲜复审:按「易变方向 + 长期未用 + 久未复审」排序,直接告诉模型或人「该复审哪几个」
安装
前置:Node ^22.19.0 || >=24.0.0,已装 DSH(npx @deepseek-ai/dsh web 跑过一次即可)。
# npm
dsh plugin --profile web add dsh-skill-dossier
# GitHub
dsh plugin --profile web add github:JeffreySuen-x/dsh-skill-dossier
# 本地目录(开发用)
dsh plugin --profile web add link:/绝对路径/dsh-skill-dossier
本仓库已提交 lib/ 构建产物,git 安装即装即用,不需要授权构建脚本。
模型侧工具
| 工具 | 作用 |
|---|---|
skill_dossier |
读某个技能的档案(方向/使用范围/能力边界/应用场景/调用与实测),加载全文前先判断合不合适 |
skill_archive |
为技能写档案(方向/使用范围/能力边界/应用场景/来源) |
skill_review |
列出待复审技能(保鲜信号排序) |
读档案是按名读的:模型在技能目录里拿到名字,再用
skill_dossier取详细档案——不需要再做一层词法匹配(早期版本的skill_match/skill_route/skill_usage/skill_eval已移除:DSH 把技能目录(名称+描述)直接放进系统提示,由模型自己选,插件再叠一层词法路由没有实测收益——调用分布显示它几乎从未被模型选中。数据仍照记,只是不再单开面板与工具。)
配置
插件 config 全部有默认值,不配置 = 旧行为。写在 profile 的 cordis.patch.yml 里按 id: skill-dossier 覆盖:
- id: skill-dossier
config:
report:
dataRoot: reporter # 汇报数据根目录
briefDir: brief # 每日简报目录
注意:DSH 的 patch 层是整体替换 config 而不是合并,所以覆盖时请把要改的键写全(未写的键会走代码里的默认值)。
从源码重建
pnpm install # 拉构建工具 + 类型依赖(@deepseek-ai/* 为公开包)
pnpm run build # tsc 产出 lib/types + tsdown 打包 lib/index.js、lib/client.js
pnpm run test # 单元 + 集成测试
node qa/gates.mjs # test / typecheck / build / pack 四闸
改完 src/ 后运行 pnpm run build 并提交 lib/,保证仓库自洽(CI 用 git diff --exit-code -- lib 防漂移)。
平台支持
Windows / Linux / macOS。文件生命周期操作按平台生成 pwsh(Windows,用原生 MoveFileExW)或 bash(POSIX)命令;tests/windows-runtime.spec.ts 在 Windows runner 上真机调用验证。
已知边界
- 仅 web profile:host 半硬依赖
webServer服务,headless 装不了。 - 调用统计是观察数据:只统计插件运行期间发生的调用,历史调用无法回溯补记。埋点写盘失败不会打断技能本身,但不再静默——面板顶部会显示「调用统计写盘失败」及原因。
- 删除是两步的封装,不是第二条路径:先移入 trash、再递归删除,两步各自的路径校验与失败回滚都复用;
rm失败时技能还留在 trash 里,仍可重装。非文件系统技能拒绝删除。 - 生命周期移动要求同文件系统:技能条目与 trash 目录跨挂载点时会在改文件前安全拒绝,不做非原子的 copy-delete。
- Windows/Linux 回归已写入 CI,但只有在 GitHub Actions 真绿之后才算「实跑通过」。
许可
MIT
No comments yet. Be the first to write one.