)]}'
{
  "log": [
    {
      "commit": "e67442a2ccf329841c9227d66ee013afcf5633c6",
      "tree": "05436cda377979ba20de0ba0c94724e033d151b4",
      "parents": [
        "6cdf49667fa681ac62504766573e5086a62ddbf2"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Sat Oct 17 22:19:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 20:19:30 2026 +0000"
      },
      "message": "chore: add bazel10 testing (#3059)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "6cdf49667fa681ac62504766573e5086a62ddbf2",
      "tree": "d6a0cc558bd8f03cc8d10015bee15d9008fc7e37",
      "parents": [
        "ec3724a56b24a789b698732b961b28df49d18baf"
      ],
      "author": {
        "name": "Greg Magolan",
        "email": "gmagolan@gmail.com",
        "time": "Thu Oct 08 08:45:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 08:45:41 2026 -0700"
      },
      "message": "chore: cli 2026.41.24 (#3058)"
    },
    {
      "commit": "ec3724a56b24a789b698732b961b28df49d18baf",
      "tree": "0c271acef34e8452c586867c6157ce13253f557f",
      "parents": [
        "6982199895a175fffb7b33a1f39856233159f42a"
      ],
      "author": {
        "name": "Greg Magolan",
        "email": "gmagolan@gmail.com",
        "time": "Tue Oct 06 21:52:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 04:52:36 2026 +0000"
      },
      "message": "ci: give plain bazel in test.sh the Aspect Cloud remote cache (#3057)\n\nThe e2e `test.sh` scripts run plain `bazel`, which gets none of the\nflags `aspect test` injects. On GitHub-hosted runners it has only\nsetup-aspect\u0027s empty disk cache, so it rebuilds from scratch. In\n`e2e/js_image_oci` after #3056, the `aspect test` step was fully cached\nat ~1 min, while `test.sh` ran 680 local actions over 6.5 min.\n\nThis adds a step that points the machine `~/.bazelrc` at the Aspect\nCloud remote cache through the `aspect` credential helper. Plain `bazel`\nin every workspace then reuses what `aspect test` uploaded. Like\n`--remote`, it is skipped on fork PRs, which have no token.\n\n---\n\n### Test plan\n\n- Covered by existing test cases\n- Compare the `Optional ./test.sh` step duration and its `remote cache\nhit` count in this PR\u0027s CI with #3056\u0027s last run.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "6982199895a175fffb7b33a1f39856233159f42a",
      "tree": "8c76e5c0ce6c179621907da94346e4cdfd7b3c3f",
      "parents": [
        "6282d4bdc59bf1107d0eb69242c8f6687d29b96a"
      ],
      "author": {
        "name": "Greg Magolan",
        "email": "gmagolan@gmail.com",
        "time": "Tue Oct 06 21:28:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 21:28:08 2026 -0700"
      },
      "message": "ci: move aspect-large jobs to ubuntu-latest (#3056)\n\nMoves the 14 `aspect-large` test-matrix jobs (`.`, `examples` and\n`e2e/js_image_oci`, across the Bazel variants) to `ubuntu-latest`, to\ncut compute cost. It also deletes `warming.yaml`, which only warmed that\nrunner pool.\n\nOver the last ~26 runs, these jobs took a median of 0.5–0.9 min (p90\n≤1.3 min) on `aspect-large`, and waited ~1.8 min for a self-hosted\nrunner before starting. They now run `--remote` against Aspect Cloud\nlike the rest of the matrix, so the job-level `REMOTE_FLAG` override and\nthe `IS_FORK` runner selection are gone. Fork PRs run on `ubuntu-latest`\ntoo, instead of falling back to the 32-core runner.\n\nAlso bumps the pinned Aspect CLI (`.aspect/version.axl`) to 2026.41.12.\nIt also re-enables the GitHub status checks in `.aspect/config.axl` that\n9dd5aef2 turned off over GitHub API rate limits, which are now fixed.\nThe PR summary comment stays off, since there are too many tasks for it\nto be useful.\n\n---\n\n### Test plan\n\n- Covered by existing test cases\n- CI on this PR: one normal run, plus one temporary commit with\n`--noremote_accept_cached` to measure the worst case (no cache hits) on\n4 cores. That commit is reverted before merge.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "6282d4bdc59bf1107d0eb69242c8f6687d29b96a",
      "tree": "37e760aa5e5ed4c9a583d340e867a0b9693936d9",
      "parents": [
        "0a0b62de7d9b1b35077328ef1377a7439d50f20f"
      ],
      "author": {
        "name": "Long Ho",
        "email": "longlho@users.noreply.github.com",
        "time": "Tue Oct 06 14:29:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 11:29:58 2026 -0700"
      },
      "message": "fix: resolve no-runfiles entry points in the tool configuration (#3054)\n\nWhen `js_run_binary(use_execroot_entry_point \u003d False)` invokes a tool\nwith runfiles disabled, the tool entry point remains in the execution\nconfiguration. The shell launcher currently resolves it relative to the\nconsuming action\u0027s `BAZEL_BINDIR`, producing `the entry_point\n\u0027.../generator.cjs\u0027 not found`.\n\nSeparate explicit execroot-entry-point mode from the no-runfiles\nfallback. The latter uses `JS_BINARY__BINDIR` for entry-point resolution\nwhile preserving the caller\u0027s working directory.\n\nDraft pending a native Windows regression test. A standalone Linux\ndiagnostic that injects `JS_BINARY__NO_RUNFILES\u003d1` fails on current\nupstream and succeeds with this change. Native Windows CI has been\nprepared locally but has **not** run. The standalone repro repository is\nnot published, so the minimal reproduction is included here instead.\n\n### Minimal reproduction\n\n`MODULE.bazel`:\n```starlark\nmodule(name \u003d \"entrypoint_repro\")\nbazel_dep(name \u003d \"aspect_rules_js\", version \u003d \"3.5.0\")\n```\n\n`BUILD.bazel`:\n```starlark\nload(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\", \"js_run_binary\")\n\njs_binary(\n    name \u003d \"generator\",\n    entry_point \u003d \"generator.cjs\",\n)\n\njs_run_binary(\n    name \u003d \"repro\",\n    tool \u003d \":generator\",\n    outs \u003d [\"result.txt\"],\n    args \u003d [\"result.txt\"],\n    use_execroot_entry_point \u003d False,\n    set_legacy_environment_variables \u003d True,\n)\n```\n\n`generator.cjs`:\n```javascript\nrequire(\u0027node:fs\u0027).writeFileSync(process.argv[2], \u0027generator ran successfully\\n\u0027);\n```\n\nWith Bazel 9.2.0 on Windows and Git Bash configured, run `bazel build\n//:repro --noenable_runfiles`. Expected: unpatched launcher fails to\nfind the entry point; patched launcher writes `result.txt`.\n\nFor the **verified Linux diagnostic**, add `env \u003d\n{\"JS_BINARY__NO_RUNFILES\": \"1\"}` to `js_run_binary` and run `bazel build\n//:repro --noenable_runfiles --spawn_strategy\u003dlocal`. Local execution\navoids Linux sandbox differences in the Windows-style toolchain lookup.\nThe diagnostic reproduces the path mismatch, but is not a substitute for\nnative Windows validation."
    },
    {
      "commit": "0a0b62de7d9b1b35077328ef1377a7439d50f20f",
      "tree": "51dc5ff50bd54bc7f94e8cbe446eaf22e8080a76",
      "parents": [
        "f4beb29c96f7e3aa82262df2bbf18fc0806f35d5"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Thu Oct 01 13:53:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 13:53:14 2026 -0700"
      },
      "message": "chore: upgrade hermetic_launcher to 0.0.16 and use its compile_stub (#3052)\n\nhermetic_launcher 0.0.16 includes\nhttps://github.com/hermeticbuild/hermetic-launcher/pull/75, which\nexports its toolchain types as Labels rather than strings. That was the\nonly reason js_binary carried its own copy of compile_stub and wrapped\nthe toolchain types in Label(), so we can now remove that workaround.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "f4beb29c96f7e3aa82262df2bbf18fc0806f35d5",
      "tree": "d623fbf06b105c1105cd57bbf696fe3ab180e9d4",
      "parents": [
        "0d688733102dce6a94aa2b9752645a2bd14291b3"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 01:22:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 01:22:02 2026 -0700"
      },
      "message": "chore: mirror external releases (#3051)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "0d688733102dce6a94aa2b9752645a2bd14291b3",
      "tree": "3d4f495bbf700680500304859d86bbf78cf11ac0",
      "parents": [
        "81256ea0a1fd44337be716fc85e9e4166a99f5d5"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Sep 30 07:56:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 07:56:47 2026 -0700"
      },
      "message": "fix: handle an absolute BAZEL_BINDIR correctly (#3046) (#3047)\n\n#3015 inadvertently introduced a bug by changing the launcher logic so\nthat it cds to BAZEL_BINDIR even when that variable contains an absolute\npath. The logic in js/private/node-bootstrap/launcher.cjs assumes that\nBAZEL_BINDIR is a relative path and then tries to determine\nJS_BINARY__EXECROOT by undoing the cd to BAZEL_BINDIR, which of course\ndoes not work if BAZEL_BINDIR is absolute. This could happen in\nparticular with bazel run, where BAZEL_BINDIR is controlled by the user\nand can be set to an arbitrary path.\n\nThis change fixes the problem by going back to the original logic, which\nonly cds to BAZEL_BINDIR if that points to a directory that exists\nrelative to the current working directory.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nFix environment with `bazel run` on js_binary targets (#3046)\n\n### Test plan\n\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "81256ea0a1fd44337be716fc85e9e4166a99f5d5",
      "tree": "662d5b64686ecf568ea2682d207872d236183b5f",
      "parents": [
        "32a14bb9dd2af6661d2e70667315f57d0c4fa67b"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Wed Sep 30 01:51:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 01:51:08 2026 -0700"
      },
      "message": "chore: mirror external releases (#3050)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "32a14bb9dd2af6661d2e70667315f57d0c4fa67b",
      "tree": "6d23cca86c7bedd03182f7cd3d6490cc0cfce95a",
      "parents": [
        "d8fe83053f41b876f82e68b2a1598a85697a7308"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Sep 29 13:15:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 13:15:28 2026 -0700"
      },
      "message": "fix: pass bash\u0027s default PATH to js_binary child processes (#3045)\n\nBefore #3015 the bash launcher exported PATH after prepending the node\nwrapper directory. When the environment had no PATH, bash\u0027s compiled-in\ndefault was exported with it, so node and everything it spawned got a\nusable PATH. #3015 moved the PATH setup into launcher.cjs, preventing\nbash\u0027s default from taking effect. As a result, any attempt to invoke\nanother js_binary results in the shebang line (`#!/usr/bin/env bash`)\nfailing to locate bash.\n\nLet\u0027s export PATH at the top of the bash launcher to restore that, and\nbuild PATH in launcher.cjs from its non-empty parts so an unset PATH no\nlonger leaves a trailing delimiter (an implicit working-directory\nentry). This change also sets a default PATH if necessary in\nlauncher.cjs so that the hermetic launcher gets a reasonable default.\n\nFixes #3044.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nfix: pass bash\u0027s default PATH to js_binary child processes\n\n### Test plan\n\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "d8fe83053f41b876f82e68b2a1598a85697a7308",
      "tree": "8bcc7db6e5c81adbbf83b225842c91f7c2f37716",
      "parents": [
        "7bbd5b569935860be42403ec5bad04918f539713"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Tue Sep 29 00:40:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 00:40:48 2026 -0700"
      },
      "message": "chore: mirror external releases (#3043)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "7bbd5b569935860be42403ec5bad04918f539713",
      "tree": "031cdaf772431afde7d8333af5e77b7fc7e3da42",
      "parents": [
        "23f8a906e5302d4094ba91926c8dcedbe79aac61"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Mon Sep 28 10:20:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 10:20:01 2026 -0700"
      },
      "message": "test: add some more characterization tests for fixed_args behavior (#3038)\n\nI am looking at introducing double quoting around `fixed_args` for the\nbash launcher to cut down on the unintended shell functionality that\nthis enables (e.g. globbing, tilde expansion, brace expansion, etc.).\nLet\u0027s add a few more characterization tests first so that it is easier\nto tell what is changing and what is staying the same.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- New test cases added\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "23f8a906e5302d4094ba91926c8dcedbe79aac61",
      "tree": "e61d7d63dbe1b94a8b2c0059e5959215ea34bc6d",
      "parents": [
        "272208fd38f09b2f0e914fd32d296fa10d51af35"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Sun Sep 27 14:28:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 14:28:17 2026 -0700"
      },
      "message": "chore: mirror external releases (#3037)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "272208fd38f09b2f0e914fd32d296fa10d51af35",
      "tree": "24bfbbabe3668110e5775ff3ea9e91d8fb54a369",
      "parents": [
        "da44b3d5792a6330fca83ad527651197c5709847"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Sat Sep 26 11:33:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 26 11:33:18 2026 -0700"
      },
      "message": "test: container wrapping binary built with optional deps (#2756)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- New test cases added"
    },
    {
      "commit": "da44b3d5792a6330fca83ad527651197c5709847",
      "tree": "b55b3a4ed768f8428684c9aeefe703cbf89a1f66",
      "parents": [
        "1a2fa28393b00ce94086ea42f52135ca8902bf59"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Sep 25 10:20:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 10:20:15 2026 -0700"
      },
      "message": "feat: add hermetic launcher as opt-in alternative to bash launcher (#3002)\n\nThis change introduces a new launcher based on hermetic_launcher. For\nnow the bash launcher is still the default, but you can opt in to the\nnew launcher with `--@aspect_rules_js//js:hermetic_launcher`.\n\nThis launcher consists of a small native binary produced with\nhermetic_launcher that execs a generated JS launcher. If possible, the\nJS launcher jumps straight to the main entry point. However, this is not\npossible when `expected_exit_code` is used, in which case we have to\nexec node a second time. We also have to re-exec node when certain\nenvironment variables or flags are embedded in the js_binary that have\nan effect at node startup.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAn experimental new launcher based on hermetic_launcher is now\navailable: opt in by passing `--@aspect_rules_js//js:hermetic_launcher`.\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "1a2fa28393b00ce94086ea42f52135ca8902bf59",
      "tree": "52042a56a4e0d69e8afd41a179202ce7b32b7216",
      "parents": [
        "09e03078410b436c6accf7d79f2b0e6b2e080365"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Fri Sep 25 09:05:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 09:05:14 2026 -0700"
      },
      "message": "chore: mirror external releases (#3032)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "09e03078410b436c6accf7d79f2b0e6b2e080365",
      "tree": "ffd33a009783b03b8d52ff18a53a70658f23ddb9",
      "parents": [
        "83b6c9841c90e00e3f723442f9bc650e17830edf"
      ],
      "author": {
        "name": "Tamir Duberstein",
        "email": "tamird@openai.com",
        "time": "Fri Sep 25 00:32:05 2026 +0000"
      },
      "committer": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Sep 24 20:26:06 2026 -0700"
      },
      "message": "fix: skip parent lookup for absolute symlinks\n\nAn absolute readlink target does not depend on its parent directory.\nReturn the normalized target before resolving the parent, avoiding an\nunnecessary synchronous realpath and preserving a successful read if\nthe parent is renamed immediately afterward.\n\nExtend the existing parent-rename regression to cover absolute targets.\n"
    },
    {
      "commit": "83b6c9841c90e00e3f723442f9bc650e17830edf",
      "tree": "1393e1488938d1d1680e90fb91210883c302a93b",
      "parents": [
        "ae890330b0cb2154735528695b5f6a9761e8b290"
      ],
      "author": {
        "name": "Tamir Duberstein",
        "email": "tamird@openai.com",
        "time": "Thu Sep 24 22:45:19 2026 +0000"
      },
      "committer": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Sep 24 20:26:06 2026 -0700"
      },
      "message": "fix: dispatch parent resolution errors to callbacks\n\nA parent directory can disappear after readlink succeeds but before the\nfilesystem guard resolves its relative target. Report synchronous\nparent-resolution errors through the callback so asynchronous readlink\nand lstat retain their error and broken-link behavior.\n"
    },
    {
      "commit": "ae890330b0cb2154735528695b5f6a9761e8b290",
      "tree": "920d955dab18ce738146d106a62da5212bbd7951",
      "parents": [
        "5f0725664d654cb4d71b5c22436dd9a1ba77f7de"
      ],
      "author": {
        "name": "Tamir Duberstein",
        "email": "tamird@openai.com",
        "time": "Thu Sep 24 22:32:38 2026 +0000"
      },
      "committer": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Sep 24 20:26:06 2026 -0700"
      },
      "message": "fix: verify guarded symlink remapping targets\n"
    },
    {
      "commit": "5f0725664d654cb4d71b5c22436dd9a1ba77f7de",
      "tree": "d19ab8c7f6d5bd097215eae2fe267f75bda23080",
      "parents": [
        "8ac0afed6318536df38202e6860c9fd635bc733c"
      ],
      "author": {
        "name": "Tamir Duberstein",
        "email": "tamird@openai.com",
        "time": "Thu Sep 24 21:20:55 2026 +0000"
      },
      "committer": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Sep 24 20:26:06 2026 -0700"
      },
      "message": "fix: classify lstat using guarded readlink\n\nlstat can report an escaping file link as a symlink when it is reached\nthrough an in-root directory alias, while readlink rejects the same path.\nWebpack can then retry lstat and readlink indefinitely.\n\nShare readlink\u0027s existing physical-parent and root-namespace classification\nwith lstat. Hidden links return native stat results with the caller\u0027s\noptions preserved; visible and broken links keep their original lstat\nresults. Remove the unused unguarded realpath walkers.\n"
    },
    {
      "commit": "8ac0afed6318536df38202e6860c9fd635bc733c",
      "tree": "f4e8ed18641c35950e69ab98b09581b72c8c9fba",
      "parents": [
        "fc237dfe4eb4b4291cfcfb7a3fba68a91c47afab"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Sep 24 16:56:39 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 16:56:39 2026 -0700"
      },
      "message": "test: handle async failures in cjs version of node-patches tests (#3035)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "fc237dfe4eb4b4291cfcfb7a3fba68a91c47afab",
      "tree": "dde91f3eec05ec54250496e2ee5dbdddeafe00cd",
      "parents": [
        "9a5f5cdd62ed113f3716b05924ca4870e6c3b1a3"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Sep 22 13:31:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 13:31:23 2026 -0700"
      },
      "message": "ci: connect CI to Aspect Cloud (#3031)\n\nThis change points our aspect-cli jobs at Aspect Cloud\u0027s remote cache\nand BES. I left our jobs running on Aspect Workflows runners alone,\nsince they already have their own separate caching. CI jobs for fork PRs\nalso avoid using Aspect Cloud, since they do not have access to the\nnecessary secrets.\n\nThe tests in e2e/npm_translate_lock_credential_helper needed a fix to\nscope their credential helper. Otherwise, the credential helper would\nhave covered the Aspect Cloud endpoints and prevented authentication\nfrom working correctly.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "9a5f5cdd62ed113f3716b05924ca4870e6c3b1a3",
      "tree": "dd521dfc20654b899824ddb27dc78444a54dbd8a",
      "parents": [
        "f6cc853a8cdf99ef460ac43b8bc1baf39cf9fe58"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Mon Sep 21 19:20:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 19:20:41 2026 -0700"
      },
      "message": "test: update fixed_args test cases to account for old bash version on macOS (#3029)\n\nThese tests are failing on macOS because it ships a very old version of\nbash (3.2), which does not correctly set `$?` in the exit handler. This\nchange fixes it by adding a new `macos_want_exit_code` parameter and\nsetting that to 0 where necessary.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "f6cc853a8cdf99ef460ac43b8bc1baf39cf9fe58",
      "tree": "9ac549f3679c1bee6e9ad1295db0733d922c94fb",
      "parents": [
        "a833ad0469e015a1df91ec067aed938623134035"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Mon Sep 21 14:32:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 14:32:49 2026 -0700"
      },
      "message": "test: pin down how the launcher expands fixed_args (#3028)\n\nThe `fixed_args` passed to `js_binary` are currently baked into the\nlauncher shell script as raw, unquoted text. As a result, these\narguments are subject to various transformations by the shell, including\nword splitting, quote removal, backslash escapes, brace and tilde\nexpansion, command substitution, globbing, and more.\n\nSome of this functionality is useful and should be kept, while other\naspects of it are probably unintentional and/or buggy. This change adds\ntests covering as many cases as possible, but these tests are not meant\nto be normative; they are there just to document the current behavior\nand make it easier to understand if/when it changes.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a833ad0469e015a1df91ec067aed938623134035",
      "tree": "4244df82a2600e609c995d8b4e7348c3e886b281",
      "parents": [
        "5d9d150b31a3d79b85a937a33240e5ebea5cdc48"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon Sep 21 10:40:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 10:40:55 2026 -0700"
      },
      "message": "chore: mirror external releases (#3027)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "5d9d150b31a3d79b85a937a33240e5ebea5cdc48",
      "tree": "31a3966a0e228f1a72392f71a8cac66e6497628a",
      "parents": [
        "eb5c6a336d1fb180271c30f051f30f8c247c9beb"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Sun Sep 20 21:16:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 21:16:55 2026 -0700"
      },
      "message": "chore: mirror external releases (#3026)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "eb5c6a336d1fb180271c30f051f30f8c247c9beb",
      "tree": "acd2c881dd1b8e3524f2dc04ace5960e15536b49",
      "parents": [
        "d2e148770bfcee53bdd65281921258f598640522"
      ],
      "author": {
        "name": "Jeff Pignataro",
        "email": "jeffp2662@gmail.com",
        "time": "Thu Sep 17 14:41:37 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 13:41:37 2026 -0700"
      },
      "message": "fix(ci): use Bazel 9 for cache warming (#3024)\n\nThe warming job inherits Bazel 7.7.1 from `.bazelversion`, which cannot\nnegotiate the runner cache\u0027s RE API 2.3 requirement. In [the failed\nrun](https://github.com/aspect-build/rules_js/actions/runs/35246486449),\nanalysis finishes in 14 seconds, but the CLI stalls before archiving\nuntil cancellation.\n\nPin `USE_BAZEL_VERSION` to `9.0.0` for the warming job. The repository\ndefault and Bazel 7/8/9 test matrix remain unchanged.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Parsed the workflow YAML and checked the warming job\u0027s version\noverride; `git diff --check` passes.\n- In an isolated Linux reproduction with CLI 2026.33.2 and a mock cache\nadvertising RE API 2.3, Bazel 7.7.1 finishes analysis but hangs until\nthe timeout kills it. Bazel 9.0.0 completes warming in 1.7 seconds. The\nmock reports requested blobs as already cached; this does not validate\nreal cache or archive uploads.\n- Full-repository local validation attempted at\n`54dda4d02a43a995922b9254f8fe6aff5fbed16f` with CLI 2026.33.2, Bazel\n9.0.0, `CI\u003dtrue`, and the exact warming command. Native Linux ARM64\ncannot select the `main_toolchain_24` fixture; emulated Linux x86-64\nreaches all 926 targets but fails fetching npm packages because the\ndownloaded `coreutils chmod` exits 139 (twice, on different packages).\nBoth x86-64 attempts report failure and exit normally. Full local\nwarming is therefore not verified.\n- Pending: dispatch the warming workflow on a native x86-64 Workflows\nrunner and verify cache population and archive upload."
    },
    {
      "commit": "d2e148770bfcee53bdd65281921258f598640522",
      "tree": "e742e517bf8fbf470a68e729c99934bd86599b1f",
      "parents": [
        "dbe12f52099ba7d20605695ee06b3d5e6fa1006e"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Thu Sep 17 13:28:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 13:28:35 2026 -0700"
      },
      "message": "fix: handle SIGINT and SIGTERM separately (#3023)\n\nThe js_binary launcher currently clears both traps upon receipt of\neither signal. This does not seem quite right, because one would expect\nto be able to send one signal and then the other and have them both\nreach the node process (assuming it does not immediately exit after the\nfirst one).\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: no\n\n### Test plan\n\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "dbe12f52099ba7d20605695ee06b3d5e6fa1006e",
      "tree": "21b95fb916ae842ea380f7f844ba25924bbbee6a",
      "parents": [
        "6f2ff4ba5e0bf231fe532f5c8d072f7c5d036408"
      ],
      "author": {
        "name": "Jeff Pignataro",
        "email": "jeff@aspect.build",
        "time": "Thu Sep 17 10:17:52 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 09:17:52 2026 -0700"
      },
      "message": "chore: bump the Aspect CLI to 2026.33.2 (#3022)\n\nThe scheduled warming task hangs at Aspect CLI 2026.28.9 on Aspect\nWorkflows runners. The populate build completes in seconds, then the CLI\nwaits indefinitely on the build-event stream, because both Bazel and the\nCLI stream the same invocation to the runner\u0027s backend. aspect-cli#1349\n(first in 2026.32) makes the CLI stream it once. 2026.33.2 is the\nversion bazel-examples runs its daily warming with on the same runner\npool.\n\nThe first `warming.yaml` run sat in that state for 35 minutes with zero\nCPU before being cancelled; the 90-minute job timeout was the only\nbackstop.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- CI on this PR runs every task under the new CLI version.\n- After merge, a manual `warming.yaml` dispatch completes and writes an\narchive.\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "6f2ff4ba5e0bf231fe532f5c8d072f7c5d036408",
      "tree": "2169d3ac25a232f1c9e11e539cbfd64452c1ee2c",
      "parents": [
        "8b1f149e61012f0cea5520e00597ebdbac7887aa"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Sep 16 16:25:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 16:25:29 2026 -0700"
      },
      "message": "test: assert on the exec arguments and bootstrap a worker thread inherits (#3020)\n\nAs we move toward replacing the bash launcher with hermetic_launcher, it\nwill be important to ensure they both behave the same way with regard to\nstarting worker threads.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- New test cases added\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8b1f149e61012f0cea5520e00597ebdbac7887aa",
      "tree": "8afdd9b49d42cf9823b3ec73c6648d43982adc28",
      "parents": [
        "3f5022df91be055e07307b46fc9d70a702fb1958"
      ],
      "author": {
        "name": "Jeff Pignataro",
        "email": "jeffp2662@gmail.com",
        "time": "Wed Sep 16 16:40:53 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 16:40:53 2026 -0600"
      },
      "message": "ci: run the 32-core workspaces on Aspect Workflows runners (#3021)\n\nThe root, `examples` and `e2e/js_image_oci` workspaces move from\nGitHub\u0027s `ubuntu-22.04-32core` to the Aspect Workflows `aspect-large`\nrunner pool. Fork PRs keep the GitHub runner: they get no repo secrets\nand must not run on self-hosted capacity, so the matrix builder emits\nthe runner as JSON and picks by\n`github.event.pull_request.head.repo.fork`.\n\n**A warming archive nobody writes leaves every job cold.** The pool\nrestores a Bazel output base from an archive that only `aspect ci\nwarming` produces, so `warming.yaml` runs it daily on the same label,\nmirroring bazel-examples.\n\n**setup-aspect v2026.23.2 hard-fails on Workflows runners.** Its only\nstep there writes `/etc/bazel.bazelrc`, which the runner user cannot;\nv2026.26.9 writes `~/.bazelrc` instead and only warns when it cannot.\nAll four uses move to v2026.26.9.\n\n`test` gains `timeout-minutes: 90`; self-hosted jobs otherwise run to\nGitHub\u0027s 6h ceiling.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Ran the matrix-builder script locally: unset `IS_FORK` yields\n`[\"self-hosted\",\"aspect-workflows\",\"aspect-large\"]` for the three large\nworkspaces and `\"ubuntu-latest\"` for the rest; `IS_FORK\u003dtrue` yields\n`\"ubuntu-22.04-32core\"`. Output parses with `jq`.\n- CI on this PR runs the 11 large jobs on the new pool.\n\n---------\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "3f5022df91be055e07307b46fc9d70a702fb1958",
      "tree": "0fa76d3768136949e1685379e4980d85c3ca1a65",
      "parents": [
        "03dfe04bcb29779ca27a96b7fd888aac23761f81"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Wed Sep 16 10:53:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 10:53:29 2026 -0700"
      },
      "message": "chore: mirror external releases (#3003)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "03dfe04bcb29779ca27a96b7fd888aac23761f81",
      "tree": "9fcd9e68e1041d0336d8293c95deae43e90bbe39",
      "parents": [
        "62b3d0df0d24e8559231bba25516a5b15710d25e"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Sep 15 16:36:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 16:36:17 2026 -0700"
      },
      "message": "chore: clean up reference to runfiles in examples/stack_traces (#3019)\n\nThe common pattern we use elsewhere is `$$RUNFILES_DIR/$(rlocationpath\n...)`, so this change updates the example to use that instead of the\nalternative pattern it was using.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "62b3d0df0d24e8559231bba25516a5b15710d25e",
      "tree": "fd96b1bb7a1182112de2694db3b78ad85806c07c",
      "parents": [
        "c063504f2ee5bd8491598badebb2172b2f94dd31"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Sep 15 14:41:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 14:41:58 2026 -0700"
      },
      "message": "refactor: move most js_binary launcher logic from bash into launcher.cjs (#3015)\n\nThis change moves most logic out of the bash launcher, keeping only the\nbare minimum functionality there. It sets things up so that launcher.cjs\nis responsible for everything that needs to run just once per launch,\nand bootstrap.cjs is responsible for things that also need to happen for\nworker threads and child processes created with `child_process.fork`. I\nmoved the `chdir` logic into `launcher.cjs` accordingly, since this is\nsomething that should happen just once per launch.\n\nThe motivation for this is to make it easier to move away from the bash\nlauncher altogether. We are likely going to have an experimental\nbash-free launcher based on hermetic_launcher, and once we have two\nlaunchers we will want to keep the duplication between them to a minimum\nuntil we can drop the bash launcher.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c063504f2ee5bd8491598badebb2172b2f94dd31",
      "tree": "36da04575136de4d3ed4f9b321480dd21c35dc9e",
      "parents": [
        "f266653934bad2b0a13788a4a6fc0e399c0dc7c9"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Sep 15 10:40:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 10:40:01 2026 -0700"
      },
      "message": "feat: authenticate update_pnpm_lock with a Bazel credential helper (#3018)\n\nBazel\u0027s `--credential_helper` covers `npm_import` downloads but not the\n`pnpm install` that `update_pnpm_lock` runs, so private registries\nneeded duplicate auth in .npmrc. This adds a\n`npm_translate_lock(credential_helpers)` attribute alongside\n`update_pnpm_lock`. When running pnpm to update the lock rules_js asks\nthe helper for each registry with the credential helper protocol and\npasses the credentials to pnpm as URL-scoped `npm_config_*` environment\nvariables, which pnpm 10 and 11 honour without any project-level .npmrc\nauth settings.\n\nFix https://github.com/aspect-build/rules_js/issues/3004\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\n`npm_translate_lock` gains a `credential_helpers` attribute so\n`update_pnpm_lock` can authenticate `pnpm install` against private\nregistries with the same Bazel credential helper used for downloads\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "f266653934bad2b0a13788a4a6fc0e399c0dc7c9",
      "tree": "79001d9be9f28675fd7e606c45080ac84f637b06",
      "parents": [
        "40006e068d6ee5f274db1adb18d4c7b397b882e8"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Mon Sep 14 16:13:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 16:13:01 2026 -0700"
      },
      "message": "refactor: use npmrc registries and auth from state in the npm extension (#3017)\n\nSupposedly this was already done and merged into `state` beforehand.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "40006e068d6ee5f274db1adb18d4c7b397b882e8",
      "tree": "ac8ecbe9d9c3d06575d854a7e188b53f458c31f6",
      "parents": [
        "46be02aa5a8cf5d87a02126c838f4d565c488e82"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Thu Sep 10 11:14:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 11:14:33 2026 -0700"
      },
      "message": "fix: correct precedence for Node compile cache environment variables (#3014)\n\nIn #2991 I tried to simplify this logic and introduced a slight bug as a\nresult. I thought it was important to set NODE_DISABLE_COMPILE_CACHE\nbefore the node process started, but I realize now that I was mistaken\nabout that. Node does not enable its compile cache by default, so we are\nfree to wait until runtime to set NODE_DISABLE_COMPILE_CACHE\u003d1. This\nwill still prevent any subsequent calls to `module.enableCompileCache()`\nfrom enabling the cache.\n\nThis change therefore moves the logic for setting\nNODE_DISABLE_COMPILE_CACHE into the bootstrap JS file, and as a side\neffect it fixes things so that NODE_DISABLE_COMPILE_CACHE correctly\ntakes precedence over NODE_COMPILE_CACHE if both variables are set.\n\nThe motivation for this is to make it easier to move to\nhermetic_launcher, which does not provide a way to set environment\nvariables.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "46be02aa5a8cf5d87a02126c838f4d565c488e82",
      "tree": "a0610435b53ee7c782878816cd434a16957e1f63",
      "parents": [
        "660f75074d8ce0763ef6ecf24d2c53d117362c68"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Sep 09 16:36:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 16:36:25 2026 -0700"
      },
      "message": "perf: drive the coverage report from the manifest, not a runfiles glob (#3005)\n\nAs of today, we effectively glob the whole runfiles directory and then\nmatch each entry against the coverage manifest. This is slow because it\nends up being O(number of runfiles * length of coverage manifest).\n\nThis change speeds up the coverage reporting by using the coverage\nmanifest instead of globbing.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "660f75074d8ce0763ef6ecf24d2c53d117362c68",
      "tree": "7e209bcdedc788d3e917bd38f0e9f9936ef13e45",
      "parents": [
        "36ac514473a2f2adb827b0a6518bd16a04978b91"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Sep 09 13:23:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 13:23:49 2026 -0700"
      },
      "message": "test: add tests of quoting in js_binary entry points and fixed_args (#3013)\n\nBoth values reach node through the launcher, so how the launcher quotes\nthem is observable behavior, and neither of these cases was covered:\n\n- an entry point whose path contains an apostrophe;\n- a $VAR in a single-quoted fixed_arg, which must not be expanded at run\ntime, and the same $VAR unquoted, which must be.\n\nNothing is broken today. These record the behavior so that a change to\nhow the launcher spells either value cannot break it silently.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "36ac514473a2f2adb827b0a6518bd16a04978b91",
      "tree": "9d13951f39dc4026ffa400f0aecfa28dfe8e9313",
      "parents": [
        "b0a07e8c31997648762abaea4dc30635705e0ad7"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Sep 09 10:31:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 10:31:11 2026 -0700"
      },
      "message": "refactor: avoid assuming that js_binary is always a bash script (#3012)\n\nToday js_binary always has a bash launcher, but that will probably not\nbe true in the near future. This change fixes a couple places that\nassume that a js_binary executable can be run with bash.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "b0a07e8c31997648762abaea4dc30635705e0ad7",
      "tree": "6c1eb73d95f9e8ba994805264238f68db10eeb7d",
      "parents": [
        "21a3e868de1918e93a775393c42903a1c3ba647c"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Sep 08 11:53:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 11:53:05 2026 -0700"
      },
      "message": "fix: report coverage for .mts and .cts sources (#3009)\n\njs_library instruments .mts and .cts files, so they reach\nCOVERAGE_MANIFEST. c8\u0027s default extension list has neither, and it drops\na manifest entry whose extension it does not recognize, so those sources\nwere silently absent from the report.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "21a3e868de1918e93a775393c42903a1c3ba647c",
      "tree": "92a90a2b0d693c6a7542028f5b3904f4406e3a99",
      "parents": [
        "40df6d670425deca70c9473fc96e8bf6a89f2c91"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Sep 04 14:14:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 14:14:48 2026 -0700"
      },
      "message": "fix: filter js_library\u0027s instrumented sources by extension (#3007)\n\njs_binary passed an extensions list to instrumented_files_info;\njs_library passed none, so every src it declared was reported as\ninstrumented. Non-JS sources such as `.json` and `.css` files therefore\nreached the COVERAGE_MANIFEST of every test that depended on the\nlibrary, and the coverage reporter had to consider each one.\n\nBoth rules now share COVERAGE_EXTENSIONS so they cannot drift apart\nagain.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "40df6d670425deca70c9473fc96e8bf6a89f2c91",
      "tree": "aa3bcb0825c43d82a54913c6d411698002d9b931",
      "parents": [
        "321a8a032147f422e2aa5a51d683285e61710432"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Sep 04 10:02:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 10:02:49 2026 -0700"
      },
      "message": "chore: remove Linux hermetic sandbox CI job for now (#3006)\n\nThis build occasionally hangs during a Rollup action and it is not yet\nclear why. Let\u0027s remove it for now to prevent CI from being flaky.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan"
    },
    {
      "commit": "321a8a032147f422e2aa5a51d683285e61710432",
      "tree": "24282f063f4b3cb74284a03f287971f48f20ba3d",
      "parents": [
        "99486e268dc1dc3fb77de321e9c7f2be515d67b5"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Sep 02 16:06:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 16:06:53 2026 -0700"
      },
      "message": "refactor: collect v8 coverage from node, not the launcher (#2993)\n\nThe bash launcher currently exports the `NODE_V8_COVERAGE` environment\nvariable and points it at `$COVERAGE_DIR`. When we switch over to\nhermetic_launcher we will no longer be able to do this before Node\nstarts, so this change works around that problem by enabling coverage\nfrom within Node, without the need to set that environment variable in\nadvance.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "99486e268dc1dc3fb77de321e9c7f2be515d67b5",
      "tree": "abfe7360d337fc346c52d7968681f386b85f801e",
      "parents": [
        "4184b96f60dacbdc8ff187e9ee631937856a028d"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Sep 02 14:22:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 14:22:07 2026 -0700"
      },
      "message": "fix: make js_image_layer tar output independent of the spawn strategy (#2998)\n\nThis change enables `--experimental_use_hermetic_linux_sandbox` on CI\nand makes a small fix to `js_image_layer` in order to do so.\n\nI think this CI coverage would be valuable to have, because without this\nflag it is still possible to escape the `linux-sandbox` by following\nsymlinks. Ideally we want to make sure we are limiting ourselves to\ndeclared inputs and not inadvertently relying on files that are supposed\nto be outside the sandbox.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "4184b96f60dacbdc8ff187e9ee631937856a028d",
      "tree": "8f6c88676240b65adae97ce375ab29c19623071d",
      "parents": [
        "20cabc0b6887e81e4e98ff41d29d083afcbed2f2"
      ],
      "author": {
        "name": "Xeonacid",
        "email": "h.dwwwwww@gmail.com",
        "time": "Wed Sep 02 07:07:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 16:07:05 2026 -0700"
      },
      "message": "feat: expose yq_linux_riscv64 for native RISC-V Linux hosts (#2977)\n\nnpm_translate_lock parses pnpm-lock.yaml by invoking the host yq binary\nvia Label(\"@yq_{platform}//:yq\"). yq.bzl already fetches a mikefarah/yq\nlinux_riscv64 artifact, but MODULE.bazel did not use_repo() it, so a\nnative riscv64 build fails with:\n\n```text\nNo repository visible as \u0027@yq_linux_riscv64\u0027 from repository \u0027@@aspect_rules_js+\u0027\n```\n\nAdd yq_linux_riscv64 next to the other Linux yq platform repos.\n\n---\n\n---------\n\nCo-authored-by: Jason Bedard \u003cjason+github@jbedard.ca\u003e"
    },
    {
      "commit": "20cabc0b6887e81e4e98ff41d29d083afcbed2f2",
      "tree": "c914b784d5dc2ec5d0dd59c8e1292ca8c3120902",
      "parents": [
        "8702c76861062d6291a061719667d3bb76053f67"
      ],
      "author": {
        "name": "Georges Farah",
        "email": "georges.farah@datadoghq.com",
        "time": "Wed Sep 02 00:54:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 22:54:56 2026 +0000"
      },
      "message": "fix: update broken registry.bazel.build/docs URLs (#2999)\n\n## Summary\n\nThe `registry.bazel.build/docs/\u003cname\u003e` URL pattern returns 404 and is no\nlonger valid.\n\nThe correct URL format is now\n`registry.bazel.build/modules/\u003cname\u003e/latest/docs`.\n\nThis was identified across multiple Bazel rule repositories — see\nhttps://github.com/hermeticbuild/rules_rs/pull/235 for the original fix.\n\n## Changes\n\nReplaced broken `/docs/\u003cname\u003e` URLs and anchor-based fragments with\nexplicit paths:\n\n**File-level anchors:**\n- `#npm-extensions-bzl` → `/npm/extensions.bzl`\n- `#lint-eslint-bzl` (aspect_rules_lint) → `/lint/eslint.bzl`\n\n**Symbol-level anchors:**\n- `#function-npm_import` → `/npm/extensions.bzl/npm`\n- `#module_extension-npm_import` → `/npm/extensions.bzl/npm`\n- `#module_extension-translate_lock` → `/npm/extensions.bzl/pnpm`\n- `#tag-npm-npm_translate_lock` → `/npm/extensions.bzl/npm`\n- `#function-jq` (jq.bzl) → `/jq/jq.bzl/jq`\n- `#function-patch` (bazel_lib) → `/lib/repo_utils.bzl/patch`\n- `#provider-directorypathinfo` (bazel_lib) →\n`/lib/directory_path.bzl/DirectoryPathInfo`"
    },
    {
      "commit": "8702c76861062d6291a061719667d3bb76053f67",
      "tree": "de68b4954018aaa6784618ae76e7ab2a1bb59ebc",
      "parents": [
        "6e0fdb5d7fa3f26e61719f3a7dd8c2af6afad88a"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Sep 01 15:52:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 22:52:25 2026 +0000"
      },
      "message": "chore: upgrade aspect_tools_telemetry to 0.5.2 (#3001)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "6e0fdb5d7fa3f26e61719f3a7dd8c2af6afad88a",
      "tree": "d13ef163d6876e90e17da827741231a2093b30e9",
      "parents": [
        "048c545230815b7b1f127f2880ec11f1e0878dc1"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Sep 01 15:10:29 2026 -0700"
      },
      "committer": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Sep 01 15:43:25 2026 -0700"
      },
      "message": "feat: add initial pnpm 12 support (#2990)\n\nPnpm 12 [was released](https://pnpm.io/blog/releases/12.0) which should\nbe API compatible with v11 but has been rewritten in rust. The lockfile\nis the same for rules_js so it\u0027s mainly just the `pnpm.bzl` for\nfetching+invoking pnpm from bazel that has changed.\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAdd pnpm12 support\n\n- Covered by existing test cases\n- New test cases added\n"
    },
    {
      "commit": "048c545230815b7b1f127f2880ec11f1e0878dc1",
      "tree": "1494cb58732732adc9592bc3d125b0d5892f2b9b",
      "parents": [
        "24f720039e6f8cd91959f048c077f1f2860427eb"
      ],
      "author": {
        "name": "Oscar Falk",
        "email": "oscar@meroton.com",
        "time": "Wed Sep 02 00:10:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 15:10:03 2026 -0700"
      },
      "message": "fix(npm): correct package_store_prefix_len for links in external-repo sub-packages (#2864)\n\nWhen calculating the package store prefix truncation with external\nmodules (i.e. a repo name is included in the path), an extra slash after\nthe repo name was unaccounted for, resulting in incorrect symlinks (and\nsubsequently `ERR_MODULE_NOT_FOUND` error during builds).\n\nBelow is an example of the logic used to calculate the truncation\nlength:\n\n```python\n# ../[com_github_example_repo+]/[example_package]/[node_modules/.aspect_rules_js/]foo@1.2.3/node_modules/bar\n#    |        repo name       | |  package name | |         store prefix         |\n\npath \u003d \"../com_github_example_repo+/example_package/node_modules/.aspect_rules_js/foo@1.2.3/node_modules/bar\"\ntruncate_length \u003d len(repo_name) + len(package_name) + len(store_prefix) + 3 # \u003d 72\ntruncated_path \u003d path[truncate_length:] # \u003d \"s/foo@1.2.3/node_modules/bar\"\n```\n\nThe extra `s` in the beginning of `truncated_path` should not be there\nand is solved by changing the `+ 3` to a `+ 4`.\n\n---------\n\nCo-authored-by: Fredrik Medley \u003cfredrik@meroton.com\u003e\nCo-authored-by: Jason Bedard \u003cjason+github@jbedard.ca\u003e"
    },
    {
      "commit": "24f720039e6f8cd91959f048c077f1f2860427eb",
      "tree": "efda07fa79200988ce0dfceeee616cea4c3fe4d5",
      "parents": [
        "ec399c68f60ae3cc04f6bdbbf02edbb18a417c5d"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Sep 01 14:58:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 14:58:15 2026 -0700"
      },
      "message": "test: add test of npm_import(patch_tool) (#3000)\n\nAdd basic test coverage of this feature\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "ec399c68f60ae3cc04f6bdbbf02edbb18a417c5d",
      "tree": "16f1da502036573af4cecb04664f99f2010c2ec9",
      "parents": [
        "c3c809d0300e02d0f98f547480d79f99fac267ea"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Mon Aug 31 13:31:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 13:31:51 2026 -0700"
      },
      "message": "fix: resolve chdir inside the tree the launcher leaves us in (#2995)\n\nCurrently we have an inconsistency in the way `js_binary(chdir)` is\nhandled. If the `js_binary` target that sets `chdir` is in the main\nmodule, then we just cd directly from there into a subdirectory.\nHowever, if it is in a foreign module, then we cd to an absolute path\nwithin the bin directory. In the case of `bazel run` or a `js_test` that\nmeans we cd out of the runfiles tree in that situation.\n\nThis change fixes the problem by making sure we stay within the current\ndirectory regardless of whether the `chdir` came from a foreign module\nor the main module.\n\nI also cleaned up the launcher script slightly by removing the behavior\nof falling back on `JS_BINARY__BINDIR` when `BAZEL_BINDIR` is unset.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAlways resolve chdir inside the tree the launcher leaves us in.\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c3c809d0300e02d0f98f547480d79f99fac267ea",
      "tree": "58f3b779b749bc7bf8309bb9d1694cd6f69590e7",
      "parents": [
        "fb007625f7401fead4bb1880cb73c1b1fcb5c2ee"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Aug 28 15:40:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 15:40:42 2026 -0700"
      },
      "message": "refactor: apply chdir from the node bootstrap, not the launcher (#2994)\n\nThis is one of the more complex behaviors remaining in the bash\nlauncher, so let\u0027s move it into the node bootstrap in preparation for\nadopting hermetic_launcher.\n\nbootstrap.cjs now cds into `JS_BINARY__CHDIR` before deleting that\nvariable. Deleting it prevents child processes or worker threads from\nattempting to cd to that same directory a second time.\n\nThis necessitated updating `js_run_devserver` to pass the normalized\nchdir value via the devserver\u0027s JSON config instead of through\n`JS_BINARY__CHDIR`.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "fb007625f7401fead4bb1880cb73c1b1fcb5c2ee",
      "tree": "094bf99b3dee00532ccd79c713afad7f086a525e",
      "parents": [
        "666c64c19f3e5302ff80593416611e8d0657fce6"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Thu Aug 27 17:51:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 17:51:42 2026 -0700"
      },
      "message": "refactor: move node compile cache logic into bootstrap.cjs (#2991)\n\nThe bash launcher currently disables node\u0027s compile cache only when\n`NODE_COMPILE_CACHE` is unset (see #2937). When we replace the bash\nlauncher with hermetic_launcher, we are no longer going to have a place\nto put this logic so that it executes before the Node process starts.\nThis change therefore disables the cache unconditionally with an\nenvironment variable but re-enables it at runtime if\n`NODE_COMPILE_CACHE` is set. This is compatible with hermetic_launcher\nbecause we can embed a command line of something like `env\nNODE_DISABLE_COMPILE_CACHE\u003d1 node ...`\n\nOne drawback of this approach is that it inverts the priority of the\n`NODE_COMPILE_CACHE` and `NODE_DISABLE_COMPILE_CACHE` variables. Node\ntreats the latter as overriding the former, but this change reverses\nthat. I think this is acceptable because it will not be an issue unless\nthe user sets both variables. We cannot easily detect this situation\nbecause we do not have a good way to tell whether\n`NODE_DISABLE_COMPILE_CACHE` was set by the user or just set by us.\n\n---\n\n### Changes are visible to end-users: no (unless they\u0027re setting both of\nthese variables but hopefully no one\u0027s doing that)\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "666c64c19f3e5302ff80593416611e8d0657fce6",
      "tree": "658bc6f39edf72fd3ac641729fa195915dbcf08a",
      "parents": [
        "1f597d31cd6200de2f2a06000408d638810c3068"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Thu Aug 27 16:35:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 16:35:59 2026 -0700"
      },
      "message": "feat(js_run_binary): add flag controlling default of silent_on_success (#2992)\n\n`silent_on_success \u003d True` has a cost: the action must run the program\nunder the `spawn_binary` wrapper so that stdout and stderr can be\nbuffered and replayed on failure.\n\nThis change adds the `//js:silent_on_success` build flag, which sets the\ndefault behavior for `silent_on_success`. Individual targets can still\noverride it by setting the attribute explicitly.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nThe flag `--@aspect_rules_js//js:silent_on_success` now controls the\ndefault behavior of `silent_on_success` for `js_run_binary`.\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "1f597d31cd6200de2f2a06000408d638810c3068",
      "tree": "b0465df6bf4ee295b41aad5ed57515ef8a7654da",
      "parents": [
        "ac921051504861aebaa0726814d7c7dca803f41a"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Aug 25 10:41:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 10:41:05 2026 -0700"
      },
      "message": "refactor: generate the coverage report from node, not the launcher (#2984)\n\nThis change removes the coverage report generation from the bash\nlauncher and puts it in a Node exit listener instead. The exit listener\nspawns another Node process to run coverage.js, much like the bash\nlauncher did.\n\nThe main benefit of this is that it means we generally no longer have to\nwait for Node to exit so that we can do any cleanup afterward. In almost\nall cases the bash launcher can just `exec` Node and that\u0027s it.\n\nThe only cases where we cannot do that are when someone has directly set\nan environment variable such as `JS_BINARY__STDOUT_OUTPUT_FILE` when\ninvoking a `js_binary`. These variables were meant as internal\nimplementation details, but we will support this use case until the next\nmajor version.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ac921051504861aebaa0726814d7c7dca803f41a",
      "tree": "b7ca4e6498562714f2d67b8ad1a591c0f57140d9",
      "parents": [
        "a3af5588123626e99e6d5871a1182d54987a0279"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Tue Aug 25 00:13:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 00:13:29 2026 -0700"
      },
      "message": "chore: mirror external releases (#2986)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "a3af5588123626e99e6d5871a1182d54987a0279",
      "tree": "7c8b19b034071aa86884a7a74f4da8df6506f0c5",
      "parents": [
        "9373ed5ac01d4335c5b80083fded440eb12e9535"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon Aug 24 00:33:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 00:33:51 2026 -0700"
      },
      "message": "chore: mirror external releases (#2985)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "9373ed5ac01d4335c5b80083fded440eb12e9535",
      "tree": "3f9a01b6c5cec1b8225a8a039c1fd90ea50b9106",
      "parents": [
        "cd168a12d5faa90e8e4dbb302596b3fadd35d9a5"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Aug 21 11:27:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 11:27:31 2026 -0700"
      },
      "message": "refactor: delegate js_run_binary output capture to run_binary (#2980)\n\n`run_binary` now has its own implementations of `stdout`, `stderr`,\n`exit_code_out` and `silent_on_success`, so we can have `js_run_binary`\nuse them without reimplementing that functionality.\n\nI previously attempted this and had to roll back the change, but that\nwas because I deleted the corresponding logic from the bash launcher,\nand it turns out that some targets rely on that to work even when\n`js_run_binary` is not involved. This commit adds test coverage of that\nuse case to ensure it keeps working.\n\nThis change will cause most `js_run_binary` invocations to be wrapped\nwith `spawn_binary`, which is the tool `run_binary` uses to capture\nstdout, stderr, and the exit code. This is due to the fact that\n`silent_on_success` defaults to `True` on `js_run_binary`.\nPerformance-wise, this is mostly a wash: we get the extra `spawn_binary`\nprocess but also allow the bash launcher to `exec` node instead of\nspawning a new process for it.\n\nThe main motivation here is to move toward having `js_run_binary` use\n`hermetic_launcher` instead of our bash launcher. Unlike the bash\nlauncher, `hermetic_launcher` has no way to capture the output or exit\ncode of the binary, but that problem goes away if we can let\n`spawn_binary` handle it.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "cd168a12d5faa90e8e4dbb302596b3fadd35d9a5",
      "tree": "0e3ad2114bff21a78cd03513ac3dc4333902a619",
      "parents": [
        "6659cdb6093c0bf2466e224837c4432f681fdc08"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Aug 21 11:11:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 11:11:22 2026 -0700"
      },
      "message": "feat: set `silent_on_success \u003d False` in more places (#2983)\n\nSetting `silent_on_success \u003d True` incurs a performance cost, because it\nrequires us to save the stdout and stderr of the `node` process so that\nwe can print it out in the event of a failure. Disabling it lets us\n`exec` Node and avoid an extra process.\n\nThis commit sets the option to `False` in a few more places. This may\nresult in a little bit more build output, but it does not appear to be\nan excessive amount. I tweaked some options in `examples/webpack_cli` to\ncut down on the build output.\n\nI also fixed a few places where we were setting `silent_on_success \u003d\nTrue`--this is unnecessary since that is already the default.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "6659cdb6093c0bf2466e224837c4432f681fdc08",
      "tree": "de660810ace048810f516236446ae135e057d9a3",
      "parents": [
        "98e3ce17cbfb28cf26df3f56edf75d318006c677"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Aug 20 15:28:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 15:28:06 2026 -0700"
      },
      "message": "chore: upgrade tools_telemetry to v0.5 (#2978)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "98e3ce17cbfb28cf26df3f56edf75d318006c677",
      "tree": "67a41b4290e5932e4799db49fd05dc802b2b280e",
      "parents": [
        "f491b84a76b2c694c1b8b881e29065c695ecaf8d"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Aug 18 19:47:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 19:47:34 2026 -0700"
      },
      "message": "test: explicitly set `silent_on_success` on most `js_run_binary` targets (#2976)\n\nThis change sets `silent_on_success \u003d True` on a few usages that\ngenerate a lot of output, but otherwise sets `silent_on_success \u003d False`\nalmost everywhere. The macros in the generated `package_json.bzl` are\nleft alone, since we cannot change those without affecting users in an\nunpredictable way.\n\nThe main goal of this is to improve test coverage. When\n`silent_on_success` is `False`, we often exercise a different code path\nbecause (depending on other options) we can sometimes `exec` node and\navoid needing to do any cleanup after it returns.\n\nI am also working on setting up `hermetic_launcher` as an alternative to\nthe bash launcher, but we cannot easily use `hermetic_launcher` if\n`silent_on_success` is enabled. Turning that off in more places should\nunlock many more opportunities to test `hermetic_launcher`.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "f491b84a76b2c694c1b8b881e29065c695ecaf8d",
      "tree": "d9c76c5ffad497ddf2cb94f50d34c7342664018c",
      "parents": [
        "8c1eeb3815c576a9b884d07bb02de8fed4366d08"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Sun Aug 16 00:31:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 00:31:58 2026 -0700"
      },
      "message": "chore: mirror external releases (#2975)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "8c1eeb3815c576a9b884d07bb02de8fed4366d08",
      "tree": "19fb003e153ad89aabe20592ad35651062876daf",
      "parents": [
        "bd8631f3a86e8d09efb3bc27e69985192e568343"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Aug 14 14:39:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 14:39:26 2026 -0700"
      },
      "message": "perf: write captured stdout/stderr straight to the output file (#2973)\n\nIt is advantageous to write the captured stderr or stdout straight to\nits intended destination. This eliminates a cleanup step after Node\nexits, making it possible to invoke Node via `exec` and thus avoid\nforking an extra process.\n\nThere is a drawback, which is that if the action fails then the captured\noutput will be lost, making it somewhat harder to troubleshoot. This\nseems like an acceptable cost given the performance benefit, though.\n\nOne other caveat is that we can only do this when `silent_on_success` is\nnot enabled, but that parameter defaults to `True` for `js_run_binary`.\nUnder the default behavior, we have to store stdout and stderr in\ntemporary files so that we are prepared to print them out if the action\nfails. So to get any improvement from this change, the action has to opt\nin by setting `silent_on_success \u003d False`, or else invoke the\n`js_binary` without using `js_run_binary`.\n\nThis commit makes one other significant change, which is to always print\nout the launcher script\u0027s fatal- and error-level log messages instead of\ncapturing them. This behavior is logical because if such a message is\ngetting logged then the action is almost certainly going to fail, in\nwhich case there is no point in attempting to capture the log message\nanyway. We might as well print out the message to help the user\nunderstand what went wrong.\n\n---\n\n### Changes are visible to end-users: no (except that build output may\nbe different in some unusual cases when an action fails)\n\n### Test plan\n\n- Covered by existing test cases\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "bd8631f3a86e8d09efb3bc27e69985192e568343",
      "tree": "72eee09d8431cc45f795fd288409b4ab28f1ad56",
      "parents": [
        "06aa56079b5a18a9028fcba1eddcf1e6dd9014bb"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Aug 14 09:49:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 09:49:43 2026 -0700"
      },
      "message": "perf: invoke node directly from the js_binary launcher (#2972)\n\nThe launcher ran the program through our Node wrapper script, which does\nnothing but pass its arguments along to Node and add a `--require` flag\nfor our fs patches.\n\nLet\u0027s just inline that into our main launcher script so that we avoid\nspawning another bash process unnecessarily.\n\nWe still need to keep the Node wrapper around, though, so that if we\never shell out to `node` then we get our wrapper with its patches.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "06aa56079b5a18a9028fcba1eddcf1e6dd9014bb",
      "tree": "66062b646569d524669acafc64ebf9e692b57d8f",
      "parents": [
        "0960bdd0f542a73a4a6fa3183d68ef5766cce285"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Fri Aug 14 08:54:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 08:54:53 2026 -0700"
      },
      "message": "refactor: share one node and npm wrapper across targets (#2971)\n\nBoth of these wrappers were being stamped out from templates, one per\njs_binary target. Since each instantiation is identical to all the\nothers, let\u0027s just have a single global copy.\n\nThis change also removes\njs/private/test/image/custom_layers_test_app.listing, which appears to\nbe unreferenced.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0960bdd0f542a73a4a6fa3183d68ef5766cce285",
      "tree": "c0c5f75bda4a4ee4dd15705b7874f6036a4bcd73",
      "parents": [
        "7e3921b50b87b928ab5453d08441e201152e03a8"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Mon Aug 10 00:17:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 00:17:30 2026 -0700"
      },
      "message": "chore: mirror external releases (#2970)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "7e3921b50b87b928ab5453d08441e201152e03a8",
      "tree": "233795adcc5c37e101c103581b9f485a30dcef3c",
      "parents": [
        "a13838b1568670a951587dfe9409fb47578a4caf"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Sun Aug 09 21:16:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 09 21:16:03 2026 -0700"
      },
      "message": "fix: run npmrc tokenHelpers lazily and match auth registries on a path boundary (#2969)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "a13838b1568670a951587dfe9409fb47578a4caf",
      "tree": "07aa07b836a281b46775ee92097f2e482804e74f",
      "parents": [
        "4578c68e24fc7a7efe7a8e6de1bc67ea77a77931"
      ],
      "author": {
        "name": "Seth Vargo",
        "email": "seth@sethvargo.com",
        "time": "Fri Aug 07 18:25:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 15:25:41 2026 -0700"
      },
      "message": "feat: support the npmrc tokenHelper auth setting (#2948)\n\nAdds support for pnpm\u0027s\n[`tokenHelper`](https://pnpm.io/npmrc#urltokenhelper) npmrc setting.\n`tokenHelper` lets an executable print the registry auth token, which\nmatters for registries that issue short-lived tokens instead of static\n`_authToken` values.\n\nrules_js reads it from `npmrc`. The path can be absolute or relative to\nthe `.npmrc`, and `${VAR}` expansion still applies. Global\n`tokenHelper\u003d` and per-registry `//registry/:tokenHelper\u003d` both work.\nFor the same registry, `tokenHelper` wins over `_authToken`.\n\nSECURITY: pnpm only runs `tokenHelper` from user-level config. rules_js\ncan run one from a checked-in `.npmrc`. rules_js already runs\nrepo-controlled executables like lifecycle hooks, so this fits the\nexisting trust model, but the `npmrc` attribute calls it out because it\nhas to be deliberate.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nSupport pnpm\u0027s `tokenHelper` npmrc setting. Use it when your registry\nissues short-lived auth tokens. rules_js runs the helper and uses stdout\nas the auth token. The helper can be absolute or relative to the\n`.npmrc`.\n\n### Test plan\n\n- New test cases added\n- Covered by existing test cases"
    },
    {
      "commit": "4578c68e24fc7a7efe7a8e6de1bc67ea77a77931",
      "tree": "08d91569205e475e80b9066425c299ed93164233",
      "parents": [
        "9d4f5bb5e6b83c7f3b24f1e71790f4bb5bd461bc"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Aug 06 15:39:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 15:39:35 2026 -0700"
      },
      "message": "fix: support path-mapping with js_run_binary(stdout,stderr,exit_code_out) (#2968)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "9d4f5bb5e6b83c7f3b24f1e71790f4bb5bd461bc",
      "tree": "98afdd8b0df2526d8c327c51b3f6d4df15c7993d",
      "parents": [
        "0b5a693fb280662d876cdc538a23d0371abcf3cb"
      ],
      "author": {
        "name": "imanmalekian31",
        "email": "58827166+imanmalekian31@users.noreply.github.com",
        "time": "Fri Aug 07 01:51:42 2026 +0330"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 15:21:42 2026 -0700"
      },
      "message": "feat(nextjs): allow passing additional args to next build (#2947)\n\n`nextjs_build` and `nextjs_standalone_build` hardcode `args \u003d\n[\"build\"]`, and `args` cannot be passed through `**kwargs` (Starlark\nraises \"got multiple values for keyword argument \u0027args\u0027\"), so there is\nno way to pass a flag to `next build` through these macros.\n\nAdd an `args` parameter, defaulting to `[]`, appended after the `build`\nsubcommand. The default produces an identical `js_run_binary`\ninvocation, so existing callers are unaffected.\n\nThe motivating case is `next build --webpack`: Next.js 16 defaults to\nTurbopack, which cannot run under a Bazel sandbox, and there is no\nconfig-file or env-var equivalent for selecting webpack.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAllow arbitrary args to be passed through to `nextjs build ...`.\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0b5a693fb280662d876cdc538a23d0371abcf3cb",
      "tree": "5bae64d5094de522b1e4dc7acea6ceebb45d7b25",
      "parents": [
        "77b4a5b50acfa3191c3411b7507725682295c435"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Aug 05 16:53:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 16:53:42 2026 -0700"
      },
      "message": "feat(js_run_binary): add flag controlling default of set_legacy_environment_variables (#2967)\n\nAdds the //js:set_legacy_environment_variables build flag, mirroring\n//js:use_execroot_entry_point, so users can flip the default for the\nlegacy BAZEL_* env vars repo-wide via .bazelrc instead of per-target.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAdds the //js:set_legacy_environment_variables build flag\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "77b4a5b50acfa3191c3411b7507725682295c435",
      "tree": "69a453cbdc44bc261fa5f0c63a16d5db929aa5a8",
      "parents": [
        "2b252ed49b8d51500d93bd0d9f4491517e979a7a"
      ],
      "author": {
        "name": "Alex Eagle",
        "email": "aeagle@figma.com",
        "time": "Wed Aug 05 16:38:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 16:38:18 2026 -0700"
      },
      "message": "feat(js_image_layer): add external compressor passthrough (#2898)\n\nAdd `compressor`/`compressor_args` attributes to the `js_image_layer`\nrule, mirroring the `tar` rule from bazel-contrib/tar.bzl. When set,\nlayers are compressed by an external program (e.g. `@pigz` for parallel\ngzip) via bsdtar\u0027s `--use-compress-program` instead of bsdtar\u0027s\nsingle-threaded built-in compressor.\n\n`compression` still selects the output file extension; `compressor` only\nswaps the program. No behavior change unless `compressor` is set.\n\n\u003c!-- Delete this comment! \nInclude a summary of your changes, links to related issue(s), relevant\nmotivation and context for why you made the change, how you arrived at\nthis design, or alternatives considered.\n\nFor repositories that use a squash merge strategy, the pull request\ndescription may also be used as the landed commit description ensuring\nthat useful information ends up in the git log.\n--\u003e\n\n---\n\n### Changes are visible to end-users: yes/no\n\n\u003c!-- If no, please delete this section. --\u003e\n\n- Searched for relevant documentation and updated as needed: yes/no\n- Breaking change (forces users to change their own code or config):\nyes/no\n- Suggested release notes appear below: yes/no\n\n### Test plan\n\n\u003c!-- Delete any which do not apply --\u003e\n\n- Covered by existing test cases\n- New test cases added\n- Manual testing; please provide instructions so we can reproduce:\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2b252ed49b8d51500d93bd0d9f4491517e979a7a",
      "tree": "f30656d334faebf45388dddf84d4a2647ec60e73",
      "parents": [
        "ee8eab75402b513775466c945b045bb5e5e7fe51"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Wed Aug 05 16:15:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 16:15:47 2026 -0700"
      },
      "message": "chore: mirror external releases (#2961)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "ee8eab75402b513775466c945b045bb5e5e7fe51",
      "tree": "be337a4de997e9fc3808ddc2f3504860e77ebd1a",
      "parents": [
        "36d23c8ec9c48c43d58382f679863403f9306420"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Aug 05 08:21:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 08:21:12 2026 -0700"
      },
      "message": "docs: add documentation on how to enable path mapping (#2966)\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan"
    },
    {
      "commit": "36d23c8ec9c48c43d58382f679863403f9306420",
      "tree": "0db8d3b283558ecec00e277e3817c01369bf3697",
      "parents": [
        "90bab55677701a26a52772ead106bbb32c75f43b"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Aug 05 07:59:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 07:59:07 2026 -0700"
      },
      "message": "refactor(js_run_binary): support path mapping with use_execroot_entry_point (#2965)\n\nuse_execroot_entry_point hoisted a js_binary tool\u0027s entire runfiles tree\n(including its generated launcher, node/npm wrappers, and node-patches\nbootstrap) into a target-configuration rebuild, so that the entry point\ncould be resolved from the target-platform bin directory. The launcher\nscript bakes `$(COMPILATION_MODE)/$(TARGET_CPU)/$(BINDIR)` into its\ncontent, so this hoisted copy differed between -c fastbuild and -c opt,\ndefeating cross-config path mapping even though none of that toolchain\nscaffolding is ever read from the target-platform bin directory at\nruntime (only the entry point and its data are).\n\njs_binary now exposes a leaner \"execroot_data_files\" output group (entry\npoint + data, without the toolchain scaffolding), and js_run_binary\nhoists that instead of the tool\u0027s full runfiles.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAllow path mapping to work with js_run_binary even with\nuse_execroot_entry_point enabled\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "90bab55677701a26a52772ead106bbb32c75f43b",
      "tree": "a658647733c8d565b0e612f6e9494f40e341307b",
      "parents": [
        "bf35bc0e47a58cef222c93c1c80b5f38faeed04c"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Aug 04 15:20:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 15:20:01 2026 -0700"
      },
      "message": "feat(js_run_binary): add support for path mapping (#2962)\n\nThis change adds support for path mapping in `js_run_binary` by updating\nit to use the new `--bazel-bindir` flag instead of setting the\n`BAZEL_BINDIR` environment variable. The only mechanism Bazel provides\nfor determining path-mapped paths is by adding inputs directly to an\n`Args` object from `ctx.actions.args()`. We can now compute the output\nBazel bin directory that way using a special case added to\n`run_binary()` for this purpose in\nhttps://github.com/bazel-contrib/bazel-lib/pull/1269.\n\nThe `js_run_binary` macro currently sets several other problematic\nenvironment variables: BAZEL_BUILD_FILE_PATH, BAZEL_COMPILATION_MODE,\nBAZEL_TARGET_CPU, BAZEL_TARGET, BAZEL_WORKSPACE, BAZEL_PACKAGE, and\nBAZEL_TARGET_NAME. Most of these are determined by evaluating Make\nvariables, and `run_binary` conservatively assumes that path mapping is\nnot safe if any location or Make variable expansion occurs. This change\nguards those variables behind a new `set_legacy_environment_variables`\nparameter (default `True`) so they can be disabled without a breaking\nchange, ahead of flipping the default in a future release. To enable\npath mapping on a particular `js_run_binary` target, make sure to set\nthis parameter to `False`.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nSupport for path mapping in `js_run_binary`\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "bf35bc0e47a58cef222c93c1c80b5f38faeed04c",
      "tree": "0c69213cf1dbfa26ae51846a674b5daf5e647f8d",
      "parents": [
        "8b8cb4062003fca15ef6bde9a0fc3f81ba8dcea1"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Mon Aug 03 14:44:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 14:44:24 2026 -0700"
      },
      "message": "refactor: expose js_run_binary_action as js_binary_lib.run_binary_action (#2963)\n\nMoving it into the existing js_binary_lib struct lets consumers detect\nsupport via `hasattr(js_binary_lib, \"run_binary_action\")` instead of a\nbare top-level symbol that can\u0027t be probed for.\n\nThis is going to be important for enabling path mapping in rules_ts 3.x,\nwhich uses rules_js 2.x. Requiring rules_js 3.x would be a breaking\nchange, so that is not an option. But instead we can opportunistically\ntake advantage of a rules_js 3.x feature if it turns out to be\navailable.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no,\nbecause `js_run_binary_action` has not been released yet\n- Suggested release notes appear below: yes\n\nExpose js_run_binary_action as js_binary_lib.run_binary_action\n\n### Test plan\n\n- Covered by existing test cases\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8b8cb4062003fca15ef6bde9a0fc3f81ba8dcea1",
      "tree": "c63bdb9c63c97dbb06a8a1436714a698f81bcd1a",
      "parents": [
        "d93e686af0b06ad5d23065da3792780ee5f1de67"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Thu Jul 30 23:35:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 23:35:05 2026 -0700"
      },
      "message": "chore: mirror external releases (#2945)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "d93e686af0b06ad5d23065da3792780ee5f1de67",
      "tree": "6713cc0e1b9176c27014b3d3fd7f739ca860ce13",
      "parents": [
        "993953ff75104f05a4b9665a031f50470a2d0a7b"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Thu Jul 30 19:49:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 19:49:43 2026 -0700"
      },
      "message": "fix: js_run_binary_action drops --bazel-bindir value when outputs[0] … (#2960)\n\n…is a directory\n\nArgs.add_all\u0027s default expand_directories\u003dTrue expands a declared\ndirectory into its (not-yet-known, empty at analysis time) contents\nbefore map_each runs, instead of calling map_each on the directory\nitself. This silently dropped the --bazel-bindir argument\u0027s value\nwhenever outputs[0] was a directory output.\n\nThis change adds test coverage for directory outputs by updating the\ntest rule in e2e/path_mapping to produce a directory instead of a file.\nWe have test coverage elsewhere for rules that produce individual files,\nso we\u0027re not losing any coverage by tweaking the test this way.\n\n---\n\n### Changes are visible to end-users: no, because this fixes a bug that\nhas not been released yet\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "993953ff75104f05a4b9665a031f50470a2d0a7b",
      "tree": "75a52a56d6397ef44cf5b39c6fff2cd51bb060e6",
      "parents": [
        "c42203eb914ec9306925b7345211a4de7077c794"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Thu Jul 30 09:08:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 09:08:34 2026 -0700"
      },
      "message": "feat: support --bazel-bindir flag for path-mapping-compatible js_binary tools (#2918)\n\nBAZEL_BINDIR is normally set via the $(BINDIR) Make variable, which\nbakes in the real, configuration-specific bindir (e.g.\nbazel-out/k8-fastbuild/bin) at analysis time. Bazel\u0027s path mapping only\nworks for command-line arguments, so BAZEL_BINDIR as an environment\nvariable permanently defeats action-cache sharing across configurations\n(e.g. -c opt vs -c fastbuild).\n\nThis adds a --bazel-bindir\u003d\u003cpath\u003e flag to the generated js_binary\nlauncher (js/private/js_binary.sh.tpl), consumed as the first argument,\nso callers can pass a path-mapping-safe bindir value instead of relying\non the environment.\n\ne2e/path_mapping/bindir_path_mapping_check proves this works end-to-end:\na test-only rule drives a real js_binary via a map_each-computed\n--bazel-bindir argument, and test.sh proves two builds that differ only\nin compilation mode share a single cached action via a shared\n--disk_cache.\n\nI plan to get js_run_binary working soon, but we need to wait for a\nbazel-lib release before we can do that.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nSupport for running js_binary targets in a path-mapping-friendly way\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c42203eb914ec9306925b7345211a4de7077c794",
      "tree": "9c18e102a296827a3bcd19ebb71ca97d2c56f13f",
      "parents": [
        "e164a846a2277ce1e47015810dde936d02e617fa"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Jul 29 13:08:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 13:08:53 2026 -0700"
      },
      "message": "feat: add js_run_binary_action helper for invoking js_binary from custom rules (#2956)\n\njs_binary\u0027s launcher requires BAZEL_BINDIR to be set when invoked as a\nbuild tool, but rule authors writing their own ctx.actions.run call\ncurrently have to deal with this implementation detail manually. Add\njs_run_binary_action() (js/libs.bzl, implemented in\njs/private/js_binary.bzl) to hide it, and update\nexamples/js_binary/custom_rule.bzl and examples/worker/defs.bzl\u0027s\npi_rule to use it.\n\nThe main motivation for this is that adding proper support for path\nmapping is going to require conveying the output bin directory via a\n`--bazel-bindir` command-line flag rather than an environment variable.\nIdeally we do not want users to specify that flag directly, but as long\nas they call our helper function we can set the flag there ourselves.\n\nAnother issue is that there are custom rules setting environment\nvariables that we intended to be private, such as\n`JS_BINARY__STDOUT_OUTPUT_FILE`. If we can get all such rules to use our\nhelper instead, then we can potentially have more flexibility to change\nhow we handle these private variables.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAdd the `js_run_binary_action` helper for invoking a `js_binary` from a\nrule implementation\n\n### Test plan\n\n- Covered by existing test cases\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "e164a846a2277ce1e47015810dde936d02e617fa",
      "tree": "6e4bba0c1cabccdc383856212e6b798c29a8d03b",
      "parents": [
        "c0f46e7a835573de71905ed4819533e6a61e123c"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Wed Jul 29 11:25:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 11:25:24 2026 -0700"
      },
      "message": "refactor: rename node-patches to node-bootstrap, register.cjs to bootstrap.cjs (#2958)\n\nThis is a pure rename in preparation for a followup change that will\nmove more launcher functionality into this file, since it will do more\nthan patch fs going forward. Eventually we would like to get rid of the\nbash launcher altogether.\n\n---\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c0f46e7a835573de71905ed4819533e6a61e123c",
      "tree": "36f12790c92b44c5255e293ead9bb3e29e26cb75",
      "parents": [
        "a2c1c498be6778a9daa81137e0b18512e232fa1e"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Jul 28 19:21:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 19:21:38 2026 -0700"
      },
      "message": "refactor: directly run node from shell using exec when not using expected_exit_code (#2944)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "a2c1c498be6778a9daa81137e0b18512e232fa1e",
      "tree": "4dbd929c893589b17dc44e4694084d219a9de56d",
      "parents": [
        "7be7e2a9af7f927b0ed1a70ebae70966a6132405"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Jul 28 17:48:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 17:48:36 2026 -0700"
      },
      "message": "fix(coverage): generate lcov report in the test action (#2932)\n\nFix #2901\nFix #965\nRef #2933\nClose #2904\nClose #991\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nFixed `bazel coverage` returning empty (0%) reports under\nsplit-postprocessing and remote execution.\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "7be7e2a9af7f927b0ed1a70ebae70966a6132405",
      "tree": "7be618b529423c94dc3365b2bab64debe7d70466",
      "parents": [
        "68fe4655db3dfb76e9d704a652ff83a326694cdb"
      ],
      "author": {
        "name": "Adam Cozzette",
        "email": "adamc@aspect.build",
        "time": "Tue Jul 28 14:49:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 14:49:54 2026 -0700"
      },
      "message": "revert: feat: use bazel-lib run_binary\u0027s native stdout/stderr/exit_co… (#2955)\n\n…de_out/s… (#2921)\n\nThis reverts commit 266085205d0c4b085a3840c67e3c6204cd5f8b4b.\n\nThat commit broke some projects because it caused us to start ignoring\nenvironment variables such as `JS_BINARY__STDOUT_OUTPUT_FILE`. I had\nthought these variables were private, but it turns out that there is\ncode outside our control setting them and expecting the launcher script\nto handle them.\n\nI had to comment out some tests under `js/private/test/launcher`. These\ntests combine use of `expected_exit_code` and `exit_code_out`, which\nonly works when we are using the `exit_code_out` implementation provided\nby `run_binary()`.\n\n---\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nRevert #2921 due to unexpected breakage from this.\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "68fe4655db3dfb76e9d704a652ff83a326694cdb",
      "tree": "adc1949f7d5563b14295dcb7829cdabcdd24fb41",
      "parents": [
        "4f0a4711782570ed7551617929724ac7fbb74b0a"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Jul 28 10:55:37 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 17:55:37 2026 +0000"
      },
      "message": "test: assert coverage merger behavior in bash, not appended JS (#2954)\n\nThe mergers here were built by genrule-appending assertions onto\ncoverage.js. That never worked for the case the `fail` test was meant to\ncover: coverage.js calls process.exit(0) as soon as it sees a non-empty\nCOVERAGE_OUTPUT_FILE, so execution never reached the appended\nprocess.on(\u0027exit\u0027) line and no handler was ever registered. The test\nonly proved the merger does not crash.\n\nAssert in bash instead, appended to the merger\u0027s launcher after it runs,\nwhere COVERAGE_DIR and COVERAGE_OUTPUT_FILE are both set and no early\nexit can skip it. The case is now covered by a real test program that\nwrites its own report, so `fail` becomes `preexisting` after what it\nexercises: a report the test wrote itself must survive. See\nhttps://github.com/aspect-build/rules_js/pull/430.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "4f0a4711782570ed7551617929724ac7fbb74b0a",
      "tree": "f1af5fb4689e7dbe1e8e9162b820cb2d817474e6",
      "parents": [
        "23af2472986b0c305902f92b89c95e100ee2f09b"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Jul 28 09:30:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 09:30:58 2026 -0700"
      },
      "message": "test: e2e coverage workspace covering the supported scenarios (#2953)\n\nRecords what `bazel coverage` produces today for a js_test: a relative\nimport, a first-party js_library linked by name, and a passing test with\na non-zero expected_exit_code. Reports are checked by looking for the\ncovered/uncovered function names rather than an SF: path, so the\nassertions survive changes to how sources resolve.\n\nTwo scenarios are asserted as not working, so that fixing either one has\nto touch this file:\n\n- Split post-processing (--experimental_split_coverage_postprocessing,\nrequired for remote execution) reports empty coverage for every target,\n#2901.\n- First-party code repackaged with npm_package and imported by name\nresolves to a copy in the store with no link back to source, #2933. That\none is a documented limitation rather than a bug; use js_library linking\ninstead.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "23af2472986b0c305902f92b89c95e100ee2f09b",
      "tree": "9a835bbdd3d57c5ad426ad91e6f2ca4df060af25",
      "parents": [
        "7fd075c9a6579dfda871746633b573c8665b6285"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Jul 28 08:54:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 08:54:43 2026 -0700"
      },
      "message": "refactor: build the coverage test rules from one factory (#2952)\n\nThe two rules differ only in which merger they default _lcov_merger to,\nwhich has to stay a private attribute, so each merger still needs its\nown rule.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "7fd075c9a6579dfda871746633b573c8665b6285",
      "tree": "036b6866aee108e1bbe5767e478c1b4a817a001f",
      "parents": [
        "68d24757e397d7a9c134d82d489a3ff0cb6c368e"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Tue Jul 28 08:52:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 08:52:33 2026 -0700"
      },
      "message": "ci: do not let a cached test result stand in for a coverage run (#2951)\n\nThe coverage job differs from the ordinary test job only in\npost-processing flags, which do not invalidate a cached test result. It\ncould therefore republish the coverage.dat of an earlier run, and the\ncustom lcov mergers in js/private/test/coverage -- the only thing\nasserting coverage behavior -- would never execute.\n\nAlso set --instrument_test_targets for `bazel coverage` in .bazelrc:\nthose tests instrument their own entry_point, so a bare `bazel coverage\n//js/private/test/coverage/...` fails without the flag CI passes\nexplicitly.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "68d24757e397d7a9c134d82d489a3ff0cb6c368e",
      "tree": "226c645c8bc1c1fa0890c1874a80358a1416f922",
      "parents": [
        "f710b0b9de909c09b686ce153b82d9d25aa24a68"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Mon Jul 27 23:14:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 23:14:07 2026 -0700"
      },
      "message": "fix(coverage): sh toolchain is optional for the merger (#2950)\n\nThe merger only references the shell toolchain on Windows, where it\nwraps the bash script in a .bat launcher, so requiring it\nunconditionally breaks platforms that have no such toolchain registered.\nSame fix as #2926 and #2930 made for js_binary.\n\nAlso add the bash script to the .bat launcher\u0027s runfiles, which is where\nthat launcher resolves the script it wraps from.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- Manual testing; see #2932"
    },
    {
      "commit": "f710b0b9de909c09b686ce153b82d9d25aa24a68",
      "tree": "d9d647ac671f89affdf9952a16336518abed9c77",
      "parents": [
        "386d1f52cbf830b0c8ee024952ca8e755ecd2a3c"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Fri Jul 24 22:05:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 22:05:54 2026 -0700"
      },
      "message": "refactor: remove unused js_binary shell logf_warn func (#2946)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    },
    {
      "commit": "386d1f52cbf830b0c8ee024952ca8e755ecd2a3c",
      "tree": "2bc7c65cdd2dc11fe5af387ab9bab59045f28c0e",
      "parents": [
        "640d8fa16b89783a9298cc46e86135bb1bcc385f"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Fri Jul 24 12:35:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 19:35:28 2026 +0000"
      },
      "message": "fix: super long package names on windows cause paths \u003emax length (#2934)\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nTruncate long npm package repo names to reduce chance of paths too long\non windows.\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "640d8fa16b89783a9298cc46e86135bb1bcc385f",
      "tree": "cce8a9de272685647c342da72097ab9ae086da10",
      "parents": [
        "189971dfad5611544425dde15fe5a5c9f6b6e852"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Jul 23 23:40:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 06:40:59 2026 +0000"
      },
      "message": "fix: do not assume testonly\u003dFalse in macros to support default_testonly (#2943)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- Manual testing"
    },
    {
      "commit": "189971dfad5611544425dde15fe5a5c9f6b6e852",
      "tree": "96f0801448140a2f338a5b0b43812c9d46e2d4d7",
      "parents": [
        "8fc6abdcc11e860b6d23390c3199610161c3d1fb"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Jul 23 19:16:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 19:16:49 2026 -0700"
      },
      "message": "test: add detailed js_test/binary launcher tests (#2942)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "8fc6abdcc11e860b6d23390c3199610161c3d1fb",
      "tree": "a217ab981f3c8e7469be94c28cd0d7b346d96d8a",
      "parents": [
        "02af6b8943ad2ba9286e31f957f91a40056d7c52"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Jul 23 15:48:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 15:48:01 2026 -0700"
      },
      "message": "ci: enable macos unit tests on main module (#2941)\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "02af6b8943ad2ba9286e31f957f91a40056d7c52",
      "tree": "be3727a262e2a65b0969e12e57f9df1c3d4da334",
      "parents": [
        "60d244a870f76806147d10bb32dbf48f0e1772b9"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Jul 23 15:45:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 15:45:22 2026 -0700"
      },
      "message": "fix: disable node compile cache unless the cache dir is explicitly specified (#2940)\n\nFix #2937\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added\n- Manual testing; please provide instructions so we can reproduce:"
    },
    {
      "commit": "60d244a870f76806147d10bb32dbf48f0e1772b9",
      "tree": "aaddbd1139b0b69b8b87d2c97b3344b8f2173878",
      "parents": [
        "14c5b2a1bb4f5bce9a8f245029ec9d6628f3ce09"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Thu Jul 23 15:45:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 15:45:06 2026 -0700"
      },
      "message": "feat: add npm_package(packable) for creating the package tar.gz file (#2939)\n\n### Changes are visible to end-users: yes\n\n- Searched for relevant documentation and updated as needed: yes\n- Breaking change (forces users to change their own code or config): no\n- Suggested release notes appear below: yes\n\nAdd `npm_package(packable\u003dTrue)` for exposing the tar.gz artifact\ngenerated by pnpm\n\n### Test plan\n\n- Covered by existing test cases\n- New test cases added"
    },
    {
      "commit": "14c5b2a1bb4f5bce9a8f245029ec9d6628f3ce09",
      "tree": "71bcbe620d9b9346fc9452f1a586d3b15670f020",
      "parents": [
        "9236fce89be8aa61a9f1a2a596758241cc3b27ed"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 09:54:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 09:54:19 2026 -0700"
      },
      "message": " chore: mirror external releases  (#2935)\n\nAutomated changes by\n[create-pull-request](https://github.com/peter-evans/create-pull-request)\nGitHub action\n\nCo-authored-by: aspect-marvin \u003cmarvin@aspect.build\u003e"
    },
    {
      "commit": "9236fce89be8aa61a9f1a2a596758241cc3b27ed",
      "tree": "a275ccdbb0de31314f3629b62b6e589b826b51da",
      "parents": [
        "26705808869bc93b1c3ef9655a4c8ad07f687a9b"
      ],
      "author": {
        "name": "Jason Bedard",
        "email": "jason+github@jbedard.ca",
        "time": "Mon Jul 20 10:50:44 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 10:50:44 2026 -0700"
      },
      "message": "fix(js_binary): tools/sh toolchain required on windows (#2930)\n\nI guess that [last\none](https://github.com/aspect-build/rules_js/commit/cbb35ca1748243273135f6fba32deee8c5405b0a)\ndidn\u0027t [work on\nwindows](https://github.com/aspect-build/rules_js/actions/runs/29720005746/job/88281713415)\nso I guess it is required then.\n\nLast time I the PR never ran on windows so I didn\u0027t notice.\n\n### Changes are visible to end-users: no\n\n### Test plan\n\n- Covered by existing test cases"
    }
  ],
  "next": "26705808869bc93b1c3ef9655a4c8ad07f687a9b"
}
