| name | release-resonite |
| description | Use when cutting a ResoniteIO release â bump version, tag, and publish the Thunderstore mod + PyPI package, or doing the one-time release setup. Triggers: 'ãªãªãŒã¹', 'release', 'publish', 'tcli', 'thunderstore publish', 'ããŒãžã§ã³ãäžãã', 'tag ãæã€', 'PyPI å
Ž', 'just mod-pack', 'TCLI_AUTH_TOKEN', 'Trusted Publisher'. |
| version | 0.1.0 |
Release ResoniteIO (tag-driven dual publish)
ResoniteIO ã 1 ã€ã® tag ã§ mod zip (GitHub Release ã«æ·»ä») ãš PyPI ããã±ãŒãž (resoio) ãåæå
¬é ãã
ããã®æé skillãæ£èŠã® runbook 㯠RELEASE.mdãæ¬ skill ã¯ãããè¡åå¯èœãªèŠçŽã«ãããã®ã
é
åžçµè·¯ (éèŠ): Thunderstore upload ã¯ åæ¢äž (ããã±ãŒãžéæ¿èª + layout äžäžèŽã®ãã)ãé
åžã¯
GitHub Release ã®ã¿ãmod 㯠Import > Local mod... ã§ Gale ã«å
¥ãããpublish.yml ã®
publish-thunderstore ãžã§ãã¯å°æ¥åéçšã« ã³ã¡ã³ãã¢ãŠãæ®çœ®ãmod zip 㯠PackTS (tcli) ã§
ãã«ã ãç¶ã GitHub Release ã«æ·»ä»ãã (tcli / thunderstore.toml ã¯ãã® zip çæã«å¿
èŠ)ã
- æ£èŠããŒãžã§ã³ = csproj
<Version> (mod/src/ResoniteIO/ResoniteIO.csproj)ãpython/pyproject.toml 㯠lockstepã
- ãªãªãŒã¹ã¯
v* tag ã® push ã§ .github/workflows/publish.yml ãçºç«ãããã
- ãªãªãŒã¹ããŒãã®ãœãŒã¹ã¯
CHANGELOG.md (Keep a Changelog 圢åŒ)ã
- mod zip namespace (zip å
mlshukai-ResoniteIO-X.Y.Z.zip) = mlshukai (thunderstore.toml)ã
1. ãªãªãŒã¹ãåã (cut a release)
1-1. æºåãã©ã³ãã§ bump (version 㯠3 ç®æ lockstep)
git switch -c chore/$(date +%Y%m%d)/release-vX.Y.Z main
just bump-version X.Y.Z (container å
ãscripts/bump-version.sh) â csproj <Version> /
pyproject.toml ã® version / uv.lock ã® 3 ãã¡ã€ã«ã lockstep ã§ bump ãã
CHANGELOG.md ã« ## [X.Y.Z] - YYYY-MM-DD ã»ã¯ã·ã§ã³ã远å (## [Unreleased] ã確å®çã«ç§»ã)ã
æ«å°Ÿã® link reference definitions ãå¿ãã远å ãã ([X.Y.Z]: https://github.com/MLShukai/ResoniteIO/releases/tag/vX.Y.Z ãš [unreleased]: ...compare/vX.Y.Z...HEAD)ã
ãããç¡ããš mdformat ãèŠåºãã ## \[X.Y.Z\] ã«ãšã¹ã±ãŒããã§2-4 ã® changelog æœåº (## \[X.Y.Z\] regex) ã倱æã㊠Release ããŒãã generic 㪠"Release X.Y.Z" ã«ãã©ãŒã«ããã¯ãããKeep a Changelog æ
£ç¿ã©ããå
š version åã® [version]: url ãæããã
çµµæåã»ã¯ã·ã§ã³èŠåºãèŠçŽ: ã«ããŽãªèŠåºã㯠### âš Added / ### ð§ Changed / ### ðïž Removed / ### ð Fixed / ### ð Security / ### â ïž Deprecated ã®çµµæåä»ãã§æžããbreaking change ã¯æ¬æå
é ã« ð¥ Breaking: ããŒã«ãŒãä»ããã## [X.Y.Z] ã® version èŠåºãã«ã¯çµµæåãä»ããªã (äžèšæœåº regex ãå£ããªããã)ãpolish/æŽåœ¢ã¯ docstring-author agent ã«å§è²ã§ããã詳现㯠feedback_changelog_emoji_convention.md
just run (formatâgen-protoâbuildâtestâtypeâcheck-renderer-prebuilt) ã green ã«ãªããŸã§åãã
æ«å°Ÿã® check-renderer-prebuilt ãèœã¡ãã Camera v2 Renderer prebuilt ã staleãResonite ã®ããããŒã«ã«ã§
just renderer-prebuild â mod/prebuilt/ ã®å·®åã commit ãã (§7 ã® prebuilt note åç
§)ãCI ã§ã¯ rebuild ã§ããªãã®ã§
ããã§æããŠãããªããš publish.yml ã® build job ã drift guard ã§ fail ãã
- PR ãåºã (
github-ops skill ã® gh pr create HEREDOC)ãmain ãžã®ããŒãžã¯ãŠãŒã¶ãŒãå®è¡
1-2. release ãã©ã³ã + tag
git switch -c release/X.Y main
git push -u origin release/X.Y
git switch release/X.Y
git tag vX.Y.Z
git push origin vX.Y.Z
main ãžã®çŽæ¥ push çŠæ¢èŠçŽã¯å®ã (tag 㯠release/X.Y ãæããã®ã push ãã)ãé²æã¯ gh run watch ã§è¿œãã
2. publish.yml ã®ãžã§ã
äŸåã°ã©ã: build â publish-pypi â github-release (Thunderstore upload 忢äž)ã
build ãå¯äžã® publish åã²ãŒããpublish-thunderstore ãžã§ãã¯ã³ã¡ã³ãã¢ãŠãæ®çœ®ã§å®è¡ãããªãã
- build â version guard (tag
X.Y.Z == csproj <Version> == pyproject.toml version ãæ€èšŒ)
â Renderer prebuilt drift guard (mod/prebuilt/renderer.sha256 == scripts/renderer-prebuilt-hash.sh ã®åèšç®å€ãæ€èšŒã
Camera v2 Renderer plugin 㯠UnityEngine.CoreModule éåé
åžã§ CI build äžå¯ã®ãããcommitted prebuilt
mod/prebuilt/renderer/ ããã®ãŸãŸ zip 忢±ãããä¹é¢ããŠããã stale ãšã㊠fail)
â .github/scripts/fetch-interprocesslib.sh ã§ InterprocessLib ã Thunderstore ããååŸ (CI ã«ã¯
Gale ãããã¡ã€ã«ãç¡ã NuGet fallback ãç¡ããããPackTS ã® mod compile ã«å¿
é )
â dotnet build mod/src/ResoniteIO/ResoniteIO.csproj -c Release -t:PackTS ã§ mod zipãuv build ã§ python sdist/wheelã
Collect artifacts ã§ zip ãåºå®å ResoniteIO.zip ã«ãã³ã㌠(latest URL çš)
- publish-thunderstore (忢äžã»ã³ã¡ã³ãã¢ãŠãæ®çœ®) â åéæã¯ fetch-interprocesslib.sh +
tcli publish
(secret TCLI_AUTH_TOKENã-p:PublishTS=true -p:TcliToken=...)
- publish-pypi â PyPI Trusted Publishing (OIDC)ãGitHub environment
pypiãtoken ãªã
- github-release â
CHANGELOG.md ã® ## [X.Y.Z] ãæœåºã㊠Release ããŒãåãmod zip (versioned + åºå®å ResoniteIO.zip) + python dists ãæ·»ä»
3. ãã¬ãªãªãŒã¹ç (alpha / beta / rc)
Thunderstore upload 忢äžã®çŸç¶ã§ã¯ prerelease ãåãããGitHub Release / PyPI 㯠prerelease ã
åãä»ããããã<Version> ã 0.1.0-rc1 (hyphen ä»ãã.NET æå¹ãtag/csproj/pyproject ã® 3 ç®æã§å®å
šäžèŽ)
ã«ã㊠v0.1.0-rc1 tag ã push ããã°ãgithub-release ã® (a|b|rc)[0-9]+$ â --prerelease å€å®ãçºç«ããã
store é
åžãåéãããšãThunderstore (tcli) ã Major.Minor.Patch æŽæ°ã®ã¿ (0.1.0-rc1 æåŠ) ã§
.NET 㯠hyphen ä»ã semver ãèŠæ±ãããããäž¡ç«ãã prerelease æååãç¡ããªã prerelease ã¯åã³äžå¯ã«ãªãã
詳现㯠RELEASE.md §5ã
ãªãªãŒã¹åæ€èšŒ: â just run â¡ dotnet build ... -t:PackTS ã®ããŒã«ã« zip çæç¢ºèª (publish ããªã)
⢠build ãéãã° PyPI â GitHub Release ãèµ°ãã®ã§ãtag ãæã€åã« PyPI Trusted Publisher ãæå¹ã確èª
(PyPI ã® version ã¯äžå¯é)ã
4. äžåéãã®æåã»ããã¢ãã (Claude ã¯è¡ããªã)
人éã GitHub / Thunderstore / PyPI ã®ç®¡çç»é¢ã§è¡ã:
- ãªããžããªã
Geson-anko/ResoniteIO â MLShukai/ResoniteIO ã«ç§»ç®¡ãæåã® publish tag ã¯ç§»ç®¡åŸã« push
(CI ã®é publish ã¯ãŒã¯ãããŒã¯ç§»ç®¡åã§ãåãã)
- (çŸåšäžèŠ â Thunderstore upload 忢äž) store åéæã®ã¿: Thunderstore team
MLShukai (namespace mlshukai)
ãäœæ â service account token ã GitHub secret TCLI_AUTH_TOKEN ã«ç»é² â publish-thunderstore ã®
ã³ã¡ã³ãã¢ãŠããè§£é€
- PyPI Trusted Publisher ãèšå® (owner
MLShukai / repo ResoniteIO / workflow publish.yml / environment pypi) +
GitHub pypi environment ãäœæãtest.pypi ã¯ä»»æ
secret / token 㯠PRã»commitã»ãã°ã«è²Œããªããgh secret æäœã人éãè¡ãã
5. ãã©ãã«ã·ã¥ãŒã
- version-guard mismatch ã§ build job ã fail: tag ã®
X.Y.Z ãš csproj <Version> ãš pyproject.toml version ã®
ã©ããããºã¬ãŠãããjust bump-version X.Y.Z ã§ 3 ãã¡ã€ã« (csproj / pyproject / uv.lock) ãæãçŽããŠãã tag ãæã¡çŽã
(誀 tag 㯠git push origin :refs/tags/vX.Y.Z ã§ remote ããæ¶ããŠããå push)ã
- Renderer prebuilt drift guard ã§ build job ã fail (
Renderer prebuilt is stale): Renderer ãœãŒã¹
(mod/src/ResoniteIO.Renderer/ ⥠mod/src/ResoniteIO.RendererShared/ ã® .cs / .csproj) ã倿Žããã®ã«
committed prebuilt mod/prebuilt/renderer/ ãæŽæ°ããŠããªããResonite ã®ããããŒã«ã«ã§ just renderer-prebuild
ãå®è¡ã mod/prebuilt/ (DLL/PDB + renderer.sha256) ã®å·®åã commit ããŠãã tag ãæã¡çŽããCI åŽã§ã¯
UnityEngine.CoreModule ãç¡ã rebuild ã§ããªãããããã®ä¿®æ£ã¯ããŒã«ã«ã§ããè¡ããªã (§7 prebuilt note)ã
publish-pypi ã OIDC ã§åŒŸããã: PyPI Trusted Publisher ã® owner/repo/workflow/environment ã移管åŸã®å€ãšäžèŽããŠããããGitHub pypi environment ãååšããããç¢ºèª (§4-2)ã
- mod zip ã GitHub Release ã«åºãªã:
build ãžã§ãã® PackTS ã mod/build/*.zip ãçæã Collect artifacts ã ResoniteIO.zip ãäœããã確èªãInterprocessLib fetch (§2-1) ã倱æããŠãããš PackTS ã compile ã§ããªãã
- Gale ã® local import ããå
¥ããªã / load ãããªã: supporting plugins (BepisLoader ç) ãäºåã« profile ãžå
¥ãããç¢ºèª (local import ã¯äŸåãèªå解決ããªã)ã§6 ã®æ€èšŒã§
Loading Plugin ResoniteIO ãåºãã確èªãGale ãããã¡ã€ã« / Steam Launch Options 㯠setup-resonite-env §2 / §3ã
- Release ããŒãã "Release X.Y.Z" ã®ãŸãŸ (CHANGELOG ãåæ ãããªã):
mdformat ãèŠåºãã ## \[X.Y.Z\] ã«ãšã¹ã±ãŒãããgithub-release ã®æœåº regex (## \[X.Y.Z\]) ã«ãããããŠããªããCHANGELOG æ«å°Ÿã«è©²åœ version ã® link reference definition ([X.Y.Z]: url) ã远å ãããšèŠåºãã reference link ãšããŠæ±ãã mdformat ããšã¹ã±ãŒãããªããªã (§1-1 step 3)ãpublish.yml ã® regex ã¯å€æŽããªãã
6. ãªãªãŒã¹åŸæ€èšŒ
- PyPI ããŒãž (distribution
resonite-io) ã«æ°çãåºãŠ uv add resonite-io==X.Y.Z ãéã
- GitHub Release ã« mod zip (versioned + åºå®å
ResoniteIO.zip) + python sdist/wheel ãæ·»ä»ãããæ¬æã CHANGELOG ãšäžèŽ (rc 㯠Pre-release ãããž)
- åºå®å latest URL ãæ©èœ:
curl -L https://github.com/MLShukai/ResoniteIO/releases/latest/download/ResoniteIO.zip -o /tmp/ResoniteIO.zip ã§ææ°ãèœã¡ã
- Gale install æ€èšŒ: ææ° zip ã DL â Gale
Import > Local mod... ã§ import (supporting plugins ã¯äºåå°å
¥) â Resonite èµ·å â just log ã§ Loading Plugin ResoniteIO ã確èª
7. Camera v2 Renderer prebuilt note
Camera v2 ã® Renderer åŽ plugin (ResoniteIO.Rendererãnet472 Unity Mono) 㯠UnityEngine.CoreModule ã
éåé
åž ãªãã CI ã§ã Remora SDK ã§ã build ã§ããªãããã®ãã Resonite ã®ããããŒã«ã«ã§ build ããææç©ã
committed prebuilt ãšã㊠repo ã« commit ããpack/CI ã¯ããã build ãããã®ãŸãŸ mod zip ã«å梱ããã
- ææç©:
mod/prebuilt/renderer/{ResoniteIO.Renderer.dll, ResoniteIO.RendererShared.dll, ResoniteIO.Renderer.pdb}
(.gitignore ã® *.dll/*.pdb ignore ã negate ããŠè¿œè·¡)ãsource hash ã¯å
åŒãã¹ mod/prebuilt/renderer.sha256
(hash file 㯠zip ã«å
¥ããªãæ¹éã§ dir å€ã«åé¢)
- æŽæ°:
just renderer-prebuild (Resonite å¿
é ) ã Release build â file-set ã mod/prebuilt/renderer/ ã« copy â
scripts/renderer-prebuilt-hash.sh ã§ source hash ã renderer.sha256 ã«æžããå®è¡åŸ mod/prebuilt/ ã commit
- drift guard:
just check-renderer-prebuilt (just run æ«å°Ÿã«å«ã) ãš CI (publish.yml build / dotnet.yml) ã
committed hash ãšåèšç® hash ãç
§åãRenderer ãœãŒã¹ãè§Šã£ãŠ prebuilt æŽæ°ãå¿ãããš fail ãã (§5 troubleshoot)
- thunderstore.toml ã®
[[build.copy]] (./prebuilt/renderer â Renderer/ResoniteIO.Renderer/) ã§ zip 忢±ã
Gale BepisLoader installer ã package top-level Renderer/ ã Renderer/BepInEx/plugins/<FullName>/ ãž routing ãã
8. é¢é£åç
§
RELEASE.md â æ£èŠã® end-to-end ãªãªãŒã¹ runbook
github-ops â push / PR / gh ã®åºæ¬ãšå®å
šèŠçŽ
merge-main â release ãã©ã³ããžã® main åã蟌ã¿ã»ã³ã³ããªã¯ãè§£æ¶
setup-resonite-env â Gale ãããã¡ã€ã« / 宿© load æ€èšŒ (§2 / §6)