mole
tw93/Mole开源磁盘清理工具 Mole CLI(mo,支持 macOS 和 Windows)的官方 skill:按 Mole 的 JSON 输出查看磁盘占用、预览并执行清理、查看已安装应用、读取系统健康状态和清理记录。清理前先用 --dry-run 预览并征得同意,卸载应用和需要管理员权限的步骤留给用户在自己的终端里执行。插件只带 skill,CLI 需另外安装。
折叠 DSH 技能目录提示面:KV 缓存稳定渲染 + BM25/bge-m3 混合技能检索 + 可选自动路由提示。
根治「DSH 每轮把全部技能 description 平铺进 prompt 吃 token」问题。
v0.3.2(2026-08-30,否定词过滤 + frontmatter 检索 + 配置持久化):
lib/frontmatter.js(extractMeta 解析 SKILL.md frontmatter YAML 子集 —— category/tags/whenToUse,含 metadata.* 嵌套与扁平 tags:),filterPool 保留 metadata 字段,searchSkills/searchSkillsHybrid 把 frontmatter 词并入 BM25 索引(加权:出现 2 次 > description 的 1 次)。无 frontmatter 的技能检索路径完全不变(poolDocs 逻辑保持等价)。审查接线:宿主 toSummary 不输出 metadata,故检索前经 skills.get(name).path 读 SKILL.md 原文解析合并(enrichPoolWithFrontmatter,进程级缓存,fail-safe)。lib/storage.js(readState/writeState 按 ~/.dsh/settings/ → ~/.dsh/state/ → 进程内内存 逐级降级,任何 fs/JSON 失败不抛错返回默认)。index.js 用之持久化真实 autoRoute 命中统计 {routes: {skillName: count}, lastTs},上限 200 技能名,超出清最旧。v0.3.1(2026-08-30,路由收紧 + 稳定性):
remem 不再误命中 memory,完整 part 才命中)。普通对话的 <skill-route> 噪声大幅减少。v0.3.0(2026-08-30,语义混合 + 自动路由):
skill_search 升级为 BM25 + 本地 bge-m3(Ollama)RRF 混合检索——中文意图可直接命中英文技能(BM25 词面鸿沟补上)。语义索引按内容指纹懒构建 + 落盘缓存(~/.dsh/state/semantic-cache.json),Ollama 离线/超时自动降级纯 BM25,绝不比旧版慢或差。autoRoute,默认开):用户消息明显指向某技能时(aliases 命中或技能名 token 命中),在用户消息尾部追加一行 <skill-route> 提示——用户区本就是动态区,catalog 前缀字节不变,KV 缓存零破坏。无关消息不路由,幂等,fail-safe。semanticEnabled / ollamaBase / embedModel / autoRoute。v0.2.0(KV-cache-stable):静态稳定 catalog(前缀永不变化)+ skill_search 检索工具(按需精准发现)。这是 Deferred loading 模式(Anthropic Tool Search / SkillRouter 同款)——动态裁剪目录文本会破坏 prompt cache 前缀(每轮数万 token 重算,净收益为负),静态 catalog + 检索工具则两者兼得:token 省 + 缓存命中 + 选择精准。
架构评审版规格:
docs/system_design.md(权威,含宿主契约行号 A-F 全章节)
catalog 静态渲染(保缓存前缀)+ skill_search 工具(保选择质量)。
@deepseek-ai/dsh-tool-skill 负责:skill 工具注册、/name 手势注入(L1)、catalog 发布/更新/digest/历史(L2)。ctx.on("agent/pre-step", fn, true)(prepend → 最外层) 挂在瀑布最外层:等 L1/L2 全部完成拿到含全量 catalog 的最终 decision 后,只替换 message.content[0].text(模型看到的渲染),绝不动 message.source.entries(digest 输入)。skill_search(intent) 工具(静态前缀),按意图 BM25 检索(name+description+aliases,中文可命中英文技能),结果追加消息尾部 → 不碰前缀。cordis.patch.yml 会把 skill-folder 插入 profile 组合。package.json 的 dsh.bundle.patch 指向 ./cordis.patch.yml;也可在 profile 自己的 cordis.patch.yml 里按 id: skill-folder 覆盖配置。http://127.0.0.1:11434)+ bge-m3 模型:ollama pull bge-m3。不装也能用——自动降级纯 BM25,功能与 v0.2.0 完全一致,只是少了中英跨语言语义命中。cd dsh-skill-folder
npm install # 只需 @deepseek-ai/schemastery(宿主已内置 cordis/dsh-tools 作 peer)
npm test # node:test,49 条测试,零外部测试依赖
⚠️ 不要禁用
@deepseek-ai/dsh-tool-skill:会导致skill工具消失、/name注入消失,模型无法按名加载技能。本插件与其共存,最小干预 = 最小风险。
id: skill-folder 覆盖)| 键 | 默认 | 说明 |
|---|---|---|
enabled | true | 总开关:关闭则完全不注册监听器 |
core | ["dsh-injection-guard", "dsh-verification"] | P0 常驻:每轮全量描述可见(安全底线,不截断;deny 不能删除 core) |
deny | [] | P3 剔除:精确名或 prefix*;core 技能豁免 |
aliases | 8 技能中文映射 | 意图词→技能:skill_search 检索索引(BM25 加分),中文意图可命中英文技能 |
maxDescLength | 100 | 非 core 技能描述最大长度(core 不受限) |
maxFoldMs | 5 | 裁剪耗时上限(ms),超时仅告警,结果仍应用 |
toolSearchEnabled | true | 注册 skill_search 检索工具(静态前缀,结果追加尾部,不破坏缓存) |
maxDescLength | 100 | 动态条目描述最大长度;core 不受限 |
maxFoldMs | 5 | 裁剪耗时上限(ms),超时仅告警,结果仍放行 |
默认 aliases(键名均为真实存在的技能名——v0.3.3 修掉了 9 个从不匹配的死引用):
{
"dsh-memory": ["记忆", "回忆", "记住", "memory", "remember"],
"dsh-grilling": ["访谈", "对齐", "先问我", "grilling", "问清楚", "开工前"],
"dsh-subagent-orchestration": ["委派", "子智能体", "subagent", "delegate", "openhands"],
"dsh-injection-guard": ["注入", "安全", "不可信", "injection", "外部内容"],
"dsh-verification": ["验证", "检查完成", "防假完成", "verify", "审查", "评审", "code review"],
"dsh-debugging": ["排查", "诊断", "bug", "崩溃", "报错", "异常", "debug", "变慢"],
"cordis-plugin-development": ["插件", "cordis", "plugin", "动态插件", "开发插件", "扩展插件"],
"editing-cordis-compositions": ["编排", "composition", "compose", "cordis.yml", "插件配置", "组合"],
}
core / deny / aliases 的键(技能名)均支持精确名或 prefix* 前缀匹配。
dsh-skill-folder/
├─ package.json # name: dsh-skill-folder, type: module, main: lib/index.js
├─ cordis.patch.yml # profile patch: insert {id: skill-folder, name: 'dsh-skill-folder'}
├─ README.md
├─ lib/
│ ├─ index.js # 插件入口:name/inject/Config/apply + buildSkillSearchTool + pre-step 监听器
│ ├─ bm25.js # 原样 vendor dsh-tool-folder/lib/bm25.js(零依赖,CJK bigram)
│ ├─ pattern.js # matchesAnyPattern(精确名或 prefix*,deny/core 共用)
│ ├─ select.js # selectEntries(entries, cfg) -> 静态有序选择(core 豁免 deny)
│ ├─ catalog.js # findCatalogMessage / trimDecision(静态渲染:只改 content,不动 entries)
│ ├─ render.js # renderCatalogText(selected, [], opts):保留宿主 framing
│ ├─ skill-search.js # 检索逻辑(BM25 + frontmatter 合并) + enrichPoolWithFrontmatter
│ ├─ frontmatter.js # extractMeta / metaFromSkillFile(SKILL.md 元数据解析)
│ └── storage.js # 三级持久化(settings → state → 进程 Map)+ updateRouteStats
├─ scripts/
│ ├─ validate-metadata.js # 技能 frontmatter 规范校验(手跑)
│ └─ type-aware-scorer.js # 技能质量评分(手跑)
├─ test/
│ ├─ fixtures.js # 10 技能 fixture(含 cordis 技能)+ 宿主渲染/digest 复刻
│ ├─ apply.test.js # 插件入口回归:prepend/disabled/fail-safe/next 传播/慢告警/disposer/tool 注册
│ ├─ catalog.test.js # T1-T6 裁剪 + T5b KV 稳定性 + T5c 全列 + T5d 安全底线 + digest 一致性 + 放行
│ ├─ skill-search.test.js # S1-S10 检索质量(中文→英文技能命中/deny/确定性/纯函数)
│ └─ waterfall.test.js # T13-T14 瀑布集成 + digest 一致性回归
├─ node_modules/@deepseek-ai/ # 测试专用轻量 stub(schemastery/dsh-tools,npm install 会被真实包覆盖)
└─ docs/ # system_design.md + class/sequence mermaid(架构评审版)
source.entries 是全量快照,永不裁剪——只替换 content[0].text(digest 一致性红线,否则每轮重发全量 token 更爆炸)。prepend:true(最外层)——普通 ctx.on 是最内层,在 L2 之前运行,改不到 catalog。<system-reminder>/<available_skills>/加载指引/直呼指引)。node --test "test/*.test.js"
77 条测试(node:test + node:assert,零外部依赖;经 node_modules/@deepseek-ai/ 下的轻量测试 stub 直接 import lib/index.js):
agent/pre-step 以 prepend=true(最外层)注册;skill_search 工具注册 / toolSearchEnabled=false 不注册;trim 抛错 → catch → 原样放行(fail-safe);next() 抛错 → 传播不吞错;maxFoldMs 超时 → 告警但结果仍放行;disposer 幂等。maxDescLength=100 为初始值,落地后按真实 token 收益调参。/name 直呼(L1 绕过目录,仍能注入)。findCatalogFromSession 沿 agent.session.events 反向镜像宿主的
catalogHistory(逐字段对照 @deepseek-ai/dsh-tool-skill);审查抓到
visible===null 分支永假(循环到底返回 undefined)——已修 + 回归测试。embedTimeoutMs 可配置。core 想常驻「防假完成」
技能作为安全底线,但写的是 dsh-verifier,真名是 dsh-verification——这条
安全底线一直是空的。同样修正:dsh-bug-diagnosis→dsh-debugging、
viking-memory-guide→dsh-memory、dsh-delegation-checklist→
dsh-subagent-orchestration;删除 dsh-context-language、dsh-two-axis-review
两个死 alias 键与 deny 的两个死条目(deny 默认改为 [])。lib/tool-skill-search.js 删除:enrichPoolWithFrontmatter 归入
skill-search.js(纯逻辑),buildSkillSearchTool 归入 index.js(宿主契约)。
skill-search.js 头部注释原本就写着 wrapper 在 index.js——代码终于和注释一致。test/ 清理 45 个一次性调研脚本:npm test 只跑 test/*.test.js,这些
analyze-*/check-*/scan-*/baseline-* 从未被任何测试引用。有长期价值的
validate-metadata.js、type-aware-scorer.js 移到 scripts/。净减 4609 行(157 增 / 4766 删)。77/77 测试全绿,真 cordis Context 预检通过。