### CHANGELOG
# Changelog
## Unreleased
## 4.0.32 (August 8, 2026)
### Features
- Expose forced env vars to template substitution too ([07b7bb19](https://github.com/extension-js/extension.js/commit/07b7bb1959a55ff59e1955420b58a012b1cb7821))
- Inspect every modified page in the watch batch with fresh bytes ([796a29da](https://github.com/extension-js/extension.js/commit/796a29da902b441e4581350df314e717c760c0ed))
### Fixes
- Guard the DNR override against dynamic-only manifests ([380767da](https://github.com/extension-js/extension.js/commit/380767dac15b4c3b6ead1241ace8c6c4421dd415))
Other changes (15)
- Raise the js-yaml floor past its advisories ([47ad1ea2](https://github.com/extension-js/extension.js/commit/47ad1ea228676a72728ad95076049a564340d021))
- Hold react-table majors in dependabot until the v9 migration ([8017287e](https://github.com/extension-js/extension.js/commit/8017287ed92e99077c3b648de362d14fed1d9821))
- Revert the react-table 9 bump until the log-table is migrated ([03601430](https://github.com/extension-js/extension.js/commit/03601430daea2c221741337f4c5032054cfa399f))
- Use a comma in the legacy-path warning to pass the messaging gate ([07a94549](https://github.com/extension-js/extension.js/commit/07a94549510f7860295bcd0e72c7306269620e86))
- Scrub the author-mode alias in the default-verbosity retry spec ([6254c869](https://github.com/extension-js/extension.js/commit/6254c869195af4749732540ebaa16113c79cad2b))
- Drop em dashes from watch-batch comments to pass the prose gate ([4f99ce00](https://github.com/extension-js/extension.js/commit/4f99ce00027a7516fd79cfe4a509e56cf890e828))
- Warn on stderr when logs --signals-only has no emitter to match ([b8e029dc](https://github.com/extension-js/extension.js/commit/b8e029dc0768f04f7205e61c4b93ba09efe61ad3))
- True up browser-family docs and pin webkit-fork behavior ([a41e54fc](https://github.com/extension-js/extension.js/commit/a41e54fc62d1721424b9b4b9e472a1779a630a45))
- Skip the polyfill for the webkit family ([33543a39](https://github.com/extension-js/extension.js/commit/33543a390d470bdba8928213c1bd600adc39a076))
- Adopt the safari product block for webkit-based runs ([cc55feb6](https://github.com/extension-js/extension.js/commit/cc55feb6409b3cba8c9421d5a2c3611dcc1a43a7))
- Print a repeated fatal-shape repair once per dev session ([11873869](https://github.com/extension-js/extension.js/commit/118738693f3a09b831c3fa430297779ab23b7298))
- Warn on legacy manifest paths from the author source, per field ([602498f5](https://github.com/extension-js/extension.js/commit/602498f5e13487b94293cf22764eb068a06e9bd2))
- Give telemetry a budget that covers a cold TLS handshake ([c11f8536](https://github.com/extension-js/extension.js/commit/c11f853629fe44300cf2a2619e8f2fa9009cefcd))
- Derive the create template list from the corpus commit it downloads ([03b52829](https://github.com/extension-js/extension.js/commit/03b52829f9a45e9e67989cb87014dd0097034ad1))
- Force color off in test suites, monochrome is the assertion contract ([32c910b9](https://github.com/extension-js/extension.js/commit/32c910b92b501085b2d7256ff9d1d91ba928dbdb))
Other changes (3)
- Refuse consent and identity that arrived with a git clone ([a9f764dd](https://github.com/extension-js/extension.js/commit/a9f764dd99011185bd009c659c8b04661554f7d8))
- Let the MAIN world resolve assets through the bridge base ([461739d7](https://github.com/extension-js/extension.js/commit/461739d70ab36486213929ca5541f46721fab28b))
- Follow the examples rename to sidebar-monorepo-turborepo in the catalog ([0f0f0769](https://github.com/extension-js/extension.js/commit/0f0f07699423d3fcd8ebadb5837c6c05e3bb2e79))
Other changes (13)
- Drop the stale templates/wasm ignore rule ([550b2589](https://github.com/extension-js/extension.js/commit/550b2589e304998b35484907407717e49c1398e4))
- Redirect guarded manifest writes to the platform null device ([cc370099](https://github.com/extension-js/extension.js/commit/cc370099ff9eb1e09f2e2fb6aef64fc5b494eb94))
- Pin the default template corpus to a commit instead of tracking main ([9f578c68](https://github.com/extension-js/extension.js/commit/9f578c68270a5363e6c8ebc0cfd29f0204e3afe7))
- Convert hex theme colors for chromium builds instead of refusing ([0d332d0c](https://github.com/extension-js/extension.js/commit/0d332d0cb4c6569690d8cb28eeebc18fdf3b2a2f))
- Keep the catalog screenshot out of every scaffold and its store zip ([3ac6630e](https://github.com/extension-js/extension.js/commit/3ac6630e35b4ad5c7685d2190f7119c772fd2191))
- Make --allow-eval self-sufficient and name it in eval refusals ([700c0247](https://github.com/extension-js/extension.js/commit/700c02479f287f150b4352d751bfae0d588316a8))
- Refuse a publish that would share a project you are not in ([dc88e4df](https://github.com/extension-js/extension.js/commit/dc88e4dfd3888c5aac6ca4aa047595cd54b86d63))
- Drop the template author from scaffolds instead of inheriting it ([f4bd8695](https://github.com/extension-js/extension.js/commit/f4bd86952267cc7d73e3f51e649451a93bf8bc45))
- Remove type casts left by the manifest-shape and flags campaigns ([c18a55d7](https://github.com/extension-js/extension.js/commit/c18a55d76417a9834365b973c99ce4a80164b8ce))
- Scope the manifest write guard per server and spare read opens ([e4b7c4da](https://github.com/extension-js/extension.js/commit/e4b7c4da8f591498ce7d5f8c533c4482b3de5da1))
- Compare theme_icons by value so identical manifests never diff ([f4628db4](https://github.com/extension-js/extension.js/commit/f4628db48f8ef3860b2bc6365aa41d975d6dc73c))
- Declare gecko data_collection_permissions in the built-in extensions ([0a7a718e](https://github.com/extension-js/extension.js/commit/0a7a718e71517da78a28ffa65c5514eca390e586))
- Print the build receipt against the merged output.path ([bb9092d4](https://github.com/extension-js/extension.js/commit/bb9092d47af0a27d865099a43a439ec6dbf158bb))
Other changes (42)
- Let a stale producer re-resolve the live control port from disk ([e98c1fc2](https://github.com/extension-js/extension.js/commit/e98c1fc22d661d9fccd421810031b9fe088796f2))
- Capture listener events on both the chrome and browser namespaces ([ef8425a0](https://github.com/extension-js/extension.js/commit/ef8425a0725186965b30eb8f541c3993491f00e7))
- Derive uninstall --all paths from installTargets instead of a literal ([59065eba](https://github.com/extension-js/extension.js/commit/59065eba05076ccd68d41256463acb6ba6598a63))
- Keep the user extension last when a companion names the same path ([3ac4b071](https://github.com/extension-js/extension.js/commit/3ac4b0712f07cc5898057522b1eb076471f5d115))
- Type the perfBudgets config read and add it to the public config ([833e499b](https://github.com/extension-js/extension.js/commit/833e499b2d9c3e2351568f1d6adc2258e1546613))
- Let unset CLI flags fall through to extension.config.js commands ([47313165](https://github.com/extension-js/extension.js/commit/47313165db1aaecda816207bd4e182a8d1f1bffc))
- Treat a profile of false or the string false as the system profile ([e074d85d](https://github.com/extension-js/extension.js/commit/e074d85df9be5e816ca79adccbc855fcaaa4b417))
- Validate DNR rules per rule and fail builds with index and reason ([d59a7118](https://github.com/extension-js/extension.js/commit/d59a7118c4c2c16a5c0269c3663a4fd1c04f051e))
- Capture nested assets paths in the web resources fallback scans ([93af863a](https://github.com/extension-js/extension.js/commit/93af863a6f8d1bb1dc2590d299131c02f9baffcc))
- Trim the HTML asset cache key, add eviction, throw on deleted HTML ([344e9a26](https://github.com/extension-js/extension.js/commit/344e9a266fe1f50b64257ae58425895f5acb65cc))
- Emit the ?url rule after typed asset rules and fix custom rule checks ([0bd2f578](https://github.com/extension-js/extension.js/commit/0bd2f5786dcfdef9f515b667604e5f2d4632faec))
- Accept safari identity options in commands.dev and commands.build ([9438d6ec](https://github.com/extension-js/extension.js/commit/9438d6ecc52b715bfbf5bfb26a6aeab1fef8205d))
- Map safari to its own devtools engine and wire the safari binary ([68288701](https://github.com/extension-js/extension.js/commit/68288701a43cce798fed621bab03ec6b39f34549))
- Exempt webkit targets from the chrome WAR match-pattern contract ([a26077c8](https://github.com/extension-js/extension.js/commit/a26077c8e84e683a54aa35e3868f5c83b739642c))
- Warn when a themed manifest targets safari instead of skipping silently ([9dff5c29](https://github.com/extension-js/extension.js/commit/9dff5c29b274d8bc927b4bd072a1339297612cae))
- Give safari ready.json the appex id instead of a chromium hash ([bc86bfc3](https://github.com/extension-js/extension.js/commit/bc86bfc39fab45537272cca456e728b3ca72e426))
- Run pnpm optional-dep installs silent to match project installs ([5c3c0c04](https://github.com/extension-js/extension.js/commit/5c3c0c04cdd3678d00d3a242f9d6d46fc7f64a59))
- Warn when a malformed package.json blanks integration detection ([3f1d7369](https://github.com/extension-js/extension.js/commit/3f1d73690638d438bf68a5d44b22a306dcaec5af))
- Align Deno scaffolds: deno.lock strip, primary merge, deno.json wins ([0f48a6ab](https://github.com/extension-js/extension.js/commit/0f48a6ab79330b08cacc4bf91b3887ff95d598bb))
- Rewrite store metadata names in one pass so extending names never double ([f96580e8](https://github.com/extension-js/extension.js/commit/f96580e877f1642df739ff39c4bd99e0a79818de))
- Keep create failure cleanup away from pre-existing user content ([65e7aa85](https://github.com/extension-js/extension.js/commit/65e7aa85c44132ba2e5edee92df9338beff31e7f))
- Clean the compiler output path instead of the context dist folder ([927dac37](https://github.com/extension-js/extension.js/commit/927dac378689eeb8b930ebc1d6d203a1e0eb5def))
- Detect the system Edge binary when the lookup exits zero ([672a1be0](https://github.com/extension-js/extension.js/commit/672a1be0f2f9ca97d772183d96d02cacc46a6723))
- Emit one-shot builds into a staging dir and rename into dist on success ([2a9b4a66](https://github.com/extension-js/extension.js/commit/2a9b4a6649c5cb477991066bac95d9445ec3d9c1))
- Merge the .extension-js ignore line into adopted project gitignores ([04f6864a](https://github.com/extension-js/extension.js/commit/04f6864a2db2db2bcb3fa4dc01132d02ab69a228))
- Gitignore the env files the framework loads in new scaffolds ([f352f758](https://github.com/extension-js/extension.js/commit/f352f75800de5ce2feda564b7334f2f0e540b6b1))
- Deny secrets in the source zip independent of any gitignore ([cacff012](https://github.com/extension-js/extension.js/commit/cacff0129953f9270a0275a5a26f334a3360d6de))
- Read the stored device login as the publish token fallback ([facc3db2](https://github.com/extension-js/extension.js/commit/facc3db2afdaee595123743f1271c92feec83ee1))
- Cover per-script reinject identity for multi-script content entries ([fa944653](https://github.com/extension-js/extension.js/commit/fa9446532e49bf4df7aef1d25d87ab5f96ffbcf0))
- Disable deno minimum dependency age in the optional deps smoke ([4ce8bcf0](https://github.com/extension-js/extension.js/commit/4ce8bcf09abd0f530c7d687a82185adb3f239802))
- Resync the bundled javascript template to the public screenshot ([3a832c9b](https://github.com/extension-js/extension.js/commit/3a832c9b6445ae29a1767254745262f95522ff5b))
- Pin waterfox-location 2.1.1 to finish the which 6 rollout ([c9c4fe96](https://github.com/extension-js/extension.js/commit/c9c4fe96ee9686b6679d17d5cd1296c8f96c311b))
- Bump nine location package pins to the which 6 releases ([19d512d5](https://github.com/extension-js/extension.js/commit/19d512d5042346cfd96a06220d5e39d435698335))
- Name the requested template truthfully in the create banner and help ([372cccdd](https://github.com/extension-js/extension.js/commit/372cccdda38be48a1a91d5db23f8c0f4b5fb39b5))
- Drop copied template lockfiles so npm ci works in a fresh scaffold ([8de42f34](https://github.com/extension-js/extension.js/commit/8de42f34a4a119c18b80af6ca4d4271766d11150))
- Size the nightly e2e to a verdict and assert the CLI boots first ([0fe46b4b](https://github.com/extension-js/extension.js/commit/0fe46b4bdb430af68831b54469bc646eb95f63c0))
- Scope the firefox e2e project to the real Firefox specs ([5c476e68](https://github.com/extension-js/extension.js/commit/5c476e6893376577dd3963269facf7ddc11e1d74))
- Let the nightly e2e fail red and find the CLI it builds with ([762cefc7](https://github.com/extension-js/extension.js/commit/762cefc769f0d951967ee7a3295699aa31a646d9))
- Name the browser doctor ran on and keep screenshots out of the zip ([8b6d2c9b](https://github.com/extension-js/extension.js/commit/8b6d2c9bb8e8bfd70c18f3d585f56ce1e4822f53))
- Report a failed create to telemetry before the process exits ([767ea493](https://github.com/extension-js/extension.js/commit/767ea4933d277f489c75a52193598c4a544c8665))
- Revalidate the packument so a good release stops failing ([33ceb567](https://github.com/extension-js/extension.js/commit/33ceb56752c24f4a385fa175a043c5d07630d99f))
- Flush telemetry before exiting so a failure is actually reported ([d4ca1d63](https://github.com/extension-js/extension.js/commit/d4ca1d6323e2077301b99c9f06285189fd134400))
Other changes (1)
- Make init scaffold the init template instead of a different one ([be5ad414](https://github.com/extension-js/extension.js/commit/be5ad41401d5588c2a9d689f5e498fee6ca4da91))
Other changes (6)
- Update the AI help snapshot for the reworded template note ([751bd442](https://github.com/extension-js/extension.js/commit/751bd44284ad67319f268e93427eb616f0cd45b5))
- Say the template rules in sentences the messaging check allows ([620d4f15](https://github.com/extension-js/extension.js/commit/620d4f156e36cba349813153b8b7e380a6b5fb7f))
- Show every template name in create help instead of only to agents ([8fba658c](https://github.com/extension-js/extension.js/commit/8fba658c65fd3214115eba43cd447766f24ae8c5))
- Resync the bundled javascript template with the examples repo ([3cb2d4f6](https://github.com/extension-js/extension.js/commit/3cb2d4f6b3090da157bd590ae71463fd5a54a1dc))
- Give the default scaffold its own name, identity, and first commit ([d3dd41f8](https://github.com/extension-js/extension.js/commit/d3dd41f85e3af784b5049d253597017cc0d9e0f6))
- Tell the reader where to get a token when publish has none ([e8cb2661](https://github.com/extension-js/extension.js/commit/e8cb2661ca726549489a8f06c60417aa58ffd89c))
Other changes (3)
- Prove a release shipped the fix by reading the published tarball ([631bced8](https://github.com/extension-js/extension.js/commit/631bced83be601c8194c90d1a5d82eaa27acae4c))
- Keep reporting when CI is set but a person has a terminal ([a92c9f29](https://github.com/extension-js/extension.js/commit/a92c9f29b4f708f499338868b79dc77008b71b33))
- Resync the bundled javascript template with the examples repo ([9de01978](https://github.com/extension-js/extension.js/commit/9de01978671a41f39b7d56efd355e47cc359ec9d))
Other changes (11)
- Print where to share a build and name the sponsor in the README ([fdd9b947](https://github.com/extension-js/extension.js/commit/fdd9b94704db43b1d9a8f068c78a1ac1c59562db))
- Name the sponsor in the README every scaffold keeps ([9fd4c4d5](https://github.com/extension-js/extension.js/commit/9fd4c4d5bd85ce23430619a8b46495277a4108fa))
- Pin npm and drop a pnpm flag that npm 12 turns into a hard error ([4f05a582](https://github.com/extension-js/extension.js/commit/4f05a58210da951a365424922380670da259bb31))
- Publish all four packages through OIDC instead of a shared npm token ([9672f35e](https://github.com/extension-js/extension.js/commit/9672f35e14c744f5a61837f16ad0ab3628e66735))
- Honor commands noBrowser from the file config, flag still wins ([e8da1e2a](https://github.com/extension-js/extension.js/commit/e8da1e2a13b22892cb9240d9e7a2718a6b32ffca))
- Stamp the user extension id on the ready contract for both families ([c4f7c103](https://github.com/extension-js/extension.js/commit/c4f7c103a487c604381371705a6bc348d7c1b8da))
- Warn early that a derived Safari bundle id is shared, drop Apple claim ([858b2f2b](https://github.com/extension-js/extension.js/commit/858b2f2bcbb79cb2995cbc413311633d1fc2b5ed))
- Warn when a second dev session targets the same browser dist ([95743e52](https://github.com/extension-js/extension.js/commit/95743e5290fd6fe73b9b6421003b33a7333b3f84))
- Document the human sinks and the logs printer exception ([4f5130f3](https://github.com/extension-js/extension.js/commit/4f5130f3a9f5afe64cc676b8446b6274d3c2a9df))
- Trim snapshot and fallback notices to cause and remedy warn lines ([bcb54782](https://github.com/extension-js/extension.js/commit/bcb54782f77374c8c13f368c1add4f4f6d48112a))
- Route browsers-bundle console output through the human sinks ([e2016e21](https://github.com/extension-js/extension.js/commit/e2016e213d7afbd3c9b0dcd1fc5c22f7deb8d7be))
Other changes (16)
- Extend check-messaging with word, emoji, color, and period rules ([017c274a](https://github.com/extension-js/extension.js/commit/017c274a0ff2b5685d03a0a9ed457c4032f32a20))
- Rewrite docs/MESSAGING.md as the spec v1 terminal-output standard ([d1119637](https://github.com/extension-js/extension.js/commit/d1119637b18f1de3e0a4d574ca8cae50dcb544e1))
- Wrap bundler stats blocks in the standard error anatomy ([eb56804d](https://github.com/extension-js/extension.js/commit/eb56804dc7fcf3fb06e7242567c157f6f91af3d6))
- Render commander parse failures through the error anatomy ([b5d9e59b](https://github.com/extension-js/extension.js/commit/b5d9e59bbbf524ff140ca54526239f801ecf6558))
- Reword develop lib messages to spec anatomy and drop dead twins ([113f4f33](https://github.com/extension-js/extension.js/commit/113f4f339dd14ba7943d410af48eb67b84785994))
- Glyph dev-server flow lines and sweep plugin catalog copy ([6eee6efe](https://github.com/extension-js/extension.js/commit/6eee6efe6aa493b2478ac252ba1459dff335c1b3))
- Align web-extension feature catalogs with the error anatomy ([158ff71e](https://github.com/extension-js/extension.js/commit/158ff71eb8b7c9aafed9b094ab2f7efc35557bc3))
- Collapse the build summary into card, asset tree, and one closer ([6312a294](https://github.com/extension-js/extension.js/commit/6312a29437ee5a39cc7ec103dcbf9866d26e6b8a))
- Record zip artifacts on the compilation instead of printing early ([6d1174c3](https://github.com/extension-js/extension.js/commit/6d1174c3dd33c0971dbc82b54d283fd160f3fdf2))
- Render build errors once by skipping the raw renderer under build ([ac1c42d0](https://github.com/extension-js/extension.js/commit/ac1c42d040786cb6be723679db071a1e415166fb))
- Collapse the home dir in the fallback card Output row ([55e2af24](https://github.com/extension-js/extension.js/commit/55e2af241e594fc6d9082ece1696007c6d2e1def))
- Pin the dev no-browser boot transcript order with an exec spec ([08c551b4](https://github.com/extension-js/extension.js/commit/08c551b4af27a349e9ad7d8161d329ac82e99afb))
- Give the no-browser card an Output row, one mode marker, update hint ([b2333596](https://github.com/extension-js/extension.js/commit/b23335964582775ae6ea921bf482857f9695c491))
- Move the resolved binary onto the card with provenance rows ([fc115198](https://github.com/extension-js/extension.js/commit/fc11519803fc3ff715a29f65ebabe44205e12b54))
- Unify the ready line wording and move it to the success channel ([892929a8](https://github.com/extension-js/extension.js/commit/892929a861d561aaf1eefbe117f18b3b395b488f))
- Print the compile line immediately and drop successfully from it ([0b55bfee](https://github.com/extension-js/extension.js/commit/0b55bfee5c25c17ef9c84749af9abe870bfd8a16))
Other changes (3)
- Report a chromium session that cannot confirm the extension loaded ([7665d933](https://github.com/extension-js/extension.js/commit/7665d93315f7d011f95c770c2b1e653c9a06b522))
- Print one browser row spelling across dev start preview build ([f7e4f67a](https://github.com/extension-js/extension.js/commit/f7e4f67a4a6fd14f95090f5f0bf31cf62c041b92))
- Honor explicit zip filenames and name written zips on stdout ([1293f181](https://github.com/extension-js/extension.js/commit/1293f1812b4c803bfde2c9fcefc9f0a87150ac9f))
Other changes (17)
- Report inspect refused targets as TargetNotFound like eval ([0c11de92](https://github.com/extension-js/extension.js/commit/0c11de9210024745297bb5e0201f4f828c28b6a0))
- Admit the capabilities command and theme message to contract guards ([a20476c8](https://github.com/extension-js/extension.js/commit/a20476c8f9342c9bc6c882504aec96658c0fc90b))
- Frame every CLI exit path as one stdout envelope with structured refs ([764e7521](https://github.com/extension-js/extension.js/commit/764e75213ff2574c2cda0b29836c4669879db02d))
- Stamp profile path and browser pid, publish profile and dist helpers ([9fa709af](https://github.com/extension-js/extension.js/commit/9fa709af1d86b54e8260218bb217017e22bacdc8))
- Publish the whole ready contract and its type from the bridge entry ([06ed3bd1](https://github.com/extension-js/extension.js/commit/06ed3bd169a01104cd5a4d2037d0a6b69ed5c8be))
- Mint the documented eval hint on guest-throw failures ([276219f8](https://github.com/extension-js/extension.js/commit/276219f8a637b837f47539c9e3af72a5d9b53e48))
- Report the resolved build mode in the JSON envelope ([04b556c0](https://github.com/extension-js/extension.js/commit/04b556c04b5be16498b2088e2a193ef13d0ca092))
- Name eval refusals on the wire and map unreachable targets ([1ba027fc](https://github.com/extension-js/extension.js/commit/1ba027fc6264612f1abce2aa2dd5cb698ae9a489))
- Hand the WebSocket close code and reason to BridgeConsumer callers ([89c128ea](https://github.com/extension-js/extension.js/commit/89c128ea60c746cc8e7800e5ef72167a5b1c1ab2))
- Name open refusals on the wire so consumers stop matching prose ([15544bf0](https://github.com/extension-js/extension.js/commit/15544bf0703df837c053bce24a99e2ec3a928177))
- Record engine-loaded companion extension ids in ready.json ([33d919ff](https://github.com/extension-js/extension.js/commit/33d919ff383a71eddb57d50fe83890200dc1133d))
- Reach the shipped dist contract through a package exports entry ([82fed76b](https://github.com/extension-js/extension.js/commit/82fed76b89d4e16994d00566ca492f653a21b3b4))
- Publish a browser-safe contracts entry with zero-import wire constants ([c4807b90](https://github.com/extension-js/extension.js/commit/c4807b909c3126a0c11af92f9a57aa422c64972e))
- Name the theme image in the missing theme-image build error ([8f741066](https://github.com/extension-js/extension.js/commit/8f7410668783cc081043fe513a2b8745d90c8d25))
- Scope the MV2 install warning to manifests Chrome actually refuses ([e5215f98](https://github.com/extension-js/extension.js/commit/e5215f9853d353823cc46945888f4308740ed675))
- Fail chromium builds over theme color values Chrome refuses at load ([706581d5](https://github.com/extension-js/extension.js/commit/706581d58d82f6dc34db8d4a22fe53af20c84f7b))
- Match Chrome's message-name charset in the manifest placeholder scan ([59130e63](https://github.com/extension-js/extension.js/commit/59130e63cfd4471033c0da84199c326ee22f31e1))
Other changes (6)
- Publish the log ranking and the control close codes ([0edd8b10](https://github.com/extension-js/extension.js/commit/0edd8b10a4fe87bb8c541a1c95f8172a57377afd))
- Rename treeWithDistFilesBrowser to repair the missing separator ([ce99a79e](https://github.com/extension-js/extension.js/commit/ce99a79ee61eb78a05283ba8dfd5d154bc888296))
- Move the chromium profile path from the debug stream to the card ([992fb320](https://github.com/extension-js/extension.js/commit/992fb3207dfb1135df568ad228906e92e1ba6f79))
- Rename pm args and drop dead params in create message catalog ([f5bd1407](https://github.com/extension-js/extension.js/commit/f5bd1407510874f28a0ba62556bfc9c7598012ef))
- Let a library caller package Safari and read what the build made ([f116418e](https://github.com/extension-js/extension.js/commit/f116418ebee574a3c3bd2c5e7973cd5bf9e54538))
- Keep companion extensions out of the source zip ([c269b83c](https://github.com/extension-js/extension.js/commit/c269b83c0f4149d5ac39382fd1b5f691204cf338))
Other changes (5)
- Override transitive postcss to 8.5.18 repo-wide ([b525f957](https://github.com/extension-js/extension.js/commit/b525f9574ce94affa8b68d0a8300b806c3398a95))
- Bump postcss to 8.5.18 for the source-map path traversal fix ([826b888c](https://github.com/extension-js/extension.js/commit/826b888c3e7044082f70f596b08aca087c06ee00))
- Hold contract bytes and drift paths steady on Windows checkouts ([7cec56b2](https://github.com/extension-js/extension.js/commit/7cec56b215c4f5b21d39a249a101096c0dd7a41e))
- Render the compile arrow with prefix() and drop its glyph exemption ([b9a8717a](https://github.com/extension-js/extension.js/commit/b9a8717a1a53bb967b9ebc801d148315e90d17e0))
- Migrate scripts harnesses from stdout tokens to the ready contract ([c65b332e](https://github.com/extension-js/extension.js/commit/c65b332e36392dc271787912fe8e52265a59d6e5))
Other changes (28)
- Describe --silent truthfully and drop preview's unwired host flags ([7c700cda](https://github.com/extension-js/extension.js/commit/7c700cdacdc0b9e106d049fdd0bd304166ae3ecd))
- Complete the error code table and ship its golden envelopes ([80e3aeab](https://github.com/extension-js/extension.js/commit/80e3aeabec59868eb1fd470243e5e16921683e8f))
- Rewrite browser runner messages to the imperative standard ([2ab0e17c](https://github.com/extension-js/extension.js/commit/2ab0e17c0703215c584ae7027d88be47f476e17a))
- Rewrite develop core messages to the imperative standard ([107d7bc4](https://github.com/extension-js/extension.js/commit/107d7bc4d008ce10b1a4c98b795cc43b079686e7))
- Rewrite CLI helper messages to the imperative standard ([7a9b9f4f](https://github.com/extension-js/extension.js/commit/7a9b9f4f542f4b359550f1908f9a1ae3e6c0e41f))
- Rewrite web-extension feature messages to the imperative standard ([fa296ccd](https://github.com/extension-js/extension.js/commit/fa296ccd2005afe129768401e7760040ca5c1384))
- Rewrite develop leaf-plugin messages to the imperative standard ([d592b69b](https://github.com/extension-js/extension.js/commit/d592b69bb0cc09ebbb9feb426f20ccd93f6bd8e0))
- Print the card first on every path and retire the banner event ([2af56bf7](https://github.com/extension-js/extension.js/commit/2af56bf77d89f5a9186296d082a9781c3f17b3a7))
- Map the legacy format flags onto --output and free the dev failure frame ([3e1d0377](https://github.com/extension-js/extension.js/commit/3e1d0377c227190d21462e6889032f461fbcb776))
- Ship the envelope contract inside the extension-develop package ([2bbb0184](https://github.com/extension-js/extension.js/commit/2bbb0184c52563ed21985b494b0dc3a7f5f8d1bd))
- Advertise schema-1 support in the ready contract ([9366e5f4](https://github.com/extension-js/extension.js/commit/9366e5f4dd9c65cc8e0d82bcfd8a09d264394047))
- Generate the help center from the command table ([5e474523](https://github.com/extension-js/extension.js/commit/5e47452319305de8679f2ec3edaf842fa67f3d02))
- Move internal steps to the debug channel across develop ([475c4858](https://github.com/extension-js/extension.js/commit/475c48586b71de873cc043f8dfb343de4ba16de9))
- Print the card before launch work and stamp profile locks ([30b9ee13](https://github.com/extension-js/extension.js/commit/30b9ee13cd27d0f444663d7ea7848a5df48d5663))
- Emit the result envelope from every terminating command ([98e85f1f](https://github.com/extension-js/extension.js/commit/98e85f1ffb9b1c3373e9f34cf53cb82165c67820))
- Stream the dev session lifecycle as schema-1 NDJSON frames ([1c86f2a1](https://github.com/extension-js/extension.js/commit/1c86f2a197d4c45a2591f534a14cd2aa048f7280))
- Seed the error code table for the remaining commands ([098ac3f4](https://github.com/extension-js/extension.js/commit/098ac3f467b664752120552e9454ca53f17993e0))
- Emit the result envelope from build under --output json ([70f786c3](https://github.com/extension-js/extension.js/commit/70f786c31b055258d673edca04e999632183da1c))
- Describe every command once, in the imperative mood ([6f8bab81](https://github.com/extension-js/extension.js/commit/6f8bab81f1fbb9bf5f1f4660592a03f2ae21c483))
- Print the card before the ready line in no-browser mode ([9f2e8733](https://github.com/extension-js/extension.js/commit/9f2e8733ff89a23845abbc33cc471823ec327c38))
- Render every Extension.js card through one renderer ([54c3e396](https://github.com/extension-js/extension.js/commit/54c3e3965ba348ae717a70f4d4adec56fee199fa))
- Point the debug docs at the flag that actually works ([ca966a39](https://github.com/extension-js/extension.js/commit/ca966a39872e8655131b711c602b9badc6ea4059))
- Drop the Author says prefix and move errors onto the glyph ([14c9c8f4](https://github.com/extension-js/extension.js/commit/14c9c8f43913ced109a7af1480c5a4bd038e42c0))
- Read the debug flag through one accessor with a closed value set ([5db59b99](https://github.com/extension-js/extension.js/commit/5db59b997460a078acca464ccb9cba042dc0d066))
- Move fmt into the shared messaging primitives ([f1edd61d](https://github.com/extension-js/extension.js/commit/f1edd61d35947e49371adbc22d1509136a81b5f3))
- Let commands report vendor and wait failures themselves ([800aed75](https://github.com/extension-js/extension.js/commit/800aed75d953852b0d31147480e9328d05bf9512))
- Collect specs under the contract directory in vitest ([a4d57534](https://github.com/extension-js/extension.js/commit/a4d5753464519638106a881eb7fd14df0b989910))
- Send first-run and update notices to stderr ([ebd74c7e](https://github.com/extension-js/extension.js/commit/ebd74c7e9998a76eef8e7687cee05d0b47581f79))
Other changes (24)
- Bump CI GitHub Actions to their latest major versions ([e34a5848](https://github.com/extension-js/extension.js/commit/e34a5848c626781bd9003b88155fd620a6d7c9ba))
- Probe exec-runner readiness in a temp dir, not the repo root ([01151c5d](https://github.com/extension-js/extension.js/commit/01151c5dc32a99d0c83933959f869f006f764d60))
- Ignore the workspace in the pnpm smoke frozen installs ([bdea3770](https://github.com/extension-js/extension.js/commit/bdea3770132a9d2f02dcadce8352065199ac0485))
- Sync pnpm-lock.yaml with the extension devDependencies move ([25451709](https://github.com/extension-js/extension.js/commit/2545170973b018f2ee2fb29710c4a0430106a428))
- Stamp template provenance into scaffolds and CreateResult ([75323f87](https://github.com/extension-js/extension.js/commit/75323f872bbcf70f380b859056cebcfa3fa80410))
- Accept a commit SHA or tag for the template corpus ref ([709fd346](https://github.com/extension-js/extension.js/commit/709fd3464bdfee7816a86fad3afc6649064227b6))
- Strip internal tracker refs and rename client test fixture ([150645a4](https://github.com/extension-js/extension.js/commit/150645a41f629a2f99bf87fac61ea7c4d440016e))
- Tidy gitignore, CI perms, dependabot, and package metadata ([63ccf8b4](https://github.com/extension-js/extension.js/commit/63ccf8b462617bf5b6598fb28fcbbffc5773761d))
- Remove unused html-merge browser helper ([ecb92872](https://github.com/extension-js/extension.js/commit/ecb92872ba9e07aea365270334d641055567f2de))
- Prune nine pnpm overrides that no longer change any resolution ([74f52bbd](https://github.com/extension-js/extension.js/commit/74f52bbdb37eefb2fc0baca4c09bb1a61df2eae9))
- Drop the unused root extension devDep that kept postcss 8.5.10 ([a4bd0c9f](https://github.com/extension-js/extension.js/commit/a4bd0c9fb2e9f8c77bb431d9dd55992319b1106d))
- Fall back to the framework logo when a welcome icon fails to load ([bf193bb4](https://github.com/extension-js/extension.js/commit/bf193bb4440d57223e4e6e362dc4e99ef46251e9))
- List Safari among the browsers the framework builds for ([e2ad588e](https://github.com/extension-js/extension.js/commit/e2ad588e07233417703376c77d522baabd799d66))
- Recover a refused dev session once the browser accepts the extension ([e6d81d72](https://github.com/extension-js/extension.js/commit/e6d81d72b1ff968e44fabf775f6fa2e4e7782b5d))
- Report a Firefox add-on refusal and let the engine re-offer the dist ([0c4314ee](https://github.com/extension-js/extension.js/commit/0c4314ee40df466a403da439f85aad39dec4e928))
- Report Chrome refusing to load the extension instead of ready ([c8fb151c](https://github.com/extension-js/extension.js/commit/c8fb151ca330624cf94b50d462537c6bf39d32ad))
- Isolate the browser-flags specs from an exported EXTENSION_HEADLESS ([b9ab2443](https://github.com/extension-js/extension.js/commit/b9ab2443ad7398847b8f6b43713cae179be742a4))
- Match the missing-JSON message to whether the build actually fails ([a0e30962](https://github.com/extension-js/extension.js/commit/a0e30962fecde1cbacb300ad2fe98825aa0c92d2))
- Leave static themes uninstrumented in dev on Firefox too ([54837af5](https://github.com/extension-js/extension.js/commit/54837af50b6c13419a2417c205a84cd131361cff))
- Honor EXTENSION_HEADLESS so automated runs never steal focus ([6d80ea06](https://github.com/extension-js/extension.js/commit/6d80ea0641a79da7bc6da1be43d5972433b3ffdd))
- Refresh the messages catalog snapshot for themeImageIsEmpty ([2959495a](https://github.com/extension-js/extension.js/commit/2959495ab129a5809d31c5bef24cc77debea4404))
- Fail the build on missing theme images, warn on 0-byte ones ([d206b729](https://github.com/extension-js/extension.js/commit/d206b729b5885f01354e5947a370ea65a5e80721))
- Match the release-notes tooling to the new release commit subjects ([e57964bb](https://github.com/extension-js/extension.js/commit/e57964bbbc0b7d0113496998606552daf2fe760a))
- List Safari as a supported target in the README ([176736d4](https://github.com/extension-js/extension.js/commit/176736d4d7b15acd680d6717f5c06c55bc93c78f))
Other changes (3)
- Bump fast-uri to 3.1.4 and immutable to 5.1.9 (Dependabot) ([c0647378](https://github.com/extension-js/extension.js/commit/c064737835197fbb6a524001f011e3ec36bc2d92))
- Drain stdout before exit so piped --output json frames arrive intact ([3e78dada](https://github.com/extension-js/extension.js/commit/3e78dadab810ef9bf8fd70b9a50cff3bca3180f1))
- Align log/event runId with ready.json and publish Firefox rdpPort ([f6a639fd](https://github.com/extension-js/extension.js/commit/f6a639fd842e217e7c3b96b31970009cbc9e393e))
Other changes (39)
- Sync bundled javascript template: STORE.md and manifest key order ([d0649f41](https://github.com/extension-js/extension.js/commit/d0649f41d91751f2eca575f52467462c5432eba5))
- Bump the js-yaml override to 4.3.0 to clear GHSA-52cp-r559-cp3m ([22392bbd](https://github.com/extension-js/extension.js/commit/22392bbd51ccfcc259bb5debad91116e254540f5))
- Replace em dashes in user-facing strings to satisfy the prose gate ([5581bb7b](https://github.com/extension-js/extension.js/commit/5581bb7b5eac85b305c7d83cd3fef7ae1ad02fec))
- Scrub source comments wave 3 of 3; annotate empty catches with Ignore ([9319bcd7](https://github.com/extension-js/extension.js/commit/9319bcd777999519a1d9315ac70b37e1b044dd15))
- Scrub narration and internal refs from source, wave 2 of 3 ([a3f23352](https://github.com/extension-js/extension.js/commit/a3f233528a208a2aff52ca1701a3900ffd14c337))
- Scrub narration and internal refs from source, wave 1 of 3 ([935e71d4](https://github.com/extension-js/extension.js/commit/935e71d48bc4b7d01080e3f31308368f0205742d))
- Record the AMO data-collection message in the catalog snapshot ([6a165dda](https://github.com/extension-js/extension.js/commit/6a165dda4426b0c7f9c2e879c72f6116557fbc53))
- Scaffold the AMO data-collection key; warn on key-less Firefox builds ([c3edd7cb](https://github.com/extension-js/extension.js/commit/c3edd7cb3c106c82d3a1936487ff5d7cbc95f02a))
- Remove non-policy comments from test files ([0b08d787](https://github.com/extension-js/extension.js/commit/0b08d787b66cf85c85c895de64259908907b0ae7))
- Keep the watcher alive when a mid-save manifest is invalid JSON ([0a7e4de5](https://github.com/extension-js/extension.js/commit/0a7e4de5fab4eb90481fb9c8b8739b9944d3b6a6))
- Self-ignore dist/extension-js so session state never gets committed ([e9b97e76](https://github.com/extension-js/extension.js/commit/e9b97e76f3e577172db39d866689bbad807f3d72))
- Persist the build summary contract for hosts that shell out to build ([602fc4e9](https://github.com/extension-js/extension.js/commit/602fc4e9c3a870384909236497fc9836c744e5a9))
- Route browser-generated CDP Log warnings into the bridge log pipeline ([4203a88e](https://github.com/extension-js/extension.js/commit/4203a88eb0b9f96d41071a0c2339fe341b042776))
- Align doctor specs with the unknown browser-liveness verdict ([d23730d2](https://github.com/extension-js/extension.js/commit/d23730d224c8b33af0a0abfb9c9ffbe9adbaa51d))
- Honesty cluster: doctor unknown verdict, stub warning text, zip locale ([639e600b](https://github.com/extension-js/extension.js/commit/639e600b24c2d8d3d4be026c0cc0507e5ee004f0))
- Reach url-override extension pages via the surface relay ([cbd73b53](https://github.com/extension-js/extension.js/commit/cbd73b536ab2c810c93fa0e79d7002462492b97f))
- Keep MV2 dev background persistent and drop stale Firefox startupCache ([4639973a](https://github.com/extension-js/extension.js/commit/4639973a04187dee95a893df816226c35cf25772))
- Warn when user code relies on dev-injected permissions, align MV2 set ([0c186ff2](https://github.com/extension-js/extension.js/commit/0c186ff2d3f03f09f6d3de95ca00c83edc38119b))
- Never rewrite a live dev session contract from build/preview/start ([beb2112c](https://github.com/extension-js/extension.js/commit/beb2112c9b18ab26a784046884586d5c8f058e77))
- Stamp unexpected browser exits for Firefox and preview, flip run-only ([40445fa8](https://github.com/extension-js/extension.js/commit/40445fa8a039d24faca29a6fc04348cc2d570d30))
- Stamp ready.json stopped at watch close and keep errored manifests watched ([cd202bc6](https://github.com/extension-js/extension.js/commit/cd202bc6f991eafb0bbaf264cb0ab4cfd814c502))
- Trace offscreen.createDocument urls so offscreen documents ship in dist ([7ec27d80](https://github.com/extension-js/extension.js/commit/7ec27d8071aacc57821b98b9d65e20a2f237a9a8))
- Ban explicit any across every program, leaving specs and the fork ([60f9e00c](https://github.com/extension-js/extension.js/commit/60f9e00cf29c8547480921f72150898cbab27c55))
- Ban explicit any across the develop program source ([80df0e10](https://github.com/extension-js/extension.js/commit/80df0e1051587081b9baf45c3eed5eb1359230ca))
- Ban explicit any in the CDP and RDP browser clients ([28f32e50](https://github.com/extension-js/extension.js/commit/28f32e5084005312998fbe03953024d5b25dc470))
- Ban explicit any in plugin-web-extension and type its boundaries ([2d3a3425](https://github.com/extension-js/extension.js/commit/2d3a342502eaf3c5d34cf3f7a7bffc1a378728fc))
- Apply the safe autofixes for five style and import lint rules ([18ff32b5](https://github.com/extension-js/extension.js/commit/18ff32b5984621301123021ff6db21d3609813ba))
- Retire the deferred lint warnings and make two suspicious rules errors ([1affa370](https://github.com/extension-js/extension.js/commit/1affa370d4477caab0a5c3087a1fbc50edfd5c04))
- Cover the bridge injection steps and the whole CLI command surface ([a869e1cc](https://github.com/extension-js/extension.js/commit/a869e1cc3403b7386229cb278521c99047f35f24))
- Unwrap the async promise executor in CDP connect and ban the pattern ([c022fab6](https://github.com/extension-js/extension.js/commit/c022fab6966758ab596895f0cc5d17e684898c9d))
- Cover the reload strategy background entry and MAIN world bridges ([9e622646](https://github.com/extension-js/extension.js/commit/9e622646a1553be2d3761899b1f4ca551f3eb275))
- Give the browser connection errors a cause and a next step ([6b16c36c](https://github.com/extension-js/extension.js/commit/6b16c36c47707fd780522426d3100ada228a234b))
- Clear em dashes from source and guard against new ones ([634da2a9](https://github.com/extension-js/extension.js/commit/634da2a952e599f916d2a4c67aa997754e4afaed))
- Replace the 23.6MB typescript dependency with rspack's swc and acorn ([1a523c6c](https://github.com/extension-js/extension.js/commit/1a523c6c5f607d99b6f4c28ba69c0840d6875b97))
- Make the lint gate real and restore the pre-commit hook ([5cff9be5](https://github.com/extension-js/extension.js/commit/5cff9be558b98b92504eff4c913c464cafcf3f2a))
- Scaffold moduleResolution bundler; node is gone in TypeScript 7 ([a22c9a3d](https://github.com/extension-js/extension.js/commit/a22c9a3d51f380eda95ed760dd3ab6cebc89a8b3))
- Split typescript: runtime stays on 6.x, tooling moves to 7.0.2 ([a3911527](https://github.com/extension-js/extension.js/commit/a39115276c9eedfbf1c3f62a366eb60b403bcb7e))
- Fetch create templates via codeload tarball, not a full git clone ([7d7da9cc](https://github.com/extension-js/extension.js/commit/7d7da9cc95c321453e934cdc2d9c79c8cbfc1777))
- Pin a resolved engine version in scaffolds instead of floating latest ([0fd9ca5e](https://github.com/extension-js/extension.js/commit/0fd9ca5e2343ab8579ad309464b70ac8d80c19da))
Other changes (4)
- Prune superseded hot-update generations from the loadable dev dist ([28602698](https://github.com/extension-js/extension.js/commit/28602698699a7384a82c8384f1983b2c3fc2e9fc))
- Stamp real command + versions in ready.json; per-run events.ndjson ([4147cda9](https://github.com/extension-js/extension.js/commit/4147cda9e3cf11685759125bd2c38b4f62cc00f9))
- Slim feature-scripts: drop dead shims, unify compilation issue reporting ([032909df](https://github.com/extension-js/extension.js/commit/032909df1664d88a17756dc9b6eb6645ed4f5ea1))
- Extract reload/HMR into plugin-reload; hoist content-script wrapper ([c702350b](https://github.com/extension-js/extension.js/commit/c702350b798a7842e91dfbcd19b394f59de24640))
Other changes (16)
- Extract inline script by string index, not regex (CodeQL #73) ([e788ecee](https://github.com/extension-js/extension.js/commit/e788eceef30af88b5ce32bd700908b2bbff502d4))
- Trace webpack numeric chunks + runtime-set HTML surfaces into dist ([29489317](https://github.com/extension-js/extension.js/commit/29489317159d4d9e9566cdb65982e3db08f46db8))
- Normalize folder ASCII banners: add 113 missing, fix 20 wrong ([e1a5b0d2](https://github.com/extension-js/extension.js/commit/e1a5b0d2bba79cdb5cfd76ed77dbe129420ec7a0))
- Remove resolved docs/followups and dead vitest.workspace.ts ([965a9043](https://github.com/extension-js/extension.js/commit/965a90434d67c891b50cf8079802404c4503e563))
- Log Firefox RDP connect retries and name the port on give-up ([e3d3b799](https://github.com/extension-js/extension.js/commit/e3d3b7993d808e3f346f273f185181b3b9b0103b))
- Repo hygiene: drop dead files, fix docs drift, sync test workspace ([96ef5038](https://github.com/extension-js/extension.js/commit/96ef5038e23d4d788e19be58f021201170652934))
- Bridge classic page-script globals to window for inline consumers ([9ffaa3e6](https://github.com/extension-js/extension.js/commit/9ffaa3e6d56dfc1f0c679ca8496e8ac134c86312))
- Root-absolute refs: ship JS import closure, fix manifest page targets ([fd820dca](https://github.com/extension-js/extension.js/commit/fd820dca3b10de19fdb825950933e7408624402a))
- Resync generated npm README mirror (Safari status Alpha) ([5105e379](https://github.com/extension-js/extension.js/commit/5105e37992a0a6ca65617ee390e9f3e7c86dc2b4))
- Resync bundled javascript template: top-level setPanelBehavior fix ([58d6a8f2](https://github.com/extension-js/extension.js/commit/58d6a8f2cc44bed98eb3858eba4b3f6c43bc8117))
- Reject failed builds as promises; process.exit(1) only via CLI opt-in ([f5c3c649](https://github.com/extension-js/extension.js/commit/f5c3c64958d0249f6715684bd3839bdf02a1d764))
- Leave unresolvable bare require() verbatim instead of failing the build ([c5ca4225](https://github.com/extension-js/extension.js/commit/c5ca4225fe7a7a7dcecf1650848dbc78279a2616))
- Canonicalize supported-surface lists; promote deno to full peer ([2a78f2ed](https://github.com/extension-js/extension.js/commit/2a78f2edd58ebb9b6c547f4201a24e7b9fc58334))
- CI: promote Deno to PR-gating smoke lane (validated locally) ([d50b5ecf](https://github.com/extension-js/extension.js/commit/d50b5ecf231d177f954ad09351e560f3a15857dd))
- CI: smoke fork build targets; add non-blocking nightly Deno lane ([0d5a6cbb](https://github.com/extension-js/extension.js/commit/0d5a6cbbf1e42e35a8afecfee4f75e16bbd9d176))
- README: note Deno support alongside npm/pnpm/yarn/bun ([aaed6e47](https://github.com/extension-js/extension.js/commit/aaed6e47a2afe19d83ff6a0bd50151b9d95fee72))
Other changes (6)
- Resync bundled javascript template with examples repo ([1fc0f7fb](https://github.com/extension-js/extension.js/commit/1fc0f7fba3b2977c72632333961372d1ab7f7be7))
- Align Safari app/appex bundle ids to --bundle-id after conversion ([b0e86e4f](https://github.com/extension-js/extension.js/commit/b0e86e4f1ada60647b2ef0e1899867f6254a052b))
- Safari status to Alpha; install explains Xcode instead of a binary ([9fad813b](https://github.com/extension-js/extension.js/commit/9fad813b4dc579c7770a393c17c6b3a1cd8ea55c))
- Wire Safari identity options: --bundle-id/--app-name + config support ([311967f6](https://github.com/extension-js/extension.js/commit/311967f6e0045dc39ddbde104b812c811e8d9d59))
- Record Safari converter as a non-surface for manifest refusals ([3036e779](https://github.com/extension-js/extension.js/commit/3036e77967324b6938db9773a8a6c1e5031dc553))
- Diagnose live-verified Chrome manifest refusals; repair bad names ([8315a492](https://github.com/extension-js/extension.js/commit/8315a4922eaf3f96c85bdaa96bebd51b63f70c3e))
Other changes (5)
- Strip emojis from generated release notes ([1c3f4be8](https://github.com/extension-js/extension.js/commit/1c3f4be83ea4df17152edb83f194652c5a729115))
- Ship real compile-error text in ready.json and events.ndjson ([8f7bd584](https://github.com/extension-js/extension.js/commit/8f7bd5846e2e78e354132b169e9e1830f6e74b3b))
- Print dev command failures cleanly without a stack trace ([f8433602](https://github.com/extension-js/extension.js/commit/f84336022810e2a0355fc32d47d9cadb90f0954a))
- Latch content-script reloads until the SW acks, replay on hello ([a194db39](https://github.com/extension-js/extension.js/commit/a194db398e743027493a23bc70a45d3419c78812))
- Warn per file when scss/less ship uncompiled without their compiler ([53c68dba](https://github.com/extension-js/extension.js/commit/53c68dba70f4324fd5a8cec8141afbb84f9e606f))
π§Ή Other changes (8)
- Loosen dev connect-src for the resolved connectable host ([3c5474d0](https://github.com/extension-js/extension.js/commit/3c5474d0e3a70e807059a5c69dcea2db09293797))
- Tolerate dead CSS url() refs; type-strip TS in classic-concat ([268a23d7](https://github.com/extension-js/extension.js/commit/268a23d7aa18e90a96b09cbb1b41bda64d9af9b8))
- Ship console-relay logs over a named Port to kill message loops ([6a148b4b](https://github.com/extension-js/extension.js/commit/6a148b4bbbd01ef0d9691744825f9c97ce873d26))
- Auto-install with --ignore-scripts; warn on dead HTML refs ([fb24279c](https://github.com/extension-js/extension.js/commit/fb24279cfdf8a903136ce82df62f142bbb6f82b2))
- Isolate devtools overlay shadow host from page styles ([639e1c53](https://github.com/extension-js/extension.js/commit/639e1c53cf4d1b6f167b2324b97a0ac9fd8d1b1f))
- Raise RUST_MIN_STACK to 256MB so deep ASTs do not SIGILL rspack ([8d05d544](https://github.com/extension-js/extension.js/commit/8d05d5444a25a13e3a62664d776f53ac0104781a))
- Dedupe files listed twice in one content_scripts js array ([b2cfc1e5](https://github.com/extension-js/extension.js/commit/b2cfc1e5886983cbb94d49395fdc0d4e7d4c8f4b))
- Content-hash dev asset names to stop same-basename collisions ([78c2dce6](https://github.com/extension-js/extension.js/commit/78c2dce6a0853171279c2baa213d234ea3f80b21))
π§Ή Other changes (27)
- Fan shared SW+content module edits to both reload paths and heal tabs ([8e833828](https://github.com/extension-js/extension.js/commit/8e833828922b24af2ebfc6032b1ccc09c130da40))
- Pick the HTML HMR API by the source's own module syntax ([17a6b852](https://github.com/extension-js/extension.js/commit/17a6b852785b95d3629849902b1bbb8fb9ba4b36))
- Name the manifest shapes Chrome silently refuses at launch ([ce14782a](https://github.com/extension-js/extension.js/commit/ce14782a39690f4efa1f540963f65c4035ec55bc))
- Strip the UTF-8 BOM before the manifest read in emit-html-file ([020715a2](https://github.com/extension-js/extension.js/commit/020715a24383d0b899c3dd4a2e0436cf894c97e0))
- Ignore watch paths by segment instead of substring ([d19d070b](https://github.com/extension-js/extension.js/commit/d19d070b107719b5f0eb3a2646dbae32d957e791))
- Warn at launch on match patterns with query, fragment, or port ([85e2669d](https://github.com/extension-js/extension.js/commit/85e2669d827f4a884a709391f7bf925c4a11b471))
- Diagnose Firefox-style MV3 background.scripts at Chromium launch ([665d8cb2](https://github.com/extension-js/extension.js/commit/665d8cb2fb92208a40aa71e3c9b78cdd4ec570d0))
- Inject module.hot into script-parsed page scripts, not import.meta ([41f23d2f](https://github.com/extension-js/extension.js/commit/41f23d2fa9c6589e5566f284010887b169694592))
- Keep import(chrome.runtime.getURL(...)) native in emitted bundles ([cfb61f27](https://github.com/extension-js/extension.js/commit/cfb61f278bb8f0a1256feb3b1082732ff3e6c2d3))
- Ship the static import closure of runtime-traced modules ([1f6043df](https://github.com/extension-js/extension.js/commit/1f6043df299d96f5c8667916cfeeeee47aef5f44))
- Update messages-catalog snapshot for fatalManifestShapeFixed ([4c05318c](https://github.com/extension-js/extension.js/commit/4c05318ccd2f49abe0cd9c523e9ba4b560a7c9c1))
- Fail the build when an emitted content script does not parse ([7d5ad766](https://github.com/extension-js/extension.js/commit/7d5ad7662e8dc7bb8f87de273b9875ac287683ad))
- Honor exclude_matches in dev reinjection and re-registration ([7120bf70](https://github.com/extension-js/extension.js/commit/7120bf7085ce353d7e9d7073ff22c16f04a075c5))
- Keep dev reloads deliverable to idle MV3 service workers ([1d8fb08e](https://github.com/extension-js/extension.js/commit/1d8fb08e97f2b16ea8cd353d612111ba577acf37))
- Point css-only content_scripts groups at the emitted entry chunk ([76552107](https://github.com/extension-js/extension.js/commit/765521073b95a5adbb85994dffe459272979abeb))
- Compare requested vs resolved dev-server ports numerically ([e3cf24cd](https://github.com/extension-js/extension.js/commit/e3cf24cd874cc5b76aa9dd9f900b4618ece68a64))
- Name the resolved browser binary and stop stale snapshot outranking ([1e6fa66f](https://github.com/extension-js/extension.js/commit/1e6fa66f37a25cdc4741aa4ed6bc86c6f8a5a552))
- Survive Chromium 152 dev reloads and merge repeated feature switches ([4d3dd33a](https://github.com/extension-js/extension.js/commit/4d3dd33a1dae1166957a0dc6b763fbc737f32b4b))
- Bound the telemetry audit log with a size-cap rotation ([538c5cb3](https://github.com/extension-js/extension.js/commit/538c5cb3947aa144f53b39bcc87f053abbe8ae09))
- Scaffold deno.jsonc and make the toolchain manifest-agnostic (#482) ([70385b8c](https://github.com/extension-js/extension.js/commit/70385b8cfb07d17ad293fda764f28a451ce8cef0))
- Persist the dev control port outside dist for SW resync (#484) ([7bb0d820](https://github.com/extension-js/extension.js/commit/7bb0d820267db50240a8081a00a2854e39add1b6))
- Classify dev reloads by chunk graph and clamp asset names to output dir ([860201f0](https://github.com/extension-js/extension.js/commit/860201f039e499bca3dc01d02e29a258d5666299))
- Identify dev-server runtime modules by content, not require position ([e3a17b60](https://github.com/extension-js/extension.js/commit/e3a17b607d75893ac93f03666b60d10b60a30c12))
- Fall back to manifest directory when a project has no package.json ([0e836d08](https://github.com/extension-js/extension.js/commit/0e836d08377f6f1047a6c4994facefa8a886f86a))
- Always rebuild bundled companion extensions; fix CDP port from --port 0 ([b6c4ff3e](https://github.com/extension-js/extension.js/commit/b6c4ff3ef8c78cc9add40ae6b733127b219aef91))
- Qualify content-script wrapper ownership by extension id ([cb16fcf6](https://github.com/extension-js/extension.js/commit/cb16fcf659d257a69cdc0e1ed78f14ae12db5bd3))
- Trace chrome.runtime.getURL literal targets into dist ([9c1fcad1](https://github.com/extension-js/extension.js/commit/9c1fcad1854dfafd33be28a6c986903360abb7c0))
π§Ή Other changes (8)
- Fail the build when manifest page surfaces (popup, options, overrides, devtools) point at missing files ([8f59a72e](https://github.com/extension-js/extension.js/commit/8f59a72e7b88c6c1e752c32ecb4b07f15274b551))
- Trace runtime-fetched package files into dist and keep executeScript tracing alive past multi-KB template literals ([648d23f2](https://github.com/extension-js/extension.js/commit/648d23f2f01b6b17396ab9e8ffe7e850098c1413))
- Confine project auto-install to the project dir and fall back to npm when the resolved package manager fails ([65f671af](https://github.com/extension-js/extension.js/commit/65f671af9c85efa14a3b572ed17519f0ad969cca))
- Type ?inline stylesheet imports as asset/source so Vue custom-element styles resolve to CSS strings ([8bff845b](https://github.com/extension-js/extension.js/commit/8bff845baf58c465d2021c02443988b8c3d45a35))
- Match link rel as a token list so shortcut icon assets stay static instead of becoming phantom stylesheet modules ([dd7d1aae](https://github.com/extension-js/extension.js/commit/dd7d1aae378ae9875c87e41fbb42f1b3ce8f90ab))
- Update all *-location dependencies ([72533594](https://github.com/extension-js/extension.js/commit/72533594399c3c497a997db45b5be7ea94b6aebf))
- Concatenate classic multi-script HTML pages into one shared scope ([8af0b2fb](https://github.com/extension-js/extension.js/commit/8af0b2fb5fbbdebc4c051d3a9a98cef40287bcb8))
- Trace importScripts deps and executeScript file payloads into dist ([2cc9c9a9](https://github.com/extension-js/extension.js/commit/2cc9c9a97a85e7c3da7f9add275f5612063ccda1))
π§Ή Other changes (3)
- Fall back to any managed chromium-family binary when the requested chrome/chromium is missing ([a13b6aaf](https://github.com/extension-js/extension.js/commit/a13b6aafa52a9009ef6449819e834df8e42b44bc))
- Cover chromium in install all and fall back to managed chromium-family binaries when dev's default chromium is missing ([e5956fda](https://github.com/extension-js/extension.js/commit/e5956fda4dcafc6502404f31e455d92ec63c4623))
- Update README.md ([3985a105](https://github.com/extension-js/extension.js/commit/3985a10556608112fbf13660876b3632ee2f6169))
π§Ή Other changes (16)
- Compare path sets against rspack resources through one resolved toResourceKey ([8469e2c9](https://github.com/extension-js/extension.js/commit/8469e2c9eeab83edf9fe435ccbb9f17222acb089))
- Pin swc rules to explicit javascript/auto so the project package.json type field cannot override browser-parity script-vs-module detection ([419748fe](https://github.com/extension-js/extension.js/commit/419748fe64d7067398e40ed81a76cdebe7fe1874))
- Tolerate UTF-8 BOM in all extension JSON parses and route preprocessor stylesheets as plain CSS when the preprocessor is not installed, matching Chrome loading ([dd8439e7](https://github.com/extension-js/extension.js/commit/dd8439e7e19e440bfaae6c50e3bb558d37f89b96))
- Announce dev reloads with one server-built context label across CLI stdout, the page devtools console, and the devtools pill, and self-heal stale cached service workers via a persisted control port and broker resync ([f5e3d846](https://github.com/extension-js/extension.js/commit/f5e3d846cff58f21adcc370f4324b534688563a4))
- Lead npm and README metadata with the cross-browser extension framework positioning ([85f8c057](https://github.com/extension-js/extension.js/commit/85f8c057feb7245770e0c4dbc5dc086b0103ef53))
- Emit HTML static assets at their source paths so runtime references resolve like Chrome serves them ([56922215](https://github.com/extension-js/extension.js/commit/569222150b3a94ffcda777ef9d24cd55efa56679))
- Accept web_accessible_resources match patterns with ports and port wildcards that Chrome loads instead of failing the build ([582e3b45](https://github.com/extension-js/extension.js/commit/582e3b45ae2b989ab8249f1b116df5cb4cfc538b))
- Parse page scripts as javascript/auto and force ESM only where the platform declares it (script type=module, module service workers) ([8f5deca8](https://github.com/extension-js/extension.js/commit/8f5deca8337c94baced8b6172cc573b03dfb0af7))
- Auto-detect script vs module in swc-loader so classic sloppy-mode content scripts build like Chrome loads them ([6c0fc548](https://github.com/extension-js/extension.js/commit/6c0fc5483f91765848c30ad2f3056732d3514754))
- Skip PWA web-app manifests when resolving manifest.json and re-resolve to the real extension manifest instead of crashing on PWA-shaped fields ([f0d3f45f](https://github.com/extension-js/extension.js/commit/f0d3f45faaeedb6539aebf8501300eaeda35fa56))
- Warn and ship invalid CSS verbatim instead of failing the build, matching browser error recovery ([4af5697d](https://github.com/extension-js/extension.js/commit/4af5697d65270b70943769c0ead7e45521507e33))
- Preserve in-project icon paths in the output instead of flattening to icons/π§Ή Other changes (1)
- Disable Preact fast-refresh so the rspack 2.x prefresh runtime stops crashing dev with module is not defined ([4f6380cc](https://github.com/extension-js/extension.js/commit/4f6380cc1f100be5e67727f40eaeb4f2a80467b2))
π§Ή Other changes (10)
- Drop four dead develop exports and rename the firefox follow-up to match its content ([ca49dd54](https://github.com/extension-js/extension.js/commit/ca49dd54403a679e716c7f28707dd9a9fed173e9))
- Rename the source-inspection dirs to cdp/ and rdp/, upgrade the firefox id follow-up ([c3dabd31](https://github.com/extension-js/extension.js/commit/c3dabd31be17727ce404b4c36e047768703fff3e))
- Remove dead controller methods left by source-inspection and pair up chromium/firefox ([53331d86](https://github.com/extension-js/extension.js/commit/53331d86bd72753fa609faa5f0c0410dbacaa623))
- Remove the unwired source-inspection feature ([a2afe400](https://github.com/extension-js/extension.js/commit/a2afe400a320764693cfd4f5967c9b881186271e))
- Remove dead code across create, develop, and extension ([6b8c47dc](https://github.com/extension-js/extension.js/commit/6b8c47dcf85d3c0ddfffb4b802e1b9671cf77e65))
- Single-source optional-dependency install hints from bundled versions and drop dead signature helper ([4e6da9a7](https://github.com/extension-js/extension.js/commit/4e6da9a751c5d76eb504e4f5c6c9a2a38b815f4c))
- Make the not-emitted manifest guard version-aware instead of blaming incremental builds ([df9c51d3](https://github.com/extension-js/extension.js/commit/df9c51d38fcbe8450ee11a28a0498858c4750c38))
- Bump bundled less to 4.6.7 to drop the errant 4.5.1 postinstall that trips build-script warnings ([f4cc754a](https://github.com/extension-js/extension.js/commit/f4cc754a575196fd5f5438b0300a6dd6aaf44a44))
- Detect the Deno runtime so scaffolds suggest deno install and deno task commands ([fd9f869b](https://github.com/extension-js/extension.js/commit/fd9f869b4c4ee3fc45d5c95a761e03160e66b4c7))
- Pre-approve dependency build scripts in scaffolds so install-once just works ([7218b099](https://github.com/extension-js/extension.js/commit/7218b099691aeaefca320c11524ae33c86666958))
π§Ή Other changes (5)
- Explain where there other templates are hosted (#477) ([6eda9f84](https://github.com/extension-js/extension.js/commit/6eda9f8400fd0a6add237b9be7233bd138e15ffd))
- Register a default background entry for Safari and version-less manifests ([a1f38e1c](https://github.com/extension-js/extension.js/commit/a1f38e1c0dc7541b1fb2e0425b253bf0acf09e0f))
- Compile create before its tests and gate env-fragile install specs under CI ([f54baeda](https://github.com/extension-js/extension.js/commit/f54baeda6c11f2aa847da9fe4175663a0034e5cd))
- Complete the init-alias create test so it actually imports the template ([a34fda8a](https://github.com/extension-js/extension.js/commit/a34fda8a643f8c4a84e2ff35794c34bba12fca64))
- Strip examples-repo scaffolding files from scaffolded projects ([54f0f4f1](https://github.com/extension-js/extension.js/commit/54f0f4f1e7d78a54e9671562ad0dcd21d0e3a25e))
π§Ή Other changes (44)
- Route isSubPath through the shared resource-path helper for cross-platform consistency ([900071dc](https://github.com/extension-js/extension.js/commit/900071dc24cb0618f9d4df05bf595dbb37947dbb))
- Centralize resource-path canonicalization in a shared, cross-platform helper ([4b938754](https://github.com/extension-js/extension.js/commit/4b93875456d335e70c02661f970956ef2170bd83))
- Match content-script loader include via canonicalized resource path for Windows ([9300fb30](https://github.com/extension-js/extension.js/commit/9300fb300d803cc79cbdaf5ae76776c9f3f0c56b))
- Canonicalize content-script resourcePath so wrapping works on Windows ([e878bf64](https://github.com/extension-js/extension.js/commit/e878bf643afc72d0b58544bd0d63c15aa7e0b87e))
- Emit prefixed manifest entries for engine-family browser targets ([b4fd0431](https://github.com/extension-js/extension.js/commit/b4fd0431f95fd25f59523e34307904a0f5f73321))
- Drop the duplicated command name from CLI usage strings ([eba667e1](https://github.com/extension-js/extension.js/commit/eba667e1142ee98653a0b38fae8652770e6a0ba4))
- Use the launched Firefox RDP port verbatim instead of re-deriving it ([4398fc80](https://github.com/extension-js/extension.js/commit/4398fc80440ccb1edcde88754a901e1c9205b30d))
- Run launched Firefox headless when MOZ_HEADLESS is set ([e8fed0d4](https://github.com/extension-js/extension.js/commit/e8fed0d40257c8829064f963770f3f858e8c8240))
- Unify reload through the extension service worker for launched and `--no-browser` browsers ([7a330aa7](https://github.com/extension-js/extension.js/commit/7a330aa7356388fafcc132e42ea0ad0159a710b3))
- Reload content scripts under `extension dev --no-browser` and add a connectable host ([a55444f8](https://github.com/extension-js/extension.js/commit/a55444f896e245cc7513185371bbea1bf0db3802))
- Probe the dev server port on the configured host ([0faa8342](https://github.com/extension-js/extension.js/commit/0faa834275e66464b9b1423bc8b3fcda571832fa))
- Inherit chrome:/firefox: manifest keys for browser forks ([c9280248](https://github.com/extension-js/extension.js/commit/c9280248e099c5ca818af3fbbbab44a52ddd6806))
- Parse optional-boolean CLI flags so --flag false disables them ([0b50bd3e](https://github.com/extension-js/extension.js/commit/0b50bd3e335c361708eb938f06fa0f20f7ca3124))
- Update dependencies for Node 22 ([7a4a269c](https://github.com/extension-js/extension.js/commit/7a4a269c07fc05ac6483a1892689051b260fd091))
- Drop Node 20: bump CI and engines.node to 22 so yarn installs resolve which@7 ([ea1c978b](https://github.com/extension-js/extension.js/commit/ea1c978b5b9c359c2ad1e401dbed43296a658852))
- Update message-catalog snapshot for the new firefox-reinject and chromium source-inspection messages ([80a88df6](https://github.com/extension-js/extension.js/commit/80a88df692fecf5a25040dc82a288056d9538846))
- Coalesce Safari dev packaging so saves resync in the background and bursts collapse to one rebuild ([34c11c8f](https://github.com/extension-js/extension.js/commit/34c11c8f132829bc164e6ca59334405ea1382559))
- Type the Firefox RDP wire boundary and client so wrong shapes fail the compile ([4be1701f](https://github.com/extension-js/extension.js/commit/4be1701f119831a76c541139ec93363d8ba5f43e))
- Type the Chromium runner's CDP wire boundary so wrong-shaped protocol data fails the compile ([0af6f5b1](https://github.com/extension-js/extension.js/commit/0af6f5b18023df78d5192c9b605d013181227b62))
- Force-kill the browser synchronously on process exit via a shared teardown module ([66b79e08](https://github.com/extension-js/extension.js/commit/66b79e088efde5b43469e26019788dab9ab0524a))
- Watch and source-map classic multi-file content scripts via a dedicated concat loader ([553d9dbd](https://github.com/extension-js/extension.js/commit/553d9dbdd74320f030252cf67ad6cb54334d3ca4))
- Route Firefox runtime-reinjection failures through the messages convention with author-mode diagnostics ([fc852022](https://github.com/extension-js/extension.js/commit/fc852022f6d02e235607f24e1a71d60bc73244f0))
- Exclude TypeScript declaration files from script entries ([e94bef25](https://github.com/extension-js/extension.js/commit/e94bef250d37b57a7c87311e8b5672183c74892f))
- Warn when building a Manifest V2 extension for a Chromium target ([8df0d895](https://github.com/extension-js/extension.js/commit/8df0d895db8fd14b2603945e8b43bf5fce536239))
- Concatenate and dedupe MV2 background.scripts output ([22b8a732](https://github.com/extension-js/extension.js/commit/22b8a73266e9ec222d6d958e330931104f3307d1))
- Concatenate classic multi-file content scripts so they share one scope ([d8b15336](https://github.com/extension-js/extension.js/commit/d8b15336c00e8bb04335e85d2a1f7702de7c253a))
- Pin which to ^4 so browser-location packages stay Node 20 compatible under yarn ([554e9161](https://github.com/extension-js/extension.js/commit/554e91612446eb84bc3501a44cac18fa9f7cc6a4))
- Declare keepProfileChanges/copyFromProfile on BrowserConfig so the dev config typechecks ([90b97113](https://github.com/extension-js/extension.js/commit/90b971139d9291af88c8a13cf501e7adf51e9970))
- reuse wsl-support package for generic WSL primitives ([0d5c4cf2](https://github.com/extension-js/extension.js/commit/0d5c4cf2e5a374a6d6a2faa82f47be639243ab73))
- Warn (don't fail) on missing CSS url() assets and pass the url through ([8bf09fec](https://github.com/extension-js/extension.js/commit/8bf09fec610621898dd7252dbe48bd6d6579fe81))
- reuse prefers-yarn helpers in develop package manager ([66477cdc](https://github.com/extension-js/extension.js/commit/66477cdcfd2ba7ee61fd1fa0a5f2a8e84b351509))
- import Compiler type explicitly in rspack config ([216a71ed](https://github.com/extension-js/extension.js/commit/216a71ed6e6d2e2127033aeb18aad537472d479e))
- reuse prefers-yarn for package manager detection in create ([dbb29ccb](https://github.com/extension-js/extension.js/commit/dbb29ccbc87e849b2dbedac413902753f3f54092))
- Relocate leading-slash icon paths to icons/ so the manifest matches the emitted files ([b65a4af2](https://github.com/extension-js/extension.js/commit/b65a4af23386da0e6502da094f40a3f4d8afe0a6))
- Seed copyFromProfile once so kept profiles are not clobbered on later runs ([6fb4375d](https://github.com/extension-js/extension.js/commit/6fb4375d4c822f6978f4c1f822e7d72ad1a929c1))
- Update message-catalog snapshot for the new Safari resync messages ([bfe4f8cd](https://github.com/extension-js/extension.js/commit/bfe4f8cdcd49abf423666dfc0c2f02acf053ea31))
- Type 41 manifest-shape casts to drop any so wrong-shaped manifests fail the compiler ([69c522e7](https://github.com/extension-js/extension.js/commit/69c522e714e0e47b488116d95de116cbcfef24d8))
- Throw a readable PM-aware install hint for missing optional deps instead of a raw JSON blob ([c6c9a97b](https://github.com/extension-js/extension.js/commit/c6c9a97b745240b89ce8344d306f2975fa4db498))
- Honor profile:false, copyFromProfile and keepProfileChanges via shared resolve-profile ([135349df](https://github.com/extension-js/extension.js/commit/135349df1d447db3e3372517558e27a355e7db5b))
- Treat unknown chromium extension ownership as not-owned to avoid adopting foreign extensions ([65ab2dbd](https://github.com/extension-js/extension.js/commit/65ab2dbd6bca0b0c74cc7aef2218b26c8ec1209f))
- Re-run Safari converter on manifest changes and preserve Xcode user settings on --force ([89510a40](https://github.com/extension-js/extension.js/commit/89510a40d71c5fe84cf9956e7bbeb8c273f63eac))
- Bump browser-extension-manifest-fields to ^2.2.5 ([8c9ea9d8](https://github.com/extension-js/extension.js/commit/8c9ea9d8f4576fad0b20ba6b77d8e8f3a3ccd577))
- Emit theme image files (theme/images/π§Ή Other changes (3)
- Delete dormant feature-resolve and drop @swc/core and magic-string ([2fe00f58](https://github.com/extension-js/extension.js/commit/2fe00f589ed95b05834b323028976e45ad706ab3))
- Use es-module-lexer instead of @swc/core for content-script default-export detection ([1142eb11](https://github.com/extension-js/extension.js/commit/1142eb113d28a717bf6cba269e684adae903be21))
- Remove dead dependencies from extension-develop (cross-spawn, unique-names-generator, loader-utils, @swc/helpers) ([4514eae6](https://github.com/extension-js/extension.js/commit/4514eae6ef6fb64996d1824d963c8741587a02cc))
π§Ή Other changes (11)
- Raise perf-budget defaults to 512/512/1024 KiB ([df09459e](https://github.com/extension-js/extension.js/commit/df09459e0d6caaaa873818e0990c776f1661c977))
- Drop the scaffold-overrides workaround for the @rspack/dev-server 2.0.2 break ([50ddc5af](https://github.com/extension-js/extension.js/commit/50ddc5af1b69bb64fc7cc63e90e8a2baa34d8c5d))
- Remove the implemented readiness design docs ([8420f830](https://github.com/extension-js/extension.js/commit/8420f83051d3eaad85b78e40f23af582fb5bd9a1))
- Snapshot the 21 messages.ts catalogs (readiness item 5c) ([c4403d7b](https://github.com/extension-js/extension.js/commit/c4403d7b5d7bbef18c589359a14a18f1fca1af9c))
- Remove the implemented agent bridge and distribution design docs and fix code comments ([38227bc0](https://github.com/extension-js/extension.js/commit/38227bc077172d2ec28b8f4ddd6be3f3797219c6))
- Pierce closed shadow roots in dev source deep dom ([f4db965d](https://github.com/extension-js/extension.js/commit/f4db965d32324d76d2bd5d2862e19e09c6751709))
- Declare the ws dependency for the control bridge ([a0777eab](https://github.com/extension-js/extension.js/commit/a0777eabedeb135436c3bac5ae2f617e1a6220b4))
- Declare webpack devDep in develop so typecheck gate resolves the vendored HMR fork ([f1300126](https://github.com/extension-js/extension.js/commit/f13001262757704e8ba104d92534e8374cc3ae16))
- Unify package-manager detection across yarn and bun ([736e1c08](https://github.com/extension-js/extension.js/commit/736e1c082263e3ba54713da36f68526408486d7c))
- Review cleanup of extension package ([f5c6ae92](https://github.com/extension-js/extension.js/commit/f5c6ae9247f3995349e3fc8188087d047ae99902))
- Develop plugin review cleanup, hardening, and browser process shim ([74de1bdd](https://github.com/extension-js/extension.js/commit/74de1bdd7198ba6d95f2aa1b5d43c8974199b9b5))
π§Ή Other changes (2)
- Write dev manifest.json in afterEmit and switch content-script hashing to contenthash ([ea94d73a](https://github.com/extension-js/extension.js/commit/ea94d73a917ddd4d4717dd816c68a72bd8820871))
- Write dev manifest.json in afterEmit and switch content-script hashing to contenthash ([d8c17912](https://github.com/extension-js/extension.js/commit/d8c17912e41d6c0a3b285fa8e820c0237d2a5af6))
π§Ή Other changes (5)
- Replay programmatic chrome.scripting.executeScript calls on /scripts/* edits ([ede537be](https://github.com/extension-js/extension.js/commit/ede537be61cc3e1ee99e87b362d6dfe192319169))
- Only warn for genuinely new files in pages/ and scripts/, not modifications ([ee26b765](https://github.com/extension-js/extension.js/commit/ee26b765421d1cf23462497a72120d4fc2ed6025))
- Auto-resolve workspace subpackage when extension dev is given the monorepo root ([32e06114](https://github.com/extension-js/extension.js/commit/32e061146f23d1f18fe8d63873e4e821fdac0cb9))
- Honor namespaced manifest_version in SetupBackgroundEntry default background entry ([28533531](https://github.com/extension-js/extension.js/commit/28533531a6fda04f27112bfbb4ab455828b5d707))
- Derive Chromium extension ID from load path when no manifest key + no runtime target ([03ffef5b](https://github.com/extension-js/extension.js/commit/03ffef5b905ffd97abdef49190795b6a30a1b127))
π§Ή Other changes (6)
- Ignore benign socket teardown errors in browser process handlers (Templates Nightly Edge ECONNRESET) ([385c955e](https://github.com/extension-js/extension.js/commit/385c955e114f52771d7888f57a356be532f0eb39))
- Force-exit optional-deps smoke after main() so Linux orphans don't hang the CI step ([ddfaeed9](https://github.com/extension-js/extension.js/commit/ddfaeed9aaf3c29fe58ad17b21084710e33dc80c))
- Compile extension-develop before vitest so dist-shape spec has artifacts ([10b87eb7](https://github.com/extension-js/extension.js/commit/10b87eb783cf3d358a98b24b9dd8698166e5fe3f))
- Scope ESM banner to Node-side bundles and add regression gates ([57b14c87](https://github.com/extension-js/extension.js/commit/57b14c8789ae606ad9fa7c46feb7f83fad7f4a3e))
- Flip extension-develop to ESM output for @rspack/core@2 compatibility ([a589d63e](https://github.com/extension-js/extension.js/commit/a589d63e792635ae129cc1b1c77a2523ba24bd9a))
- Update WASM example link in README ([e9caf210](https://github.com/extension-js/extension.js/commit/e9caf210ad432acb4240b4ff365ef149db970faa))
π§Ή Other changes (14)
- Update preact.spec assertions to match package-directory preactPath ([80047082](https://github.com/extension-js/extension.js/commit/800470827334bd9dcc7bfaa403280bdcef26c1ff))
- Pass preact package directory to PreactRefreshPlugin (not entry file) ([2e235377](https://github.com/extension-js/extension.js/commit/2e235377a45b0afc14f24408244fb69e05f40358))
- Pass project preact path to PreactRefreshPlugin for pnpm strict layouts ([5580a757](https://github.com/extension-js/extension.js/commit/5580a757035aaf1a53bccd083206990f16d19791))
- Raise content-script perf budget to 256 KiB for framework templates ([1812a011](https://github.com/extension-js/extension.js/commit/1812a01141b7341c0773640ee5625c2e691c25da))
- Apply project-package fallback to module-context-resolve rules ([4b6b329e](https://github.com/extension-js/extension.js/commit/4b6b329ed35a49ac40c1ff0283ef6f384aec9801))
- Trust project package.json when pnpm symlinks hide the contract dep ([5e0a0f79](https://github.com/extension-js/extension.js/commit/5e0a0f79b1915e53460619b058dca094b78e1501))
- Suppress executionContextCreated burst on watched-session attach ([05d9195a](https://github.com/extension-js/extension.js/commit/05d9195a5898f73632e827b9d35c660f37e9b479))
- Preserve sibling content_scripts entries during dev reinject ([78a2c1fb](https://github.com/extension-js/extension.js/commit/78a2c1fb1758e66d938bbbf8926d633f1f2d46ff))
- Inline content-script CSS as data URLs to close the WAR gap on rspack 2.x ([0120b2db](https://github.com/extension-js/extension.js/commit/0120b2dbbaa55ece2343b77328564973daaab895))
- Relocate reload-matrix harness to _FUTURE/examples per workspace convention ([a5706d7c](https://github.com/extension-js/extension.js/commit/a5706d7c4c698b4320f7dffc81c6ffbfe64c8418))
- Extend reload-matrix harness with multi-scenario runner and 5-row matrix ([ed3c294e](https://github.com/extension-js/extension.js/commit/ed3c294eaf7f98b6476efa7818f816a052f41ca9))
- Scaffold reload-matrix CDP harness for ground-truth reload measurement ([65df59c1](https://github.com/extension-js/extension.js/commit/65df59c1b2067f9bfc0c0e4797982a5340506ae4))
- Revert "Serialize and coalesce reload requests at the controller boundary" ([07c16fd7](https://github.com/extension-js/extension.js/commit/07c16fd7a24c0fa0b3f8ef7ad201d063f9baa4a5))
- Serialize and coalesce reload requests at the controller boundary ([daf8e451](https://github.com/extension-js/extension.js/commit/daf8e451fc8d308bcec4fe5f45ea1b2fe82f42a7))
π§Ή Other changes (21)
- Fire chrome.runtime.reload() once per save instead of N times racing on the eval response ([60745b23](https://github.com/extension-js/extension.js/commit/60745b23380544a6a4398754718fe60ad95af97b))
- Anchor relative profile paths to the rspack context so sequential examples do not share one profile ([727d9b29](https://github.com/extension-js/extension.js/commit/727d9b2963c765ff17b3996b3fed8cc07f7ce28e))
- Bump browser-extension-manifest-fields ([4b37af31](https://github.com/extension-js/extension.js/commit/4b37af316fbc0b370a67fc9a0681ae24a04e974a))
- Pick user extension over companion when version + manifest_version tie ([0705456d](https://github.com/extension-js/extension.js/commit/0705456d67dafd367c50f76985648209c7384b8f))
- Compile extension CLI on demand from companion Firefox MV3 spec ([f0200792](https://github.com/extension-js/extension.js/commit/f02007920bb55dbeecb3d1b2b6cdff91db31ca8e))
- Update README.md ([43042601](https://github.com/extension-js/extension.js/commit/43042601e84b852cce2133dc5284b73532bef3e1))
- Dedupe extension load list and ignore companion shadows of built-in packages ([021d789e](https://github.com/extension-js/extension.js/commit/021d789e36a7a38bfaebe21505bf6659d582fc98))
- Skip dependency install in web-only mode to fix extension dev crash on Chrome samples ([70d41a67](https://github.com/extension-js/extension.js/commit/70d41a678a8af912ea9982963b0d8001bf8a3992))
- Rework README with growth-oriented hero, comparison table, and ship-to-store guide ([6e292dfa](https://github.com/extension-js/extension.js/commit/6e292dfae0f17d71128847e81c8c3eb9f7593df7))
- Lock in companion-extension Firefox bundle as MV3-API-free ([c72dadab](https://github.com/extension-js/extension.js/commit/c72dadab9b976d00fa759084b6851b0ebbbeea1b))
- Force single Playwright worker to eliminate content-reload spec race ([b5f4b85f](https://github.com/extension-js/extension.js/commit/b5f4b85f7119266a85a53c872cb577d30142bc2f))
- Hold firefox apt package so --with-deps does not trigger snap install ([bb4c6f28](https://github.com/extension-js/extension.js/commit/bb4c6f2871a3aa1ec27623f1df5452897ab11326))
- Soften strict _locales layout policy from build error to warning ([4cc4f82d](https://github.com/extension-js/extension.js/commit/4cc4f82dd310b73b82040b3bae1c10d4a5674555))
- Mark generated templates/package.json as ESM to keep spec imports working ([19ceeb99](https://github.com/extension-js/extension.js/commit/19ceeb99755828c498d3e988c7e506cd0d67a08e))
- Teach perf-warning inventory to parse the new PerfBudgetWarning block ([ada3b652](https://github.com/extension-js/extension.js/commit/ada3b65264cb970812dc7d2595ba2bc1571dc197))
- Discriminate page vs content errors in devtools dialog by script origin ([599fc7dd](https://github.com/extension-js/extension.js/commit/599fc7dd542bf0518f7dd48fc63a66590343b841))
- Pick newest content-script bundle by mtime so reload reflects latest rebuild ([f38f3060](https://github.com/extension-js/extension.js/commit/f38f3060c25f4332067fb9f2fab6e9e697282641))
- Make Firefox welcome tab open reliably on first run ([9cf4dae8](https://github.com/extension-js/extension.js/commit/9cf4dae84f667ba5ca5d66f888a921799d3debc9))
- Normalize watch path separators in dev-server config spec for Windows CI ([c50d2b8e](https://github.com/extension-js/extension.js/commit/c50d2b8eaa230a8161936db6c99f65744de71989))
- Normalize watch path separators in dev-server config spec for Windows CI ([27400eb2](https://github.com/extension-js/extension.js/commit/27400eb29fe49f980a6fbd0ccd9c7519a29f9abd))
- Drop dist-build dependency from minimum-script-file/preact-refresh-shim specs ([415f505f](https://github.com/extension-js/extension.js/commit/415f505fd5bca842a522a219bec36a81ee660b87))
π§Ή Other changes (3)
- Pin uuid >=14 to close Dependabot alert 143 ([2a6fb8d8](https://github.com/extension-js/extension.js/commit/2a6fb8d8b4cab748c997b6216cfdee862b66dc13))
- Cover fresh tabs and page reloads for content-script edits ([55c80040](https://github.com/extension-js/extension.js/commit/55c80040a5de2be1b883fbbff118c893478213d8))
- Scope browser-root auto-attach to extension targets, silence debugger infobar ([e31853fa](https://github.com/extension-js/extension.js/commit/e31853fabb7adc2a4a710f337f241e01de9ae885))
π§Ή Other changes (1)
- Disable module concatenation in dev to fix react-refresh __webpack_module__ clash ([c2b2b66f](https://github.com/extension-js/extension.js/commit/c2b2b66f71043259b411a1c2fa0aaec759cd1ab9))
π§Ή Other changes (4)
- Drop ?url query bypass in CSS loaders, add end-to-end regression spec ([eda750a2](https://github.com/extension-js/extension.js/commit/eda750a274aef85b0dba0041a6fff5261cfae00d))
- Pin @rspack/dev-server to ^1.2.1 until @rspack/core 2.x ships stable ([794e400c](https://github.com/extension-js/extension.js/commit/794e400c71945a8b557edc160f6cfb6921a5d794))
- Default --install to off on extension create ([135c58cc](https://github.com/extension-js/extension.js/commit/135c58cc5a4799a7abc3ffa5fb007698887aefcb))
- Collapse CLI telemetry to 2 events with sampling, cap, and dedup ([c87ef941](https://github.com/extension-js/extension.js/commit/c87ef9413c75ee4f7b81969121a8024a0b3a3924))
π§Ή Other changes (1)
- Respect --install flag to skip dependency install in build/dev commands ([298dd072](https://github.com/extension-js/extension.js/commit/298dd0720a99dee56c44299d131ddc585f602d8d))
π§Ή Other changes (2)
- Remove dead code, extract shared utilities, fix signal race, simplify core plugins ([ddaabbd0](https://github.com/extension-js/extension.js/commit/ddaabbd0287f579b01c6f6d04f8d912bb20e22e6))
- Make extensionCreate API/AI-friendly with injectable logger and structured result ([9508cbfd](https://github.com/extension-js/extension.js/commit/9508cbfd04859a20109dc1ad36cce926b59ecbe4))
π§Ή Other changes (3)
- Remove extensionStart from develop. CLI now orchestrates build + preview ([cc329680](https://github.com/extension-js/extension.js/commit/cc3296808408cc34da8156edad3b3c5934a62e7c))
- Orchestrate start command with separate build + preview calls ([b9ad1987](https://github.com/extension-js/extension.js/commit/b9ad198795d2e3ff26211172c97e1a6598fd62b4))
- Optimize GitHub Actions workflows for faster CI ([a6c08068](https://github.com/extension-js/extension.js/commit/a6c080682cf3cb9ae25c8038c965a2a15badb22d))
π§Ή Other changes (8)
- Default create template to javascript and make template option optional ([cd457fe1](https://github.com/extension-js/extension.js/commit/cd457fe1a51a00fa2285c13d53ee80ee11850db4))
- Use workspace:* for extension dev dependency ([ea7982da](https://github.com/extension-js/extension.js/commit/ea7982da3afaae8dfd5a801df4cf0befff833557))
- Remove isolated-deps and bundle extension-develop toolchain ([ed284849](https://github.com/extension-js/extension.js/commit/ed284849ae575e354171176b062f91643219622b))
- Use geometric triangle prefix for signature log lines across CLI and webpack ([70d5d95b](https://github.com/extension-js/extension.js/commit/70d5d95b89e70327a803d83a1d86c4219cc71e15))
- Update Vite/Vitest ([81f3e250](https://github.com/extension-js/extension.js/commit/81f3e25099d412efa9f1315f519435615588a88a))
- Normalize path separators in HMR entry assertions for Windows ([e4a7f83e](https://github.com/extension-js/extension.js/commit/e4a7f83e6c315b603e4878e7c831db3e561ab842))
- Bump go-git-it to 5.1.5 ([0ec2602e](https://github.com/extension-js/extension.js/commit/0ec2602e455cea395a4fa1ece88a43cd4bd2ca77))
- Show Firefox add-on ready line in dev and align ready copy ([10067e85](https://github.com/extension-js/extension.js/commit/10067e850f9bac8aab32f7680e0c8786a7aa6323))
π§Ή Other changes (10)
- Ignore programs/create/.npmrc so local npm tokens are never committed ([97576321](https://github.com/extension-js/extension.js/commit/9757632127929006d087e1e36803e0f5e90abf3a))
- Normalize Windows drive slashes after backslash replace ([c3478484](https://github.com/extension-js/extension.js/commit/c3478484142706251553fb45a6f2cd5827a6752a))
- Replace in-tree optional-deps installer with isolated-deps package ([821c6b22](https://github.com/extension-js/extension.js/commit/821c6b224108b0740008da28ad7bc326256e4914))
- Simplify reload internals before release ([4b574838](https://github.com/extension-js/extension.js/commit/4b57483810bb673c536cd7da8c1be24555e558d3))
- Consolidate ci-scripts into scripts and remove dead scripts ([21e04fac](https://github.com/extension-js/extension.js/commit/21e04fac368beb3f882dfa135c03c96a62204cde))
- Update changelog and companion extension adjustments ([30262963](https://github.com/extension-js/extension.js/commit/3026296323000723b3a84f9b3ead62d39d4c6a11))
- Refactor browser plugins, CDP/RDP inspection, and dev server internals ([97ec810d](https://github.com/extension-js/extension.js/commit/97ec810dd4e5d69d3ad149e2b4cede90f3b5cfbe))
- Wrap extension messaging sendMessage in try-catch in chunk loader ([a8d6e2a0](https://github.com/extension-js/extension.js/commit/a8d6e2a0db672abc8e8fe34861e93cac5b99acca))
- Hash content script filenames in dev mode to bust browser cache on hard reload ([ba3e497d](https://github.com/extension-js/extension.js/commit/ba3e497d26d584ffd778f860fe8102aa84c4c807))
- Rewrite content script wrapper with reinject lifecycle and cleanup registry ([89f5ae4a](https://github.com/extension-js/extension.js/commit/89f5ae4a2f0d0bdc5e030100cbd1aa6e01185a91))
π§Ή Other changes (1)
- Offload browser discovery to location libs ([6e5746df](https://github.com/extension-js/extension.js/commit/6e5746dfea7eaa09122dfad11de04b53136d7a79))
π§Ή Other changes (2)
- chore: sync build deps tracking manifest ([c5622538](https://github.com/extension-js/extension.js/commit/c56225387f586e92e36fb935e49b9581b9f350aa))
- Bump dependency bundle and clear audit alerts ([6b01a343](https://github.com/extension-js/extension.js/commit/6b01a343153930c9693e83111e7218e73981f16d))
π§Ή Other changes (11)
- Added -b shortcut to browser option (#430) ([cca28133](https://github.com/extension-js/extension.js/commit/cca281338a24ac0ba57085f6fba68d89813d256f))
- Stabilize Windows pnpm smoke workspace paths ([aa09acb5](https://github.com/extension-js/extension.js/commit/aa09acb53f777fd27c93d4ded61032fd5e5dcb7e))
- Stabilize Windows npm optional dependency preflight ([daaca4e0](https://github.com/extension-js/extension.js/commit/daaca4e06e71513788dd2a132568dc99c35ef0e9))
- Handle cross-drive Windows file specifiers in pnpm smoke ([df7f9d5f](https://github.com/extension-js/extension.js/commit/df7f9d5fb861932a0bab291c6bfd3de65e5522b8))
- Align pnpm optional-deps smoke with source-under-test ([1aad9776](https://github.com/extension-js/extension.js/commit/1aad97765d145e950babb5c76077b7967f4aaf9e))
- Generalize optional dependency contracts across webpack tooling ([3cb55980](https://github.com/extension-js/extension.js/commit/3cb559801408b7413b91ea5a416d6fb87c5c60f4))
- Enforce transactional optional dependency installs ([de00809c](https://github.com/extension-js/extension.js/commit/de00809c3ab4a7c390a1f468b427178d4cac5018))
- Setup internal standalone library for installing and resolving on-demand tooling ([f57cd715](https://github.com/extension-js/extension.js/commit/f57cd715437ff60c97ed8369d29592667493def5))
- Setup internal standalone library for installing and resolving on-demand tooling ([20c0b6b9](https://github.com/extension-js/extension.js/commit/20c0b6b9a35fa658dd9a84cda937a4e90e94e4cd))
- Stabilize CI platform-specific optional deps assertions ([8735e20c](https://github.com/extension-js/extension.js/commit/8735e20c4dfe05e59a6215d212cb88cf974c8710))
- Setup internal standalone library for installing and resolving on-demand tooling ([dfe59ce2](https://github.com/extension-js/extension.js/commit/dfe59ce2599cbb4a88fd845f5cedf1aaedede4c1))
π§Ή Other changes (1)
- Preserve Rspack branding in optimization warnings ([bd7874a4](https://github.com/extension-js/extension.js/commit/bd7874a4ad68d7a56760f8100495703d31e94837))
π§Ή Other changes (2)
- Improve managed browser install guidance. ([d7bcbcd8](https://github.com/extension-js/extension.js/commit/d7bcbcd870a34d3baaf1eaa161109c3f64f5ab5e))
- Prefer the project-local develop runtime during create ([41f2b912](https://github.com/extension-js/extension.js/commit/41f2b91290c5888ac4951e67cf9d7f631a748530))
π§Ή Other changes (2)
- Generate curated stable release notes ([7771574e](https://github.com/extension-js/extension.js/commit/7771574e19c478ca87c2fefef6c007e5c57ad488))
- Richer build output ([bef3ffc8](https://github.com/extension-js/extension.js/commit/bef3ffc86cd96021807c99bfda02c5e56c45b440))
π§Ή Other changes (2)
- Preserve webpackIgnore comments in production builds ([49d81f16](https://github.com/extension-js/extension.js/commit/49d81f1639ba3f8eba81cf2fceba3594461beeaa))
- Preserve CLI spacer lines in Turbo-prefixed output ([511b0e23](https://github.com/extension-js/extension.js/commit/511b0e23b8ecaadf318e5bff66b84dfc97432ca7))
π§Ή Other changes (1)
- Improve build warning summaries and remove contradictory success output ([d2a9583b](https://github.com/extension-js/extension.js/commit/d2a9583b4bc777eeb72ca8f3c40bcaf884c1925f))
π§Ή Other changes (1)
- Improve --wait for `start` command ([df1eb61d](https://github.com/extension-js/extension.js/commit/df1eb61ddd3b89b2c9920fd58c52f548babb0f77))
π§Ή Other changes (2)
- Rename no-runner behavior to no-browser ([1a4c845a](https://github.com/extension-js/extension.js/commit/1a4c845afb3502635a9fb3eba7908106b0560e4b))
- Invalidate optional-deps preflight cache when lockfiles change ([c76331bd](https://github.com/extension-js/extension.js/commit/c76331bd2f0a98baec0455836d69991039fada12))
π§Ή Other changes (1)
- No loading for first-time optional deps install ([1d6fb8a2](https://github.com/extension-js/extension.js/commit/1d6fb8a2e5289cef404341dc27ea600fe961d5dd))
π§Ή Other changes (4)
- Scope optional peer runtime checks to Vue ([43b84c70](https://github.com/extension-js/extension.js/commit/43b84c7031b660d9ed80067a4c6863782a212317))
- Remove vulnerable serialize-javascript from build-deps lockfile ([93c4be40](https://github.com/extension-js/extension.js/commit/93c4be401dec80ef626bb74aac0bb2e383e9902c))
- Hotfix for Vue examples not working ([68e27a4d](https://github.com/extension-js/extension.js/commit/68e27a4d431e9f2d0ad2a2343fea1c2f699d3622))
- Setup experimental error overlay ([f2dbdbe2](https://github.com/extension-js/extension.js/commit/f2dbdbe2696465aa4e27b2280dae86d08bf66bc9))
π§Ή Other changes (4)
- Improve version resolution during create step ([bca90b1b](https://github.com/extension-js/extension.js/commit/bca90b1bad82a8f460a0f56f075c252cc510996e))
- Ignore dist output changes in hard reload watch detection ([b5bfe8c0](https://github.com/extension-js/extension.js/commit/b5bfe8c05fc8b7440442917e0dd74509f1f5ff84))
- Experimental error overlay ([f1b66998](https://github.com/extension-js/extension.js/commit/f1b6699876c883df9318ce9679ffe9204289f6b8))
- Auto-scan top-level ./extensions ([49ccad57](https://github.com/extension-js/extension.js/commit/49ccad570f5a814992b671d346b66e179c2da644))
π§Ή Other changes (1)
- Follow up on built-in extension overriding user NTP ([5f4b4af3](https://github.com/extension-js/extension.js/commit/5f4b4af3fd98a7743e4104c085ffacef51b37a4d))
π§Ή Other changes (1)
- Curate changelog entries for public release notes. ([8bdd39b8](https://github.com/extension-js/extension.js/commit/8bdd39b8b7484be20be19c2983643eee772dc63f))
π§Ή Other changes (4)
- Further simplify install-root entrypoint resolution helpers ([88f5b19d](https://github.com/extension-js/extension.js/commit/88f5b19db7efc31b13ff971d9e04fefb4913db1c))
- Simplify optional dependency resolver control flow ([941947e9](https://github.com/extension-js/extension.js/commit/941947e91e5c977f6e04e0270135e7953d50078b))
- Codify optional-deps runtime contract and lock regressions ([0f885a33](https://github.com/extension-js/extension.js/commit/0f885a3381e70d917e4386ccf650cfa796acc46a))
- Use registry-mode extension for Windows pnpm smoke lane ([e40e9568](https://github.com/extension-js/extension.js/commit/e40e9568cdb5281232173461bf008007497b1645))
```bash
npx extension@latest create my-extension
cd my-extension
npm run dev
```
Works with `npm`, `pnpm`, `yarn`, `bun`, and `deno`.
[Documentation](https://extension.js.org) Β· [Templates](https://templates.extension.dev) Β· [Examples](https://github.com/extension-js/examples) Β· [Discord](https://discord.gg/v9h2RgeTSN)
## Why Extension.js
Browser extensions ship with the worst dev experience in modern web. Manifest V3 fragmentation, browser-specific quirks, no hot reload for content scripts, and a separate build pipeline for every target. Extension.js fixes that.
- **Hot Module Replacement** for background, content, popup, and options scripts, including React, Vue, Svelte, and Preact components
- **Manifest V3 by default**, with automatic adapters for Chrome, Edge, Firefox, and Safari targets
- **One CLI** for Chrome, Edge, Firefox, and any Chromium or Gecko binary
- **Zero config**, no webpack, no rollup, no plugins to maintain
- **First-class** TypeScript, React, Vue, Svelte, and Preact support
- **Production builds** with `extension build --zip`, ready for the Chrome Web Store and Firefox Add-ons
- **Drop-in** for existing extensions with one `devDependency`
## Watch it work
[60-second demo](https://github.com/cezaraugusto/extension/assets/4672033/7263d368-99c4-434f-a60a-72c489672586)
Or skip the install and try a [live template](https://templates.extension.dev) in your browser.
## How is this different
If you have used [Plasmo](https://www.plasmo.com), [WXT](https://wxt.dev), or [CRXJS](https://crxjs.dev), here is what Extension.js does that the others do not:
| Capability | Extension.js |
| :--------- | :----------- |
| Run any GitHub sample directly | `extension dev https://github.com/.../sample` |
| Managed browser binaries | `extension install firefox` downloads an isolated build |
| Cross-browser HMR for content scripts | Built in, no plugin glue |
| Production zip for the stores | `extension build --zip` |
| Framework agnostic | [Vanilla](https://templates.extension.dev/javascript), [TS](https://templates.extension.dev/typescript), [React](https://templates.extension.dev/react), [Vue](https://templates.extension.dev/vue), [Svelte](https://templates.extension.dev/svelte), [Preact](https://templates.extension.dev/preact), no lock-in |
| Custom Chromium and Gecko binaries | `--chromium-binary`, `--gecko-binary` |
Extension.js is sponsored by [extension.dev](https://docs.extension.dev/?utm_source=readme), the platform that hosts the build, share and store submission side of shipping an extension. To hand someone an unpublished build behind a link, with no zip and no install on their side, see [Share an unpublished build for review](https://docs.extension.dev/share/unpublished-build-for-review?utm_source=readme).
## Frameworks