# 7. Skill 庫說明

Skills 位置：`~/.openclaw/workspace/skills/` 或 OpenClaw 官方 skill 庫

### 7.1 行動任務 Skills

| Skill | 功能 | 觸發方式 |
|-------|------|---------|
| `assign-task` | 分析任務，分派給 VPS-A 或 VPS-B | 使用者描述任務 |
| `dispatch-webhook` | 發送 Webhook 到 VPS，等待回應 | assign-task 呼叫 |
| `project-status` | 查詢進行中的專案狀態 | 使用者查詢 |
| `code-review-request` | 提交 code review 請求 | 開發完成後 |

### 7.2 生活安排 Skills

| Skill | 功能 | 觸發方式 |
|-------|------|---------|
| `daily-briefing` | 每日簡報（行程+天氣+待辦） | cron 08:00 |
| `calendar-check` | 查詢 Google Calendar | 使用者查詢 |
| `schedule-plan` | 安排行程 | 使用者指令 |
| `reminder-set` | 設定定時提醒 | 使用者指令 |
| `task-capture` | 快速記錄待辦 | 使用者指令 |

### 7.3 ClawHub Skills（已安裝）

| Skill | 功能 | 來源 | 備註 |
|-------|------|------|------|
| `skill-vetter` | 安裝前安全審查（檢查權限範圍、可疑模式、風險分級） | ClawHub | 純指引型，無需額外設定 |
| `tavily-tool` | Tavily 網頁搜尋/探索，附來源引用摘要 | ClawHub | 需 `TAVILY_API_KEY`（已設於 `gateway.env`，透過 `EnvironmentFile` 載入） |

> **ClawHub 帳號**：`@selika`（GitHub: sovaha@gmail.com），登入方式：`npx clawhub login --token <token> --no-browser`
> **Python 依賴**：`tavily-python 0.7.23`（已安裝於 `~/.openclaw/venv/`）
> **踩坑**（2026-03-11）：Gateway service 原本沒有 `EnvironmentFile`，`gateway.env` 的變數不會進入 Gateway 進程。修復：service 加 `EnvironmentFile=/home/selig/.config/openclaw/gateway.env`
> **踩坑**（2026-03-11）：skill 用 symlink 分發到 agent workspace 會被 Gateway 安全機制擋掉（`Skipping skill path that resolves outside its configured root`），必須用 `cp -r` 複製

### 7.4 Bundled Skills（已啟用）

| Skill | 功能 | 依賴 CLI | 備註 |
|-------|------|---------|------|
| `coding-agent` | 分派 coding 任務給 Claude Code/Codex/OpenCode | `claude`（`~/.local/bin/claude`） | 需 bash pty:true |
| `summarize` | 摘要 URL/影片/Podcast 內容 | `summarize`（`~/.local/bin/summarize` → nvm） | `@steipete/summarize` npm 套件 |

> **注意**：bundled skills 的 CLI 安裝在 nvm 路徑時，需 symlink 到 `~/.local/bin/` 才能被 Gateway 的 PATH 找到。
> Gateway service PATH：`%h/.local/bin:/usr/local/bin:/usr/bin:/bin`

### 7.5 知識庫 Skills

| Skill | 功能 | 觸發方式 |
|-------|------|---------|
| `qmd-brain` | 第二大腦搜尋（BM25 + pgvector 語意） | 搜尋、查找、recall、之前說過... |

#### qmd-brain 架構

```
使用者 Telegram 查詢
        │
        ▼
┌─────────────────────────────────────────────┐
│              qmd-brain skill                │
│  1. qmd search  → BM25 全文搜尋 (SQLite)    │
│  2. embed_to_pg → 語意搜尋 (PostgreSQL)      │
│     └─ CLIProxyAPI text-embedding-ada-002   │
└─────────────────────────────────────────────┘

夜間排程（02:00）：
  qmd embed        → 更新本地索引
  embed_to_pg embed → 更新 PG 向量庫
```

#### 相關路徑

```
/home/selig/apps/qmd-pg/
├── embed_to_pg.py      # 向量寫入/搜尋 Python 腳本
├── nightly-embed.sh    # 夜間排程腳本
└── venv/               # Python 虛擬環境

PostgreSQL:
  database: qmd_brain
  table:    brain_documents (vector(1536), HNSW)
  user:     qmd_user

qmd:
  collections: selig-home (/home/selig)
  index:       ~/.cache/qmd/index.sqlite
```

### 7.6 Skill 格式說明

每個 Skill 由兩個檔案組成：

**SKILL.md（Frontmatter + 說明）**
```yaml
---
name: skill-name               # 必填，kebab-case，和資料夾同名
description: 一句話說明用途       # 必填，顯示在 skills list
triggers:                       # 必填，空陣列 = 僅供內部呼叫
  - "關鍵字1"
  - "關鍵字2"
tools:                          # 必填，宣告可用工具
  - exec
  - web_fetch
internal: false                 # 選填，true = 對使用者隱藏
---

# Skill 標題
## 功能說明
詳細說明 Skill 的功能、輸入、輸出...
```

**handler.ts（實作）**
```typescript
export async function handler(ctx: any) {
  const message = ctx.message?.text || ctx.message?.content || '';
  // skill 邏輯...
  return {
    reply: '回覆文字（支援 Markdown）',
    metadata: { key: 'value' },   // 選填，結構化資料
    files: ['/tmp/output.wav'],   // 選填，附件檔案路徑
  };
}
```

> 注意：不可 import 第三方 npm 套件（skill 環境無 node_modules），外部依賴改用 `execSync('curl ...')` 呼叫。

### 7.7 語音合成 Skill（tts-voice）

| Skill | 功能 | 觸發方式 |
|-------|------|---------|
| `tts-voice` | 文字轉語音（LuxTTS Voice Cloning，48kHz） | tts、文字轉語音、語音合成、唸出來、說出來 |

- 呼叫本機 LuxTTS API（localhost:7860），自動取得登入 cookie
- 支援修飾詞：慢速/快速/高品質
- 原始碼：`/home/selig/openclaw-skill/skills/tts-voice/`

### 7.8 Skill 開發指南

完整的 Skill 開發教學（含 SKILL.md 格式、handler.ts 寫法、觸發機制、context 物件、回傳格式、安裝驗證、實戰範例、常見踩坑）請參考：

`/home/selig/openclaw-skill/create-skill.md`
