collectFiles() skipped manifest.json unconditionally, and the final zip is
produced by calling collectFiles() on the built target dir — so both
dist/*.zip shipped with no manifest.json at all and could not be installed.
The per-target manifest was written into the dir correctly, then filtered
back out on the way into the archive.
Split the exclusion list: EXCLUDED_DIRS plus DEV_ONLY_FILES (manifest.json,
AGENTS.md, README.md, package.json, package-lock.json), and only apply the
latter when reading the repo root. Reading a built target keeps its
generated manifest.
Firefox zip: 26 files/1.84 MB (no manifest) -> 23 files/1.68 MB.
Chrome zip gains its manifest.json and background.chrome.js as before.