skills/tabctl/SKILL.md
Manage and analyze Edge tabs and groups with tabctl. Use GraphQL-first workflows via `tabctl query` for browser reads and mutations, and keep mutations explicit and reversible.
npx skillsauth add ekroon/tabctl tabctlInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use tabctl to inspect and analyze tabs safely, then perform targeted GraphQL mutations only when requested.
Browser state is now exposed through GraphQL only:
tabctl query '<GRAPHQL>'tabctl schematabctl pingtabctl historyDo not use removed legacy browser subcommands like list, open, close, inspect, report, screenshot, archive, or 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 converts main-frame HTML to Markdown with Kreuzberg preprocessing. Check status, emptyReason, diagnostics, and error per tab; cached fallbacks use a bounded profile-local open-tab cache refreshed by successful reads, active tab switches, and quiescent active pages, and report status: CACHED, cached: true, and cache provenance in diagnostics.readTabs v1 does not traverse cross-origin iframes or shadow DOM; non-scriptable URLs are returned with status: UNSUPPORTED_URL.inspectTabs selector attrs now include html, value, count, box, styles, visible, enabled, and checked.visible means rendered and not display:none, visibility:hidden, or opacity:0.enabled means the element is not disabled and aria-disabled != "true".checked uses input.checked for form controls, otherwise 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 } }'
txid values when available.tabctl ping
tabctl history --limit 10
Use ping for connectivity/version health and history to find undo transactions.
tabctl ping --json is the canonical runtime health check.tabctl doctor --fix repairs local profile wiring and sync drift.TABCTL_AUTO_SYNC_MODE=release-like tabctl query '{ tabs { total } }' forces runtime sync behavior during local release-like testing.development
Bump version, test, build, tag, push, and create a GitHub Release. Use when user asks to release, bump version, cut a release, or mentions "/release". Analyzes conventional commits to auto-detect bump type. Always confirms before pushing.
testing
Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit, tidy up, or clean up an existing skill or SKILL.md file. Also use when editing or restructuring a skill directory (moving files to references/ or scripts/, removing stale content, validating against the AgentSkills spec). Triggers on phrases like "create a skill", "author a skill", "tidy up a skill", "improve this skill", "review the skill", "clean up the skill", "audit the skill".
testing
Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).
testing
Create, edit, improve, or audit AgentSkills. Use when creating a new skill from scratch or when asked to improve, review, audit, tidy up, or clean up an existing skill or SKILL.md file. Also use when editing or restructuring a skill directory (moving files to references/ or scripts/, removing stale content, validating against the AgentSkills spec). Triggers on phrases like "create a skill", "author a skill", "tidy up a skill", "improve this skill", "review the skill", "clean up the skill", "audit the skill".