You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-`wingetcreate update --submit` in CI handles manifest generation; metadata is **inherited verbatim from the previous version's manifest in `microsoft/winget-pkgs`**. Once a bad field lands, every future submission propagates it — the rules below must be enforced by patching the PR, not by hoping `wingetcreate` will fix it.
46
+
WinGet submission is local because Microsoft's open-source enterprise limits classic PATs to eight days and WinGetCreate does not support fine-grained PATs. Never add a WinGet PAT back to GitHub Actions or pass a token with WinGetCreate's `--token` argument.
47
+
48
+
### New Windows Machine Setup
49
+
50
+
Run these commands once from the Whisperi repository:
-`wingetcreate token -s` starts GitHub's OAuth flow and stores the resulting credential in WinGetCreate's local cache for the current Windows user. If a browser, device code, or authorization prompt appears, the agent must pause and ask the user to approve it; never attempt to extract, print, or copy the cached credential.
58
+
- A successful setup prints `Token stored in cache successfully.` Repeat it only on a new machine/user profile, after the cache is cleared, or when GitHub revokes the authorization.
59
+
60
+
### Per-Release Submission
61
+
62
+
Only submit after the non-draft GitHub release and its signed x64 NSIS asset are public. Run preview first, then submit exactly once:
- If submission reports an authentication problem, refresh the cache with `wingetcreate token -s` and retry. Do not create a classic or fine-grained PAT.
70
+
-`scripts/submit-winget.ps1` handles manifest generation and submission with WinGetCreate's cached OAuth credential; metadata is **inherited verbatim from the previous version's manifest in `microsoft/winget-pkgs`**. Once a bad field lands, every future submission propagates it — the rules below must be enforced by patching the PR, not by hoping `wingetcreate` will fix it.
47
71
-**License**: SPDX identifier `MIT` (not `MIT License`), and include `LicenseUrl: https://github.com/xarthurx/whisperi/blob/main/LICENSE`. Copilot review flags `MIT License` as non-SPDX (precedent: [PR #376335](https://github.com/microsoft/winget-pkgs/pull/376335))
48
72
-**ShortDescription**: single concise phrase only (~one line); longer text goes in `Description`
49
73
-**`ReleaseDate`** in installer manifest is **valid** (schema 1.2.0+, see [installer schema 1.12.0](https://github.com/microsoft/winget-pkgs/blob/master/doc/manifest/schema/1.12.0/manifest.installer.1.12.0.json)) — Copilot has incorrectly flagged this as needing to move to the version manifest; don't move it
50
-
-**After every release tag**, when the CI-submitted winget PR appears under `microsoft/winget-pkgs`: open the generated `*.locale.en-US.yaml` and verify all four rules above before letting it merge. Push fixes onto the PR branch (`xarthurx.Whisperi-<version>-<uuid>` on `xarthurx/winget-pkgs`) — do not wait for the next version, since the next `wingetcreate` run will re-inherit whatever is in the latest accepted manifest.
74
+
-**After every local WinGet submission**, open the generated PR under `microsoft/winget-pkgs` and verify all four rules above before letting it merge. Push fixes onto the PR branch (`xarthurx.Whisperi-<version>-<uuid>` on `xarthurx/winget-pkgs`) — do not wait for the next version, since the next `wingetcreate` run will re-inherit whatever is in the latest accepted manifest.
51
75
- See [docs/PROGRESS.md](docs/PROGRESS.md) for full winget notes
1.**`release`** — Builds the NSIS installer via `tauri-apps/tauri-action@v0` and publishes it as a GitHub Release asset. Windows-only.
302
-
2.**`update-winget`** — Runs after `release`. Downloads `wingetcreate`, resolves the released x64 NSIS installer asset, and submits a manifest update PR for `xarthurx.Whisperi` to `microsoft/winget-pkgs`. Requires a `WINGET_CREATE_GITHUB_TOKEN` classic PAT with `public_repo` scope (≤ 90-day lifetime).
300
+
Triggered on version tags (`v*`). Its Windows `release` job builds and signs the NSIS/MSI installers via `tauri-apps/tauri-action@v0`, then publishes them with updater metadata as a GitHub Release.
303
301
304
-
The Winget step is in the same workflow (not a separate one) because `tauri-action` creates the release using `GITHUB_TOKEN`, and events from `GITHUB_TOKEN` do not trigger other workflows.
WinGet submission is deliberately separate from GitHub Actions. Microsoft's open-source enterprise limits classic PATs to eight days, while WinGetCreate does not support fine-grained PATs for cross-owner public-repository contributions. The release workstation uses WinGetCreate's cached OAuth login instead:
307
305
308
-
Manual-only (`workflow_dispatch`) backup for retries and backfills against an existing release tag.
The submission script resolves the published release through GitHub's public API, verifies there is exactly one x64 NSIS installer, generates the three manifests in a temporary directory, checks the inherited metadata and GitHub asset digest, then invokes `wingetcreate submit` without putting a token on the command line. The temporary directory is removed on success or failure.
309
313
310
314
### Key Dependencies
311
315
@@ -405,13 +409,15 @@ whisperi/
405
409
├── docs/
406
410
│ ├── ARCHITECTURE.md # This file
407
411
│ ├── CHANGELOG.md # Version history
408
-
│ └── CONTINUE.md # Short follow-up notes
412
+
│ ├── PROGRESS.md # Operational/release notes
413
+
│ └── TODO.md # Follow-up work
414
+
├── scripts/
415
+
│ └── submit-winget.ps1 # Local OAuth WinGet submission
Copy file name to clipboardExpand all lines: docs/CHANGELOG.md
+7Lines changed: 7 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,12 @@
1
1
# Changelog
2
2
3
+
## [Unreleased]
4
+
5
+
### Internal
6
+
7
+
- Moved WinGet publication out of GitHub Actions and into a local, cached-OAuth release script. The script resolves the published installer, generates manifests in temporary storage, validates their inherited metadata and asset hash, and submits without placing a personal access token on the command line. This avoids Microsoft's eight-day classic-PAT lifetime limit and prevents WinGet authentication from marking an otherwise successful app release as failed.
8
+
- Documented the complete new-machine and per-release WinGet procedure for future maintainers and coding agents: install WinGetCreate, authorize its local OAuth cache once, preview every generated manifest, submit once, and pause for the user whenever GitHub requires interactive authorization.
Copy file name to clipboardExpand all lines: docs/PROGRESS.md
+10-7Lines changed: 10 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,27 +2,30 @@
2
2
3
3
## Winget Submission
4
4
5
-
### Token
5
+
### Authentication
6
6
7
-
-`WINGET_CREATE_GITHUB_TOKEN` must be a **classic PAT** with `public_repo` scope and **≤ 90-day** lifetime (enforced by the `Microsoft Open Source` GitHub enterprise policy — applies to both classic and fine-grained PATs).
7
+
- WinGetCreate is installed locally through `winget install --id Microsoft.WingetCreate --exact`.
8
+
- Authenticate once on the release workstation with `wingetcreate token -s`. WinGetCreate keeps the OAuth credential in its local cache; no token is passed on the command line or stored in the Whisperi repository.
9
+
- Microsoft's open-source GitHub enterprise rejects classic PATs whose lifetime exceeds eight days. Fine-grained PATs are not a replacement because WinGetCreate and cross-owner public-repository contributions do not support them. The former `WINGET_CREATE_GITHUB_TOKEN` workflows were removed after this policy caused the v0.8.2 follow-up job to fail.
8
10
9
11
### Workflow
10
12
11
-
- Winget submission runs as the `update-winget` job in `release.yml`, triggered automatically after the build job on tag push (`v*`).
12
-
-`update-winget.yml` is kept as a manual-only (`workflow_dispatch`) backup for retries/backfills.
13
-
- The release is created by `tauri-action` using `GITHUB_TOKEN`, which does not trigger other workflows (GitHub security policy). That's why the Winget step is in the same workflow instead of a separate one.
13
+
-`.github/workflows/release.yml` only builds, signs, and publishes the GitHub release. A WinGet credential failure can no longer mark the application release as failed.
14
+
- After the release assets are public, preview the generated manifests with `powershell -ExecutionPolicy Bypass -File scripts/submit-winget.ps1 vX.Y.Z -Preview`.
15
+
- Submit with `powershell -ExecutionPolicy Bypass -File scripts/submit-winget.ps1 vX.Y.Z`. The script resolves the exact published release, requires one x64 NSIS asset, generates manifests in a temporary directory, verifies the package/version/URL/hash/release date/license metadata, and submits them using the cached OAuth credential.
16
+
- The script cleans its temporary output, so running it from the repository does not create untracked manifest files.
14
17
15
18
### wingetcreate Notes
16
19
17
-
`wingetcreate`(v1.12.8.0, framework-dependent, requires .NET 6) output is used as-is with `--submit`. Its `ReleaseDate` placement at the top level (outside `Installers`) looks wrong per the schema docs but is the convention winget-pkgs validation expects — do not move it inside the installer entry.
20
+
`wingetcreate` v1.12.8.0 generates the manifests locally, then its `submit` command publishes the validated directory. Its `ReleaseDate` placement at the top level (outside `Installers`) looks wrong per the schema docs but is the convention winget-pkgs validation expects — do not move it inside the installer entry.
18
21
19
22
**Do NOT use the self-contained wingetcreate** (`aka.ms/wingetcreate/latest/self-contained`) — it bundles v1.0.4.0, which generates schema 1.1.0 manifests instead of 1.10.0.
`wingetcreate update` inherits metadata from the previous version's manifest in winget-pkgs. Fix these once and they carry forward to all future versions:
-**ShortDescription** — Keep to a single concise phrase (e.g. `Lightweight Windows speech-to-text app.`). Move longer text to a separate `Description` field.
27
30
-**Locale metadata** — Include `PublisherUrl`, `PublisherSupportUrl`, and `PackageUrl` for storefront quality.
28
31
-**`ReleaseDate` in installer manifest** — Copilot flagged this as invalid, but it IS a valid field in the installer schema (added in 1.2.0+). `wingetcreate` generates it correctly. The PR was approved by a human reviewer — ignore this Copilot suggestion.
Copy file name to clipboardExpand all lines: docs/TODO.md
-2Lines changed: 0 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,5 @@
1
1
# TODO
2
2
3
-
-**Renew `WINGET_CREATE_GITHUB_TOKEN`** — classic PAT with `public_repo` scope, ≤ 90-day lifetime (Microsoft Open Source enterprise policy). Last set **2026-03-16**; renew by **2026-06-13**.
4
-
5
3
## Live mode stabilization
6
4
7
5
-[ ] Remove "(Beta)" label after 2 consecutive minor releases with zero Live-mode-related issues + multi-provider validation.
0 commit comments