tabctl について
tabctlは、ブラウザーのタブを調査・分析し、依頼に応じてGraphQLで限定的な変更を行うスキルです。読み取り専用の確認を優先し、ブラウザー操作に安全策を設けています。
主な機能
- 01GraphQLによるタブ状態の照会
- 02重複・古いタブの分析
- 03ページ内容をMarkdownで抽出
- 04要素属性の確認
- 05タブとグループの限定的な変更
活用シーン
- 01ブラウザーウィンドウのタブとグループを確認
- 02重複または古いタブを特定
- 03複数タブのページ内容を読む
- 04選択したタブを整理してグループ化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ ekroon/ tabctl --skill tabctlインストール後、Claude Code で/tabctlを入力して読み込まれたか確認します。
詳細
タブ制御
tabctl を使ってタブを安全に調査・分析し、要求された場合にのみ、対象を絞った GraphQL ミューテーションを実行してください。
公開ブラウザー API
ブラウザーの状態は現在、GraphQL 経由でのみ公開されています。
tabctl query '<GRAPHQL>'tabctl schematabctl pingtabctl history
削除された従来のブラウザーサブコマンド(list、open、close、inspect、report、screenshot、archive、undo など)は使用しないでください。
検出
tabctl schema
tabctl help
tabctl help query
読み取り例
# Windows, tabs, and groups
tabctl query '{ windows { windowId focused groups { groupId title } tabs { tabId title url groupTitle } } }'
# Paginated tabs
tabctl query '{ tabs(limit: 20, offset: 0) { total hasMore items { tabId title url } } }'
# Analyze duplicate/stale tabs
tabctl query '{ analyze(windowId: 123, staleDays: 30) { totalTabs duplicateTabs staleTabs } }'
# Inspect page metadata
tabctl query 'query { inspectTabs(tabIds: [456], signals: ["page-meta"]) { entries { tabId signals { name valueJson } } } }'
# Inspect selectors with typed attrs and filters
tabctl query 'query { inspectTabs(windowId: 123, selectors: [{ name: "prices", selector: ".price", attr: "text", all: true, text: "$", textMode: "contains" }, { name: "submit_visible", selector: "#submit", attr: "visible" }, { name: "submit_style", selector: "#submit", attr: "styles", styleProps: ["color", "background-color"] }, { name: "item_count", selector: ".item", attr: "count" }, { name: "email_value", selector: "input[type=email]", attr: "value" }, { name: "tos_checked", selector: "input[name=terms]", attr: "checked" }]) { entries { tabId url signals { name valueJson } } } }'
# Read page content as Markdown
tabctl query 'query { readTabs(windowId: 123, extract: true, maxChars: 30000) { entries { tabId title url markdown chars truncated extracted cached status emptyReason diagnostics { source sourceHtmlChars sourceTextChars documentReadyState truncatedHtml cachedAt cacheAgeMs } error } } }'
# Build reports
tabctl query '{ reportTabs(windowId: 123) { entries { tabId title url description } } }'
# Capture screenshots
tabctl query 'query { captureScreenshots(tabIds: [456], mode: "viewport") { entries { tabId tiles { index width height } } } }'
読み取り専用の抽出に関する注意事項
readTabsは Kreuzberg の前処理を使用して、メインフレームの HTML を Markdown に変換します。タブごとにstatus、emptyReason、diagnostics、errorを確認してください。キャッシュされたフォールバックでは、プロファイルごとの上限付きの開いているタブのキャッシュが使用されます。このキャッシュは、読み取りの成功、アクティブなタブの切り替え、静止状態のアクティブページによって更新され、status: CACHED、cached: true、および診断情報内のキャッシュの出所が報告されます。readTabsv1 は、クロスオリジンの iframe や Shadow DOM をたどりません。スクリプトを実行できない URL は、status: UNSUPPORTED_URLとして返されます。inspectTabsのセレクター属性には、html、value、count、box、styles、visible、enabled、checkedが含まれるようになりました。visibleは、レンダリングされており、display:none、visibility:hidden、opacity:0のいずれにも該当しないことを意味します。enabledは、要素が無効化されておらず、aria-disabled != "true"であることを意味します。checkedは、フォームコントロールにはinput.checkedを使用し、それ以外ではaria-checked == "true"を使用します。
ミューテーションの例
# Open tabs in a new grouped window
tabctl query 'mutation { openTabs(urls: ["https://example.com"], group: "Research", newWindow: true) { windowId groupId tabs { tabId url } } }'
# Group and window changes
tabctl query 'mutation { updateGroup(groupId: 99, title: "Inbox", color: "blue") { groupId title color } }'
tabctl query 'mutation { assignToGroup(tabIds: [456], groupTitle: "Inbox") { groupId title } }'
tabctl query 'mutation { ungroupTabs(tabIds: [456]) { tabId groupId } }'
tabctl query 'mutation { moveGroup(groupId: 99, newWindow: true) { movedToWindowId movedTabs } }'
tabctl query 'mutation { mergeWindows(fromWindowId: 200, toWindowId: 123, closeSource: true, confirm: true) { movedTabs sourceClosed } }'
# Tab changes
tabctl query 'mutation { focusTab(tabId: 456) { success } }'
tabctl query 'mutation { refreshTabs(tabIds: [456]) { refreshedTabs } }'
tabctl query 'mutation { moveTab(tabIds: [456], windowId: 123, index: 0) { movedTabs } }'
# Destructive actions with undo support
tabctl query 'mutation { closeTabs(tabIds: [456], confirm: true) { txid closedTabs } }'
tabctl query 'mutation { archiveTabs(windowId: 123) { txid archivedTabs } }'
tabctl query 'mutation { deduplicateTabs(windowId: 123, confirm: true) { txid closedTabs } }'
tabctl query 'mutation { undoAction(latest: true) { txid summary } }'
# Extension reload
tabctl query 'mutation { reloadExtension { reloading } }'
安全性
- ユーザーが明示的に変更を求めない限り、読み取り専用の GraphQL クエリを優先してください。
- ミューテーションの対象を限定し、元に戻せるようにしてください。利用可能な場合は
txidの値を提示してください。 - 対象の指定または確認を明示的に得ることなく、ユーザーのブラウジングセッション全体に対して破壊的なワークフローを実行しないでください。
- ポリシーを遵守してください。保護されたタブはクエリとミューテーションの結果から除外されます。
- 視覚的なコンテキストが必要な場合にのみ、スクリーンショットを使用してください。
便利なコマンド
tabctl ping
tabctl history --limit 10
接続とバージョンの健全性確認には ping を、取り消しトランザクションの検索には history を使用してください。
トラブルシューティング
tabctl ping --jsonは、標準のランタイム健全性チェックです。tabctl doctor --fixは、ローカルプロファイルの設定と同期のずれを修復します。TABCTL_AUTO_SYNC_MODE=release-like tabctl query '{ tabs { total } }'は、ローカルのリリース相当テスト中にランタイムの同期動作を強制します。
コメント
Markdown 対応