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>
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>
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
* docs: migrate install guides to brew/script-first, keep npm (CUE-504)
* docs: keep README install simple (npm only), link to full guide
* docs: use script install in README (no Node.js dependency)
* docs: split Installation into sub-headings per platform
* [packages/cli]test: improve CLI E2E test coverage to 93%
Add 56 new test cases covering previously untested commands, subcommands,
and parameter combinations. New test files for setup, extension, help,
and global options. Enhanced existing browser, config, search, and get
tests with parameter-level coverage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/cli]test: add real assertions to browser E2E tests
Replace exit-code-only checks with actual value assertions:
- scroll tests verify window.scrollY changes before/after
- select/focus verify element value and activeElement
- type verifies input field value contains typed text
- cookies delete/clear verify cookie is actually removed
- navigate goto verifies location.href
- inspect verifies output contains element info
Move restart/close tests to end to prevent cascade failures.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]test: expand Rust CLI integration tests to match TypeScript E2E coverage
Add ~70 new tests bringing total to 123, covering all CLI commands and options:
help, browser (57 tests), config, profile, extension, setup, search, get,
sources, and global flags. Mirrors the TypeScript E2E test suite structure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/cli]fix: relax assertions for offline/extension-mode-only tests
- extension install: accept exit code 0 or 1 (network failures in CI)
- cookies set --domain: tolerate graceful failure outside extension mode
Addresses PR #167 review feedback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/actionbook-rs]test: add browser E2E tests mirroring TypeScript cli-browser-e2e.test.ts
57 individual #[test] functions covering navigation, page content, form
interaction, screenshot/pdf, cookies, scroll, type, select/hover/focus/press,
inspect, tab management, and restart/close. Shares browser session via OnceLock,
gated by RUN_BROWSER_TESTS=true, runs with --test-threads=1.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/cli]fix: address PR #167 review comments from Codex
- cli_test.rs: fail setup tests explicitly when process is killed by
signal (timeout) instead of silently passing
- cli_test.rs: isolate extension stop test with temp HOME/XDG dirs to
avoid killing real user bridge processes
- cli-browser-e2e.test.ts: clarify that cookie --dry-run/--domain
tests require extension mode and rename describe block
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]chore: add changeset for CLI patch to test release workflow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: align CLI and platform package versions to npm (0.7.2)
Local versions were 0.3.1 while npm had 0.7.2 (CI used to overwrite
versions at publish time without committing back). Align to 0.7.2 so
changeset can manage versions going forward.
Also revert pnpm-workspace.yaml to keep platform packages in workspace
(avoids npm resolution failures) and let them pass changeset validation
by not being in the ignore list.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: add CHANGELOG.md to platform packages for changesets/action
changesets/action reads CHANGELOG.md of all modified packages when
composing the Version PR. Platform packages are modified by
sync-versions.js but lacked CHANGELOG.md files, causing ENOENT.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: update lockfile after sync-versions to prevent frozen-lockfile failure
sync-versions.js rewrites CLI optionalDependencies versions, making
the lockfile stale. Add pnpm install after sync to keep it in sync.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: use workspace:* for CLI platform deps to avoid lockfile staleness
- CLI optionalDependencies changed from exact versions to workspace:*
so pnpm resolves locally instead of from npm registry
- Remove optionalDependencies sync from sync-versions.js (no longer needed)
- Add workspace:* → actual version replacement step in publish-cli job
before npm publish
- Remove pnpm install from version-packages (lockfile stays stable with
workspace links)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [root]chore: add changeset for CLI patch to test release workflow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [root]fix: align CLI and platform package versions to npm (0.7.2)
Local versions were 0.3.1 while npm had 0.7.2 (CI used to overwrite
versions at publish time without committing back). Align to 0.7.2 so
changeset can manage versions going forward.
Also revert pnpm-workspace.yaml to keep platform packages in workspace
(avoids npm resolution failures) and let them pass changeset validation
by not being in the ignore list.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/cli]test: add comprehensive CLI test suite with E2E browser tests
- Add unit tests for wrapper (actionbook.js), postinstall, config, profile,
search, get, and sources commands
- Add Tier 1 browser tests (arg validation, help output, defaults)
- Add Tier 2 browser E2E tests (navigation, interaction, screenshots,
cookies, tabs, error handling, JSON output)
- Fix E2E test reliability: add --wait for element readiness after navigation,
use eval-based form submit for login flow, match actual CLI exit codes
- Suppress macOS Keychain dialogs in tests via --use-mock-keychain config
- Set testTimeout to 60s for browser E2E operations
- Export modules from actionbook.js and postinstall.js for testability
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/cli]fix: resolve Windows .exe suffix when locating test CLI binary
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [packages/cli]fix: skip shell-script mock tests on Windows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Remove GitHub Releases download fallback from postinstall script.
The binary is always bundled in the npm package, so download logic is unnecessary.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the TypeScript CLI implementation with a thin JS wrapper that
executes the native Rust binary. The npm package now ships all platform
binaries directly, with a postinstall fallback to download from GitHub
Releases if needed.
- Add bin/actionbook.js: platform detection + binary execution
- Add scripts/postinstall.js: fallback download from GitHub Releases
- Remove all TypeScript source, build config, and dependencies
- Update CI workflow to build, package, and publish with binaries
- Update README with full Rust CLI command documentation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace old JSON API with new text-based API using area_id format
- Add get_action_by_area_id tool to MCP server
- Update search_actions with new parameters (domain, url, page, page_size)
- Remove --json option from CLI commands (output is now plain text)
- Disable sources command temporarily in CLI
- Update README documentation for CLI and MCP
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace npx playwright@{version} with direct node execution of playwright-core CLI.
Find CLI path by checking multiple node_modules structures (pnpm .pnpm/*, npm flat, npm nested).
Search both package dir and workspace root to support pnpm workspaces.
Benefits:
- Eliminates npx overhead and potential version mismatches
- Works reliably with both npm and pnpm package managers
- No need to parse agent-browser's
Remove custom help text and disable Commander.js help option.
Now 'actionbook browser -h' displays full agent-browser help with all
commands, options, and examples instead of minimal Commander help.
Benefits:
- Users see complete command reference without extra steps
- Automatically stays up-to-date with agent-browser changes
- Consistent help across -h, --help, and no-args invocations