skill-manager
管理 Agent Skills 全生命周期:多源发现、去重溯源、评测对比、安全审查、经 skills CLI 安装/更新/卸载、各 Agent 链接验证与状态诊断。 TRIGGER(中文):"找个适合 X 的技能""有没有现成的 X 技能""对比/评测一下这几个技能""安装这个技能""更新已装技能""卸载/删掉某技能""检查技能状态""技能装不上/看不见了""skill manager"。 DO NOT TRIGGER:从零创作自研技能(用 skill-creator);把自家技能发布到 GitHub 等多平台(用 skill-publisher);项目版本发布流程(用 release-...
Install this skill
Security score
The skill-manager skill was audited on Oct 2, 2026 and we found 14 security issues across 2 threat categories. Review the findings below before installing.
Categories Tested
Security Issues
Command substitution pattern
| 152 | |
| 153 | ```bash |
| 154 | for d in ~/.claude/skills/*; do printf '%s -> %s\n' "$(basename "$d")" "$(readlink "$d" 2>/dev/null || echo 非链接)"; done |
| 155 | ``` |
| 156 |
Access to home directory dotfiles
| 17 | |
| 18 | 1. **CLI 是唯一执行层。** 安装/更新/卸载一律走 `npx skills`,禁止把 git clone / cp -R 当常规安装方式;只有 CLI 已完成安装但 Agent 链接缺失或损坏时,才允许安全地手动修复软链接。 |
| 19 | 2. **~/.agents/skills 是唯一实体。** 全局技能的真实文件只存在 `~/.agents/skills/<name>/`;symlink 类 Agent 目录(~/.claude/skills、~/.openclaw/skills 等)只能是软链接,绝不允许同一技能存在两份实体副本。 |
| 20 | 3. **安装前必过安全审查。** 安装与更新前必须读候选技能完整源码并按 `references/security-vetting.md` 审查;安全是硬门槛判定(PASS / WARNING / DANGER)而非评分项,DANGER 直接淘汰。 |
| 21 | 4. **只读自由,写入需意图。** 搜索、读源码、读元数据、查状态、非破坏诊断无需确认;安装、卸载、替换文件必须来自用户明确意图。 |
Access to home directory dotfiles
| 26 | 本机 Agent 分两类(CLI 安装时自己也这么分组,实测行为): |
| 27 | |
| 28 | **直读类(universal)**:CLI 注册表里技能目录就是 `.agents/skills` 的 Agent,安装**不建链、也不核查其链接**——Codex、Cursor、Gemini CLI、Antigravity、GitHub Copilot、OpenCode(其全局目录 `~/.config/opencode/skills` 独立,无链接即不核查)等。可见性判据:`~/.agents/skills/<name>/SKILL.md` 存在即可。 |
| 29 | |
| 30 | **ZCode 特例**:ZCode 应用自身直读 `~/.agents/skills`(新技能须新会话生效),但 CLI 注册表把 zcode 归为 symlink 类(全局目录 `~/.zcode/skills`,本机现为空)——安装**勿用 `-a zcode`**;装后发现 `~/.zcode/skills` 出现链接时如实报告(与直读叠加成双路可见)。 |
Access to home directory dotfiles
| 28 | **直读类(universal)**:CLI 注册表里技能目录就是 `.agents/skills` 的 Agent,安装**不建链、也不核查其链接**——Codex、Cursor、Gemini CLI、Antigravity、GitHub Copilot、OpenCode(其全局目录 `~/.config/opencode/skills` 独立,无链接即不核查)等。可见性判据:`~/.agents/skills/<name>/SKILL.md` 存在即可。 |
| 29 | |
| 30 | **ZCode 特例**:ZCode 应用自身直读 `~/.agents/skills`(新技能须新会话生效),但 CLI 注册表把 zcode 归为 symlink 类(全局目录 `~/.zcode/skills`,本机现为空)——安装**勿用 `-a zcode`**;装后发现 `~/.zcode/skills` 出现链接时如实报告(与直读叠加成双路可见)。 |
| 31 | |
| 32 | **symlink 类**:CLI 安装时在其目录创建指向 canonical 的软链接——Claude Code(`~/.claude/skills/`)、OpenClaw(`~/.openclaw/skills/`)、Qwen(`~/.qwen/skills/`)、Kilo Code(`~/.kilocode/skills/`)等。可见性判据:对应目录下 `<name>` 为软链接且解析后指向 `~/.agents/skills/<name>`。 |
Access to home directory dotfiles
| 30 | **ZCode 特例**:ZCode 应用自身直读 `~/.agents/skills`(新技能须新会话生效),但 CLI 注册表把 zcode 归为 symlink 类(全局目录 `~/.zcode/skills`,本机现为空)——安装**勿用 `-a zcode`**;装后发现 `~/.zcode/skills` 出现链接时如实报告(与直读叠加成双路可见)。 |
| 31 | |
| 32 | **symlink 类**:CLI 安装时在其目录创建指向 canonical 的软链接——Claude Code(`~/.claude/skills/`)、OpenClaw(`~/.openclaw/skills/`)、Qwen(`~/.qwen/skills/`)、Kilo Code(`~/.kilocode/skills/`)等。可见性判据:对应目录下 `<name>` 为软链接且解析后指向 `~/.agents/skills/<name>`。 |
| 33 | |
| 34 | 两类归属与目录清单**以实际枚举为准,勿硬编码**: |
Access to home directory dotfiles
| 35 | |
| 36 | ```bash |
| 37 | ls -d ~/.claude/skills ~/.openclaw/skills ~/.qwen/skills ~/.kilocode/skills ~/.config/opencode/skills ~/.cursor/skills ~/.gemini/skills ~/.gemini/antigravity/skills ~/.codex/skills ~/.copilot/skills ~/.factory/skills 2>/dev/null |
| 38 | ``` |
| 39 |
Access to home directory dotfiles
| 95 | 2. **执行安装**(本机约定一律全局安装,命令显式带 `-g`——注意 CLI 不带 `-g` 时默认装到项目目录): |
| 96 | ```bash |
| 97 | # 默认:canonical 落 ~/.agents/skills;symlink 类 Agent 自动建链,直读类 Agent 直读无需链接(实测行为) |
| 98 | npx skills add <owner/repo> --skill <skill-name> -g -y |
| 99 | # 收窄:只给指定 Agent 安装(技能名含空格须加引号,如 --skill "Convex Best Practices") |
Access to home directory dotfiles
| 102 | CLI 行为异常时,先换 `npx skills@latest ...` 重试一次再排查。 |
| 103 | 3. **三重验证**: |
| 104 | - `~/.agents/skills/<name>/SKILL.md` 存在且可读; |
| 105 | - symlink 类 Agent 的链接正确(`ls -la` + `readlink`,对照上方可见性模型;直读类不核查链接,canonical 存在即可); |
| 106 | - frontmatter 的 name 与目录名一致。 |
Access to home directory dotfiles
| 123 | ``` |
| 124 | |
| 125 | - 卸载后验证:`~/.agents/skills/<name>` 与各 Agent 链接均不存在。 |
| 126 | - **孤儿链接清理**:canonical 已删但 Agent 链接残留时——先确认该路径确为软链接且指向已删除的 canonical,再仅 `rm` 链接本体;未验证指向关系前禁止 `rm -rf`。 |
| 127 | - **红线(无确认例外)**:`~/.agents/skills` 下的文件永不物理删除。注意 `npx skills remove <name> -g` 会**递归强删 canonical 实体**,且在 AI agent 环境下自动跳过确认(实测源码行为)——因此对 `~/.agents/skills` 的 CLI remove 仅限"用户点名卸载的第三方技能"(Benchmark 临时目录内自装自清不在此列);自制技能与身份存疑技能**一律不执行 CLI remove**(哪怕它出现在 list 里、哪怕用户催促确认),只给替代方案(移入 ~/.agents/skills-disabled 停用、仅移除 Agent 链接、用户自行归档)。自制技能的参考判据是 `npx skills list -g` 中 Source 为 `local`(如 commit、reply-polish);注意经 CLI 安装过的自制技能会带上游 Source(如 simplify 实测显示为 brianlovin/agent-config)——身份存疑时向用户求证,勿只认 Source 字段。 |
Access to home directory dotfiles
| 125 | - 卸载后验证:`~/.agents/skills/<name>` 与各 Agent 链接均不存在。 |
| 126 | - **孤儿链接清理**:canonical 已删但 Agent 链接残留时——先确认该路径确为软链接且指向已删除的 canonical,再仅 `rm` 链接本体;未验证指向关系前禁止 `rm -rf`。 |
| 127 | - **红线(无确认例外)**:`~/.agents/skills` 下的文件永不物理删除。注意 `npx skills remove <name> -g` 会**递归强删 canonical 实体**,且在 AI agent 环境下自动跳过确认(实测源码行为)——因此对 `~/.agents/skills` 的 CLI remove 仅限"用户点名卸载的第三方技能"(Benchmark 临时目录内自装自清不在此列);自制技能与身份存疑技能**一律不执行 CLI remove**(哪怕它出现在 list 里、哪怕用户催促确认),只给替代方案(移入 ~/.agents/skills-disabled 停用、仅移除 Agent 链接、用户自行归档)。自制技能的参考判据是 `npx skills list -g` 中 Source 为 `local`(如 commit、reply-polish);注意经 CLI 安装过的自制技能会带上游 Source(如 simplify 实测显示为 brianlovin/agent-config)——身份存疑时向用户求证,勿只认 Source 字段。 |
| 128 | |
| 129 | ## 八、status(技能状态表) |
Access to home directory dotfiles
| 144 | |
| 145 | - `OK`:canonical 存在,且本应存在的 symlink 类链接均正常(直读类只需 canonical 存在) |
| 146 | - `broken-link`:canonical 存在,但本应存在的 symlink 类链接(Agents 字段列出该 symlink 类 Agent,或 add 时用 `-a` 指定过)缺失或断裂。**只核查 symlink 类**——Agents 字段里的直读类 Agent(Codex/Cursor/Gemini CLI 等)从不据此报 broken-link,否则会整列误报;zcode 虽在 CLI 注册表归 symlink 类,但 ZCode 应用直读 canonical,`~/.zcode/skills` 为空属正常态,同样不据此报 broken-link(该目录出现链接时仅如实备注双路可见)。Agents 字段会截断(前 5 个 + "+N more"):无法确认某 symlink 类 Agent 是否在列时以链接实测为准——链接在记 ✓;链接不在且该 Agent 未直接出现在字段里,记 `-` 并注明"字段截断无法确认",不凭猜记 ✗ |
| 147 | - `orphan-link`:canonical 不存在,但 Agent 目录下链接残留 |
| 148 | - `conflict`:Agent 路径上是实体目录,或链接解析后目标 ≠ `~/.agents/skills/<name>`(比较前对目标做 realpath/去尾斜杠归一化;绝对路径链接归一化后指向 canonical 即正常,不算 conflict) |
Access to home directory dotfiles
| 146 | - `broken-link`:canonical 存在,但本应存在的 symlink 类链接(Agents 字段列出该 symlink 类 Agent,或 add 时用 `-a` 指定过)缺失或断裂。**只核查 symlink 类**——Agents 字段里的直读类 Agent(Codex/Cursor/Gemini CLI 等)从不据此报 broken-link,否则会整列误报;zcode 虽在 CLI 注册表归 symlink 类,但 ZCode 应用直读 canonical,`~/.zcode/skills` 为空属正常态,同样不据此报 broken-link(该目录出现链接时仅如实备注双路可见)。Agents 字段会截断(前 5 个 + "+N more"):无法确认某 symlink 类 Agent 是否在列时以链接实测为准——链接在记 ✓;链接不在且该 Agent 未直接出现在字段里,记 `-` 并注明"字段截断无法确认",不凭猜记 ✗ |
| 147 | - `orphan-link`:canonical 不存在,但 Agent 目录下链接残留 |
| 148 | - `conflict`:Agent 路径上是实体目录,或链接解析后目标 ≠ `~/.agents/skills/<name>`(比较前对目标做 realpath/去尾斜杠归一化;绝对路径链接归一化后指向 canonical 即正常,不算 conflict) |
| 149 | - `local`:`npx skills list -g` 显示 Source 为 `local` 的自制/手工安装技能(正常现象,不视为问题)。状态列**优先标 `local`**;其在 Agent 目录的既有实体目录布局(如 agent-reach)单独备注即可,不按 conflict 给修复建议 |
| 150 |
Access to home directory dotfiles
| 152 | |
| 153 | ```bash |
| 154 | for d in ~/.claude/skills/*; do printf '%s -> %s\n' "$(basename "$d")" "$(readlink "$d" 2>/dev/null || echo 非链接)"; done |
| 155 | ``` |
| 156 |
Access to home directory dotfiles
| 161 | ```bash |
| 162 | # 相对路径形式,与本机既有链接(../../.agents/skills/<name>)及 CLI 行为一致 |
| 163 | ln -sfn ../../.agents/skills/<name> ~/.claude/skills/<name> |
| 164 | ``` |
| 165 |