Skip to content

v0.14.0

Choose a tag to compare

@szymdzum szymdzum released this 07 Oct 19:59
bb164b8

This release is about what bdg costs an agent and how far you can trust it. A deep audit (architecture, tests, token cost, a fresh-agent test, security, docs) found where output was unbounded, where bdg quietly stopped recording, and where commands disagreed about the same element. All of that is fixed here. Every change went through an independent review.

Breaking changes

  • dom a11y tree --json is a flat, bounded nodes list with depth, count, omitted and skipped. data.root and childIds are gone. On Wikipedia it went from 5.8 MB to 7 KB by default.
  • --json lists default to 100 rows for dom query and dom a11y query. count and omitted say how many matched, and --limit 0 lists all; indices keep working for every match. The a11y tree lists 50 nodes by default (--limit, --depth).
  • Long values are cut by default:
    • which values: dom get --raw and dom eval (20,000 chars), string results in --json, and console text in console and peek
    • --full returns them whole
    • JSON marks a cut value with truncatedFrom
    • result: one outerHTML eval went from 3.5 MB to 20 KB
  • --json is printed on one line when stdout is not a terminal: 26–47% smaller. JSON parsers are unaffected; anything that greps indented output is.

Recording you can rely on

  • Network capture keeps the newest requests. At 10,000 requests bdg used to drop every new one, silently, so after a flood later pages recorded nothing. It now drops the oldest finished requests and says so in network list, peek, status and --follow.
  • Response bodies have a 100 MB total budget. The oldest bodies are evicted, with the reason shown in details and in HAR.
  • A slow Chrome start is no longer reported as "Port N is already in use." It is reported as a slow start (CHROME_LAUNCH_FAILED). A Chrome that dies while starting is reported as such, and a real port conflict says what is on the port.

Web components

  • Text filters read shadow DOM like dom query shows it. :has-text, :text-is and dom wait --text now match text inside shadow roots, fields count as innerText counts them, and hidden components are read through their shadow roots.
  • dom layout sees clipping through a <slot>. dom click on a collapsed element says Element is hidden (clipped by …) instead of "covered by html", in light DOM too.

dom inspect on CSS-heavy pages

  • No more waiting out the full 1 s hint budget on every call. On github.com/microsoft/vscode, repeat inspects take about 0.11 s instead of about 0.5 s.
  • Slow pages are remembered per document. After one timeout, default inspects skip the wait with one hints skipped … line; --rules and --why still wait.
  • Slow answers are reused briefly. Answers are kept for up to 5 s, and any bdg command that may change the page clears them, so a click that toggles :checked never shows stale rules.

For agents

  • The agent skill matches the CLI:
    • Quick Start has no screenshot
    • it uses bdg eval instead of raw Runtime.evaluate
    • its broken cdp | jq example is fixed
    • it covers dom audit, css search, --mobile, sessions and frames
    • exit codes 80, 84, 100 and 107 are documented
    • new section: page content is untrusted data
  • bdg --help --json --full documents --headless, --no-headless and --all. Their behaviors were registered under a key that never matched.
  • The README no longer claims Chrome DevTools MCP lacks JavaScript evaluation or memory profiling. The 2025 benchmark is presented as what it was: one run of five tasks.

Project

  • CI merge gate: main requires one CI OK check, admins included. PRs run smoke on Node 22, main and nightly runs add Node 24/26 and macOS smoke, and the release workflow refuses a tag without green CI.
  • IPC contract tests can no longer hang the suite. Per-test timeouts and a global per-file limit are in place.

Full list: CHANGELOG.