--- name: search-first description: 研究优先于编码的工作流程。在编写自定义代码之前,搜索现有的工具、库和模式。调用研究员代理。 origin: ECC --- # /search-first — 编码前先研究 系统化“在实现之前先寻找现有解决方案”的工作流程。 ## 触发时机 在以下情况使用此技能: * 开始一项很可能已有解决方案的新功能 * 添加依赖项或集成 * 用户要求“添加 X 功能”而你准备开始编写代码 * 在创建新的实用程序、助手或抽象之前 ## 工作流程 ``` ┌─────────────────────────────────────────────┐ │ 1. 需求分析 │ │ 确定所需功能 │ │ 识别语言/框架限制 │ ├─────────────────────────────────────────────┤ │ 2. 并行搜索(研究员代理) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ npm / │ │ MCP / │ │ GitHub / │ │ │ │ PyPI │ │ 技能 │ │ 网络 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ ├─────────────────────────────────────────────┤ │ 3. 评估 │ │ 对候选方案进行评分(功能、维护、 │ │ 社区、文档、许可证、依赖) │ ├─────────────────────────────────────────────┤ │ 4. 决策 │ │ ┌─────────┐ ┌──────────┐ ┌─────────┐ │ │ │ 采用 │ │ 扩展 │ │ 构建 │ │ │ │ 原样 │ │ /包装 │ │ 定制 │ │ │ └─────────┘ └──────────┘ └─────────┘ │ ├─────────────────────────────────────────────┤ │ 5. 实施 │ │ 安装包 / 配置 MCP / │ │ 编写最小化自定义代码 │ └─────────────────────────────────────────────┘ ``` ## 决策矩阵 | 信号 | 行动 | |--------|--------| | 完全匹配,维护良好,MIT/Apache 许可证 | **采纳** — 直接安装并使用 | | 部分匹配,基础良好 | **扩展** — 安装 + 编写薄封装层 | | 多个弱匹配 | **组合** — 组合 2-3 个小包 | | 未找到合适的 | **构建** — 编写自定义代码,但需基于研究 | ## 使用方法 ### 快速模式(内联) 在编写实用程序或添加功能之前,在脑中过一遍: 0. 这已经在仓库中存在吗? → 首先通过相关模块/测试检查 `rg` 1. 这是一个常见问题吗? → 搜索 npm/PyPI 2. 有对应的 MCP 吗? → 检查 `~/.claude/settings.json` 并进行搜索 3. 有对应的技能吗? → 检查 `~/.claude/skills/` 4. 有 GitHub 上的实现/模板吗? → 在编写全新代码之前,先运行 GitHub 代码搜索以查找维护中的开源项目 ### 完整模式(代理) 对于非平凡的功能,启动研究员代理: ``` 任务(子代理类型="通用型",提示=" 研究现有工具用于:[描述] 语言/框架:[语言] 约束:[任何] 搜索:npm/PyPI、MCP 服务器、Claude Code 技能、GitHub 返回:结构化对比与推荐 ") ``` ## 按类别搜索快捷方式 ### 开发工具 * Linting → `eslint`, `ruff`, `textlint`, `markdownlint` * Formatting → `prettier`, `black`, `gofmt` * Testing → `jest`, `pytest`, `go test` * Pre-commit → `husky`, `lint-staged`, `pre-commit` ### AI/LLM 集成 * Claude SDK → 使用 Context7 获取最新文档 * 提示词管理 → 检查 MCP 服务器 * 文档处理 → `unstructured`, `pdfplumber`, `mammoth` ### 数据与 API * HTTP 客户端 → `httpx` (Python), `ky`/`got` (Node) * 验证 → `zod` (TS), `pydantic` (Python) * 数据库 → 首先检查是否有 MCP 服务器 ### 内容与发布 * Markdown 处理 → `remark`, `unified`, `markdown-it` * 图片优化 → `sharp`, `imagemin` ## 集成点 ### 与规划器代理 规划器应在阶段 1(架构评审)之前调用研究员: * 研究员识别可用的工具 * 规划器将它们纳入实施计划 * 避免在计划中“重新发明轮子” ### 与架构师代理 架构师应向研究员咨询: * 技术栈决策 * 集成模式发现 * 现有参考架构 ### 与迭代检索技能 结合进行渐进式发现: * 循环 1:广泛搜索 (npm, PyPI, MCP) * 循环 2:详细评估顶级候选方案 * 循环 3:测试与项目约束的兼容性 ## 示例 ### 示例 1:“添加死链检查” ``` 需求:检查 Markdown 文件中的失效链接 搜索:npm "markdown dead link checker" 发现:textlint-rule-no-dead-link(评分:9/10) 行动:采纳 — npm install textlint-rule-no-dead-link 结果:无需自定义代码,经过实战检验的解决方案 ``` ### 示例 2:“添加 HTTP 客户端包装器” ``` 需求:具备重试和超时处理能力的弹性 HTTP 客户端 搜索:npm "http client retry"、PyPI "httpx retry" 发现:got(Node)带重试插件、httpx(Python)带内置重试功能 行动:采用——直接使用 got/httpx 并配置重试 结果:零定制代码,生产验证的库 ``` ### 示例 3:“添加配置文件 linter” ``` 需求:根据模式验证项目配置文件 搜索:npm "config linter schema"、"json schema validator cli" 发现:ajv-cli(评分:8/10) 操作:采用 + 扩展 —— 安装 ajv-cli,编写项目特定的模式 结果:1 个包 + 1 个模式文件,无需自定义验证逻辑 ``` ## 反模式 * **直接跳转到编码**:不检查是否存在就编写实用程序 * **忽略 MCP**:不检查 MCP 服务器是否已提供该能力 * **过度定制**:对库进行如此厚重的包装以至于失去了其优势 * **依赖项膨胀**:为了一个小功能安装一个庞大的包