# skills Claude Code skills 的版本化源头。所有能给 Claude Code 使用的 skill 都放在这里,通过 `install.sh` 同步到 `~/.claude/skills/`。 ## 这里放什么? 只放**本仓库相关**的 skill —— 也就是依赖或协作于 `cyber-agent` / KnowHub / ToolHub 的那些。 | Skill | 形态 | 依赖 | |-------|------|------| | `agent/` | CLI 薄壳 + 共享 config | `cyber-agent` editable install | | `toolhub/` | 自包含单脚本 | 仅 `httpx`(可选 `cyber_sdk` 走 OSS) | | `knowhub/` | 自包含单脚本 | 仅 `httpx` | | `content-search/` | 纯文档,调 `python -m ...` | `cyber-agent` editable install | 个人/跨项目的 skill(如 `glk-*`、`stitch-images`)不放这里。 ## 安装 ```bash # 默认:symlink,适合本机开发 bash skills/install.sh # 跨机器部署:copy,脱离 repo bash skills/install.sh --copy # 只装指定 skill bash skills/install.sh --skills agent,toolhub # 改安装路径 bash skills/install.sh --target /some/other/dir # 先看会做什么,不动文件 bash skills/install.sh --dry-run # 强制覆盖已有内容(否则冲突即失败) bash skills/install.sh --force ``` `symlink` 模式下在 `skills/X/*` 改文件会立即反映在 `~/.claude/skills/X/`。 `copy` 模式下每次改完需要重跑脚本。 ## 冲突处理 `install.sh` **不自动备份**。遇到目标已存在的情况会这样处理: - 已是指向本 repo 的 symlink → 安静跳过(no-op) - 其他(旧目录 / 错位 symlink / 普通文件)→ **报错退出(exit 2)**,打印现状让你自己决定 想覆盖加 `--force`,它会 `rm -rf` 现有目标再装。**不会**偷偷复制到 `.bak.*` —— 那样只会污染 `~/.claude/skills/`(Claude Code 会把 `.bak.*` 当成 skill 去索引)。旧内容若有价值,大多数时候本来就在 git 里;真要保底,自己 `mv` 一下再跑脚本。 ## 跨项目调用 所有脚本都用**绝对路径**调用,不受 CWD 影响: ```bash # agent — 本地或远端 agent python ~/.claude/skills/agent/invoke.py --agent_type=remote_librarian --task="..." # toolhub — 远程 AI 工具 python ~/.claude/skills/toolhub/toolhub.py call --tool_id=flux_gen --params='{...}' # knowhub — 知识库 python ~/.claude/skills/knowhub/knowhub.py search --query="..." python ~/.claude/skills/knowhub/knowhub.py save --task="..." --content="..." python ~/.claude/skills/knowhub/knowhub.py ask --query="..." # content-search — 内容平台搜索 python -m agent.tools.builtin.content.tools platforms ``` 每个脚本的 trace / 输出都落在**调用方 CWD 的 `.cache/`** 下,和项目解耦。