技能本体只留一份,项目里全是引用 —— 用 NTFS 目录联接替代复制,让 AI 编程工具的 skills 技能可维护、可同步、可进 git。
在 Claude Code、opencode 等 AI 编程工具里,技能(skill) 是一个包含 SKILL.md 的文件夹:把它放进项目目录,AI 就会按照你的固定流程、规范、工作流来干活。
技能一多,复制粘贴式的管理就崩了——改一处,所有项目的副本全旧。skill-manager 用 Windows 目录联接(Junction) 把技能"引用"进项目:
- 技能本体永远留在技能库,项目里只是链接,更新自动同步到所有项目
- 创建链接不需要管理员权限(符号链接才需要)
- 每个项目自动维护一份清单,换机器后按一个键全部重建
启动后依次选择「技能库目录」和「项目技能目录」,即可进入主界面:
⚙ 技能管理器
库: D:\skills 项目: D:\project\.opencode\skills
╭────────────────────────────────────────────────────╮ ╭─────────────────────────────────────────╮
│ 技能库 (4) │ │项目目录 (2) │
│ │ │已链接 1 · 失效 0 · 外来 1 │
│ [ ] code-review │ │✓ tdd → D:\skills\tdd │
│ Review the changes since a fixed point (commit, b…│ │⚠ notes │
│ │ │ │
│ [✓] tdd │ │清单 1 项(r 键重建) │
│ Test-driven development. Red-green-refactor │ │ │
│ │ │ │
│ [ ] gh │ │ │
│ Use when working with GitHub CLI (gh) │ │ │
│ │ │ │
│ [ ] siyuan-api │ │ │
│ SiYuan (思源笔记) REST API skill │ │ │
│ │ │ │
│ ... │ │ │
╰────────────────────────────────────────────────────╯ ╰─────────────────────────────────────────╯
就绪 · 技能 4 · 已链接 1 · 失效 0 · 外来 1
↑↓ 移动 · Space 链接/解除 · Enter 详情 · / 过滤 · d 清理失效 · r 重建 · s 切换目录 · q 退出
- 左栏:技能库列表。
[✓]已链接 ·[ ]未链接 ·[!]链接已失效 ·[⚠]同名位置是普通文件夹 - 右栏:项目目录现状,每个链接指向哪里一目了然
- 零复制 — 技能本体只在技能库存一份,所有项目通过目录联接引用,技能更新全局生效
- 免管理员 — 目录联接(Junction)是 NTFS 原生能力,普通用户权限即可创建
- TUI 交互 — 终端全键盘操作:空格链接/解除、
/过滤、Enter 预览技能内容,不用记命令 - 失效链接识别 — 技能库目录被移动/删除后,链接自动标记为失效,
d键一键清理(有确认) - 清单可进 git — 项目目录内自动维护
.skill-links.json,换机器/同事拉代码后r键重建全部链接 - 外来目录保护 — 同名位置存在普通文件夹时拒绝覆盖,绝不误删
- 会话记忆 — 记住上次的目录组合,启动回车即进
- 单文件分发 — 静态编译 exe,零依赖,约 4 MB,无需安装
技能库目录 项目技能目录
D:\skills\tdd\SKILL.md ──Junction──► D:\project\.opencode\skills\tdd
(本体,唯一副本) (目录联接,仅引用)
| 操作 | 机制 |
|---|---|
| 链接 | mklink /J 创建目录联接(无需管理员权限) |
| 识别 | 读取 NTFS 重解析点,区分 junction / 符号链接 / 普通目录 |
| 解除 | 只删除链接本身,技能库内容永不触碰 |
| 重建 | 依据 .skill-links.json 清单一键恢复 |
技术栈:Go + Bubble Tea(opencode 同款 TUI 库),列表/输入/翻页使用官方 bubbles 组件;目录选择内嵌 Windows 原生文件夹对话框,不依赖外部文件。
前往 Releases 下载 skill-manager-vX.Y.Z-windows-amd64.exe,解压即用。
要求:Windows 10/11 64 位,技能库与项目目录必须位于 NTFS 磁盘(FAT32 / U 盘不支持目录联接)。无需管理员权限、无需联网。
需要 Go 1.26+:
go build -trimpath -ldflags "-s -w" -o skill-manager.exe .或直接运行打包脚本(产出单文件 exe):
.\build.ps1- 选择技能库目录 —— 技能本体的存放位置(每个技能是一个含
SKILL.md的文件夹)。支持预设库、Windows 原生目录选择框、手动输入 - 选择项目技能目录 —— 想让技能"出现"的位置(例如项目的
.opencode\skills或.claude\skills) - 主界面操作 —— 空格键链接/解除,按需过滤、预览、清理
| 按键 | 功能 |
|---|---|
↑ / ↓ 或 j / k |
移动光标 |
Space |
链接 / 解除链接(即时生效,同步更新清单) |
Enter |
查看技能内容(SKILL.md) |
/ |
模糊过滤(Esc 退出并清空) |
d |
清理失效链接(确认框) |
r |
从清单重建全部链接 |
s |
重新选择目录 |
q / Ctrl+C |
退出 |
程序同目录的 skill-manager.config.json 可手动编辑,把自己的技能库加入启动列表:
{
"lastLibrary": "",
"lastProject": "",
"presets": ["D:\\my-skills", "E:\\team-skills"]
}程序放在可写目录即可(如 C:\Program Files 等只读目录会无法保存配置)。
为什么不用符号链接(symbolic link)? 符号链接在 Windows 上需要管理员权限或开发者模式;目录联接(Junction)是普通用户权限就能创建的 NTFS 原生能力,对文件夹场景两者效果一致。
技能更新后项目侧会自动同步吗? 会。链接只是引用,技能库里的改动立即对链接了它的所有项目生效。
换电脑 / 同事拉下代码后链接全没了怎么办?
目录联接本身无法提交进 git,但 .skill-links.json 清单可以。拉到项目后运行本工具选好目录,按 r 键一键重建。
链接显示失效([!])是怎么回事?
技能库目录被移动或删除了。按 d 清理失效链接,或修复技能库路径后按 r 重建。
项目目录里出现 ⚠ 标记的普通文件夹会被动吗?
不会。工具只管理自己创建的链接,外来目录只提示不触碰。
- Linux.do —— 中文开发者社区,AI 编程工具与效率工具爱好者的聚集地
go test ./... # 单元测试(junction 生命周期、断链、安全删除、TUI 全流程)
go vet ./... # 静态检查
.\build.ps1 # 打包 exe真实技能库集成测试(可选):
$env:SKM_TEST_LIB = "C:\path\to\skills"
$env:SKM_TEST_PROJ = "D:\path\to\temp-proj"
go test ./core/ -run TestRealLibraryIntegration -v