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.