/search-first — コードを書く前にリサーチせよ
「既存のソリューションを実装前に検索する」ワークフローを体系化します。
トリガー
以下の状況でこのスキルを使用します:
- 既存のソリューションが存在しそうな新機能の開始時
- 依存関係やインテグレーションの追加時
- ユーザーが「Xの機能を追加して」と頼み、コードを書き始めようとしたとき
- 新しいユーティリティ、ヘルパー、抽象化を作成する前
ワークフロー
┌─────────────────────────────────────────────┐
│ 0. ツール利用可能性の事前チェック │
│ 検索チャネルの可用性を確認し、 │
│ 利用不可のチャネルは正直に報告する │
├─────────────────────────────────────────────┤
│ 1. ニーズ分析 │
│ 必要な機能を定義する │
│ 言語・フレームワークの制約を特定する │
├─────────────────────────────────────────────┤
│ 2. 並列検索(リサーチャーエージェント) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ npm / │ │ MCP / │ │ GitHub / │ │
│ │ PyPI │ │ スキル │ │ Web │ │
│ └──────────┘ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────┤
│ 3. 評価 │
│ 候補を評価する(機能性、メンテナンス、 │
│ コミュニティ、ドキュメント、ライセンス、 │
│ 依存関係) │
├─────────────────────────────────────────────┤
│ 4. 決定 │
│ ┌─────────┐ ┌──────────┐ ┌─────────┐ │
│ │ 採用 │ │ 拡張 │ │ カスタム│ │
│ │ そのまま│ │ /ラップ │ │ 構築 │ │
│ └─────────┘ └──────────┘ └─────────┘ │
├─────────────────────────────────────────────┤
│ 5. 実装 │
│ パッケージのインストール / MCPの設定 / │
│ 最小限のカスタムコードを記述 │
└─────────────────────────────────────────────┘
判断マトリックス
| シグナル | アクション |
|---|---|
| 完全一致、メンテナンス良好、MIT/Apacheライセンス | 採用 — インストールしてそのまま使用する |
| 部分一致、良い基盤あり | 拡張 — インストール + 薄いラッパーを記述する |
| 複数の弱い一致 | 組み合わせ — 2~3の小さなパッケージを組み合わせる |
| 適切なものが見つからない | 構築 — カスタム実装するが、リサーチに基づいて行う |
使い方
ステップ0: ツール利用可能性の事前チェック
これは実行可能なセットアップスクリプトではなく、エージェント向けのガイダンスです。現在のタスクとプロジェクトに関連するチャネルのみをチェックします。
| チャネル | 確認方法 | 見つからない場合 |
|---|---|---|
| リポジトリ検索 | rg --files および対象を絞った rg クエリ | 可視ファイルのみを検査したことを明記する |
| パッケージレジストリ | npm --version、python -m pip --version、またはプロジェクトのパッケージマネージャー | Web/ドキュメント検索を使用し、レジストリの網羅性は主張しない |
| GitHub CLI | gh auth status | 公開Webまたはローカルgit履歴のみを使用する |
| MCP/ドキュメントツール | 利用可能なツール一覧またはローカルMCP設定 | 公式ドキュメント/Web検索にフォールバックする |
| スキルディレクトリ | 該当する場合 ls ~/.claude/skills ~/.codex/skills | ローカルのスキルカタログが利用できなかったことを明記する |
クイックモード(インライン)
ユーティリティを書いたり機能を追加する前に、頭の中で以下を実行します:
- これはリポジトリにすでに存在するか? → まず
rgで関連モジュール/テストを検索する - これは一般的な問題か? → npm/PyPIを検索する
- これに対するMCPはあるか? →
~/.claude/settings.jsonを確認し、検索する - これに対するスキルはあるか? →
~/.claude/skills/を確認する - GitHubに実装/テンプレートはあるか? → 新しいコードを書く前に、メンテナンスされたOSSをGitHubコード検索する
フルモード(エージェント)
重要な機能の場合は、リサーチャーエージェントを起動します:
Agent(subagent_type="general-purpose", prompt="
[説明] に対する既存ツールをリサーチしてください
言語/フレームワーク: [言語]
制約: [任意]
検索対象: npm/PyPI、MCPサーバー、Claude Codeスキル、GitHub
戻り値: 推奨事項を含む構造化比較表
")
古いClaude Codeのドキュメントではこれを Task(...) と呼んでいる場合があります。アクティブなハーネスが公開している現在のagent/subagentツール名を使用してください。
カテゴリ別検索ショートカット
開発ツール
- Lint →
eslint、ruff、textlint、markdownlint - フォーマット →
prettier、black、gofmt - テスト →
jest、pytest、go test - プリコミット →
husky、lint-staged、pre-commit
AI/LLM連携
- Claude SDK → 最新ドキュメントはContext7を確認
- プロンプト管理 → MCPサーバーを確認
- ドキュメント処理 →
unstructured、pdfplumber、mammoth
データとAPI
- HTTPクライアント →
httpx(Python)、ky/undici(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)にretryプラグインあり、httpx(Python)に組み込みretryあり
アクション: 採用 — got/httpxをretry設定付きで直接使用
結果: カスタムコードゼロ、本番実績のあるライブラリ
例3: 「設定ファイルリンターを追加」
ニーズ: プロジェクト設定ファイルをスキーマに対して検証する
検索: npm "config linter schema"、"json schema validator cli"
発見: ajv-cli(スコア: 8/10)
アクション: 採用 + 拡張 — ajv-cliをインストールし、プロジェクト固有のスキーマを記述
結果: 1パッケージ + 1スキーマファイル、カスタムバリデーションロジックなし
アンチパターン
- コードに飛びつく: 既存のものがあるか確認せずにユーティリティを書く
- MCPを無視する: MCPサーバーがすでに機能を提供しているか確認しない
- 黙ってスキップする: 検索チャネルが利用不可だったときに「何も見つからなかった」と報告する
- 過剰なカスタマイズ: ライブラリを過度にラップして、その利点を失わせる
- 依存関係の肥大化: 小さな一機能のために巨大なパッケージをインストールする