[分享创造] 受不了在多个工具之间复制 skill,做了个软链接管理器,一个目录管住 32+ 个 AI 编程工具的 skills,附带一个本地风险扫描

起因是我的 skill 在硬盘上有五份。Claude Code 读 ~/.claude/skills ,Codex 读 ~/.codex ,Cursor 读 ~/.cursor/skills ,Trae 读 ~/.trae ,OpenCode 又跑到 ~/.config/opencode 去了。skill 本身就是一个装着 SKILL.md 的文件夹,所以最顺手的操作永远是「复制过去」。几周之后你有五份副本、三份是旧的,而且根本不知道 Agent 实际加载的是哪一份。改一个 prompt 要改五遍,这事我干了大概两个月。

做法很简单:用一个 hub 目录当唯一数据源,各工具的 skills 目录里放的是指回 hub 的目录软链接。给某个工具启用 skill = 建一条软链,禁用 = 删掉这条软链。改一处等于改所有地方,因为本来就只有一处。

坦白说核心逻辑就是 symlink,写个 shell 脚本也能做,我一开始就是拿脚本凑的。后来
真正花时间的是这几块:

1) Windows 。目录软链要开发者模式或者提权,所以做了三级降级:目录软链 → junction(mklink /J,不需要任何权限)→ 带溯源记录的复制(写一个.skills-manager-source.json,这样复制出来的目录仍然能被识别、能从 App 里禁用)。普通非管理员账号三条路都走得通,不用 UAC 。

2) 迁移。没人是从零开始的,已有的 skill 都散在各个工具目录里。skm adopt 会扫一遍工具目录,找出真实(非软链)的 skill 文件夹,搬进 hub 再原地建链。支持 --dry-run,幂等,跑两遍不会出事。

3) 扫描。装一个别人写的 skill,等于把指令加 shell 片段塞进一个已经握着你终端的循环里。所以内置了一套本地规则引擎,扫 skill 文件里的代码块:破坏性命令(rm -rf /、dd of=/dev/...)、curl | sh 、反弹 shell(/dev/tcp 、nc -e 、socat EXEC)、base64/hex 解码后 eval 、Unicode 花招(零宽字符、RTL 覆写)、以及抢注的包名。配了 LLM provider 可以再叠一层 AI 二审。结果按「路径 + mtime + 扫描器版本」缓存,改了文件才重扫。基础模式纯本地,不发任何网络请求。

工具支持:目前内置 32 个,除了 Claude Code / Codex / Cursor / Gemini CLI 这些,
国内的 Trae 、Trae CN 、CodeBuddy 、iFlow 、Qoder 、Qwen Code 、DeepSeek Harness 、
WorkBuddy 也在里面,不够的可以自己加自定义工具(填路径 + 图标)。

隐私方面:没有账号体系,不联网也能用全部核心功能。翻译和技能市场用的是你自己填的 API key 。数据模型就是「磁盘上的文件夹」,把 App 删了,你的 skill 还是一堆普通目录,不存在被绑定。

已知问题:macOS 版是 ad-hoc 签名、没做 Apple 公证(那个每年 99 美元还没交),所以 Homebrew cask 装的时候会去掉 quarantine 标记 —— 介意的话请自己编译,源码全都在。

不想装 GUI 的可以只用 CLI,每个 release 都附带,全部命令支持 --json,适合无头机器和 dotfiles 脚本:

skm init # 不开 GUI 完成首次配置
skm adopt --dry-run # 先看会搬哪些
skm list --tool claude # 看链接状态
skm enable --for
skm doctor / skm fix --yes # 检测并修复链接漂移

技术栈 Rust + Tauri 2(大概 2.8 万行 Rust)+ React 19,macOS / Windows / Linux
都有构建。

地址:https://skillsmanager.freeourdays.com

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论