Skip to content

v1.3.0

Latest

Choose a tag to compare

@detrin detrin released this 15 Aug 16:07
· 2 commits to main since this release

Added

  • run -s <id> <file.py> [--arg k=v] — execute a reusable Python file once against the live session (same vars as eval, plus args), instead of shell-looping eval/CLI calls over a list. ~20x faster than a shell loop for 30 items (7.75s → 0.38s; see benchmarks/microbench_run_vs_loop.sh)
  • replay playbooks gained wait (by selector/state, not just a fixed sleep), assert (fail a step when a condition doesn't hold), for_each (loop nested steps over a literal or captured list), and headers on fetch steps
  • stop_on_failure: true playbook option halts remaining steps after the first failed one, including out of a nested for_each
  • setup --upgrade bumps the patchright pip package and installs the Chromium build it now expects, and restarts a running daemon so it stops driving the old binary from memory. Previously there was no command for this — brow setup alone just re-fetched the build for whatever version was already pinned
  • Update-available check: most commands now print a one-line [brow] brow X.Y.Z is available ... notice to stderr when a newer brow-cli is on PyPI, cached once a day (hourly retry on failure) so it almost never touches the network. Fails silently on any error and never blocks a command. Disable with BROW_NO_UPDATE_CHECK=1

Changed

  • License reverted to Elastic License 2.0 (was MIT) — permits free use, modification, and distribution, but not offering brow as a hosted/managed service. Releases up to and including 1.2.0 remain MIT-licensed; this applies to releases after 1.2.0

Fixed

  • fetch steps' output: name now actually populates {name} (and {name[key]}) for later steps, as the playbook-writer docs always claimed — previously it was only recorded in the run's result log and never fed back into substitution
  • replay CLI now exits nonzero when any step failed — previously it always exited 0 regardless of step outcomes
  • fetch steps with an HTTP 4xx/5xx response are now marked as failed (expect_status opts out) — previously any response, including a 500, was reported ok: true
  • An unknown playbook step action now reports a clear error instead of failing silently with no explanation
  • stop_on_failure now actually halts a run when the failure is inside a for_each — previously it only stopped the current iteration's remaining steps, and later iterations and outer steps kept going
  • A playbook-level auth: none is now inherited by fetch steps that don't set their own auth — previously only a per-step auth was ever checked
  • state restore now restores localStorage in addition to cookies — previously it silently dropped the origins half of storage_state(), so a restored login failed for any site keeping its auth token in localStorage instead of a cookie
  • profile delete now refuses (409) while a live session holds that profile, instead of deleting the on-disk directory out from under it
  • Docs site: every internal cross-reference link used a relative .md path that Astro never resolves and rendered as a literal broken href in the built site (e.g. href="daemon.md") — converted site-wide to the resolved /brow/... paths the sidebar itself uses