## Summary
Adds GitCode Release mirroring for AIRI release assets.
- Adds a reusable `.github/scripts/publish-gitcode-release.sh` helper
that creates or reuses the matching GitCode release, compares GitHub and
GitCode asset names, downloads only missing `AIRI-*` and `latest-*.yml`
assets, uploads them through GitCode's upload URL API, and verifies the
final asset list.
- Hooks the mirror step into desktop, Android, and iOS release workflows
so assets produced by separate release jobs can converge on the same
GitCode release.
- Keeps the mirror idempotent so repeated or concurrent release
workflows skip already mirrored files.
## Why
GitHub Releases are slow for many mainland China users. GitCode provides
a domestic fallback release page, but manually copying installers after
every release is error-prone and tedious.
## Validation
- `bash -n .github/scripts/publish-gitcode-release.sh`
- YAML parsing for:
- `.github/workflows/release-tamagotchi.yml`
- `.github/workflows/release-pocket-android.yml`
- `.github/workflows/release-pocket-ios.yml`
- `git diff --check -- .github/scripts/publish-gitcode-release.sh
.github/workflows/release-tamagotchi.yml
.github/workflows/release-pocket-android.yml
.github/workflows/release-pocket-ios.yml`
- Local idempotency check against existing `v0.10.1` GitHub/GitCode
releases:
- GitCode release already exists
- all mirrored assets already present
- final asset verification passed
## Setup Required
The target repository needs these GitHub Secrets:
- `GITCODE_TOKEN`
- `GITCODE_OWNER`
- `GITCODE_REPO`
For the current GitCode project, `GITCODE_OWNER` should remain `MoeruAI`
because GitCode's API and release download paths currently resolve that
namespace even though the UI displays `moeru-ai`.
## Summary
- change the sponsors workflow to create or update a generated-assets PR
instead of pushing directly to `main`
- publish generated SponsorKit assets to
`automation/update-sponsors-svg`
- use the existing `PAT_SLASH_COMMAND_DISPATCH` token when available so
the generated PR can trigger downstream checks, with `github.token` as a
fallback
## Why
The sponsors generation step now succeeds, but direct pushes to `main`
are rejected by repository rules because required checks are expected. A
PR-based update path keeps generated assets behind the normal branch
protection flow.
## Verification
- `ruby -e 'require "yaml";
YAML.load_file(".github/workflows/sponsors-svg.yml"); puts "yaml ok"'`
- `ruby -e 'require "yaml";
wf=YAML.load_file(".github/workflows/sponsors-svg.yml");
run=wf.fetch("jobs").fetch("generate").fetch("steps").find { |s|
s["name"] == "Create or update sponsors PR" }.fetch("run");
IO.popen(["bash", "-n"], "w") { |io| io.write(run) }; abort "bash -n
failed" unless $?.success?; puts "bash syntax ok"'`
- `git diff --check`
- `pnpm install --frozen-lockfile --ignore-scripts`
- `pnpm exec moeru-lint .github/workflows/sponsors-svg.yml` (workflow
file is ignored by repo lint config; command exited 0 with ignored-file
warning)
## Summary
- Repair two stale Vitest lockfile references left after the current
main branch merge state.
- Restore `pnpm install --frozen-lockfile` so scheduled workflows can
reach their actual jobs.
## Testing
- `pnpm install --frozen-lockfile --ignore-scripts`
- `git diff --check`
## Context
The manually triggered `Update Sponsors SVG` workflow failed before
SponsorKit ran because `pnpm install --frozen-lockfile` could not find
the lockfile entry for a Vitest peer snapshot.
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
## Summary
- keep the AtomGit/GitCode acknowledgement only in the Simplified
Chinese README
- remove the same acknowledgement from other translated README files
## Checks
- `git diff --check upstream/main...HEAD`
## Summary
- add AtomGit to the README acknowledgements across all translated
README files
- keep the mention in acknowledgements instead of the top project
intro/download area
## Checks
- `git diff --check -- README.md docs/README.zh-CN.md
docs/README.ja-JP.md docs/README.ru-RU.md docs/README.vi.md
docs/README.fr.md docs/README.ko-KR.md`
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* perf(vishot-runner-electron): compress and downscale AVIF screenshots
The capture pipeline was emitting AVIF at default quality with no
resolution cap, so 4K displays produced ~800KB per screenshot (~42MB
total for the tamagotchi manual). Add quality 50, speed 6, and a
1920px max-width downscale — expected output drops to ~20-40KB each
with no visible quality loss for UI documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* perf(docs): regenerate manual screenshots with compression
Re-capture all 27 tamagotchi manual screenshots using the new AVIF
pipeline settings (quality 50, max-width 1920px, speed 6).
Before: ~800KB per image, ~42MB total (4K @ default quality)
After: ~15-38KB per image, ~1MB total (1920px @ quality 50)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By-Agent: Claude Opus 4.6 <noreply@anthropic.com>
The ACT JSON format documentation in locale files contained unescaped curly braces, which caused vue-i18n compilation to fail with 'SyntaxError: 2'. This commit escapes these characters to fix the production build.