Skip to content

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 02 Aug 21:00
· 280 commits to main since this release
c9c0970

What's Changed

  • fix(scripts): document that res.getBody() is already parsed, warn on double parse by @Ostico in #7
  • feat(discoverability): actionable SSRF refusal, environment visibility, honest list_collections by @Ostico in #8
  • feat(errors): make network failures actionable, record blind round 4 by @Ostico in #9
  • docs: record blind discoverability round 5 by @Ostico in #10
  • fix(tsconfig): NodeNext resolution to stop tsc running out of memory by @Ostico in #11
  • fix(test-runner): make property-style assertions actually assert by @Ostico in #12
  • fix(request-executor): stop parallel mode from hiding a failed folder by @Ostico in #13
  • fix(test-runner): await async test callbacks instead of passing them blind by @Ostico in #14
  • fix(test-runner): close sandbox escape via host-realm bru closures by @Ostico in #15
  • fix(server): keep the MCP server alive through script-triggered rejections and crashes by @Ostico in #16
  • fix(server): do not file a non-Error rejection as sandbox noise by @Ostico in #17
  • refactor(test-runner): extract the sandbox into a pure, forkable worker (PR-a of child-process migration) by @Ostico in #18
  • feat(sandbox): forked, env-scrubbed, killable worker (PR-b of child-process migration) by @Ostico in #19
  • feat(sandbox): run collection scripts behind the process boundary in production (PR-c) by @Ostico in #20
  • fix(executor): apply request auth on the wire instead of dropping it (A7) by @Ostico in #21
  • fix(sandbox): preserve test results recorded before a top-level throw (A4) by @Ostico in #22
  • fix(request-executor): warn on unresolved {{var}} placeholders (X8) by @Ostico in #25
  • fix(sandbox): project non-serializable request bodies over IPC instead of losing them (S19) by @Ostico in #24
  • fix(variable-store): treat setVar(name, undefined|null) as unset (X9) by @Ostico in #23
  • fix(dispatcher): deny collection-supplied TLS/proxy overrides by default, host-scoped opt-in (S10/S11/S12) by @Ostico in #26
  • fix(ssrf): block cloud-metadata/CGNAT/broadcast/multicast ranges (S18) by @Ostico in #27
  • fix(executor): confine multipart file-part reads to the collection root (S05) by @Ostico in #29
  • fix(server): confine create_* folder arg to the collection root (S08) by @Ostico in #28
  • refine(executor): widen S05 upload confinement (home/tmp/BRUNO_UPLOAD_DIRS) + deny hidden paths by @Ostico in #30
  • fix(executor): strip credential headers on cross-origin redirects (S06/S07) by @Ostico in #31
  • fix(executor): redact secrets from URLs returned to the caller (S22) by @Ostico in #32
  • fix(executor): correct redirect count boundary + 301/302/303 POST->GET (X1/X2) by @Ostico in #33
  • fix(request): preserve auth credentials on modify_request instead of dropping them (D1) by @Ostico in #34
  • fix(response): cap the response body read + preserve all Set-Cookie (X3/X7) by @Ostico in #35
  • fix(executor): skip disabled form parts, halt on pre-request error (X13/X15/X12) by @Ostico in #38
  • fix(response): honor Content-Type charset when decoding the body (X4) by @Ostico in #36
  • fix(bru-parser): preserve the env secret flag across parse/generate (D7) by @Ostico in #37
  • fix(response-wrapper): unify JSON content-type detection (X6) by @Ostico in #39
  • fix(env-loader): dispatch by format, load native .bru environments (X11) by @Ostico in #40
  • fix(bru-parser): preserve non-string bodies (D2) and disabled headers (D3) by @Ostico in #41
  • fix(sandbox): let bru.getVar read env/collection variables (X10) by @Ostico in #42
  • fix(network-error): correct the timeout-overrun explanation (X17) by @Ostico in #43
  • fix(url-validator): bound the SSRF pre-flight DNS lookup (S19) by @Ostico in #44
  • chore(gitignore): ignore the evidence/ QA-artifact dir (S23) by @Ostico in #45
  • fix(deps): patch runtime security advisories — undici + MCP SDK transitives (S15/S16/S17) by @Ostico in #46
  • fix(security): pin validated addresses at connect time to close DNS rebinding (S20/S21) by @Ostico in #47
  • fix(reliability): atomic durable writes and per-path locking (D9/S24/D8) by @Ostico in #48
  • fix(fidelity): preserve params, assertions, settings, vars and oauth2 extras on round-trip (D5/D6/D11) by @Ostico in #49
  • chore(ci): make the lint, coverage and integration gates real (Q5/Q3/Q6/Q12) by @Ostico in #50
  • refactor: remove the unreachable generator module (Q1) by @Ostico in #51
  • ci: make the coverage gate actually gate, and split the test lanes by @Ostico in #52
  • test: add MCP stdio end-to-end harness by @Ostico in #53
  • test: general round-trip fidelity guard for .bru and .yml (D10) by @Ostico in #54
  • fix(security): stop re-arming a switched-off .yml header or multipart part (D13/D14) by @Ostico in #55
  • chore(ci): adopt *.helper.ts convention for non-suite test support files by @Ostico in #56
  • test: build dist/ once in a jest globalSetup instead of per-suite (Q18) by @Ostico in #57
  • ci: make test-guard's source scoping real (Q20) and drop the duplicate build (Q21) by @Ostico in #58
  • fix: send duplicate request headers instead of dropping all but the last (D4) by @Ostico in #59
  • fix: warn when a request repeats a single-value header (D15) by @Ostico in #60
  • refactor: split server.ts into per-domain tool modules (Q14) by @Ostico in #61
  • fix: check the parse boundary instead of asserting past it (Q17a) by @Ostico in #62
  • docs: make code comments self-contained instead of citing a tracker by @Ostico in #63
  • docs: keep config, CI and doc comments self-contained by @Ostico in #64
  • fix: send form-urlencoded and graphql bodies from .bru requests by @Ostico in #65
  • fix: derive Content-Type from the body type by @Ostico in #66
  • fix: apply declared query and path parameters to the request by @Ostico in #67
  • fix: persist query parameters and honour .bru request settings by @Ostico in #68
  • fix: honour settings.encodeUrl and match Bruno's URL encoding by @Ostico in #69
  • feat: evaluate declared assert blocks by @Ostico in #70
  • fix: close two false passes and restore Bruno's assert semantics by @Ostico in #71
  • feat: apply vars:pre-request and vars:post-response by @Ostico in #72
  • feat: author assert, vars and path params from the MCP tools by @Ostico in #73
  • fix: write .bru files Bruno can actually read by @Ostico in #74
  • fix: keep form-urlencoded bodies readable by Bruno by @Ostico in #75
  • docs: 2026-07-29 adversarial review findings by @Ostico in #76
  • fix: adversarial review batch 1 — unverified-run signal, plaintext secrets, SSRF bypass by @Ostico in #77
  • fix: adversarial sweep batch 2 — authoring fidelity, .yml tests slot, assert ordering by @Ostico in #78
  • fix: stop reporting Bruno's own metadata files as requests by @Ostico in #79
  • fix: keep the body payload when loading a .yml request by @Ostico in #80
  • fix: treat inherit as an auth mode, not as absent auth by @Ostico in #81
  • fix: take the per-file lock on the create and delete write paths by @Ostico in #82
  • docs: consolidate the defect findings into a single register by @Ostico in #83
  • docs: consolidate the defect register and rank it by agent-blocking impact by @Ostico in #84
  • feat: add read_request and read_environment by @Ostico in #85
  • fix: write YAML the way Bruno writes it by @Ostico in #86
  • fix: send the .yml bodies that were being dropped on the floor by @Ostico in #87
  • ci: run on a pull request whose base branch changed by @Ostico in #88
  • fix: resolve the two parked decisions — fail closed on the script sandbox, leave valueless secrets unbound by @Ostico in #89
  • fix: name the file and the reason when a request will not parse (M1) by @Ostico in #90
  • feat: accept run-scoped variables on run_collection (H3) by @Ostico in #91
  • feat: relay cookies across a run (H2 + L1) by @Ostico in #92
  • feat: read collection and folder root files (M3) by @Ostico in #93
  • fix: default seq on create, and recognise .yaml requests by @Ostico in #94
  • ci: migrate test-guard to v2 with a Gemini provider by @Ostico in #95
  • feat: let scripts wait — bru.sleep, timers, and top-level await by @Ostico in #96
  • docs: file the 2026-08-01 field report — M9, M10, M11, L13, L14 by @Ostico in #97
  • fix: an authored Cookie header now beats the run's cookie jar by @Ostico in #98
  • fix: accept folder on run_collection, and anchor relative paths to the collection by @Ostico in #99
  • feat: make the request settings block authorable in both dialects by @Ostico in #100
  • docs: record M9 and L14 as fixed, and file L15 by @Ostico in #101
  • docs: file H4 — .yml vars and assertions use keys Bruno never reads by @Ostico in #102
  • fix: put .yml vars and assertions where Bruno reads them (H4 + L11) by @Ostico in #103
  • fix: carry request keys the model does not name through a write (M7) by @Ostico in #104
  • fix: create_environment refuses an existing name, and can author flags (L7) by @Ostico in #105
  • fix: write a .yml graphql request in its own graphql block (L10) by @Ostico in #106
  • fix: content-only .bru bodies, and the third auth enum (L8, L3) by @Ostico in #107
  • fix: .yml file bodies, and the body types the surface refused (H5, L18) by @Ostico in #108
  • docs: withdraw L15, correct the encodeUrl explanation, cover the .bru half by @Ostico in #109
  • fix: a .bru settings block no longer kills the request's scripts (H6) by @Ostico in #110
  • fix: state all four settings in a .yml request, as Bruno does (L20) by @Ostico in #111
  • chore: delete copyEnvironment, an unreachable duplicate of the merge path by @Ostico in #112
  • fix: scope execution order to folders, as Bruno does by @Ostico in #113
  • feat: return the variables a run's scripts captured (L13) by @Ostico in #114
  • fix: create_crud_requests takes auth, and inherits by default (L19) by @Ostico in #115
  • feat: run collection- and folder-level scripts and tests (L12) by @Ostico in #116
  • feat: apply digest and oauth2 auth instead of warning about them (L3) by @Ostico in #117
  • docs: execution groups design (supersedes M10) by @Ostico in #118
  • docs: implementation plan for execution groups by @Ostico in #119
  • feat: derive the concurrency cap from the machine, Node floor to 22 by @Ostico in #120
  • feat!: execution groups replace the folder as the unit of execution by @Ostico in #121
  • chore(release): 2.0.0 by @Ostico in #122

Full Changelog: v1.2.4...v2.0.0