find-everything
# find-everything:跨平台资源搜索
## 触发条件
1. **显式调用**:`/find-everything {query}`
2. **自动检测**:用户问"有没有xxx工具"、"帮我找个xxx"、"有没有skill能..."
3. **主动推荐**:基于对话上下文判断用户在持续做某类任务且缺少相关工具(best-effort 启发式,同会话最多 1 次)
## 执行流程
### Step 1: 意图分类
将用户查询分类为一个或多个类别:
- **skill**: Agent Skills(可安装技能)
- **mcp**: MCP Servers
- **prompt**: 提示词模板/角色扮演/图片生成
- **repo**: GitHub 开源项目
模糊需求同时搜索多个类别。从自然语言中提取核心搜索关键词。
### Step 2: 读取注册表并路由
读取 `references/registry.json`。若读取失败,使用以下硬编码最小源:
- skills-sh: `npx skills find {query}`
- github: `gh search repos {query} --sort stars --limit 10 --json name,owner,description,url,stargazersCount`
筛选规则:
1. 只选 `enabled: true` 的源
2. 只选 `category` 包含目标类别的源
3. 检查 `requires` 是否满足:
- `requires` 为 CLI 名称(如 `npx`、`gh`)→ 用 `which` 检查
- `requires` 以 `mcp:` 开头(如 `mcp:prompts-chat`)→ 检查对应 MCP tool 是否在当前会话可用(尝试 ToolSearch 或直接调用)
4. 不可用的源跳过,记录到 `skipped_sources` 列表,附带 `install_hint`(如有)
### Step 3: Tier 1 搜索
在**同一条回复**中发起多个独立 tool 调用实现并行:
**cli 类型**:用 Bash tool 执行 `command` 字段({query} 替换为实际关键词),15 秒超时。
**mcp 类型**:调用 registry.json 中 `tool` 字段指定的 MCP tool,参数取 `tool_params`({query} 替换为实际关键词)。例如:
- `search_prompts({ query: "blockchain analyst", limit: 10 })` → 返回 prompt 列表
- `search_skills({ query: "search aggregator", limit: 10 })` → 返回 skill 列表
- 支持的额外过滤参数(按需使用):`type`(TEXT/STRUCTURED/IMAGE)、`category`、`tag`
**skill 类型**:调用对应已安装 skill。
若并行不可用,按优先级执行:skills-sh > github > clawhub > 其他。
### Step 4: 结果数量预判
基于标题/描述的关键词匹配做轻量判断(非完整 LLM 评估):
- ≥3 条匹配度高 → 跳到 Step 6(末尾注明"搜索更多源可获取更多结果")
- <3 条或匹配度低 → 继续 Step 5
### Step 5: Tier 2/3 搜索
**Tier 2**:将同类别 Tier 2 源合并为 1 次 WebSearch:
```
{query} {category关键词} site:skillhub.club OR site:aiskillsshow.com OR site:skillsmp.com
```
若合并查询返回 <2 条,退回对 Top 2-3 优先源逐个 `site:` 搜索。
**Tier 3**(仍不足时):不带 `site:` 限定的广域 WebSearch。
### Step 6: 结果评估
对每条结果判断相关性:
- **高相关**:保留,排在前面
- **中相关**:保留,排在后面,标注"可能相关"
- **不相关**:丢弃
对 Top 3-5 条高相关结果,可选 WebFetch 补充详情。
### Step 7: 安全快筛
对所有保留结果做元数据安全标注:
- **[SAFE]**:来自注册表已知平台 + 安装量 >100
- **[CAUTION]**:安装量低、来源不明、或 Tier 3 发现
- **[RISK]**:名称疑似 typosquat,或其他红旗信号
### Step 8: 去重 + 排序
同一工具出现在多个源 → 合并为一条,标注所有来源。
合并时优先保留安装量/star 数最高的来源作为主展示(同一站点可能有 Tier 1 CLI 和 Tier 2 WebSearch 两条结果,合并时保留 Tier 1 数据)。
排序:相关度 > 安全等级 > 安装量/star 数。
### Step 9: 展示推荐
格式:
```
找到 N 个相关结果(来自 X 个源)
1. [名称] [SAFE]
来源: skills.sh | 安装量: 1.2K
简介: ...
推荐理由: ...
2. [名称] [CAUTION]
来源: WebSearch (skillhub.club) | star: 50
简介: ...
注意: 来源非直接 API,建议安装前审查源码
---
未覆盖的搜索源: clawhub CLI(未安装)
提示: npm i -g clawhub
```
注意:同一依赖缺失提示每会话只展示一次,避免重复打扰。
### Step 10: 用户后续操作
用户说**"看看"/"详细"** → WebFetch 详情页展示更多信息。
用户说**"安装"/"用这个"** → 触发深度安全扫描:
**1. 获取资源内容(按类型):**
| 资源类型 | 扫描目标 | 获取方式 |
|---|---|---|
| Skill (skills.sh/clawhub) | SKILL.md + scripts/ 目录 | 优先 WebFetch GitHub 源码(从搜索结果中的 repo URL 获取);若不可访问,`npx skills add <name>` 安装到临时目录后读取 |
| MCP Server | package.json + 入口文件 | WebFetch npm registry 页面或 GitHub README,提取入口文件路径后 WebFetch |
| GitHub Repo | README.md + 主要脚本文件 | `gh api repos/{owner}/{repo}/contents` 获取文件列表,WebFetch 关键文件 |
| Prompt | 提示词文本本身 | 通常搜索结果中已包含完整文本,无需额外获取 |
**限制:** 单次扫描最多 50KB。超出只扫 SKILL.md + 入口文件。
**2.** 运行安全扫描(路径相对于本 SKILL.md 所在目录解析):`python3 scripts/security_scan.py <file> [--check-name <name> --known-skills references/known_skills.txt]`
**3.** 读取 `references/security-checklist.md`,结合 security_scan.py 结果做 LLM 上下文评估
**4.** 输出量化评分(0-100)和风险定级
**5.** [SAFE] → 执行安装;[CAUTION] → 展示详情让用户确认;[RISK] → 明确提示风险,不自动安装
### Step 11: 新站点发现
Tier 3 搜索发现了不在 registry.json 中的优质资源站 → 提示用户:
"发现新站点 xxx.com,内容相关度高。要加入搜索注册表吗?"
用户确认 → 在 registry.json 的 sources 数组中追加新条目。
## 错误处理
| 场景 | 处理 |
|---|---|
| CLI 超时(15s) | 跳过该源,继续其他 |
| WebSearch 错误/限流 | 跳过 Tier 2,展示 Tier 1 结果 + 提示稍后重试 |
| security_scan.py 崩溃 | 退回 LLM-only 评估,标记"自动扫描未完成" |
| 所有 Tier 1 不可用 | 直接进 Tier 2,注明"主要搜索源暂不可用" |
| 所有源失败 | 告知用户搜索失败,建议检查网络 |
## 主动推荐逻辑
触发条件(低频,同会话最多 1 次):
- 对话上下文显示用户持续在做某类任务(如调试、前端开发、数据处理)
- 且当前未见明显相关的 skill/MCP 在使用
推荐格式:
"[发现] 你正在做 xxx,有一些工具可能有帮助,要搜索看看吗?"
标签
skill
ai