Files
edgeever/docs/extension-store.md
T

101 lines
4.7 KiB
Markdown

# Web Clipper store submission
Chrome, Edge, and Firefox listings are submitted by the official repository
workflow **Submit Web Clipper**. This is separate from `bun run release`.
A stable GitHub Release triggers the store workflow asynchronously. Store
submission does not block the GitHub Release, and review does not change it.
The extension has its own version in `apps/extension/package.json`, independent
of the main app version in the root `package.json`. For an extension-only release,
merge the change, then run the workflow manually on `main` with `release_tag`
left empty. A new GitHub Release for the main app is not required.
Edge users install the Chrome Web Store item
`gjadpfmanienmlofajibkfkkpfdkclgo`. One Chrome submission covers that item.
Firefox is a separate submission for `edgeever-web-clipper`. The workflow does
not publish to Microsoft Edge Add-ons.
The workflow builds the packages, uploads them, and submits them for review.
It does not approve the listing. Users stay on the last approved version until
Chrome and Mozilla each finish review. An uploaded version number cannot be
reused. Increase `apps/extension/package.json` before submitting changes.
Before either store is contacted, the command extracts the Firefox review source
ZIP into a clean directory, installs with the frozen lockfile, and rebuilds it.
Every output file must match the submission build by SHA-256; a mismatch stops
the command. The archive includes the shared Web UI components the extension
imports. Build CI watches these dependencies and runs the same rebuild check.
Both workflows use the Bun version from the checked-out root `package.json`.
## Run it
On https://github.com/tianma-if/edgeever/actions/workflows/extension-store.yml,
choose **Run workflow**. Leave the Firefox notes empty for a one-line version
note, or paste the notes Mozilla should show. `dry_run` builds the packages
and stops before calling either store.
The same command runs locally after the credentials below are available in the
environment:
```sh
bun run publish:extension -- --dry-run
bun run publish:extension -- --notes "What changed."
```
`--platform chrome` or `--platform firefox` retries one store. A Chrome
version that is already awaiting review is left in place. A Firefox version
that is awaiting review and has no source archive receives the source archive
on the next run.
The Actions log and Summary report each store separately: submission action,
API state, confirmed public version (when available), failure stage, and the
API's detailed error response or warnings. `submitted` / `already-submitted`
mean review submission, not publication; `STAGED` means approved but awaiting
publication. Only an API-confirmed public version or `PUBLISHED` state is
reported as published. The run does not wait for later review results.
Diagnostics redact credentials and private review notes; large error responses
are explicitly truncated. If the API returns only a generic error, use the
linked developer dashboard for requirements that the API does not expose.
After fixing a store-specific issue, retry only that platform.
## Credentials
Add these Actions secrets to `tianma-if/edgeever`. Forks do not run the job.
Chrome accepts either a service account or a refresh token. The service
account does not expire every few days:
1. In Google Cloud, enable the Chrome Web Store API and create a service
account. Do not grant it extra project roles.
2. In the Chrome Web Store developer dashboard, under Account, add that
service account email. The publisher can register one service account.
3. Create a JSON key and store the whole file as
`CHROME_WEB_STORE_SERVICE_ACCOUNT_JSON`.
The refresh-token alternative uses `CHROME_WEB_STORE_CLIENT_ID`,
`CHROME_WEB_STORE_CLIENT_SECRET`, and `CHROME_WEB_STORE_REFRESH_TOKEN` for
scope `https://www.googleapis.com/auth/chromewebstore`. The Google account
needs 2-Step Verification. An OAuth client left in testing expires its refresh
token after seven days, so publish the consent screen or use the service
account.
Firefox uses an API key from
https://addons.mozilla.org/developers/addon/api/key/:
- `AMO_JWT_ISSUER`
- `AMO_JWT_SECRET`
These two optional secrets are added to the Firefox reviewer note:
- `EDGE_EVER_REVIEW_INSTANCE_URL`
- `EDGE_EVER_REVIEW_API_TOKEN`
Chrome's upload API has no release-notes field. The Chrome listing text and
privacy disclosure stay as they were last saved in the dashboard. Change those
in the dashboard when the permissions or the public description change.
Firefox receives the workflow notes as `en-US` release notes, plus the build
steps from `apps/extension/SOURCE_BUILD.md`.
The current Firefox listing uses license `AGPL-3.0-only`. The workflow sends
that license with every version.