一个桌面应用,用图形界面同时管理 Claude Code 和 Codex 这两套 AI 编程助手的技能、插件和配置。
亮点在这里:它不把 Codex 当成 Claude 的附属。两个工具平级独立,各自有自己的技能、插件、配置子页,顶层一个工作区切换器来回切,整窗配色跟着换。市面上管 Claude Code 配置的工具不少,但大多只盯着一家;Skill Manager 同时盯着两家,而且承认它们是两套独立的东西——配置目录、命令、版本要求都不一样,所以干脆分开管,不强行套进同一个模子。
为什么要做这个?这两个工具的配置都散在命令行和 ~/.claude/、~/.codex/ 的文本文件里。想关掉某个技能、想知道哪些技能在吃上下文、想看插件到底启没启用,都得翻文件或敲命令。Skill Manager 把这些搬进一个窗口:技能的"完整开启 / 仅看名称 / 仅手动调用 / 关闭"四档,每档都标了模型能不能发现它、上下文开销多大;插件开关改完会回读一遍,确认真的写进去了。
npm install
npm run check # typecheck + lint + test + build
npm run electron:dev # 启动 Electron 调试会话
npm run electron:build # 打包 NSIS 安装包(产物在 release/)校验命令一次跑完 TypeScript、ESLint、Vitest 和 Vite 生产构建。提交前应保证它通过。
Windows 打包走 scripts/pack-win.js,本机没开开发者模式、非管理员也能稳定产出(详见脚本注释)。直接 electron-builder --win 在当前环境会因 winCodeSign 解压失败而中断。
electron/main.js进程入口、能力服务装配、配置 watcher 挂载electron/services/capability-service.js把 inventory 扫描、配置解析、宿主回读合并为统一入口electron/services/settings-resolver.js设置值优先级(Managed > Local > Project > User)electron/services/capability-resolver.js安装实例优先级(Enterprise > Personal > Project)src/hooks/useClaudeCapabilities.ts渲染层会话状态、写作用域路由docs/superpowers/specs/设计稿,docs/superpowers/plans/实施计划
两个 resolver 方向相反是有意的:Skill 来源优先级决定"哪个 Skill 文件被加载",设置值优先级决定"哪条配置生效"。Claude Code 官方就是两套独立机制,实现里不能合并成一条排序。
skillOverrides 接受四个值:
| 产品名称 | 配置值 | 向模型暴露 | 用户手动调用 |
|---|---|---|---|
| 关闭 | off |
隐藏 | 隐藏 |
| 仅手动调用 | user-invocable-only |
隐藏 | 可见 |
| 仅看名称 | name-only |
仅名称 | 可见 |
| 完整开启 | on |
名称与描述 | 可见 |
没出现在 skillOverrides 里的 Skill 按 on 处理。
四档控制要求 Claude Code 2.1.129 或更高。低于这个版本时状态切换禁用、不写 skillOverrides,设置页会显示当前版本和最低要求。检测只读,不做安装或升级。
Skill 设置写完后会重新读回配置文件比对内容,这一级叫已持久化。它只能证明:
- 写入的是官方字段、合法枚举
- 目标配置文件读回一致
证明不了已打开的 Claude 会话已经重新算过 Skill 暴露程度。官方 /skills 是交互菜单,Claude Code 也没有能被脚本稳定调用的 skill list/status 命令,所以应用不显示"已验证生效"或"宿主已确认",成功文案统一是"已保存,需新对话加载"。
Claude Plugin 的状态走官方 claude plugin enable/disable --scope 命令,改完再跑 claude plugin list --json 回读,只有 JSON 里目标插件的 enabled 字段跟请求一致时才显示"宿主已确认"。
Codex Plugin 只在当前 Codex CLI 输出里明确带安装和启用状态时才显示宿主确认;CLI 只能写出、不能回读的版本上,降级为"已持久化"。
持久化设置按 Managed > Local > Project > User 解析。Managed 只读,应用不会去覆盖。更高优先级有明确值时盖掉更低优先级,没有就向下继承。
- 全局视图:只写用户全局配置,影响没有更高层明确值的项目。
- 项目视图:只写当前选定的 Project 或 Local,不写用户全局。
- 切换项目或全局:重新算实例、来源、状态来源,不产生写入,不闪现上一视图的状态。
全局值是默认值,Project/Local 的显式值能盖掉它。项目切换不创建、删除或修改任何配置文件。
普通 Skill 按名称寻址,同名不同源时,Claude Code 加载的是按 Enterprise > Personal > Project 排出来的胜者。Skill Manager 不合并同名卡片,输的那个标为"已遮蔽"并把控制区设为只读。同项目层内出现同名 Skill 而官方没规定层内优先级时,显示"来源未确认"提示,不替用户猜谁是胜者。
npm test -- --runVitest 双工程:Electron 服务用 node 环境,渲染层 hook 和组件用 jsdom。集成测试(临时目录 + 真实文件)放在对应服务的 *.test.js 旁边。