* [AI] DX: scope CI Lage cache key per job
The Lage cache key was shared across every job in the Build and Test
workflows. The `setup` job (a dependency that finishes first) runs no
Lage task, so it persisted an empty cache under the shared key; every
other job then saw the key already existed and skipped saving its real
cache. The next run restored that empty cache, causing a 100% cache miss.
Key the cache per job so each job restores and persists its own Lage
cache.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GsWzGLUnt9TWkmNVDiYTof
* [AI] DX: remove comment and shorten release note
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GsWzGLUnt9TWkmNVDiYTof
---------
Co-authored-by: Claude <noreply@anthropic.com>
* [AI] Fix CI Lage cache to target the real cache directory
The "Cache Lage" step in the shared setup action cached the repo-root
.lage directory, but Lage writes its build/test cache to
node_modules/.cache/lage. The configured directory was always empty
(the step even mkdir -p's it first), so the cache step did nothing and
Lage results only persisted incidentally inside the yarn.lock-keyed
node_modules cache, frozen between lockfile changes.
Point both the mkdir and the cache step at node_modules/.cache/lage so
the existing sha key + prefix restore-key actually roll the cache
forward: each run restores the most recent prior entry and saves a
fresh one, letting CI jobs/shards and reruns reuse earlier build/test
results.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013fQ9w27xTJdsb4Q9QUmHD9
* [AI] Address review: drop comment, use slug release note
Remove the explanatory comment from the Cache Lage step and rename the
release note to a descriptive slug with a shorter, user-facing body, per
the repo's release-note conventions.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013fQ9w27xTJdsb4Q9QUmHD9
---------
Co-authored-by: Claude <noreply@anthropic.com>
* [AI] Fix template injection in setup action's Lage cache step
The 'Ensure Lage cache directory exists' step expanded
${{ inputs.working-directory }} directly into the shell command via
format(), which zizmor flags as a code-injection risk. Pass the input
through an env var and reference it with shell expansion instead.
* [AI] Add release note for template injection fix
* [AI] Rename release note to match PR #7858
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Pull/push strings via Git instead of via API
This is necessary because the Weblate API doesn't handle stale strings
well. In particular, it won't remove them automatically.
* Schedule workflow instead of running on every commit
This is so we can minimize downtime for Weblate translations.
* Prevent pull requests modifying translations
* Don't commit translations during the merge freeze
* Add release notes
* Undo rename
* Don't commit translations nightly, per feedback
* Include translations just-in-time in builds
* Revert "Prevent pull requests modifying translations"
This reverts commit 8c19a0ce13.
* Re-ignore translations
* Update release notes to be accurate
* Create missing directory
* Fix conditional logic
* fix: translations were not being loaded properly
* fix: support running GitHub actions locally with `act`
* feat: upload new strings on master build
* Add release notes
* PR feedback: security
After #1115, new Node.js versions will be able to be used for
development of the frontend. This PR changes the recommended Node.js
version to 18 (the current LTS version). I have also tested with 16 and
20 and it works.
I also took the opportunity to:
- move the build script that was at the project root to the `bin/`
folder
- update the `browserslist` to target Electron 24 (which is the version
we currently build against). This results in a slightly smaller bundle
due to no longer having to transpile optional chaining.