diff --git a/CHANGELOG.md b/CHANGELOG.md index b286c6d3..2f989493 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## [0.12.1.0] - 2026-03-26 — Smarter Browsing: Network Idle, State Persistence, Iframes + +Every click, fill, and select now waits for the page to settle before returning. No more stale snapshots because an XHR was still in-flight. Chain accepts pipe-delimited format for faster multi-step flows. You can save and restore browser sessions (cookies + open tabs). And iframe content is now reachable. + +### Added + +- **Network idle detection.** `click`, `fill`, and `select` auto-wait up to 2s for network requests to settle before returning. Catches XHR/fetch triggered by interactions. Uses Playwright's built-in `waitForLoadState('networkidle')`, not a custom tracker. + +- **`$B state save/load`.** Save your browser session (cookies + open tabs) to a named file, load it back later. Files stored at `.gstack/browse-states/{name}.json` with 0o600 permissions. V1 saves cookies + URLs only (not localStorage, which breaks on load-before-navigate). Load replaces the current session, not merge. + +- **`$B frame` command.** Switch command context into an iframe: `$B frame iframe`, `$B frame --name checkout`, `$B frame --url stripe`, or `$B frame @e5`. All subsequent commands (click, fill, snapshot, etc.) operate inside the iframe. `$B frame main` returns to the main page. Snapshot shows `[Context: iframe src="..."]` header. Detached frames auto-recover. + +- **Chain pipe format.** Chain now accepts `$B chain 'goto url | click @e5 | snapshot -ic'` as a fallback when JSON parsing fails. Pipe-delimited with quote-aware tokenization. + +### Changed + +- **Chain post-loop idle wait.** After executing all commands in a chain, if the last was a write command, chain waits for network idle before returning. + +### Fixed + +- **Iframe ref scoping.** Snapshot ref locators, cursor-interactive scan, and cursor locators now use the frame-aware target instead of always scoping to the main page. +- **Detached frame recovery.** `getActiveFrameOrPage()` checks `isDetached()` and auto-recovers. +- **State load resets frame context.** Loading a saved state clears the active frame reference. +- **elementHandle leak in frame command.** Now properly disposed after getting contentFrame. +- **Upload command frame-aware.** `upload` uses the frame-aware target for file input locators. + ## [0.12.0.0] - 2026-03-26 — Headed Mode + Sidebar Agent You can now watch Claude work in a real Chrome window and direct it from a sidebar chat. diff --git a/TODOS.md b/TODOS.md index b1ade477..8458a98a 100644 --- a/TODOS.md +++ b/TODOS.md @@ -80,17 +80,14 @@ May replace `/setup-browser-cookies` for most use cases since the user's real co **Effort:** S **Priority:** P3 -### State persistence +### State persistence — SHIPPED -**What:** Save/load cookies + localStorage to JSON files for reproducible test sessions. +~~**What:** Save/load cookies + localStorage to JSON files for reproducible test sessions.~~ -**Why:** Enables "resume where I left off" for QA sessions and repeatable auth states. +`$B state save/load` ships in v0.12.1.0. V1 saves cookies + URLs only (not localStorage, which breaks on load-before-navigate). Files at `.gstack/browse-states/{name}.json` with 0o600 permissions. Load replaces session (closes all pages first). Name sanitized to `[a-zA-Z0-9_-]`. -**Context:** The `saveState()`/`restoreState()` helpers from the handoff feature (browser-manager.ts) already capture cookies + localStorage + sessionStorage + URLs. Adding file I/O on top is ~20 lines. - -**Effort:** S -**Priority:** P3 -**Depends on:** Sessions +**Remaining:** V2 localStorage support (needs pre-navigation injection strategy). +**Completed:** v0.12.1.0 (2026-03-26) ### Auth vault @@ -102,14 +99,13 @@ May replace `/setup-browser-cookies` for most use cases since the user's real co **Priority:** P3 **Depends on:** Sessions, state persistence -### Iframe support +### Iframe support — SHIPPED -**What:** `frame ` and `frame main` commands for cross-frame interaction. +~~**What:** `frame ` and `frame main` commands for cross-frame interaction.~~ -**Why:** Many web apps use iframes (embeds, payment forms, ads). Currently invisible to browse. +`$B frame` ships in v0.12.1.0. Supports CSS selector, @ref, `--name`, and `--url` pattern matching. Execution target abstraction (`getActiveFrameOrPage()`) across all read/write/snapshot commands. Frame context cleared on navigation, tab switch, resume. Detached frame auto-recovery. Page-only operations (goto, screenshot, viewport) throw clear error when in frame context. -**Effort:** M -**Priority:** P4 +**Completed:** v0.12.1.0 (2026-03-26) ### Semantic locators diff --git a/VERSION b/VERSION index 6ca5e048..ba9b59b5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.12.0.0 +0.12.1.0