Commit graph

34 commits

Author SHA1 Message Date
le king fu
2d4caecae8 fix(deps): resolve the quick-xml advisories, unyank deep-link and spin
All checks were successful
PR Check — Rust / rust (pull_request) Successful in 9m23s
The removal trigger #312 was written for had already fired — I filed the issue
without checking whether a newer plist existed. plist 1.10.0 ships quick-xml
0.41.0, which carries the fix, within tauri's existing bound:

    cargo update -p plist -> plist 1.8.0 -> 1.10.0
                             quick-xml 0.38.4 -> 0.41.0

So RUSTSEC-2026-0194 and -0195 are resolved rather than accepted, and leave
.cargo/audit.toml the day they entered it. rsa is now the only entry, and the
guard loops on that crate alone; its rationale comment is re-pointed
accordingly, since it was written entirely around quick-xml/plist.

Also bumps the two yanked crates (#313). tauri-plugin-deep-link 2.4.8 -> 2.4.9:
upstream's 2.4.9 is a single commit, "Fix broken iOS custom URL schemes", so
the defect behind the yank is iOS-only and never reached this desktop app —
v0.14.0 shipping 2.4.8 was not a user-facing problem, which is why neither
Security nor Fixed applies to it in the changelog. spin 0.9.8 -> 0.9.9; every
0.9.x up to 0.9.8 is yanked, which reads as a bulk yank rather than a defect.

The #310 changelog bullet is amended rather than contradicted: it sits in the
same unreleased section and would otherwise ship two opposing claims in the
same release notes. Two of its statements were wrong. It said three advisories
remained (now one), and it said tar sits on "real code paths in the shipped
app" — tar is compiled, but its vulnerable extraction path is only reached by
the AppImage and macOS installers this project does not bundle. The
rustls-webpki half stands: TLS runs on every update check.

ADR 0018's decision is untouched; an amendment header marks the passages that
are now historical, including the "override is impossible" alternative, which
plist 1.10.0 made false the same day.

cargo audit from the repo root: 0 vulnerabilities, warnings 23 -> 21 (the two
yanked ones). From src-tauri/ it reports 1 — that is the cwd sensitivity of
.cargo/audit.toml, not a regression. Guard: 2 checks + canary, exit 0.
cargo check + cargo test green (106 tests). Lock diff: 4 packages, 666 before
and after.

Resolves #312
Resolves #313

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 11:51:46 -04:00
le king fu
e3dc794a09 ci: make the suppression guard log every check, not just failures
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m54s
PR Check — Rust / rust (pull_request) Successful in 9m3s
The guard emitted nothing when it passed, so its success was indistinguishable
in the CI log from the step never running at all — the same silent-skip failure
mode it exists to catch, one level up. Confirmed on run 332: the job was green
and the log carried no trace of the step either way.

Each crate/target check and the canary now echo their result, followed by a
count and the exit code, so a reader can see the guard ran and what it proved.

Verified by extracting the run: block from the workflow and executing it
verbatim under bash -e: 4 checks, canary found, exit 0.
2026-07-27 20:00:09 -04:00
le king fu
f4b09b028e fix(deps): clear 6 reachable RustSec advisories, accept 3 unreachable ones
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m38s
PR Check — Rust / rust (pull_request) Successful in 8m40s
cargo update -p rustls-webpki -p tar moves rustls-webpki 0.103.9 -> 0.103.13
and tar 0.4.44 -> 0.4.46, both within the existing Cargo.toml bounds. They sit
under tauri-plugin-updater, which downloads and unpacks application updates, so
all six of their advisories were reachable in the shipped binary.

The remaining three can neither be fixed nor reached. quick-xml (2x 7.5 high)
is pulled by plist, which tauri only needs for Apple bundling: its per-target
trees are empty for both shipped targets and it appears solely under
x86_64-apple-darwin. Its fix is >= 0.41.0 while plist requires ^0.38, a
semver-incompatible boundary [patch.crates-io] cannot cross. rsa has no
published fix at all and is never compiled — its only parent is sqlx-mysql, an
artifact of sqlx's multi-backend graph on a SQLite project.

Leaving those three to red the daily gate forever would reproduce the signal
loss that #232 removed the `|| true` to fix, so they move into a versioned
.cargo/audit.toml. Entries are keyed by advisory ID, never by crate, so a new
advisory against the same crate still reds the gate; each carries its
reachability proof and its removal condition.

A blocking step in check-rust.yml re-proves that justification on every PR
touching src-tauri/ or .cargo/, and fails if a suppressed crate enters a
shipped target's graph — the scenario that would rot the list is itself a
src-tauri change. It separates cargo tree's exit status from its output (an
absent crate and a failed invocation both print nothing) and asserts a canary
crate is still found, so its silence proves something.

cargo audit: 9 vulnerabilities -> 0, warnings unchanged at 23
(cargo-audit 0.22.2, advisory-db 0bfde9d6 of 2026-07-27).
cargo check + cargo test green (106 tests); npm build + 871 vitest green.

Resolves #310

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 19:45:15 -04:00
le king fu
7779f7dc52 ci: ignore .claude/ in the frontend filter, drop stale check.yml ref
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m44s
PR Check — Rust / rust (pull_request) Successful in 9m6s
Follow-up on the review of #232:

- .claude/ is tracked (rules + skills) and cannot affect the frontend build,
  so a change confined to it no longer queues a 1m43s job for nothing.
- The release skill's pre-flight step named check.yml, which this PR deletes.
  The reasoning still holds — the check workflows only run on PRs, never on
  main, so a merged tip has never been seen by CI — only the filename moved.
  Its dated changelog entry is left alone.

Resolves #232
2026-07-24 21:02:12 -04:00
le king fu
263ebe1495 ci: split check.yml, drop dead caches, prebuild cargo-audit (#232)
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m43s
PR Check — Rust / rust (pull_request) Successful in 8m55s
The rust job cost 21m44s on every PR while only ~1 PR in 40 touches
src-tauri/, and the runner has capacity 1 — the frontend job queues behind
it, so every PR paid ~24.5 min of feedback.

Measured on run 326 (2026-07-21), 12m15s of that was pure waste:
- 6m54s tarring target/ and the cargo registry for saves that time out
  against the runner's unreachable cache server (#234). The restore times
  out into a miss too, so nothing was ever cached at either end.
- 4m41s recompiling cargo-audit from source on every run.
- ~40s on the two doomed restores.

Split check.yml into check-rust.yml (paths: src-tauri/**) and
check-frontend.yml (paths-ignore denylist), drop every actions/cache step
until #234 is fixed, and install cargo-audit as a prebuilt binary via
taiki-e/install-action. The audit step keeps continue-on-error — advisories
are informational and can land on unrelated crates — but loses the `|| true`
that also hid tooling failures; the install step is blocking.

The frontend filter is a denylist on purpose: that job costs ~2.5 min, so
running it needlessly is cheap while silently not running it is not. The
expensive job keeps a strict allowlist.

Neither workflow filters on `branches:` anymore. `branches: [main]` never
matched a PR stacked on another feature branch, which is what /autopilot
produces: PRs #305-#308 of the feature-gating milestone ran no CI at all.

Adds audit.yml for daily RustSec coverage, since check-rust.yml now only
runs on Rust PRs. It skips the Rust toolchain entirely — cargo-audit only
reads Cargo.lock — so it costs ~1-2 min rather than the ~22 a scheduled
check-rust would burn daily on a capacity-1 runner.

The GitHub mirror is left untouched (#233: it receives no PRs).

Expected: Rust PR ~9-10 min, frontend-only PR ~2.5 min instead of ~24.5.

Resolves #232
2026-07-24 20:26:35 -04:00
le king fu
af36b51cf7 chore(ci): drop redundant push trigger; add concurrency group
All checks were successful
PR Check / rust (pull_request) Successful in 22m29s
PR Check / frontend (pull_request) Successful in 2m26s
The `push` + `pull_request` combo doubled CI runs on every PR (visible
on #170 with 4 pending checks instead of 2). Drop `push`, keep
`pull_request: branches: [main]`.

Trade-off: branches pushed without an open PR no longer get CI
feedback. Open a draft PR if you want CI to run before requesting
review — `/fix-issue` always opens a PR right after pushing, so the
gap is essentially zero in practice.

Also adds a concurrency group `ci-${{ github.ref }}` with
cancel-in-progress so force-pushes cancel the previous run instead
of stacking.

Same change applied to .github/workflows/check.yml (GitHub mirror)
to keep the two configs in sync.

Fixes #171
2026-04-28 20:50:34 -04:00
le king fu
481018e1e3 ci: install libdbus-1-dev for keyring build, drop appimage target (#79)
All checks were successful
PR Check / rust (push) Successful in 23m16s
PR Check / frontend (push) Successful in 2m17s
PR Check / rust (pull_request) Successful in 21m37s
PR Check / frontend (pull_request) Successful in 2m10s
The new token_store module (#78) depends on `sync-secret-service` via
`dbus-secret-service`, which in turn links to libdbus-1 at build time
through the `dbus` crate. Add `libdbus-1-dev` to:

- `check.yml` rust job (alongside the existing webkit/appindicator
  system deps), so every PR run compiles the keyring backend.
- `release.yml` Linux deps step, so tagged builds link correctly.

Runtime requires `libdbus-1-3`, which is present on every desktop
Linux distro by default, so `.deb` / `.rpm` depends stay unchanged.

Also add a non-blocking `cargo audit` step to check.yml to surface
advisories across the transitive dep graph (zbus, dbus-secret-service,
etc.) without failing unrelated PRs.

Drop `appimage` from `bundle.targets` in tauri.conf.json: the release
workflow explicitly builds `--bundles deb,rpm` so AppImage was never
shipped, and its presence in the config risks a silent fallback to
plaintext token storage for anyone running `tauri build` locally
without libsecret/libdbus bundled into the AppImage. No behaviour
change for CI; follow-up to re-enable AppImage properly would need a
linuxdeploy workflow that bundles the backend.

Refs #66

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:27:14 -04:00
le king fu
60bf43fd65 fix(ci): install Node.js in the rust job
All checks were successful
PR Check / rust (push) Successful in 15m32s
PR Check / frontend (push) Successful in 2m24s
PR Check / rust (pull_request) Successful in 15m44s
PR Check / frontend (pull_request) Successful in 2m33s
actions/checkout@v4 and actions/cache@v4 are JavaScript actions and
require `node` in the container PATH. The rust job in check.yml only
installed system libs and the Rust toolchain, so the post-checkout
cleanup failed with `exec: "node": executable file not found in $PATH`
on every Forgejo run.

The frontend job already installed Node, which is why it succeeded.
The GitHub mirror is unaffected because ubuntu-latest ships with Node
preinstalled.

Validated against the failed run https://git.lacompagniemaximus.com/maximus/Simpl-Resultat/actions/runs/122
2026-04-09 09:44:24 -04:00
le king fu
8e5228e61c ci: add PR validation workflow (#60)
Some checks failed
PR Check / rust (push) Failing after 2m2s
PR Check / frontend (push) Successful in 2m10s
PR Check / rust (pull_request) Failing after 1m32s
PR Check / frontend (pull_request) Successful in 2m8s
Adds .forgejo/workflows/check.yml (and a GitHub mirror) that runs on
every branch push (except main) and on every PR targeting main.

Two parallel jobs:
- rust: cargo check + cargo test, with cargo registry/git/target caches
  keyed on Cargo.lock. Installs the minimal Rust toolchain and the
  webkit2gtk system deps that the tauri build script needs.
- frontend: npm ci + npm run build (tsc + vite) + npm test (vitest),
  with the npm cache keyed on package-lock.json.

The Forgejo workflow uses the ubuntu:22.04 container pattern from
release.yml. The GitHub mirror uses native runners (ubuntu-latest)
since the GitHub mirror exists for portability and uses GitHub-native
actions.

Documents the new workflow in CLAUDE.md alongside release.yml so future
contributors know what CI runs before merge.
2026-04-09 09:21:20 -04:00
le king fu
d23fcd6bdb Add bilingual changelog page and file-based release notes
- Create CHANGELOG.fr.md with full French translation of all versions
- Add ChangelogPage (/changelog) accessible from Settings
- Replace hardcoded i18n release notes with file-based approach:
  loads CHANGELOG.md or CHANGELOG.fr.md based on user language
- CI copies changelogs to public/ during release build
- Update CLAUDE.md with bilingual changelog deployment process (fixes #10)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 14:58:54 -05:00
le king fu
fc906d6d55 Fix CI: use PACKAGE_TOKEN for package registry operations
The automatic GITHUB_TOKEN does not have package permissions in Forgejo.
Use a dedicated PACKAGE_TOKEN secret with the package scope instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:23:13 -05:00
le king fu
efb922eb0e Fix CI: use correct API v1 endpoint for package registry deletion
The DELETE endpoint for Forgejo generic packages is /api/v1/packages/
while the upload (PUT) endpoint is /api/packages/. Using the wrong
endpoint caused silent failures, leaving stale latest.json in the
registry. Also fail the CI step explicitly on upload failure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 16:01:50 -05:00
le king fu
4030cc90b2 Fix package registry: use correct DELETE endpoint for generic packages
All checks were successful
Release / build-and-release (push) Successful in 26m43s
Forgejo generic package API uses /api/packages/ not /api/v1/packages/
for both upload and deletion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 14:29:28 -05:00
le king fu
c777dbb7b8 Fix CI: delete existing release before creating a new one
All checks were successful
Release / build-and-release (push) Successful in 26m38s
Prevents "Release has no Tag" error when re-running a build for
a tag that already has a release.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 12:38:08 -05:00
le king fu
e3992298f0 Fix package registry publish: use correct API v1 endpoint for deletion
Some checks failed
Release / build-and-release (push) Failing after 26m30s
The DELETE was using the upload URL instead of the API v1 package
endpoint, so old versions were never actually deleted, causing 409
on re-upload and leaving stale latest.json.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:55:00 -05:00
le king fu
457dbce6c2 Fix CI: pass changelog notes via env var instead of inline interpolation
All checks were successful
Release / build-and-release (push) Successful in 26m43s
The ${{ steps.changelog.outputs.notes }} expression was being interpolated
directly into shell commands, causing parse errors when the changelog
contained special characters, markdown, or backticks.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:06:10 -05:00
le king fu
d604d5ae63 Fix updater latest.json and add log viewer in settings
Some checks failed
Release / build-and-release (push) Has been cancelled
Fix updater: strip v-prefix from version in latest.json, and delete
old package before re-uploading to avoid 409 conflicts.
Add frontend log capture (console intercept) with a log viewer card
in the settings page (filterable, copyable, clearable).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 21:09:10 -05:00
le king fu
f126d08da3 Fix CI: skip AppImage (needs FUSE), build deb+rpm only
Some checks failed
Release / build-and-release (push) Has been cancelled
linuxdeploy cannot run inside Docker containers even with
APPIMAGE_EXTRACT_AND_RUN. Use --bundles deb,rpm instead.
Update latest.json to use .deb for linux-x86_64 platform.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 16:42:51 -05:00
le king fu
b34527730d Fix AppImage build in Docker: set APPIMAGE_EXTRACT_AND_RUN=1
Some checks failed
Release / build-and-release (push) Failing after 17m29s
linuxdeploy needs FUSE which is unavailable in containers.
This env var makes it extract instead of mounting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 16:13:14 -05:00
le king fu
90f095a8cf Fix CI container: set global PATH for cargo/node across steps
Some checks failed
Release / build-and-release (push) Failing after 18m25s
Docker container steps don't share shell state. Set PATH at job level
to include /root/.cargo/bin and remove per-step source cargo/env.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:52:11 -05:00
le king fu
9ab8d3d7df Fix glibc compat: build in Ubuntu 22.04 container (glibc 2.35)
Some checks failed
Release / build-and-release (push) Failing after 27s
The Forgejo runner's default image uses glibc 2.39, which produces
binaries incompatible with Pop!_OS / Ubuntu 22.04 (glibc 2.35).
Build inside container: ubuntu:22.04 with Node.js and Rust installed.
Bump to v0.4.4.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 21:46:31 -05:00
le king fu
3302d79c38 Fix updater: use Forgejo package registry for stable latest.json URL
Some checks failed
Release / build-and-release (push) Has been cancelled
- Forgejo has no /releases/latest/download/ route (GitHub-specific)
- Upload latest.json to generic package registry for a stable endpoint
- Fix Linux signature collection: use .AppImage.sig (not .tar.gz.sig)
- Collect all platform signatures (.deb.sig, .rpm.sig, .AppImage.sig)
- Bump to v0.4.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 21:10:50 -05:00
le king fu
e3ecfce34c Fix Windows cross-compile: remove --bundles flag unsupported on Linux host
All checks were successful
Release / build-and-release (push) Successful in 20m28s
Tauri CLI filters --bundles values by host OS. The nsis target is already
configured in tauri.conf.json and auto-selected for Windows targets.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 20:40:41 -05:00
le king fu
b97a80d8b9 Release v0.4.2: Windows cross-compile via cargo-xwin + updater trampoline
Some checks failed
Release / build-and-release (push) Failing after 15m4s
- Add Windows cross-compile (cargo-xwin) to Forgejo CI workflow
- Add libsqlite3-sys bundled for cross-compile compatibility
- Switch updater endpoint from GitHub to self-hosted Forgejo
- Collect Windows NSIS assets and include windows-x86_64 in latest.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 20:23:25 -05:00
le king fu
530c556e95 Fix Forgejo CI: URL-encode filenames with spaces for upload
Some checks failed
Release / build-and-release (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 21:26:40 -05:00
le king fu
66b25dd707 Fix Forgejo CI: add verbose upload logging and timeout
Some checks failed
Release / build-and-release (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 21:11:54 -05:00
le king fu
7b9ab383bc Regenerate signing keys with password
Some checks failed
Release / build-and-release (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 20:57:07 -05:00
le king fu
8fdc693f1a Fix Forgejo CI: set empty signing password explicitly
Some checks failed
Release / build-and-release (push) Has been cancelled
Tauri requires TAURI_SIGNING_PRIVATE_KEY_PASSWORD to be defined,
even when the key has no password.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 20:36:19 -05:00
le king fu
a07f1e4ab5 Fix Forgejo CI: remove signing password env var
Some checks failed
Release / build-and-release (push) Has been cancelled
Key was generated without a password.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:23:28 -05:00
le king fu
3acd1e0173 Fix Forgejo CI: add xdg-utils for AppImage bundling
Some checks failed
Release / build-and-release (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 19:01:20 -05:00
le king fu
7717b70e77 Fix Forgejo CI: add build-essential and libssl-dev
Some checks failed
Release / build-and-release (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:46:19 -05:00
le king fu
3361e52541 Fix Forgejo CI: use direct shell commands instead of GitHub Actions
Some checks failed
Release / build-and-release (push) Has been cancelled
Replace dtolnay/rust-toolchain, actions/setup-node, and swatinem/rust-cache
with shell commands since they are not mirrored on code.forgejo.org.
Use https://github.com/ prefix for checkout action.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:41:48 -05:00
le king fu
6771efd0b0 Simplify Forgejo CI to Linux-only build
Some checks failed
Release / build-and-release (push) Has been cancelled
Remove Windows job (no Windows runner available) and merge
build + release into a single job.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:38:29 -05:00
le king fu
640caf2617 Add Forgejo CI/CD workflow and sync versions
Some checks failed
Release / build-linux (push) Failing after 6s
Release / build-windows (push) Has been cancelled
Release / release (push) Has been cancelled
- Add .forgejo/workflows/release.yml for Forgejo Actions
- Update signing pubkey for new key pair
- Sync Cargo.toml version to 0.4.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 07:14:05 -05:00