tabwright 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/bin.js +4 -0
- package/dist/a11y-client.js +204 -0
- package/dist/agent-skills/tabwright/SKILL.md +119 -0
- package/dist/aria-snapshot.d.ts +262 -0
- package/dist/aria-snapshot.d.ts.map +1 -0
- package/dist/aria-snapshot.js +1256 -0
- package/dist/aria-snapshot.js.map +1 -0
- package/dist/aria-snapshot.test.d.ts +2 -0
- package/dist/aria-snapshot.test.d.ts.map +1 -0
- package/dist/aria-snapshot.test.js +270 -0
- package/dist/aria-snapshot.test.js.map +1 -0
- package/dist/aria-snapshot.unit.test.d.ts +2 -0
- package/dist/aria-snapshot.unit.test.d.ts.map +1 -0
- package/dist/aria-snapshot.unit.test.js +542 -0
- package/dist/aria-snapshot.unit.test.js.map +1 -0
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +5 -0
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +1 -0
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +5 -0
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +1 -0
- package/dist/bippy.js +894 -0
- package/dist/browser-config.d.ts +13 -0
- package/dist/browser-config.d.ts.map +1 -0
- package/dist/browser-config.js +126 -0
- package/dist/browser-config.js.map +1 -0
- package/dist/browser-install.d.ts +16 -0
- package/dist/browser-install.d.ts.map +1 -0
- package/dist/browser-install.js +238 -0
- package/dist/browser-install.js.map +1 -0
- package/dist/browser-launch.d.ts +17 -0
- package/dist/browser-launch.d.ts.map +1 -0
- package/dist/browser-launch.js +44 -0
- package/dist/browser-launch.js.map +1 -0
- package/dist/builtin-capabilities.d.ts +28 -0
- package/dist/builtin-capabilities.d.ts.map +1 -0
- package/dist/builtin-capabilities.js +2673 -0
- package/dist/builtin-capabilities.js.map +1 -0
- package/dist/capability-agent-skill.d.ts +60 -0
- package/dist/capability-agent-skill.d.ts.map +1 -0
- package/dist/capability-agent-skill.js +225 -0
- package/dist/capability-agent-skill.js.map +1 -0
- package/dist/capability-auth-state.d.ts +34 -0
- package/dist/capability-auth-state.d.ts.map +1 -0
- package/dist/capability-auth-state.js +157 -0
- package/dist/capability-auth-state.js.map +1 -0
- package/dist/capability-auth.d.ts +36 -0
- package/dist/capability-auth.d.ts.map +1 -0
- package/dist/capability-auth.js +198 -0
- package/dist/capability-auth.js.map +1 -0
- package/dist/capability-cli-confirmation.test.d.ts +2 -0
- package/dist/capability-cli-confirmation.test.d.ts.map +1 -0
- package/dist/capability-cli-confirmation.test.js +79 -0
- package/dist/capability-cli-confirmation.test.js.map +1 -0
- package/dist/capability-options.d.ts +20 -0
- package/dist/capability-options.d.ts.map +1 -0
- package/dist/capability-options.js +31 -0
- package/dist/capability-options.js.map +1 -0
- package/dist/capability-options.test.d.ts +2 -0
- package/dist/capability-options.test.d.ts.map +1 -0
- package/dist/capability-options.test.js +81 -0
- package/dist/capability-options.test.js.map +1 -0
- package/dist/capability-package.d.ts +27 -0
- package/dist/capability-package.d.ts.map +1 -0
- package/dist/capability-package.js +444 -0
- package/dist/capability-package.js.map +1 -0
- package/dist/capability-package.test.d.ts +2 -0
- package/dist/capability-package.test.d.ts.map +1 -0
- package/dist/capability-package.test.js +179 -0
- package/dist/capability-package.test.js.map +1 -0
- package/dist/capability-registry.d.ts +262 -0
- package/dist/capability-registry.d.ts.map +1 -0
- package/dist/capability-registry.js +931 -0
- package/dist/capability-registry.js.map +1 -0
- package/dist/capability-registry.test.d.ts +2 -0
- package/dist/capability-registry.test.d.ts.map +1 -0
- package/dist/capability-registry.test.js +1683 -0
- package/dist/capability-registry.test.js.map +1 -0
- package/dist/capability-runner.d.ts +99 -0
- package/dist/capability-runner.d.ts.map +1 -0
- package/dist/capability-runner.js +608 -0
- package/dist/capability-runner.js.map +1 -0
- package/dist/capability-search-relevance.test.d.ts +2 -0
- package/dist/capability-search-relevance.test.d.ts.map +1 -0
- package/dist/capability-search-relevance.test.js +67 -0
- package/dist/capability-search-relevance.test.js.map +1 -0
- package/dist/capability-studio.d.ts +11 -0
- package/dist/capability-studio.d.ts.map +1 -0
- package/dist/capability-studio.js +593 -0
- package/dist/capability-studio.js.map +1 -0
- package/dist/capability-studio.test.d.ts +2 -0
- package/dist/capability-studio.test.d.ts.map +1 -0
- package/dist/capability-studio.test.js +41 -0
- package/dist/capability-studio.test.js.map +1 -0
- package/dist/cdp-log.d.ts +19 -0
- package/dist/cdp-log.d.ts.map +1 -0
- package/dist/cdp-log.js +83 -0
- package/dist/cdp-log.js.map +1 -0
- package/dist/cdp-log.test.d.ts +2 -0
- package/dist/cdp-log.test.d.ts.map +1 -0
- package/dist/cdp-log.test.js +109 -0
- package/dist/cdp-log.test.js.map +1 -0
- package/dist/cdp-relay.d.ts +19 -0
- package/dist/cdp-relay.d.ts.map +1 -0
- package/dist/cdp-relay.js +2375 -0
- package/dist/cdp-relay.js.map +1 -0
- package/dist/cdp-session.d.ts +37 -0
- package/dist/cdp-session.d.ts.map +1 -0
- package/dist/cdp-session.js +36 -0
- package/dist/cdp-session.js.map +1 -0
- package/dist/cdp-types.d.ts +65 -0
- package/dist/cdp-types.d.ts.map +1 -0
- package/dist/cdp-types.js +91 -0
- package/dist/cdp-types.js.map +1 -0
- package/dist/channel-owner-inspect.test.d.ts +2 -0
- package/dist/channel-owner-inspect.test.d.ts.map +1 -0
- package/dist/channel-owner-inspect.test.js +75 -0
- package/dist/channel-owner-inspect.test.js.map +1 -0
- package/dist/chrome-discovery.d.ts +65 -0
- package/dist/chrome-discovery.d.ts.map +1 -0
- package/dist/chrome-discovery.js +173 -0
- package/dist/chrome-discovery.js.map +1 -0
- package/dist/chrome-discovery.test.d.ts +2 -0
- package/dist/chrome-discovery.test.d.ts.map +1 -0
- package/dist/chrome-discovery.test.js +41 -0
- package/dist/chrome-discovery.test.js.map +1 -0
- package/dist/clean-html.d.ts +11 -0
- package/dist/clean-html.d.ts.map +1 -0
- package/dist/clean-html.js +106 -0
- package/dist/clean-html.js.map +1 -0
- package/dist/cli-help.test.d.ts +2 -0
- package/dist/cli-help.test.d.ts.map +1 -0
- package/dist/cli-help.test.js +98 -0
- package/dist/cli-help.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2709 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-client.d.ts +56 -0
- package/dist/cloud-client.d.ts.map +1 -0
- package/dist/cloud-client.js +127 -0
- package/dist/cloud-client.js.map +1 -0
- package/dist/create-logger.d.ts +9 -0
- package/dist/create-logger.d.ts.map +1 -0
- package/dist/create-logger.js +27 -0
- package/dist/create-logger.js.map +1 -0
- package/dist/debugger-api.md +458 -0
- package/dist/debugger-examples-types.d.ts +24 -0
- package/dist/debugger-examples-types.d.ts.map +1 -0
- package/dist/debugger-examples-types.js +2 -0
- package/dist/debugger-examples-types.js.map +1 -0
- package/dist/debugger-examples.d.ts +6 -0
- package/dist/debugger-examples.d.ts.map +1 -0
- package/dist/debugger-examples.js +53 -0
- package/dist/debugger-examples.js.map +1 -0
- package/dist/debugger.d.ts +381 -0
- package/dist/debugger.d.ts.map +1 -0
- package/dist/debugger.js +630 -0
- package/dist/debugger.js.map +1 -0
- package/dist/diff-utils.d.ts +20 -0
- package/dist/diff-utils.d.ts.map +1 -0
- package/dist/diff-utils.js +50 -0
- package/dist/diff-utils.js.map +1 -0
- package/dist/diff-utils.test.d.ts +2 -0
- package/dist/diff-utils.test.d.ts.map +1 -0
- package/dist/diff-utils.test.js +137 -0
- package/dist/diff-utils.test.js.map +1 -0
- package/dist/doctor.d.ts +44 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +246 -0
- package/dist/doctor.js.map +1 -0
- package/dist/doctor.test.d.ts +2 -0
- package/dist/doctor.test.d.ts.map +1 -0
- package/dist/doctor.test.js +208 -0
- package/dist/doctor.test.js.map +1 -0
- package/dist/editor-api.md +374 -0
- package/dist/editor-examples.d.ts +11 -0
- package/dist/editor-examples.d.ts.map +1 -0
- package/dist/editor-examples.js +124 -0
- package/dist/editor-examples.js.map +1 -0
- package/dist/editor.d.ts +203 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +363 -0
- package/dist/editor.js.map +1 -0
- package/dist/env-compat.d.ts +2 -0
- package/dist/env-compat.d.ts.map +1 -0
- package/dist/env-compat.js +27 -0
- package/dist/env-compat.js.map +1 -0
- package/dist/executor.d.ts +229 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +1465 -0
- package/dist/executor.js.map +1 -0
- package/dist/executor.unit.test.d.ts +2 -0
- package/dist/executor.unit.test.d.ts.map +1 -0
- package/dist/executor.unit.test.js +143 -0
- package/dist/executor.unit.test.js.map +1 -0
- package/dist/extension/_locales/en/messages.json +278 -0
- package/dist/extension/_locales/zh_CN/messages.json +256 -0
- package/dist/extension/assets/options-CYH96Lcx.css +1349 -0
- package/dist/extension/background.js +3994 -0
- package/dist/extension/icons/SolarCursorSquareBold.png +0 -0
- package/dist/extension/icons/icon-black-128.png +0 -0
- package/dist/extension/icons/icon-black-16.png +0 -0
- package/dist/extension/icons/icon-black-32.png +0 -0
- package/dist/extension/icons/icon-black-48.png +0 -0
- package/dist/extension/icons/icon-gray-128.png +0 -0
- package/dist/extension/icons/icon-gray-16.png +0 -0
- package/dist/extension/icons/icon-gray-32.png +0 -0
- package/dist/extension/icons/icon-gray-48.png +0 -0
- package/dist/extension/icons/icon-green-128.png +0 -0
- package/dist/extension/icons/icon-green-16.png +0 -0
- package/dist/extension/icons/icon-green-32.png +0 -0
- package/dist/extension/icons/icon-green-48.png +0 -0
- package/dist/extension/icons/tabwright-icon-black.png +0 -0
- package/dist/extension/icons/tabwright-icon-gray-disabled.png +0 -0
- package/dist/extension/icons/tabwright-icon-gray-disabled.svg +1 -0
- package/dist/extension/manifest.json +54 -0
- package/dist/extension/options.js +16145 -0
- package/dist/extension/rrweb-recorder.js +12952 -0
- package/dist/extension/src/options.html +165 -0
- package/dist/extension/src/prism-bash.min.js +1 -0
- package/dist/extension/src/prism.min.js +1 -0
- package/dist/extension/src/welcome.html +396 -0
- package/dist/extension-connection.test.d.ts +2 -0
- package/dist/extension-connection.test.d.ts.map +1 -0
- package/dist/extension-connection.test.js +708 -0
- package/dist/extension-connection.test.js.map +1 -0
- package/dist/extension-icon-warning.test.d.ts +2 -0
- package/dist/extension-icon-warning.test.d.ts.map +1 -0
- package/dist/extension-icon-warning.test.js +33 -0
- package/dist/extension-icon-warning.test.js.map +1 -0
- package/dist/ghost-browser.d.ts +62 -0
- package/dist/ghost-browser.d.ts.map +1 -0
- package/dist/ghost-browser.js +107 -0
- package/dist/ghost-browser.js.map +1 -0
- package/dist/ghost-cursor-client.js +374 -0
- package/dist/ghost-cursor-controller.d.ts +46 -0
- package/dist/ghost-cursor-controller.d.ts.map +1 -0
- package/dist/ghost-cursor-controller.js +98 -0
- package/dist/ghost-cursor-controller.js.map +1 -0
- package/dist/ghost-cursor.d.ts +27 -0
- package/dist/ghost-cursor.d.ts.map +1 -0
- package/dist/ghost-cursor.js +79 -0
- package/dist/ghost-cursor.js.map +1 -0
- package/dist/htmlrewrite.d.ts +8 -0
- package/dist/htmlrewrite.d.ts.map +1 -0
- package/dist/htmlrewrite.js +339 -0
- package/dist/htmlrewrite.js.map +1 -0
- package/dist/htmlrewrite.test.d.ts +2 -0
- package/dist/htmlrewrite.test.d.ts.map +1 -0
- package/dist/htmlrewrite.test.js +7975 -0
- package/dist/htmlrewrite.test.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/kill-port.d.ts +29 -0
- package/dist/kill-port.d.ts.map +1 -0
- package/dist/kill-port.js +190 -0
- package/dist/kill-port.js.map +1 -0
- package/dist/kitty-graphics.d.ts +22 -0
- package/dist/kitty-graphics.d.ts.map +1 -0
- package/dist/kitty-graphics.js +71 -0
- package/dist/kitty-graphics.js.map +1 -0
- package/dist/kitty-graphics.test.d.ts +2 -0
- package/dist/kitty-graphics.test.d.ts.map +1 -0
- package/dist/kitty-graphics.test.js +125 -0
- package/dist/kitty-graphics.test.js.map +1 -0
- package/dist/locator-selector.test.d.ts +2 -0
- package/dist/locator-selector.test.d.ts.map +1 -0
- package/dist/locator-selector.test.js +98 -0
- package/dist/locator-selector.test.js.map +1 -0
- package/dist/mcp-client.d.ts +20 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +56 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp.d.ts +6 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +511 -0
- package/dist/mcp.js.map +1 -0
- package/dist/on-mouse-action.test.d.ts +2 -0
- package/dist/on-mouse-action.test.d.ts.map +1 -0
- package/dist/on-mouse-action.test.js +180 -0
- package/dist/on-mouse-action.test.js.map +1 -0
- package/dist/options-page.test.d.ts +2 -0
- package/dist/options-page.test.d.ts.map +1 -0
- package/dist/options-page.test.js +773 -0
- package/dist/options-page.test.js.map +1 -0
- package/dist/package-paths.d.ts +4 -0
- package/dist/package-paths.d.ts.map +1 -0
- package/dist/package-paths.js +30 -0
- package/dist/package-paths.js.map +1 -0
- package/dist/page-markdown.d.ts +40 -0
- package/dist/page-markdown.d.ts.map +1 -0
- package/dist/page-markdown.js +181 -0
- package/dist/page-markdown.js.map +1 -0
- package/dist/performance-examples.d.ts +5 -0
- package/dist/performance-examples.d.ts.map +1 -0
- package/dist/performance-examples.js +112 -0
- package/dist/performance-examples.js.map +1 -0
- package/dist/performance-profiling.md +417 -0
- package/dist/playwright-import.d.ts +19 -0
- package/dist/playwright-import.d.ts.map +1 -0
- package/dist/playwright-import.js +40 -0
- package/dist/playwright-import.js.map +1 -0
- package/dist/popup-relocation.test.d.ts +7 -0
- package/dist/popup-relocation.test.d.ts.map +1 -0
- package/dist/popup-relocation.test.js +139 -0
- package/dist/popup-relocation.test.js.map +1 -0
- package/dist/product-paths.d.ts +9 -0
- package/dist/product-paths.d.ts.map +1 -0
- package/dist/product-paths.js +24 -0
- package/dist/product-paths.js.map +1 -0
- package/dist/product-paths.test.d.ts +2 -0
- package/dist/product-paths.test.d.ts.map +1 -0
- package/dist/product-paths.test.js +39 -0
- package/dist/product-paths.test.js.map +1 -0
- package/dist/prompt.md +1004 -0
- package/dist/protocol.d.ts +248 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +59 -0
- package/dist/protocol.js.map +1 -0
- package/dist/protocol.test.d.ts +2 -0
- package/dist/protocol.test.d.ts.map +1 -0
- package/dist/protocol.test.js +31 -0
- package/dist/protocol.test.js.map +1 -0
- package/dist/react-source.d.ts +57 -0
- package/dist/react-source.d.ts.map +1 -0
- package/dist/react-source.js +254 -0
- package/dist/react-source.js.map +1 -0
- package/dist/readability.js +1674 -0
- package/dist/relay-client.d.ts +104 -0
- package/dist/relay-client.d.ts.map +1 -0
- package/dist/relay-client.js +426 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/relay-client.test.d.ts +2 -0
- package/dist/relay-client.test.d.ts.map +1 -0
- package/dist/relay-client.test.js +305 -0
- package/dist/relay-client.test.js.map +1 -0
- package/dist/relay-core.test.d.ts +2 -0
- package/dist/relay-core.test.d.ts.map +1 -0
- package/dist/relay-core.test.js +1427 -0
- package/dist/relay-core.test.js.map +1 -0
- package/dist/relay-navigation.test.d.ts +2 -0
- package/dist/relay-navigation.test.d.ts.map +1 -0
- package/dist/relay-navigation.test.js +661 -0
- package/dist/relay-navigation.test.js.map +1 -0
- package/dist/relay-session.test.d.ts +2 -0
- package/dist/relay-session.test.d.ts.map +1 -0
- package/dist/relay-session.test.js +1121 -0
- package/dist/relay-session.test.js.map +1 -0
- package/dist/relay-state.d.ts +178 -0
- package/dist/relay-state.d.ts.map +1 -0
- package/dist/relay-state.js +346 -0
- package/dist/relay-state.js.map +1 -0
- package/dist/relay-state.test.d.ts +2 -0
- package/dist/relay-state.test.d.ts.map +1 -0
- package/dist/relay-state.test.js +594 -0
- package/dist/relay-state.test.js.map +1 -0
- package/dist/replay-ai-index.d.ts +99 -0
- package/dist/replay-ai-index.d.ts.map +1 -0
- package/dist/replay-ai-index.js +677 -0
- package/dist/replay-ai-index.js.map +1 -0
- package/dist/replay-ai-index.test.d.ts +2 -0
- package/dist/replay-ai-index.test.d.ts.map +1 -0
- package/dist/replay-ai-index.test.js +255 -0
- package/dist/replay-ai-index.test.js.map +1 -0
- package/dist/replay-cli.test.d.ts +2 -0
- package/dist/replay-cli.test.d.ts.map +1 -0
- package/dist/replay-cli.test.js +275 -0
- package/dist/replay-cli.test.js.map +1 -0
- package/dist/replay-eval.d.ts +44 -0
- package/dist/replay-eval.d.ts.map +1 -0
- package/dist/replay-eval.js +902 -0
- package/dist/replay-eval.js.map +1 -0
- package/dist/replay-handoff.d.ts +29 -0
- package/dist/replay-handoff.d.ts.map +1 -0
- package/dist/replay-handoff.js +83 -0
- package/dist/replay-handoff.js.map +1 -0
- package/dist/replay-handoff.test.d.ts +2 -0
- package/dist/replay-handoff.test.d.ts.map +1 -0
- package/dist/replay-handoff.test.js +123 -0
- package/dist/replay-handoff.test.js.map +1 -0
- package/dist/replay-workflow-compiler.d.ts +44 -0
- package/dist/replay-workflow-compiler.d.ts.map +1 -0
- package/dist/replay-workflow-compiler.js +601 -0
- package/dist/replay-workflow-compiler.js.map +1 -0
- package/dist/replay-workflow-compiler.test.d.ts +2 -0
- package/dist/replay-workflow-compiler.test.d.ts.map +1 -0
- package/dist/replay-workflow-compiler.test.js +223 -0
- package/dist/replay-workflow-compiler.test.js.map +1 -0
- package/dist/rrweb-recording-relay.d.ts +56 -0
- package/dist/rrweb-recording-relay.d.ts.map +1 -0
- package/dist/rrweb-recording-relay.js +299 -0
- package/dist/rrweb-recording-relay.js.map +1 -0
- package/dist/rrweb-recording-relay.test.d.ts +2 -0
- package/dist/rrweb-recording-relay.test.d.ts.map +1 -0
- package/dist/rrweb-recording-relay.test.js +85 -0
- package/dist/rrweb-recording-relay.test.js.map +1 -0
- package/dist/rrweb-recording.d.ts +104 -0
- package/dist/rrweb-recording.d.ts.map +1 -0
- package/dist/rrweb-recording.js +180 -0
- package/dist/rrweb-recording.js.map +1 -0
- package/dist/scoped-fs.d.ts +95 -0
- package/dist/scoped-fs.d.ts.map +1 -0
- package/dist/scoped-fs.js +358 -0
- package/dist/scoped-fs.js.map +1 -0
- package/dist/scoped-fs.test.d.ts +5 -0
- package/dist/scoped-fs.test.d.ts.map +1 -0
- package/dist/scoped-fs.test.js +73 -0
- package/dist/scoped-fs.test.js.map +1 -0
- package/dist/selector-generator.js +7378 -0
- package/dist/skill-stub.test.d.ts +2 -0
- package/dist/skill-stub.test.d.ts.map +1 -0
- package/dist/skill-stub.test.js +22 -0
- package/dist/skill-stub.test.js.map +1 -0
- package/dist/snapshot-tools.test.d.ts +2 -0
- package/dist/snapshot-tools.test.d.ts.map +1 -0
- package/dist/snapshot-tools.test.js +856 -0
- package/dist/snapshot-tools.test.js.map +1 -0
- package/dist/start-relay-server.d.ts +6 -0
- package/dist/start-relay-server.d.ts.map +1 -0
- package/dist/start-relay-server.js +57 -0
- package/dist/start-relay-server.js.map +1 -0
- package/dist/styles-api.md +124 -0
- package/dist/styles-examples.d.ts +8 -0
- package/dist/styles-examples.d.ts.map +1 -0
- package/dist/styles-examples.js +64 -0
- package/dist/styles-examples.js.map +1 -0
- package/dist/styles.d.ts +27 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +231 -0
- package/dist/styles.js.map +1 -0
- package/dist/tabwright-agent-skill.d.ts +30 -0
- package/dist/tabwright-agent-skill.d.ts.map +1 -0
- package/dist/tabwright-agent-skill.js +74 -0
- package/dist/tabwright-agent-skill.js.map +1 -0
- package/dist/tabwright-agent-skill.test.d.ts +2 -0
- package/dist/tabwright-agent-skill.test.d.ts.map +1 -0
- package/dist/tabwright-agent-skill.test.js +51 -0
- package/dist/tabwright-agent-skill.test.js.map +1 -0
- package/dist/test-declarations.d.ts +13 -0
- package/dist/test-declarations.d.ts.map +1 -0
- package/dist/test-declarations.js +2 -0
- package/dist/test-declarations.js.map +1 -0
- package/dist/test-utils.d.ts +69 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +448 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/test-utils.test.d.ts +2 -0
- package/dist/test-utils.test.d.ts.map +1 -0
- package/dist/test-utils.test.js +55 -0
- package/dist/test-utils.test.js.map +1 -0
- package/dist/utils.d.ts +26 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +60 -0
- package/dist/utils.js.map +1 -0
- package/dist/wait-for-page-load.d.ts +16 -0
- package/dist/wait-for-page-load.d.ts.map +1 -0
- package/dist/wait-for-page-load.js +146 -0
- package/dist/wait-for-page-load.js.map +1 -0
- package/dist/workflow-capability.d.ts +72 -0
- package/dist/workflow-capability.d.ts.map +1 -0
- package/dist/workflow-capability.js +316 -0
- package/dist/workflow-capability.js.map +1 -0
- package/dist/workflow-script-flow.test.d.ts +2 -0
- package/dist/workflow-script-flow.test.d.ts.map +1 -0
- package/dist/workflow-script-flow.test.js +285 -0
- package/dist/workflow-script-flow.test.js.map +1 -0
- package/package.json +80 -0
- package/src/__snapshots__/x.com.processed.html +1003 -0
- package/src/__snapshots__/x.com.processed.withStyles.html +2720 -0
- package/src/a11y-client.ts +241 -0
- package/src/agent-skills/conan-config/SKILL.md +141 -0
- package/src/agent-skills/conan-config/agents/openai.yaml +4 -0
- package/src/aria-snapshot.test.ts +311 -0
- package/src/aria-snapshot.ts +1681 -0
- package/src/aria-snapshot.unit.test.ts +615 -0
- package/src/aria-snapshots/github-interactive.txt +193 -0
- package/src/aria-snapshots/github-raw.txt +309 -0
- package/src/aria-snapshots/hackernews-interactive.txt +477 -0
- package/src/aria-snapshots/hackernews-raw.txt +428 -0
- package/src/aria-snapshots/prosemirror-interactive.txt +66 -0
- package/src/aria-snapshots/prosemirror-raw.txt +145 -0
- package/src/assets/aria-labels-hacker-news.png +0 -0
- package/src/assets/aria-labels-old-reddit.png +0 -0
- package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +5 -0
- package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +18 -0
- package/src/assets/x.com.html +32946 -0
- package/src/browser-config.ts +179 -0
- package/src/browser-install.ts +284 -0
- package/src/browser-launch.ts +75 -0
- package/src/builtin-capabilities.ts +2765 -0
- package/src/capability-agent-skill.ts +305 -0
- package/src/capability-auth-state.ts +197 -0
- package/src/capability-auth.ts +249 -0
- package/src/capability-cli-confirmation.test.ts +90 -0
- package/src/capability-options.test.ts +89 -0
- package/src/capability-options.ts +57 -0
- package/src/capability-package.test.ts +204 -0
- package/src/capability-package.ts +555 -0
- package/src/capability-registry.test.ts +1905 -0
- package/src/capability-registry.ts +1234 -0
- package/src/capability-runner.ts +801 -0
- package/src/capability-search-relevance.test.ts +73 -0
- package/src/capability-studio.test.ts +45 -0
- package/src/capability-studio.ts +641 -0
- package/src/cdp-log.test.ts +131 -0
- package/src/cdp-log.ts +112 -0
- package/src/cdp-relay.ts +2944 -0
- package/src/cdp-session.ts +77 -0
- package/src/cdp-types.ts +158 -0
- package/src/channel-owner-inspect.test.ts +94 -0
- package/src/chrome-discovery.test.ts +50 -0
- package/src/chrome-discovery.ts +220 -0
- package/src/clean-html.ts +141 -0
- package/src/cli-help.test.ts +123 -0
- package/src/cli.ts +3181 -0
- package/src/cloud-client.ts +179 -0
- package/src/create-logger.ts +38 -0
- package/src/debugger-examples-types.ts +16 -0
- package/src/debugger-examples.ts +66 -0
- package/src/debugger.ts +708 -0
- package/src/diff-utils.test.ts +152 -0
- package/src/diff-utils.ts +70 -0
- package/src/doctor.test.ts +244 -0
- package/src/doctor.ts +321 -0
- package/src/editor-examples.ts +158 -0
- package/src/editor.ts +426 -0
- package/src/env-compat.ts +28 -0
- package/src/executor.ts +1824 -0
- package/src/executor.unit.test.ts +168 -0
- package/src/extension-connection.test.ts +855 -0
- package/src/extension-icon-warning.test.ts +45 -0
- package/src/ghost-browser.ts +149 -0
- package/src/ghost-cursor-client.ts +494 -0
- package/src/ghost-cursor-controller.ts +129 -0
- package/src/ghost-cursor.ts +123 -0
- package/src/htmlrewrite.test.ts +8008 -0
- package/src/htmlrewrite.ts +390 -0
- package/src/index.ts +53 -0
- package/src/kill-port.ts +219 -0
- package/src/kitty-graphics.test.ts +139 -0
- package/src/kitty-graphics.ts +79 -0
- package/src/locator-selector.test.ts +119 -0
- package/src/mcp-client.ts +78 -0
- package/src/mcp.ts +629 -0
- package/src/on-mouse-action.test.ts +226 -0
- package/src/options-page.test.ts +839 -0
- package/src/package-paths.ts +38 -0
- package/src/page-markdown.ts +240 -0
- package/src/performance-examples.ts +186 -0
- package/src/playwright-import.ts +59 -0
- package/src/popup-relocation.test.ts +163 -0
- package/src/product-paths.test.ts +47 -0
- package/src/product-paths.ts +28 -0
- package/src/protocol.test.ts +52 -0
- package/src/protocol.ts +351 -0
- package/src/react-source.ts +379 -0
- package/src/relay-client.test.ts +375 -0
- package/src/relay-client.ts +572 -0
- package/src/relay-core.test.ts +1603 -0
- package/src/relay-navigation.test.ts +790 -0
- package/src/relay-session.test.ts +1375 -0
- package/src/relay-state.test.ts +729 -0
- package/src/relay-state.ts +561 -0
- package/src/replay-ai-index.test.ts +278 -0
- package/src/replay-ai-index.ts +872 -0
- package/src/replay-cli.test.ts +325 -0
- package/src/replay-eval.ts +1039 -0
- package/src/replay-handoff.test.ts +163 -0
- package/src/replay-handoff.ts +109 -0
- package/src/replay-workflow-compiler.test.ts +250 -0
- package/src/replay-workflow-compiler.ts +700 -0
- package/src/resource.md +409 -0
- package/src/rrweb-recording-relay.test.ts +99 -0
- package/src/rrweb-recording-relay.ts +400 -0
- package/src/rrweb-recording.ts +322 -0
- package/src/scoped-fs.test.ts +80 -0
- package/src/scoped-fs.ts +420 -0
- package/src/skill-stub.test.ts +24 -0
- package/src/skill.md +1413 -0
- package/src/snapshot-tools.test.ts +1017 -0
- package/src/snapshots/hacker-news-accessibility-full.md +81 -0
- package/src/snapshots/hacker-news-accessibility-interactive.md +43 -0
- package/src/snapshots/page-markdown-output.txt +16 -0
- package/src/snapshots/shadcn-ui-accessibility-full.md +201 -0
- package/src/snapshots/shadcn-ui-accessibility-interactive.md +109 -0
- package/src/start-relay-server.ts +69 -0
- package/src/styles-examples.ts +84 -0
- package/src/styles.ts +343 -0
- package/src/tabwright-agent-skill.test.ts +61 -0
- package/src/tabwright-agent-skill.ts +105 -0
- package/src/test-declarations.ts +13 -0
- package/src/test-utils.test.ts +70 -0
- package/src/test-utils.ts +566 -0
- package/src/utils.ts +78 -0
- package/src/wait-for-page-load.ts +198 -0
- package/src/workflow-capability.ts +417 -0
- package/src/workflow-script-flow.test.ts +388 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tommy D. Rossi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/bin.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
function __accessProp(key) {
|
|
7
|
+
return this[key];
|
|
8
|
+
}
|
|
9
|
+
var __toCommonJS = (from) => {
|
|
10
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
11
|
+
if (entry)
|
|
12
|
+
return entry;
|
|
13
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (var key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(entry, key))
|
|
17
|
+
__defProp(entry, key, {
|
|
18
|
+
get: __accessProp.bind(from, key),
|
|
19
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
__moduleCache.set(from, entry);
|
|
23
|
+
return entry;
|
|
24
|
+
};
|
|
25
|
+
var __moduleCache;
|
|
26
|
+
var __returnValue = (v) => v;
|
|
27
|
+
function __exportSetter(name, newValue) {
|
|
28
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
29
|
+
}
|
|
30
|
+
var __export = (target, all) => {
|
|
31
|
+
for (var name in all)
|
|
32
|
+
__defProp(target, name, {
|
|
33
|
+
get: all[name],
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
set: __exportSetter.bind(all, name)
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// src/a11y-client.ts
|
|
41
|
+
var exports_a11y_client = {};
|
|
42
|
+
__export(exports_a11y_client, {
|
|
43
|
+
hideA11yLabels: () => hideA11yLabels
|
|
44
|
+
});
|
|
45
|
+
var LABELS_CONTAINER_ID = "__tabwright_labels__";
|
|
46
|
+
var LABELS_TIMER_KEY = "__tabwright_labels_timer__";
|
|
47
|
+
var ROLE_COLORS = {
|
|
48
|
+
link: ["#FFF785", "#FFC542", "#E3BE23"],
|
|
49
|
+
button: ["#FFE0B2", "#FFCC80", "#FFB74D"],
|
|
50
|
+
textbox: ["#FFCDD2", "#EF9A9A", "#E57373"],
|
|
51
|
+
combobox: ["#F8BBD0", "#F48FB1", "#F06292"],
|
|
52
|
+
searchbox: ["#F8BBD0", "#F48FB1", "#F06292"],
|
|
53
|
+
checkbox: ["#C8E6C9", "#A5D6A7", "#81C784"],
|
|
54
|
+
radio: ["#C8E6C9", "#A5D6A7", "#81C784"],
|
|
55
|
+
slider: ["#BBDEFB", "#90CAF9", "#64B5F6"],
|
|
56
|
+
spinbutton: ["#BBDEFB", "#90CAF9", "#64B5F6"],
|
|
57
|
+
switch: ["#D1C4E9", "#B39DDB", "#9575CD"],
|
|
58
|
+
menuitem: ["#FFE0B2", "#FFCC80", "#FFB74D"],
|
|
59
|
+
menuitemcheckbox: ["#FFE0B2", "#FFCC80", "#FFB74D"],
|
|
60
|
+
menuitemradio: ["#FFE0B2", "#FFCC80", "#FFB74D"],
|
|
61
|
+
option: ["#FFE0B2", "#FFCC80", "#FFB74D"],
|
|
62
|
+
tab: ["#FFE0B2", "#FFCC80", "#FFB74D"],
|
|
63
|
+
treeitem: ["#FFE0B2", "#FFCC80", "#FFB74D"],
|
|
64
|
+
img: ["#B3E5FC", "#81D4FA", "#4FC3F7"],
|
|
65
|
+
video: ["#B3E5FC", "#81D4FA", "#4FC3F7"],
|
|
66
|
+
audio: ["#B3E5FC", "#81D4FA", "#4FC3F7"]
|
|
67
|
+
};
|
|
68
|
+
var DEFAULT_COLORS = ["#FFF9C4", "#FFF59D", "#FFEB3B"];
|
|
69
|
+
function renderA11yLabels(labels) {
|
|
70
|
+
const doc = document;
|
|
71
|
+
const win = window;
|
|
72
|
+
if (win[LABELS_TIMER_KEY]) {
|
|
73
|
+
win.clearTimeout(win[LABELS_TIMER_KEY]);
|
|
74
|
+
win[LABELS_TIMER_KEY] = null;
|
|
75
|
+
}
|
|
76
|
+
doc.getElementById(LABELS_CONTAINER_ID)?.remove();
|
|
77
|
+
const container = doc.createElement("div");
|
|
78
|
+
container.id = LABELS_CONTAINER_ID;
|
|
79
|
+
container.style.cssText = "position:absolute;left:0;top:0;z-index:2147483647;pointer-events:none;";
|
|
80
|
+
const style = doc.createElement("style");
|
|
81
|
+
style.textContent = `
|
|
82
|
+
.__pw_label__ {
|
|
83
|
+
position: absolute;
|
|
84
|
+
font: bold 12px Helvetica, Arial, sans-serif;
|
|
85
|
+
padding: 1px 4px;
|
|
86
|
+
border-radius: 3px;
|
|
87
|
+
color: black;
|
|
88
|
+
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
|
|
89
|
+
white-space: nowrap;
|
|
90
|
+
}
|
|
91
|
+
`;
|
|
92
|
+
container.appendChild(style);
|
|
93
|
+
const svg = doc.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
94
|
+
svg.style.cssText = "position:absolute;left:0;top:0;pointer-events:none;overflow:visible;";
|
|
95
|
+
svg.setAttribute("width", `${doc.documentElement.scrollWidth}`);
|
|
96
|
+
svg.setAttribute("height", `${doc.documentElement.scrollHeight}`);
|
|
97
|
+
const defs = doc.createElementNS("http://www.w3.org/2000/svg", "defs");
|
|
98
|
+
svg.appendChild(defs);
|
|
99
|
+
const markerCache = {};
|
|
100
|
+
function getArrowMarkerId(color) {
|
|
101
|
+
if (markerCache[color]) {
|
|
102
|
+
return markerCache[color];
|
|
103
|
+
}
|
|
104
|
+
const markerId = `arrow-${color.replace("#", "")}`;
|
|
105
|
+
const marker = doc.createElementNS("http://www.w3.org/2000/svg", "marker");
|
|
106
|
+
marker.setAttribute("id", markerId);
|
|
107
|
+
marker.setAttribute("viewBox", "0 0 10 10");
|
|
108
|
+
marker.setAttribute("refX", "9");
|
|
109
|
+
marker.setAttribute("refY", "5");
|
|
110
|
+
marker.setAttribute("markerWidth", "6");
|
|
111
|
+
marker.setAttribute("markerHeight", "6");
|
|
112
|
+
marker.setAttribute("orient", "auto-start-reverse");
|
|
113
|
+
const path = doc.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
114
|
+
path.setAttribute("d", "M 0 0 L 10 5 L 0 10 z");
|
|
115
|
+
path.setAttribute("fill", color);
|
|
116
|
+
marker.appendChild(path);
|
|
117
|
+
defs.appendChild(marker);
|
|
118
|
+
markerCache[color] = markerId;
|
|
119
|
+
return markerId;
|
|
120
|
+
}
|
|
121
|
+
container.appendChild(svg);
|
|
122
|
+
const placedLabels = [];
|
|
123
|
+
const LABEL_HEIGHT = 17;
|
|
124
|
+
const LABEL_CHAR_WIDTH = 7;
|
|
125
|
+
const viewportLeft = win.scrollX;
|
|
126
|
+
const viewportTop = win.scrollY;
|
|
127
|
+
const viewportRight = viewportLeft + win.innerWidth;
|
|
128
|
+
const viewportBottom = viewportTop + win.innerHeight;
|
|
129
|
+
let count = 0;
|
|
130
|
+
for (const { ref, role, box } of labels) {
|
|
131
|
+
const rectLeft = box.x;
|
|
132
|
+
const rectTop = box.y;
|
|
133
|
+
const rectRight = rectLeft + box.width;
|
|
134
|
+
const rectBottom = rectTop + box.height;
|
|
135
|
+
if (box.width <= 0 || box.height <= 0) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (rectRight < viewportLeft || rectLeft > viewportRight || rectBottom < viewportTop || rectTop > viewportBottom) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const labelWidth = ref.length * LABEL_CHAR_WIDTH + 8;
|
|
142
|
+
const labelLeft = rectLeft;
|
|
143
|
+
const labelTop = Math.max(0, rectTop - LABEL_HEIGHT);
|
|
144
|
+
const labelRect = {
|
|
145
|
+
left: labelLeft,
|
|
146
|
+
top: labelTop,
|
|
147
|
+
right: labelLeft + labelWidth,
|
|
148
|
+
bottom: labelTop + LABEL_HEIGHT
|
|
149
|
+
};
|
|
150
|
+
let overlaps = false;
|
|
151
|
+
for (const placed of placedLabels) {
|
|
152
|
+
if (labelRect.left < placed.right && labelRect.right > placed.left && labelRect.top < placed.bottom && labelRect.bottom > placed.top) {
|
|
153
|
+
overlaps = true;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (overlaps) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const [gradTop, gradBottom, border] = ROLE_COLORS[role] || DEFAULT_COLORS;
|
|
161
|
+
const label = doc.createElement("div");
|
|
162
|
+
label.className = "__pw_label__";
|
|
163
|
+
label.textContent = ref;
|
|
164
|
+
label.style.background = `linear-gradient(to bottom, ${gradTop} 0%, ${gradBottom} 100%)`;
|
|
165
|
+
label.style.border = `1px solid ${border}`;
|
|
166
|
+
label.style.left = `${labelLeft}px`;
|
|
167
|
+
label.style.top = `${labelTop}px`;
|
|
168
|
+
container.appendChild(label);
|
|
169
|
+
const line = doc.createElementNS("http://www.w3.org/2000/svg", "line");
|
|
170
|
+
const labelCenterX = labelLeft + labelWidth / 2;
|
|
171
|
+
const labelBottomY = labelTop + LABEL_HEIGHT;
|
|
172
|
+
const elementCenterX = rectLeft + box.width / 2;
|
|
173
|
+
const elementCenterY = rectTop + box.height / 2;
|
|
174
|
+
line.setAttribute("x1", `${labelCenterX}`);
|
|
175
|
+
line.setAttribute("y1", `${labelBottomY}`);
|
|
176
|
+
line.setAttribute("x2", `${elementCenterX}`);
|
|
177
|
+
line.setAttribute("y2", `${elementCenterY}`);
|
|
178
|
+
line.setAttribute("stroke", border);
|
|
179
|
+
line.setAttribute("stroke-width", "1.5");
|
|
180
|
+
line.setAttribute("marker-end", `url(#${getArrowMarkerId(border)})`);
|
|
181
|
+
svg.appendChild(line);
|
|
182
|
+
placedLabels.push(labelRect);
|
|
183
|
+
count++;
|
|
184
|
+
}
|
|
185
|
+
doc.documentElement.appendChild(container);
|
|
186
|
+
win[LABELS_TIMER_KEY] = win.setTimeout(() => {
|
|
187
|
+
doc.getElementById(LABELS_CONTAINER_ID)?.remove();
|
|
188
|
+
win[LABELS_TIMER_KEY] = null;
|
|
189
|
+
}, 30000);
|
|
190
|
+
return count;
|
|
191
|
+
}
|
|
192
|
+
function hideA11yLabels() {
|
|
193
|
+
const win = window;
|
|
194
|
+
if (win[LABELS_TIMER_KEY]) {
|
|
195
|
+
win.clearTimeout(win[LABELS_TIMER_KEY]);
|
|
196
|
+
win[LABELS_TIMER_KEY] = null;
|
|
197
|
+
}
|
|
198
|
+
document.getElementById(LABELS_CONTAINER_ID)?.remove();
|
|
199
|
+
}
|
|
200
|
+
globalThis.__a11y = {
|
|
201
|
+
renderA11yLabels,
|
|
202
|
+
hideA11yLabels
|
|
203
|
+
};
|
|
204
|
+
})();
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tabwright
|
|
3
|
+
description: Control the user own Chrome browser via Tabwright extension with Playwright code snippets in a stateful local js sandbox. Use this over other Playwright MCPs to automate the browser because it connects to the user's existing Chrome. Use this for JS-heavy websites, logged-in browser state, saved browser capabilities, and admin/config lookup tasks where saved capability match/routingHint metadata may apply. ALWAYS load this skill before using any tabwright commands, opening admin/config URLs, or answering how to inspect saved Tabwright capabilities.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Fast Path: Saved Capability Exact Matches
|
|
7
|
+
|
|
8
|
+
For concrete user tasks, check saved capability contracts before browser automation. If a capability has `routingHint: "exact-match-direct-run"`, its `match` patterns exactly fit the task, and it is autonomously runnable (`trusted`, read-only, no confirmation), run it directly with the extracted input:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
tabwright capability run <capability-id> --input-json '<json-input>' --json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Do not search, describe, or open a page first for these exact matches. Do not treat every URL as a direct-run signal; this shortcut only applies when capability metadata says so, and it can also apply to non-URL tasks with exact `match` patterns.
|
|
15
|
+
|
|
16
|
+
If execution is disallowed and the user only asks what the first step would be, say that you would use the matching capability directly and show the exact `tabwright capability run ...` command.
|
|
17
|
+
|
|
18
|
+
If the exact-match capability index is not already visible, use one lightweight route check as the first step:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
tabwright capability route "<task-or-url>" --json
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
When using route output, run the returned `shellCommand` exactly. Do not infer a shell command from the capability id; capability ids are not shell commands.
|
|
25
|
+
|
|
26
|
+
Do not use `capability search` or `capability describe` for an exact-match direct-run candidate.
|
|
27
|
+
|
|
28
|
+
In Codex sandboxed environments, `tabwright capability run ...` writes the capability run log and may write artifacts under `~/.tabwright/capabilities/...`. Run trusted capability commands with escalated/unsandboxed permissions immediately instead of trying once in the sandbox and then retrying. `tabwright capability route ... --json` is metadata-only and can run sandboxed.
|
|
29
|
+
|
|
30
|
+
Capability-specific usage and display rules belong in that capability's own agent skill, not in this general Tabwright skill.
|
|
31
|
+
|
|
32
|
+
If a described capability has `requiresConfirmation: true`, stop and obtain explicit user approval for the concrete input and side effect. Only after approval may you run it with `--confirm <capability-id>`. The value must exactly match the capability id, and `--force` never bypasses this gate.
|
|
33
|
+
|
|
34
|
+
## Creating Saved Capabilities
|
|
35
|
+
|
|
36
|
+
When an AI is creating or refining a saved capability, put machine-readable behavior in the capability contract and executable behavior in `script.js`. Create a capability-specific agent skill only for high-frequency, exact-match, easy-to-misuse, auth-sensitive, or display-sensitive capabilities.
|
|
37
|
+
|
|
38
|
+
Use the CLI to scaffold and install, but do not treat generated scaffold text as final prose:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
tabwright capability skill init <capability-id>
|
|
42
|
+
# edit the generated SKILL.md with the real workflow and display rules
|
|
43
|
+
tabwright capability skill install <capability-id>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`capability skill install` refuses untouched scaffold templates. Simple capabilities usually need only a good contract, not a separate agent skill.
|
|
47
|
+
|
|
48
|
+
## Sharing Saved Capabilities
|
|
49
|
+
|
|
50
|
+
When the user asks to package, share, export, or install a saved capability, use the capability package commands directly:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
tabwright capability pack <capability-id>
|
|
54
|
+
tabwright capability install ./<capability-id>.tgz
|
|
55
|
+
tabwright capability install https://example.com/<capability-id>.tgz
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`capability pack` includes only the manifest, entry script, optional README, and optional agent skills. It excludes `secrets.json`, `runs.jsonl`, and `artifacts/`. Shared capabilities always install as `draft`. Do not trust one until its contract and script have been inspected and it has passed a `capability run --force` validation. Authentication must be refreshed from the recipient's own browser. Packaged agent skills are not installed unless the user explicitly passes `--with-agent-skill` or later runs `capability skill install <capability-id>`.
|
|
59
|
+
|
|
60
|
+
## Replay-to-Capability Handoff
|
|
61
|
+
|
|
62
|
+
Turn a saved user demonstration into a capability through the CLI contract:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
tabwright replay list --limit 10 --json
|
|
66
|
+
tabwright replay index <replay-id> --json
|
|
67
|
+
tabwright replay make <replay-id> <capability-id> --force --goal '<goal>' --json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`replay index --json` is compact by default; add `--full` only when complete page text and interactive-element evidence is needed. `replay make` returns `status: "compiled"` after writing a draft. An unsupported workflow returns `status: "needs_ai"`, writes no fake capability, and supplies exact `next.inspectCommand` and `next.createCommand` commands. Follow that handoff instead of inventing a workflow.
|
|
71
|
+
|
|
72
|
+
Generated workflows are draft browser writes. Inspect them and obtain explicit user approval before running the exact returned command, which must include `--browser user --force --confirm <capability-id> --json`:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
tabwright capability run <capability-id> --browser user --force --confirm <capability-id> --input-json '<json-input>' --json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Browser Core Protocol
|
|
79
|
+
|
|
80
|
+
This skill contains the required core protocol. Do not load the 17k-token extended reference before every browser task. Query it only when the task needs a specialized API:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# macOS/Linux
|
|
84
|
+
tabwright skill | rg -n -C 20 'working with pages|snapshot|iframe'
|
|
85
|
+
tabwright skill | rg -n -C 20 'network requests|debugger|live edit'
|
|
86
|
+
# Windows PowerShell
|
|
87
|
+
tabwright skill | Select-String -Pattern 'working with pages|snapshot|iframe' -Context 20,20
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Follow this order for browser work:
|
|
91
|
+
|
|
92
|
+
1. Run `tabwright doctor --json` when connection state is unclear, and follow its exact `next` action.
|
|
93
|
+
2. Create a new session for this task. Never reuse an existing session unless the user explicitly handed it to you.
|
|
94
|
+
3. Create and retain your own page in `state`. Pages are shared across sessions, but `state` is not.
|
|
95
|
+
4. Navigate, inspect logs, then snapshot. Use snapshot search when full output would be large.
|
|
96
|
+
5. Copy a role/text/test-id locator from current evidence. Never guess a fixed `aria-ref` from examples or an older snapshot.
|
|
97
|
+
6. Perform the smallest action, then verify the resulting URL, visible state, response, or logs.
|
|
98
|
+
7. Never call `browser.close()` or `context.close()`. Close only pages you created, and delete your task session when finished.
|
|
99
|
+
|
|
100
|
+
In sandboxed agent environments, browser/relay commands need immediate elevated or unsandboxed execution because they connect to localhost and may update session state. Metadata-only `capability route/search/describe` commands can remain sandboxed.
|
|
101
|
+
|
|
102
|
+
Use single quotes around `-e` code so the shell does not expand `$`, backticks, or backslashes. Use double quotes for JavaScript strings inside.
|
|
103
|
+
|
|
104
|
+
## Minimal Browser Example
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
tabwright session new
|
|
108
|
+
SESSION_ID=2 # replace 2 with the new ID printed above
|
|
109
|
+
tabwright -s "$SESSION_ID" -e 'state.page = await context.newPage(); await state.page.goto("https://example.com")'
|
|
110
|
+
tabwright -s "$SESSION_ID" -e 'console.log(await getLatestLogs({ page: state.page }))'
|
|
111
|
+
tabwright -s "$SESSION_ID" -e 'console.log(await snapshot({ page: state.page, search: /learn|more/i }))'
|
|
112
|
+
tabwright -s "$SESSION_ID" -e 'console.log(await state.page.getByRole("link", { name: "Learn more" }).getAttribute("href"))'
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
If `tabwright` is not found, use `npx tabwright@latest` or `bunx tabwright@latest`.
|
|
116
|
+
|
|
117
|
+
If the relay, extension, enabled tab, or session state is unclear, run `tabwright doctor --json` and follow its returned `next` step instead of guessing recovery commands.
|
|
118
|
+
|
|
119
|
+
`tabwright session new` automatically selects a single connected extension. With multiple profiles, it waits briefly for reconnects to settle and auto-selects only when exactly one has enabled tabs; otherwise choose one of the reported browser keys with `--browser <key>`. A restarted relay is ready after it reports the current or a newer compatible Tabwright package version.
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import type { Page, Locator, ElementHandle, Frame, FrameLocator } from '@xmorse/playwright-core';
|
|
2
|
+
import type { Protocol } from 'devtools-protocol';
|
|
3
|
+
import type { ICDPSession } from './cdp-session.js';
|
|
4
|
+
export type SnapshotFormat = 'raw';
|
|
5
|
+
export declare const DEFAULT_SNAPSHOT_FORMAT: SnapshotFormat;
|
|
6
|
+
export interface AriaRef {
|
|
7
|
+
role: string;
|
|
8
|
+
name: string;
|
|
9
|
+
ref: string;
|
|
10
|
+
shortRef: string;
|
|
11
|
+
backendNodeId?: Protocol.DOM.BackendNodeId;
|
|
12
|
+
}
|
|
13
|
+
export type AriaSnapshotNode = {
|
|
14
|
+
role: string;
|
|
15
|
+
name: string;
|
|
16
|
+
locator?: string;
|
|
17
|
+
ref?: string;
|
|
18
|
+
shortRef?: string;
|
|
19
|
+
backendNodeId?: Protocol.DOM.BackendNodeId;
|
|
20
|
+
children: AriaSnapshotNode[];
|
|
21
|
+
};
|
|
22
|
+
export interface ScreenshotResult {
|
|
23
|
+
path: string;
|
|
24
|
+
base64: string;
|
|
25
|
+
mimeType: 'image/png';
|
|
26
|
+
snapshot: string;
|
|
27
|
+
labelCount: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* LLM-optimal max dimension. Claude auto-resizes images larger than 1568px
|
|
31
|
+
* on any edge, adding latency. Token cost: (width * height) / 750.
|
|
32
|
+
*/
|
|
33
|
+
export declare const LLM_MAX_DIMENSION = 1568;
|
|
34
|
+
export interface ResizeImageOptions {
|
|
35
|
+
/** Input: file path or Buffer */
|
|
36
|
+
input: string | Buffer;
|
|
37
|
+
/** Max pixels on longest edge. Default 1568 (Claude-optimal).
|
|
38
|
+
* Ignored if explicit width/height provided. */
|
|
39
|
+
maxDimension?: number;
|
|
40
|
+
/** Explicit target width in px (aspect ratio preserved unless both width+height set) */
|
|
41
|
+
width?: number;
|
|
42
|
+
/** Explicit target height in px */
|
|
43
|
+
height?: number;
|
|
44
|
+
/** How to fit when both width+height specified. Default 'inside' (preserve aspect ratio, no crop) */
|
|
45
|
+
fit?: 'inside' | 'cover' | 'contain' | 'fill';
|
|
46
|
+
/** JPEG quality 1-100. Default 80 */
|
|
47
|
+
quality?: number;
|
|
48
|
+
/** Output format. Default 'jpeg'. Use 'png' for lossless output (e.g. Kitty Graphics). */
|
|
49
|
+
format?: 'jpeg' | 'png';
|
|
50
|
+
/** Output file path. Defaults to overwriting the input file (when input is a path) */
|
|
51
|
+
output?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface ResizeImageResult {
|
|
54
|
+
buffer: Buffer;
|
|
55
|
+
mimeType: 'image/png' | 'image/jpeg';
|
|
56
|
+
/** Only set if output path was provided */
|
|
57
|
+
path?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resize an image using sharp. Useful for shrinking screenshots before reading
|
|
61
|
+
* them back into context so they consume fewer tokens.
|
|
62
|
+
*
|
|
63
|
+
* Default behavior (no width/height): fits within 1568×1568px, preserving
|
|
64
|
+
* aspect ratio, never upscales. This is optimal for Claude vision.
|
|
65
|
+
*
|
|
66
|
+
* Explicit width/height: resizes to those dimensions using the fit strategy.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resizeImageForAgent(options: ResizeImageOptions): Promise<ResizeImageResult>;
|
|
69
|
+
export interface AriaSnapshotResult {
|
|
70
|
+
snapshot: string;
|
|
71
|
+
tree: AriaSnapshotNode[];
|
|
72
|
+
refs: AriaRef[];
|
|
73
|
+
refToElement: Map<string, {
|
|
74
|
+
role: string;
|
|
75
|
+
name: string;
|
|
76
|
+
shortRef: string;
|
|
77
|
+
}>;
|
|
78
|
+
refToSelector: Map<string, string>;
|
|
79
|
+
/**
|
|
80
|
+
* Get a CSS selector for a ref. Use with page.locator().
|
|
81
|
+
* For stable test IDs, returns [data-testid="..."] or [id="..."]
|
|
82
|
+
* For fallback refs, returns a role-based selector.
|
|
83
|
+
*/
|
|
84
|
+
getSelectorForRef: (ref: string) => string | null;
|
|
85
|
+
getRefsForLocators: (locators: Array<Locator | ElementHandle>) => Promise<Array<AriaRef | null>>;
|
|
86
|
+
getRefForLocator: (locator: Locator | ElementHandle) => Promise<AriaRef | null>;
|
|
87
|
+
getRefStringForLocator: (locator: Locator | ElementHandle) => Promise<string | null>;
|
|
88
|
+
}
|
|
89
|
+
export declare function buildShortRefMap({ refs }: {
|
|
90
|
+
refs: Array<{
|
|
91
|
+
ref: string;
|
|
92
|
+
}>;
|
|
93
|
+
}): Map<string, string>;
|
|
94
|
+
type DomNodeInfo = {
|
|
95
|
+
nodeId: Protocol.DOM.NodeId;
|
|
96
|
+
parentId?: Protocol.DOM.NodeId;
|
|
97
|
+
backendNodeId: Protocol.DOM.BackendNodeId;
|
|
98
|
+
nodeName: string;
|
|
99
|
+
attributes: Map<string, string>;
|
|
100
|
+
};
|
|
101
|
+
export type SnapshotLine = {
|
|
102
|
+
text: string;
|
|
103
|
+
baseLocator?: string;
|
|
104
|
+
hasChildren?: boolean;
|
|
105
|
+
role?: string;
|
|
106
|
+
name?: string;
|
|
107
|
+
indent?: number;
|
|
108
|
+
};
|
|
109
|
+
export type SnapshotNode = {
|
|
110
|
+
role: string;
|
|
111
|
+
name: string;
|
|
112
|
+
baseLocator?: string;
|
|
113
|
+
ref?: string;
|
|
114
|
+
backendNodeId?: Protocol.DOM.BackendNodeId;
|
|
115
|
+
indentOffset?: number;
|
|
116
|
+
ignored?: boolean;
|
|
117
|
+
children: SnapshotNode[];
|
|
118
|
+
};
|
|
119
|
+
export declare function buildSnapshotLines(nodes: SnapshotNode[], indent?: number): SnapshotLine[];
|
|
120
|
+
export declare function buildRawSnapshotTree(options: {
|
|
121
|
+
nodeId: Protocol.Accessibility.AXNodeId;
|
|
122
|
+
axById: Map<Protocol.Accessibility.AXNodeId, Protocol.Accessibility.AXNode>;
|
|
123
|
+
isNodeInScope: (node: Protocol.Accessibility.AXNode) => boolean;
|
|
124
|
+
}): SnapshotNode | null;
|
|
125
|
+
export declare function filterInteractiveSnapshotTree(options: {
|
|
126
|
+
node: SnapshotNode;
|
|
127
|
+
ancestorNames: string[];
|
|
128
|
+
labelContext: boolean;
|
|
129
|
+
refFilter?: (entry: {
|
|
130
|
+
role: string;
|
|
131
|
+
name: string;
|
|
132
|
+
}) => boolean;
|
|
133
|
+
domByBackendId: Map<Protocol.DOM.BackendNodeId, DomNodeInfo>;
|
|
134
|
+
promotedContentEditableIds?: Set<Protocol.DOM.BackendNodeId>;
|
|
135
|
+
createRefForNode: (options: {
|
|
136
|
+
backendNodeId?: Protocol.DOM.BackendNodeId;
|
|
137
|
+
role: string;
|
|
138
|
+
name: string;
|
|
139
|
+
}) => string | null;
|
|
140
|
+
}): {
|
|
141
|
+
nodes: SnapshotNode[];
|
|
142
|
+
names: Set<string>;
|
|
143
|
+
};
|
|
144
|
+
export declare function filterFullSnapshotTree(options: {
|
|
145
|
+
node: SnapshotNode;
|
|
146
|
+
ancestorNames: string[];
|
|
147
|
+
refFilter?: (entry: {
|
|
148
|
+
role: string;
|
|
149
|
+
name: string;
|
|
150
|
+
}) => boolean;
|
|
151
|
+
domByBackendId: Map<Protocol.DOM.BackendNodeId, DomNodeInfo>;
|
|
152
|
+
promotedContentEditableIds?: Set<Protocol.DOM.BackendNodeId>;
|
|
153
|
+
createRefForNode: (options: {
|
|
154
|
+
backendNodeId?: Protocol.DOM.BackendNodeId;
|
|
155
|
+
role: string;
|
|
156
|
+
name: string;
|
|
157
|
+
}) => string | null;
|
|
158
|
+
}): {
|
|
159
|
+
nodes: SnapshotNode[];
|
|
160
|
+
names: Set<string>;
|
|
161
|
+
};
|
|
162
|
+
export declare function finalizeSnapshotOutput(lines: SnapshotLine[], nodes: SnapshotNode[], shortRefMap: Map<string, string>): {
|
|
163
|
+
snapshot: string;
|
|
164
|
+
tree: AriaSnapshotNode[];
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Get an accessibility snapshot with utilities to look up refs for elements.
|
|
168
|
+
* Uses the browser accessibility tree (CDP) and maps nodes to DOM attributes.
|
|
169
|
+
*
|
|
170
|
+
* Refs are generated from stable test IDs when available (data-testid, data-test-id, etc.)
|
|
171
|
+
* or fall back to e1, e2, e3...
|
|
172
|
+
*
|
|
173
|
+
* @param page - Playwright page
|
|
174
|
+
* @param locator - Optional locator to scope the snapshot to a subtree
|
|
175
|
+
* @param refFilter - Optional filter for which elements get refs
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```ts
|
|
179
|
+
* const { snapshot, getSelectorForRef } = await getAriaSnapshot({ page })
|
|
180
|
+
* // Snapshot shows locators like [id="submit-btn"] or role=button[name="Submit"]
|
|
181
|
+
* const selector = getSelectorForRef('submit-btn')
|
|
182
|
+
* await page.locator(selector).click()
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export declare function getAriaSnapshot({ page, frame, locator, refFilter, interactiveOnly, cdp, }: {
|
|
186
|
+
page: Page;
|
|
187
|
+
frame?: Frame | FrameLocator;
|
|
188
|
+
locator?: Locator;
|
|
189
|
+
refFilter?: (info: {
|
|
190
|
+
role: string;
|
|
191
|
+
name: string;
|
|
192
|
+
}) => boolean;
|
|
193
|
+
interactiveOnly?: boolean;
|
|
194
|
+
cdp?: ICDPSession;
|
|
195
|
+
}): Promise<AriaSnapshotResult>;
|
|
196
|
+
/**
|
|
197
|
+
* Show Vimium-style labels on interactive elements.
|
|
198
|
+
* Labels are colored badges positioned above each element showing the ref.
|
|
199
|
+
* Use with screenshots so agents can see which elements are interactive.
|
|
200
|
+
*
|
|
201
|
+
* Labels auto-hide after 30 seconds to prevent stale labels.
|
|
202
|
+
* Call this function again if the page HTML changes to get fresh labels.
|
|
203
|
+
*
|
|
204
|
+
* @param page - Playwright page
|
|
205
|
+
* @param locator - Optional locator to scope labels to a subtree
|
|
206
|
+
* @param interactiveOnly - Only show labels for interactive elements (default: true)
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```ts
|
|
210
|
+
* const { snapshot, labelCount } = await showAriaRefLabels({ page })
|
|
211
|
+
* await page.screenshot({ path: '/tmp/screenshot.png' })
|
|
212
|
+
* // Agent sees [submit-btn] label on "Submit" button
|
|
213
|
+
* await page.locator('[data-testid="submit-btn"]').click()
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
export declare function showAriaRefLabels({ page, locator, interactiveOnly, logger, }: {
|
|
217
|
+
page: Page;
|
|
218
|
+
locator?: Locator;
|
|
219
|
+
interactiveOnly?: boolean;
|
|
220
|
+
logger?: {
|
|
221
|
+
info?: (...args: unknown[]) => void;
|
|
222
|
+
error?: (...args: unknown[]) => void;
|
|
223
|
+
};
|
|
224
|
+
}): Promise<{
|
|
225
|
+
snapshot: string;
|
|
226
|
+
labelCount: number;
|
|
227
|
+
}>;
|
|
228
|
+
/**
|
|
229
|
+
* Remove all aria ref labels from the page.
|
|
230
|
+
*/
|
|
231
|
+
export declare function hideAriaRefLabels({ page }: {
|
|
232
|
+
page: Page;
|
|
233
|
+
}): Promise<void>;
|
|
234
|
+
/**
|
|
235
|
+
* Take a screenshot with accessibility labels overlaid on interactive elements.
|
|
236
|
+
* Shows Vimium-style labels, captures the screenshot, then removes the labels.
|
|
237
|
+
* The screenshot is automatically included in the MCP response.
|
|
238
|
+
*
|
|
239
|
+
* @param page - Playwright page
|
|
240
|
+
* @param locator - Optional locator to scope labels to a subtree
|
|
241
|
+
* @param collector - Array to collect screenshots (passed by MCP execute tool)
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```ts
|
|
245
|
+
* await screenshotWithAccessibilityLabels({ page })
|
|
246
|
+
* // Screenshot is automatically included in the MCP response
|
|
247
|
+
* // Use ref from the snapshot to interact with elements
|
|
248
|
+
* await page.locator('[data-testid="submit-btn"]').click()
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
export declare function screenshotWithAccessibilityLabels({ page, locator, interactiveOnly, collector, logger, }: {
|
|
252
|
+
page: Page;
|
|
253
|
+
locator?: Locator;
|
|
254
|
+
interactiveOnly?: boolean;
|
|
255
|
+
collector: ScreenshotResult[];
|
|
256
|
+
logger?: {
|
|
257
|
+
info?: (...args: unknown[]) => void;
|
|
258
|
+
error?: (...args: unknown[]) => void;
|
|
259
|
+
};
|
|
260
|
+
}): Promise<void>;
|
|
261
|
+
export { getAriaSnapshot as getAriaSnapshotWithRefs };
|
|
262
|
+
//# sourceMappingURL=aria-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-snapshot.d.ts","sourceRoot":"","sources":["../src/aria-snapshot.ts"],"names":[],"mappings":"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"}
|