Skip to content

Releases: AppleBoiy/StarHubTH

Release v1.1.9

Choose a tag to compare

@github-actions github-actions released this 27 Jul 05:06

Added

  • Internal — Release builds now auto-upload to Nexus Mods: release.yml pushes every tagged release's build to StarHubTH's existing Nexus Mods file slot right after publishing the GitHub Release, using the same version and CHANGELOG.md notes 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 — SmapiLogParser treated 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.txt linked 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

Choose a tag to compare

@github-actions github-actions released this 26 Jul 14:39

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-level env: block never reached the test process at all, in CI or locally — SmapiInstallerIntegrationTests always made a real GitHub API call and just usually got lucky. Fixed by declaring STARHUB_SKIP_LIVE_TESTS directly in the Xcode scheme via project.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") returns nil when read from a process sharing that same bundle ID — true for StarHubTHTests, which hosts inside StarHubTH.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 via UserDefaults.standard instead.

Added

  • Internal — Real-Nexus-API test coverage extended to the actual store/coordinator wiring: previously every live test called LiveNexusAPIClient directly; new coverage now goes through ModsStore, AppCoordinator.handleOpenURL (the real nxm:// entry point), and ModsStore.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 for endorseMod, the one call that mutates a real Nexus account, so it never runs as a side effect of enabling live tests generally. Added TestPlans/UILive.xctestplan for 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.json inventories 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-screenshots skill 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 the Integration/UI/UILive test plans.

Release v1.1.8

Choose a tag to compare

@github-actions github-actions released this 26 Jul 14:45

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-level env: block never reached the test process at all, in CI or locally — SmapiInstallerIntegrationTests always made a real GitHub API call and just usually got lucky. Fixed by declaring STARHUB_SKIP_LIVE_TESTS directly in the Xcode scheme via project.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") returns nil when read from a process sharing that same bundle ID — true for StarHubTHTests, which hosts inside StarHubTH.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 via UserDefaults.standard instead.

Added

  • Internal — Real-Nexus-API test coverage extended to the actual store/coordinator wiring: previously every live test called LiveNexusAPIClient directly; new coverage now goes through ModsStore, AppCoordinator.handleOpenURL (the real nxm:// entry point), and ModsStore.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 for endorseMod, the one call that mutates a real Nexus account, so it never runs as a side effect of enabling live tests generally. Added TestPlans/UILive.xctestplan for 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.json inventories 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-screenshots skill 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 the Integration/UI/UILive test plans.

Release v1.1.7

Choose a tag to compare

@github-actions github-actions released this 26 Jul 08:34

Changed

  • Internal — Codebase brought into full compliance with docs/SWIFT_STANDARDS.md: Resolved every finding from scripts/check_standards.py (56 total). Removed the last two .shared singleton call sites outside App/, replaced justified DispatchQueue usage with documented exceptions or async/await, audited every @Published property across the app for real external writes (adding private(set) where safe, a STANDARDS-EXCEPTION comment 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

Choose a tag to compare

@github-actions github-actions released this 26 Jul 07:34

Changed

  • Internal — Migrated the build/test pipeline to a real Xcode project: Replaced the script-based build (build_app.py, run_tests.py) with StarHubTH.xcodeproj (generated from project.yml via 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 new StarHubTHUITests target drives the real app end-to-end via XCUIApplication. CI (build.yml/release.yml) and release.py now build/test via xcodebuild. No user-facing behavior change — same app, same features.

Release v1.1.4

Choose a tag to compare

@github-actions github-actions released this 26 Jul 02:49

Changed

  • Internal — Architecture refactor complete: Finished the multi-phase internal refactor tracked in docs/REFACTOR_PLAN.md. The old 2,100-line StarHubTHViewModel god object is gone, replaced by one @MainActor store per feature (Mods, Saves, Profiles, Mod Packs, Thai Hub, Logs) plus an AppCoordinator for 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 uses async/await instead of completion handlers, failures throw typed errors instead of silently returning false, 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. Added scripts/check_standards.py and a CI build/test workflow to keep the codebase from drifting back.

Release v1.1.3

Choose a tag to compare

@AppleBoiy AppleBoiy released this 24 Jul 14:10

Automated release for StarHubTH v1.1.3.

Release v1.1.0

Choose a tag to compare

@AppleBoiy AppleBoiy released this 23 Jul 10:36

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 .zip files 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 0 and 1 were 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

Choose a tag to compare

@AppleBoiy AppleBoiy released this 04 Jul 14:03

Automated release for StarHubTH v1.0.6-rev1.

Release v1.0.6

Choose a tag to compare

@AppleBoiy AppleBoiy released this 04 Jul 09:12

Automated release for StarHubTH v1.0.6.