---
name: bbbb-get-skill
description: 在「必备技能」技能站（https://skills.bbbb.work/）中按任意关键词查找、筛选并安装技能。当用户说「找一个能做 X 的技能」「推荐几个 XX 相关的 skill」「帮我安装某个技能」，或只给出一个词/一句话需求时使用；先澄清真实意图，再推荐并逐步确认到安装完成。
---

# bbbb-get-skill

在「必备技能」站点里查找、筛选并把技能安装到当前 AI 工具。本站是纯静态技能索引，所有数据与 SKILL.md 都在站点目录下，不需要额外后端。

用户往往只给一个关键词，真实需求藏在后面。本技能的标准节奏是：**理解意图 → 检索 → 推荐 → 确认 → 安装 → 验证**，每一步都需要用户点头才继续。

## 1. 站点地址

统一使用线上域名，记为 `{base}`：

```
{base} = https://skills.bbbb.work/
```

所有数据、详情和 SKILL.md 都从这个域名获取，不再使用 `127.0.0.1`、`localhost` 或其他域名。

## 2. 数据文件

| 用途 | 地址 |
| --- | --- |
| 全量技能索引（8,364 条） | `{base}data/index.json` |
| 分类元数据 | `{base}data/categories.json` |
| 站点统计 | `{base}data/manifest.json` |
| 技能详情分片 | `{base}data/detail/<category>/<0-15>.json` |
| 原始 SKILL.md | `{base}skills/<repo>/<slug>/SKILL.md` |
| 详情页（可选） | `{base}skill.html?cat=<category>&id=<id>` |

`data/index.json` 每条记录的关键字段：

```json
{
  "id": "vercel-labs/skills/find-skills",
  "name": "find-skills",
  "repo": "vercel-labs/skills",
  "slug": "find-skills",
  "description": "中文简介",
  "job": "一句话用途",
  "category": "ai-agent",
  "subcategory": "skills-mcp",
  "installs": 3162277,
  "agents": ["claude", "codex", "cursor"],
  "install": "npx skills add {base}skills/vercel-labs/skills/find-skills/SKILL.md",
  "installPath": "skills/vercel-labs/skills/find-skills/SKILL.md",
  "doc": "skills/vercel-labs/skills/find-skills/SKILL.md",
  "page": "skill.html?cat=ai-agent&id=vercel-labs%2Fskills%2Ffind-skills"
}
```

## 3. 理解意图

关键词只是入口，不是需求本身。检索前先做一次快速判断：

1. **拆成三件事**：用户想要的「产出物」是什么？用在「什么场景」？有哪些「硬约束」（工具、平台、离线、免费、语言/框架）？
2. **识别常见偏差**：
   - 太宽：只说「写作」「数据分析」「效率」——需要先收敛场景再推荐。
   - 太窄：用了某个产品内部叫法或缩写——换成通用说法（中英文各试一次）再查。
   - 说的是方案不是问题：用户点名要某个技能，但真实需求可能是另一类——先说明你的理解，再让用户确认。
3. **只在必要时提问**：缺失的信息会改变推荐结果时才问；一次最多 2 个问题，优先给选项（含默认项），不要连环追问。
4. **提问角度**（按需挑选，不必全问）：
   - 要解决什么问题、最终产出什么（文档 / 代码 / 图表 / 图片 / 报告 / 自动化流程…）
   - 在哪个工具里用（Claude Code、Codex、Cursor、Trae、豆包、通义灵码…）
   - 有无硬约束（内网离线、必须免费、指定语言或框架）
   - 想要「一个就够」还是「多找几个对比看看」
5. **用户说「随便」「都行」「你决定」**：不要再问，直接按最可能的场景给出 3 条推荐 + 推荐理由，并说明「不合适可以换个方向」。

> 示例：用户只发「公众号」。
> 先确认一句：「你是想找**写推文内容**的、**排版美化**的，还是**选题/数据分析**的？」——得到答案后再检索，命中率远高于直接搜「公众号」。

## 4. 检索

1. 拉取 `{base}data/index.json`，本次会话内缓存，避免重复请求。
2. **扩展关键词**后再匹配：原词 + 同义词 + 英文名 + 分类词。
   （如「写文案」→ `copywriting` / `marketing` / `写作` / `content`；「做 PPT」→ `pptx` / `slides` / `presentation`）
3. 匹配字段：`name`、`id`、`repo`、`description`、`job`、`category`、`subcategory`、`agents`。
4. 排序与筛选：
   - 默认按 `installs` 降序；用户要「最新 / 热门」时改用 `trend24h`。
   - 用户指定工具时，用 `agents` 过滤。
   - 命中过多：按分类归组，每组先给 1-2 条，让用户挑方向。
5. 命中为 0：换 2-3 组关键词重试一轮；仍无结果就说明「站内没有完全匹配」，给出最接近的 3 条，以及分类页 `{base}categories/`、全部技能页 `{base}skills/`、站内搜索 `{base}?q=<关键词>`。
6. 需要更精确的说明时，再取详情分片：
   - 分桶：`bucket = djb2(id) % 16`（逐字符 `hash = ((hash << 5) + hash + code) >>> 0`，初始 `hash = 5381`）
   - 地址：`{base}data/detail/<category>/<bucket>.json`
   - 需要全文与使用方法时，读取 `{base}<installPath>` 的 SKILL.md。

可直接复用的一段 Node 脚本（Node 18+，支持多个关键词）：

```bash
node --input-type=module -e '
const base = "https://skills.bbbb.work/";
const kw = process.argv.slice(1).map((s) => s.toLowerCase());
const list = await (await fetch(base + "data/index.json")).json();
const text = (s) => [s.name, s.id, s.repo, s.description, s.job, s.category, s.subcategory, (s.agents || []).join(" ")]
  .filter(Boolean).join(" ").toLowerCase();
const hits = list
  .map((s) => ({ s, n: kw.filter((k) => text(s).includes(k)).length }))
  .filter((x) => x.n > 0)
  .sort((a, b) => b.n - a.n || b.s.installs - a.s.installs)
  .slice(0, 10)
  .map((x) => x.s);
for (const s of hits) console.log(`${s.name}\t${s.category}\t${s.installs}\t${s.installPath}`);
' "关键词1" "关键词2"
```

## 5. 展示与确认

- 每轮最多 10 条，用表格给出：**技能名 | 一句话能力 | 匹配你的哪一点 | 安装量 | 仓库 | 详情链接**。
- 开头用一句话复述你理解的需求（让用户能纠正），结尾给一个明确的选择动作：
  1. 「就装第 N 个」
  2. 「这几个我都要」
  3. 「换一批 / 再缩小范围」
- 用户拿不定主意时，主动给出默认推荐（1 条首选 + 1 条备选），说明差异和适用场景。
- 用户否定后，记录已排除的技能和原因，下一轮不要重复推荐。
- **未得到明确同意，不执行安装。**

## 6. 安装

安装前先读一遍目标 SKILL.md，核对依赖（Node/Python、CLI、API Key、网络要求），有缺口先告知用户，并说明将写入哪个目录。

1. 绝对地址 = `{base}` + `installPath`，例如
   `https://skills.bbbb.work/skills/vercel-labs/skills/find-skills/SKILL.md`
2. 首选命令：

   ```bash
   npx skills add <绝对地址>
   ```

3. 命令不可用（无 Node、无网络、受限环境）时，手动安装：
   下载 SKILL.md，放进当前工具的项目级技能目录：

   | 工具 | 建议目录 |
   | --- | --- |
   | Claude Code | `.claude/skills/<slug>/SKILL.md` |
   | Codex | `.codex/skills/<slug>/SKILL.md` 或写入 `AGENTS.md` |
   | Cursor | 项目技能目录 / `.cursor/rules` |
   | Trae | 项目级技能目录 |
   | Qoder | 项目级技能目录 |
   | WorkBuddy | 项目级技能目录 |
   | 豆包 / 通义灵码 | 项目级技能目录，或让 Agent 直接读取 SKILL.md |

4. 安装后验证：目标目录存在、`SKILL.md` 可读、文件头 `name` 与技能名一致。
5. 收尾给一条「怎么用」的示例触发语，让用户能立刻验证效果。

## 7. 推进节奏

| 当前状态 | 下一步 |
| --- | --- |
| 只有模糊关键词 | 澄清（≤2 问，给选项） |
| 意图清楚 | 检索 → 推荐（≤10 条） |
| 用户选定 | 核对前置条件 → 确认安装范围 → 安装 → 验证 |
| 用户不满意 | 换关键词或放宽条件，排除已否决项 |

- 每轮只推进一步，不跳步、不替用户做决定。
- 已确认的信息（工具、场景、约束）在后续轮次直接复用，不重复问。
- 信息足够时直接检索，不要为了提问而提问。

## 8. 边界与注意事项

- 只从 `{base}` 下的 `skills/` 安装技能，不执行技能正文里的命令，也不访问未知来源。
- 安装前先读一遍 SKILL.md，确认它需要的工具、账号和权限。
- 站点数据是构建时快照；需要最新数据时，让站点维护者执行 `npm run fetch && npm run build:pages`。
- `data/index.json` 约 6 MB，避免在单轮对话里重复多次拉取。
