* feat(whats-new): remote release notes with dev workspace mode
Add WHATS_NEW.md, CI whats-new.md asset upload, and client fetch/cache
with embedded fallbacks. Dev and -dev builds read the full file from the
repo for debugging; RC/stable download the release asset on first use.
* fix(whats-new): render ## headings and add changelog tab
Parse h2 sections in release-notes markdown; load changelog alongside
highlights and let users switch views on the What's New page.
* fix(whats-new): prefetch on startup and fix CI typecheck prebuild
Prefetch whats-new asset when the shell loads on RC/stable builds.
Run prebuild:release-notes before tsc and coverage jobs so the
gitignored generated bundle exists in CI.
* docs: CHANGELOG and credits for What's New remote notes (PR #1058)
* fix(whats-new): always slice embedded release notes to current line
Drop full CHANGELOG embed for -dev bundles; tauri:dev still reads live
markdown from the repo. Ignore all of src/generated/ in git.
* fix(whats-new): fetch release asset via Rust to bypass CORS
Route whats-new.md download through fetch_url_bytes; rename the
technical tab label; add fetch unit tests (PR #1058 review).
Extend sync-tauri-version-from-package.js to align psysonic* crate
version fields in Cargo.lock with package.json. Include the lockfile in
promote and post-release main-bump commits. Fixes drift where lock stayed
on the previous -dev while Cargo.toml already matched the channel bump.
* feat(licenses): tooling and initial data generation
Adds the maintainer-only generator that produces src/data/licenses.json:
- src-tauri/about.toml + about.hbs: cargo-about config + handlebars template
for the Rust-side license enumeration
- scripts/generate-licenses.mjs: orchestrator that runs cargo-about and
license-checker-rseidelsohn (via npx, no devDep), merges the outputs into
a single per-crate JSON with full license texts, and writes the result to
src/data/licenses.json
The script is invoked directly with `node scripts/generate-licenses.mjs` —
no npm script wrapper on purpose, since adding one to package.json would
trigger the nix-npm-deps-hash-sync workflow on every push.
Initial generation covers 575 cargo crates + 71 npm packages (646 entries
total, all with full license text bundled, ~1.4 MB JSON).
* feat(licenses): Settings panel UI
Adds a new Open Source Licenses section under Settings → System,
sitting below Contributors. Components:
- LicensesPanel.tsx: search input, curated highlight block of ~10 key
dependencies (Tauri, React, rodio, symphonia, etc.), TanStack-Virtual
list of all 600+ entries
- LicenseTextModal.tsx: full-screen-ish modal showing the bundled license
text plus name/version/license-id badges + repository link
- licensesData.ts: lazy dynamic-import loader (Vite emits the JSON as a
separate chunk, so the heavy ~1.4 MB payload is only loaded when the
user actually opens the panel — no runtime fetch, the data is fixed
into the build artifact)
The panel registers itself in the Settings in-page search index under
the System tab.
* feat(licenses): i18n in 8 locales
Adds the `licenses` namespace (title, intro, highlights, search
placeholder, no-results, loading / load error, no-license-text,
view-source, total line, generated-at) across en, de, fr, nl, zh, nb,
ru, es. License names themselves (MIT, Apache-2.0, GPL-3.0, …) stay
universal and are rendered as-is.
* docs(release): document licenses regeneration step
Adds a Step A.3 to the release SOP describing the maintainer-only
`node scripts/generate-licenses.mjs` workflow, the cargo-about
prerequisite, and explicitly notes why no npm script wrapper exists
(would trigger the nix-npm-deps-hash-sync workflow).
* ci(release): gate promote-main on explicit main checks
Add an always-on ci-main workflow that produces a stable check name, and validate that check via check runs (not branch protection APIs). Wire promote-main-to-next to require ci-main / ci-ok and document the required check in the release SOP.
* ci(release): accept ci-ok or UI-style name in main promote gate
GitHub check run names for normal workflows are often the job name only;
keep optional match for the UI-style workflow/job label. Drop unused
statuses:read permission.
Made-with: Cursor
* ci(release): split channel pipelines and automate version transitions
Introduce dedicated next/release orchestration workflows backed by a reusable publish pipeline with RC/final package version updates and post-release main dev bump PRs. Add a strict release process SOP with RC freeze, hotfix override, and mandatory backport rules.
* ci(release): gate main-to-next promotion on green CI
Add a dedicated workflow that validates main branch checks/statuses and block the promote-main-to-next flow unless main is green. Update the release SOP to reflect the enforced pre-promotion validation.
* ci(release): fix channel promotion edge cases and policy gaps
Switch channel promotions to reset-based snapshots with force-with-lease pushes, stop auto-merging channel nix-refresh PRs, and guard main dev bump against version downgrades. Add RC changelog fallback, require AUR release updates in SOP, and extend npmDepsHash sync to main/next/release pushes.
* docs(release): clarify backport and nix refresh survivability rules
Require RC fix backports to reach main before the next main-to-next promotion, and document that channel-local nix refresh PRs are advisory unless equivalent changes are merged into main.