# 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/`** 下，和项目解耦。
