docs: remove search and get commands from help and skills
Search and get commands are being removed from the CLI. This removes
all references from help output, SKILL.md, and command-reference.md.
The workflow now starts directly with browser automation via snapshot.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Increase DevTools URL discovery timeout from 15s to 30s for CI environments
- Relax snap_selector_flag_limits_subtree assertion to allow ±2 node tolerance
- Increase E2E test workflow timeout to 20 minutes
Chrome 146+ may enforce Trusted Types on certain pages, causing
innerHTML assignments to fail. Replace innerHTML with createElement
+ appendChild in install_select_fixture.
Three issues fixed:
1. Input.dispatchKeyEvent routes to Chrome's active tab, ignoring sessionId.
- type: add Target.activateTarget before key dispatch loop
- press: add Target.activateTarget before key dispatch
2. type command used minimal key definitions (just key+text) which didn't
trigger native text insertion on contenteditable elements.
- Reuse key_definition() from press module for full CDP key definitions
(code, windowsVirtualKeyCode, nativeVirtualKeyCode, unmodifiedText)
3. Contenteditable e2e test fixture had element at top:500px, whose center
(y=531) exceeded headless viewport height (513), causing click to miss.
- Changed to top:200px
Closes ACT-822
CDP DOM.focus fails on contenteditable divs (e.g., Lark/Notion/Slate editors)
with "Element is not focusable" (-32000). This change adds a JS .focus()
fallback and click-to-place-cursor for rich text editors.
Changes:
- Add TabContext::focus_element() with JS .focus() fallback when DOM.focus fails
- type command: detect contenteditable and click element center to establish
cursor position (required by Slate/ProseMirror internal cursor management)
- fill/focus commands: use focus_element() instead of raw DOM.focus
- Add E2E tests for type and focus on contenteditable elements
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Send SIGTERM first so Chrome can flush Preferences (window placement,
cookies, etc.), wait up to 3s for graceful exit, then fall back to
SIGKILL. This allows Chrome to restore window position and size on
next launch.
[packages/cli]fix: remove setDeviceMetricsOverride and hardcoded window-size to avoid bot detection
setDeviceMetricsOverride creates detectable inconsistencies between
window.outerWidth/innerWidth and screen dimensions that anti-fingerprint
scripts use to flag automated browsers. The hardcoded --window-size
Chrome arg is also removed to let the browser use its default size.
setDeviceMetricsOverride creates detectable inconsistencies between
window.outerWidth/innerWidth and screen dimensions that anti-fingerprint
scripts use to flag automated browsers. The hardcoded --window-size
Chrome arg is also removed to let the browser use its default size.
browser start --session sid: get-or-create semantics — reuses existing
session if found, creates with that ID if not. Works for both local and
cloud modes. Conflicts with --set-session-id (which always force-creates).
browser new-tab --tab tid: visible alias for --set-tab-id — creates tab
with custom ID, returns TAB_ID_CONFLICT on duplicate.
Input.dispatchKeyEvent always routes to Chrome's active/foreground tab,
ignoring the CDP sessionId. This caused type and press commands to
silently fail when the target tab was not the active one.
- type: replace per-character Input.dispatchKeyEvent with Input.insertText
which correctly routes via CDP session. Also faster (1 CDP call vs 2N).
- press: add Target.activateTarget before dispatching key events since
functional keys (Enter, Tab, etc.) require Input.dispatchKeyEvent.
- type: add contentEditable support for cursor positioning (Selection/Range
API fallback when setSelectionRange is unavailable).
Closes ACT-822
- Add workflow_dispatch trigger to allow manual releases from any branch
- Add --tag alpha for prerelease versions so alpha doesn't overwrite latest
- Remove stale CHANGELOG.md from 6 CLI platform packages (stuck at 0.8.0)
* docs(cli): remove -i/-c/--cursor from snapshot help, mention path output
These flags are being deprecated. Updated snapshot after_help and
command-reference.md to remove all -i/-c/--cursor examples. Added note
about the path field in snapshot output.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs(cli): keep -i/-c in snapshot help, remove only --cursor, add sample output
Per @junliang-mk: -i (interactive) and -c (compact) stay, only --cursor
is removed from help. Added sample snapshot output showing the tree
structure with refs, links, combobox, and clickable elements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs(cli): describe default snapshot as all-inclusive, remove flag descriptions
Default snapshot contains everything. Use additional flags as needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/cli]fix: send mouseMoved before mousePressed in dispatch_click (#220)
SPA frameworks (React Router, Vue Router, Next.js) require a prior
mouseMoved event to establish pointer hover state before the click
event synthesizes correctly. Without it, the router's click listener
never fires and the URL remains unchanged (url_changed: false).
Add a single mouseMoved dispatch at (x, y) with button=none before
the existing mousePressed/mouseReleased loop — matches Playwright's
standard click implementation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* [packages/cli]test: fix click_spa_navigation — use hash for pushState in about:blank (#220)
history.pushState with a path-only URL (/spa-destination) throws a
SecurityError in about:blank (null origin). Use a hash fragment
(#spa-destination) instead, which is always allowed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Snapshot output is now stored in a yml file so full snapshots are fine.
Remove the redundant second snapshot and drop -i from the first.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
[packages/cli]test: add click_spa_navigation E2E test (#220)
Injects a SPA-style fixture (history.pushState on click with
preventDefault) into about:blank and verifies that browser click
triggers the router handler and returns url_changed=true.
Tests the mouseMoved fix — will fail until dispatch_click sends
mouseMoved before mousePressed in click.rs.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Follow a single scenario through search → get → browser automation,
using snapshot refs (@eN) for interactions instead of CSS selectors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add usage examples to search (query construction, domain/url filters,
pagination) and get (area_id format examples). Also remove --api-key
from top-level help since it's reserved for future use.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Address Codex bot P1 review finding: skipping favicon/data: URLs on
requestWillBeSent without also skipping their loadingFinished would
undercount active requests, causing premature network-idle.
Changes:
- Maintain `skipped_request_ids` HashSet to track suppressed requests
- loadingFinished/loadingFailed checks the set and suppresses delta
- Add EventSource exclusion (persistent like WebSocket)
- Handle redirect double-counting (redirectResponse → don't re-increment)
- Add comprehensive unit test covering all skip/undercount scenarios
WebSocket upgrade requests fire `Network.requestWillBeSent` but never
`Network.loadingFinished`, leaving the pending counter stuck at ≥1
and causing `wait network-idle` to always time out on sites with
persistent WebSocket connections (analytics, real-time features).
Align with Playwright's behaviour by excluding:
- WebSocket upgrades (type == "WebSocket")
- Favicon requests (url ends with /favicon.ico)
- data: URLs (not intercepted by Network Service)
Before: healthline.com 30s timeout, flightaware.com ~25s
After: healthline.com 523ms, flightaware.com 514ms
Run sync-versions.js to align 6 platform packages with CLI version.
Fixes broken release path where optionalDependencies would point to
unpublished npm versions.