Repository navigation
Releases: AppleBoiy/StarHubTH
Releases · AppleBoiy/StarHubTH
Release list
Release v1.1.9
Added
- Internal — Release builds now auto-upload to Nexus Mods:
release.ymlpushes every tagged release's build to StarHubTH's existing Nexus Mods file slot right after publishing the GitHub Release, using the same version andCHANGELOG.mdnotes already extracted for GitHub. No user-facing behavior change — same build, one less manual upload step per release.
Fixed
- Software Update screen never showed available mod updates: SMAPI's real update-check output interleaves a blank line between each "you can update" entry —
SmapiLogParsertreated any non-matching line as the end of that block, so the blank line right after "You can update N mods:" silently ended parsing before a single real entry was ever read. Confirmed against a real, 122K-line SMAPI log with 4 genuinely out-of-date mods, none of which ever showed up. The existing unit test never caught this because its sample log had no blank lines between entries — unlike real SMAPI output. - Internal — Nexus mod page's screenshot gallery was broken:
assets/nexus_description.txt/nexus_description_en.txtlinked to numbered screenshot files (1.png…15.png) that no longer exist after the descriptive-slug rename, so every embedded image on the live Nexus listing 404'd. Repointed to the current slugs and expanded to the full 21-screen set in both languages. No in-app behavior change.
Release v1.1.8-preview.1
Fixed
- Internal — CI's live-network-test skip gate now actually works: The previous fix (v1.1.7's changelog entry) misdiagnosed this as a parallel-test-worker issue. The real cause:
xcodebuild test's scheme was configured to use the Run action's (empty) environment variables, so a workflow-levelenv:block never reached the test process at all, in CI or locally —SmapiInstallerIntegrationTestsalways made a real GitHub API call and just usually got lucky. Fixed by declaringSTARHUB_SKIP_LIVE_TESTSdirectly in the Xcode scheme viaproject.yml, which XcodeGen wires to the scheme's own environment variables instead of inheriting the Run action's. No user-facing behavior change. - Internal —
Integration/tests silently self-skipped on every run:UserDefaults(suiteName: "com.appleboiy.StarHubTH")returnsnilwhen read from a process sharing that same bundle ID — true forStarHubTHTests, which hosts insideStarHubTH.app. Every existing live-Nexus test read the API key this way, so they always no-op'd instead of actually hitting the real API. Fixed by reading viaUserDefaults.standardinstead.
Added
- Internal — Real-Nexus-API test coverage extended to the actual store/coordinator wiring: previously every live test called
LiveNexusAPIClientdirectly; new coverage now goes throughModsStore,AppCoordinator.handleOpenURL(the realnxm://entry point), andModsStore.syncTagFromNexus— the code path a real user's click actually runs, not just the underlying HTTP client. Added an opt-in, separately-gated (STARHUB_RUN_MUTATING_NEXUS_TESTS=1) test forendorseMod, the one call that mutates a real Nexus account, so it never runs as a side effect of enabling live tests generally. AddedTestPlans/UILive.xctestplanfor the small set of UI tests that need both a real GUI session and a real Nexus API key at once (mod detail loading real cover art, Sync Tag updating from real category data). - Internal — Release screenshot refresh tooling:
scripts/screenshot_manifest.jsoninventories every Core-tier screen the app has (built from the app's own navigation code, not the old screenshot files) so a future feature can't quietly ship without anyone remembering to add a screenshot. A new/refresh-screenshotsskill drives the real, already-configured app end-to-end (TestPlans/ScreenshotCapture.xctestplan) to capture them, checks for drift between the manifest and the app's actual tabs, and reports differences against the checked-in screenshots — never auto-commits. Manual, local-only, same posture as theIntegration/UI/UILivetest plans.
Release v1.1.8
Fixed
- Internal — CI's live-network-test skip gate now actually works: The previous fix (v1.1.7's changelog entry) misdiagnosed this as a parallel-test-worker issue. The real cause:
xcodebuild test's scheme was configured to use the Run action's (empty) environment variables, so a workflow-levelenv:block never reached the test process at all, in CI or locally —SmapiInstallerIntegrationTestsalways made a real GitHub API call and just usually got lucky. Fixed by declaringSTARHUB_SKIP_LIVE_TESTSdirectly in the Xcode scheme viaproject.yml, which XcodeGen wires to the scheme's own environment variables instead of inheriting the Run action's. No user-facing behavior change. - Internal —
Integration/tests silently self-skipped on every run:UserDefaults(suiteName: "com.appleboiy.StarHubTH")returnsnilwhen read from a process sharing that same bundle ID — true forStarHubTHTests, which hosts insideStarHubTH.app. Every existing live-Nexus test read the API key this way, so they always no-op'd instead of actually hitting the real API. Fixed by reading viaUserDefaults.standardinstead.
Added
- Internal — Real-Nexus-API test coverage extended to the actual store/coordinator wiring: previously every live test called
LiveNexusAPIClientdirectly; new coverage now goes throughModsStore,AppCoordinator.handleOpenURL(the realnxm://entry point), andModsStore.syncTagFromNexus— the code path a real user's click actually runs, not just the underlying HTTP client. Added an opt-in, separately-gated (STARHUB_RUN_MUTATING_NEXUS_TESTS=1) test forendorseMod, the one call that mutates a real Nexus account, so it never runs as a side effect of enabling live tests generally. AddedTestPlans/UILive.xctestplanfor the small set of UI tests that need both a real GUI session and a real Nexus API key at once (mod detail loading real cover art, Sync Tag updating from real category data). - Internal — Release screenshot refresh tooling:
scripts/screenshot_manifest.jsoninventories every Core-tier screen the app has (built from the app's own navigation code, not the old screenshot files) so a future feature can't quietly ship without anyone remembering to add a screenshot. A new/refresh-screenshotsskill drives the real, already-configured app end-to-end (TestPlans/ScreenshotCapture.xctestplan) to capture them, checks for drift between the manifest and the app's actual tabs, and reports differences against the checked-in screenshots — never auto-commits. Manual, local-only, same posture as theIntegration/UI/UILivetest plans.
Release v1.1.7
Changed
- Internal — Codebase brought into full compliance with
docs/SWIFT_STANDARDS.md: Resolved every finding fromscripts/check_standards.py(56 total). Removed the last two.sharedsingleton call sites outsideApp/, replaced justifiedDispatchQueueusage with documented exceptions orasync/await, audited every@Publishedproperty across the app for real external writes (addingprivate(set)where safe, aSTANDARDS-EXCEPTIONcomment where not), and split five files that had grown past the 400-line convention (ModsStore,L10n,LiveNexusAPIClient,SaveManager,SmapiInstaller) along their existing logical sections. Also fixed a CI-only flakiness bug where a live-network integration test could run instead of skip under parallel test execution. No user-facing behavior change.
Release v1.1.6
Changed
- Internal — Migrated the build/test pipeline to a real Xcode project: Replaced the script-based build (
build_app.py,run_tests.py) withStarHubTH.xcodeproj(generated fromproject.ymlvia XcodeGen), keeping the "new files need no build-script change" guarantee via Xcode's File System Synchronized Groups. The custom 200-assertion test runner is now a real XCTest target (StarHubTHTests), and a newStarHubTHUITeststarget drives the real app end-to-end viaXCUIApplication. CI (build.yml/release.yml) andrelease.pynow build/test viaxcodebuild. No user-facing behavior change — same app, same features.
Release v1.1.4
Changed
- Internal — Architecture refactor complete: Finished the multi-phase internal refactor tracked in
docs/REFACTOR_PLAN.md. The old 2,100-lineStarHubTHViewModelgod object is gone, replaced by one@MainActorstore per feature (Mods, Saves, Profiles, Mod Packs, Thai Hub, Logs) plus anAppCoordinatorfor cross-store actions. Every I/O boundary (Nexus API, save files, mod install, SMAPI install, file pickers, preferences) now goes through an injectable protocol with a test double, all async work usesasync/awaitinstead of completion handlers, failures throw typed errors instead of silently returningfalse, and the seven largest views were split into smaller focused files. No user-facing behavior changes; a few previously-silent failures (backup/restore errors, Nexus tag sync) now show an actual message instead of failing quietly. Addedscripts/check_standards.pyand a CI build/test workflow to keep the codebase from drifting back.
Release v1.1.3
Automated release for StarHubTH v1.1.3.
Release v1.1.0
Automated release for StarHubTH v1.1.0.
[1.1.0] - 2026-07-23
Added
- App Changelog: Added an in-app changelog page to view update history directly within StarHubTH.
- Mod List View: Added a new filtering system to easily sort mods by status (All / Enabled / Disabled) using interactive filter pills.
- Mod List View: Added a new category/tag filter dropdown to filter mods by their specific types.
- Mod Installation: Added the ability to easily install mods directly from
.zipfiles or unzipped folders. The app automatically extracts, organizes, and places the mod contents into the correct Stardew Valley Mods directory. - Mod Backup: Added a convenient "Backup Mods" feature to quickly compress and save your entire active Mods folder into a backup zip file on your Desktop.
- Nexus Mods Integration: Added the ability to download and install mods directly from Nexus Mods into the app using a 1-click download process.
- Mod Detail View: Integrated with Nexus Mods API to automatically fetch and display mod descriptions, changelogs, and cover images directly within the app.
- Mod Config Editor: Complete layout redesign to strictly adhere to native macOS Human Interface Guidelines (HIG).
- Mod Config Editor: Implemented a recursive tree data structure to support properly nested configurations that expand/collapse, matching the in-game Generic Mod Config Menu.
Fixed
- Mod Config Editor: Fixed a type-inference bug where configuration values
0and1were incorrectly parsed and displayed as boolean toggles (On/Off) instead of number inputs. - Mod Config Editor: Fixed the appearance of the top Toolbar Segmented Picker.
- Mod Config Editor: Completed 100% Thai localization coverage for all editor strings.
Release v1.0.6-rev1
Automated release for StarHubTH v1.0.6-rev1.
Release v1.0.6
Automated release for StarHubTH v1.0.6.