React Grab
aidenybai/react-grab · 開発中アプリ上で UI を選び、エージェント向けコンテキストをコピー
React Grab は、ブラウザ上の任意の UI 要素を指定し、その背後にあるソースファイル・行番号・React コンポーネントスタックをクリップボードにまとめてコピーするツール。Cursor・Claude Code・Copilot などのコーディングエージェントに貼り付けることで、「どのコンポーネントのどの行か」を明示したまま修正依頼できる。公式ベンチマークでは編集が約 2 倍速になり精度も上がるとしている。
ランタイムは 開発環境のみで読み込む想定。CLI(grab)が Next.js / Vite / TanStack Start / Webpack などを検出し、フレームワーク別の dev-only 設定を自動適用する。
NODE_ENV === "development" のときだけ react-grab のスクリプトまたは dynamic import を有効にする。
grab configure で変更できる。in ComponentName (at path:line:col) 形式のスタックが含まれる。<a class="ml-auto inline-block text-sm" href="#">
Forgot your password?
</a>
// components/login-form.tsx:46
45| <div className="flex items-center">
> 46| <a className="ml-auto inline-block text-sm" href="#">
47| Forgot your password?
48| </a>
in LoginForm (at components/login-form.tsx:46:19)
init() 後、キーのホールドまたはトグルで active に入る。ホバー・クリック固定(frozen)・矩形ドラッグ選択・コピー中(copying)を core/store.ts の判別共用体で管理する。
- ブラウザで
importされるとinit()が走り、API がwindow.__REACT_GRAB__に露出する(SSR 時は同形の Noop API)。 - オーバーレイ UI は Shadow DOM にマウントし、ホストは
pointer-events: none(子 UI だけがイベントを受ける)。 - レンダラー(Solid コンポーネント群)は dynamic import で遅延読み込みし、検出ロジックを先に立ち上げる。
- コピー・コメント・エディタで開くはすべてプラグインとして登録され、コアはパイプラインだけを提供する。
| npm 名 | 役割 |
|---|---|
react-grab | コア。要素ハイライト・コンテキスト解決(bippy + source map)・コピー・プラグインレジストリ。Solid.js で UI/状態。 |
grab | 公開 CLI パッケージ。npx grab@latest init のエントリ。 |
@react-grab/cli | CLI 実装。フレームワーク検出・設定ファイル変換・MCP インストール補助。 |
@react-grab/mcp | MCP サーバー / クライアント。npx grab add mcp でエージェントに接続。 |
apps/(リポジトリ内)
| ディレクトリ | 役割 |
|---|---|
website / website-v2 | マーケティングサイト・デモ |
web-extension | ブラウザ拡張(任意サイトで Grab を使う) |
e2e-app | Playwright E2E 用のサンプルアプリ |
openstory | コンポーネントストーリー / デモ |
プロジェクトルート(next.config.ts や vite.config.ts がある階層)で:
npx grab@latest init
MCP 連携を追加する場合:
npx grab@latest add mcp
有効化キーやホールド時間などは対話式またはフラグ付きで更新できる:
npx grab@latest configure
npx grab@latest configure --mode hold --hold-duration 500
npx grab@latest init -k "Meta+K" -y
| コマンド | 主なオプション |
|---|---|
grab init | -y 確認スキップ、-k 有効化キー、-f 上書き、--skip-install |
grab configure | --mode toggle|hold、--hold-duration、--context-lines、--cdn |
grab add mcp | 対応エージェント向け MCP 設定を追加 |
CLI が使えない場合、エントリの先頭で開発時のみ import する:
if (import.meta.env.DEV) {
import("react-grab");
}
Next.js App Router では app/layout.tsx に unpkg 経由の <Script src="//unpkg.com/react-grab/dist/index.global.js" /> を development 条件付きで入れる方法もある(詳細は公式 README)。
コンテキストメニュー・ツールバー・ライフサイクルフック・テーマ上書きを registerPlugin / unregisterPlugin で追加する。組み込みプラグインは copy(デフォルトコピー)、comment(プロンプトモード)、open(エディタで開く)の 3 つ。
import { registerPlugin, unregisterPlugin } from "react-grab";
registerPlugin({
name: "my-plugin",
actions: [
{
id: "inspect",
label: "Inspect",
shortcut: "I",
onAction: (ctx) => console.dir(ctx.element),
},
{
id: "toggle-freeze",
label: "Freeze",
target: "toolbar",
onAction: () => toggleFreeze(),
},
],
hooks: {
onElementSelect: (element) => {
console.log("Selected:", element.tagName);
},
},
});
コピー内容は onBeforeCopy → transformSnippet → transformCopyContent の reduce パイプラインを通過する。型定義は Plugin / PluginHooks(packages/react-grab/src/types.ts)。
init(options?) → ReactGrabAPI—activate/deactivate/togglecopyElement(elements)、getSource(element)、getStackContext(element)registerPlugin/unregisterPlugin、setOptions、getState、disposereact-grab/primitives—getElementContext、freeze/unfreeze、openFile(カスタム選択 UI 向け)
オーバーレイ表示中は見た目が動かないよう、複数系統を同時に止める(いずれも React 内部へのパッチを含み、バージョン依存で脆い)。
- React 更新 — ディスパッチャをラップし、
useState/useReducer等の dispatch をバッファ。解除時に順序付きでリプレイ。 - アニメーション — CSS / WAAPI / SVG SMIL / GSAP を一時停止。解除時は
finish()でジャンプを避ける。 - 疑似状態 —
:hover/:focusの見た目をインラインスタイルで固定し、ポインタがオーバーレイに移っても色が変わらないようにする。
- DOM → bippy で最寄りの React fiber
- fiber →
getOwnerStack()(React 19 は_debugStack、17–18 はフォールバック生成) - バンドル URL → source map で元ファイル・行へ
- RSC の
rsc://URL → Next.js の/__nextjs_original-stack-framesで実パスへ - 表示名フィルタ(
InnerLayoutRouter等の内部名を除外)→ エディタ起動(Vite / Next の open-in-editor、失敗時はvscode://リダイレクト)
key ゲッターパッチ・Canvas オーバーレイなどは、リポジトリ内の packages/react-grab/docs/architecture.md に長文でまとまっている。
- react-grab.com — デモ・ドキュメント
- GitHub: aidenybai/react-grab
- npm: react-grab
- benchmarks.react-grab.com — 速度・精度ベンチマーク