Skip to content

feat: expand system and MiSTer launch coverage#1109

Merged
wizzomafizzo merged 3 commits into
mainfrom
feat/expand-system-coverage
Jul 17, 2026
Merged

feat: expand system and MiSTer launch coverage#1109
wizzomafizzo merged 3 commits into
mainfrom
feat/expand-system-coverage

Conversation

@wizzomafizzo

@wizzomafizzo wizzomafizzo commented Jul 17, 2026

Copy link
Copy Markdown
Member

Summary

  • add MiSTer launchers and virtual launchables for PICO-8, OpenBOR, Paprium, MegaVGMDrive, Apple IIGS, Apple Lisa, and companion cores
  • add Intellivision .rom indexing and launch support verified against upstream core metadata
  • add missing system definitions and researched metadata, including Pinball, with obvious ES-DE, RetroArch, Batocera, and LaunchBox mappings
  • extend MiSTer custom-core discovery and cache persistence for companion-installed cores

Closes #1021
Closes #1104
Closes #655

Summary by CodeRabbit

  • New Features
    • Added many new supported systems (including consoles, computers, handhelds, media, and software) via new system definitions and registry entries.
    • Expanded MiSTer launch support with new systems and additional MGL-backed virtual media (including Paprium and cartridge/other “Other” items).
    • Added stable launchable UUIDs for new MiSTer entries.
    • Updated EmulationStation and LaunchBox system mappings for newly supported titles.
  • Improvements
    • Enhanced MiSTer core/RBF discovery to include additional custom-core locations and improve fallback selection.
    • Improved RBF caching by supporting injected filesystem behavior.
  • Tests
    • Added regression coverage for system definitions, alias lookups, launcher filtering/availability, and alternate-core fallback.

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b7625118-d223-4ed5-b811-9b4a134c17e6

📥 Commits

Reviewing files that changed from the base of the PR and between 8284416 and 19cbe74.

📒 Files selected for processing (2)
  • pkg/platforms/mister/cores/rbf_cache.go
  • pkg/platforms/mister/cores/rbf_cache_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/platforms/mister/cores/rbf_cache.go

📝 Walkthrough

Walkthrough

The change adds numerous system metadata assets and registry entries, expands ES-DE, RetroArch, LaunchBox, and MiSTer mappings, introduces MiSTer launchables and alternate-core fallbacks, and broadens nested RBF discovery and persistence coverage.

Changes

System definitions and registry

Layer / File(s) Summary
System metadata assets
pkg/assets/systems/*
Adds JSON metadata entries for numerous consoles, computers, handhelds, software systems, and media systems.
System registry and lookup coverage
pkg/database/systemdefs/*, pkg/launchables/ids.go
Adds exported system constants, registry entries, aliases, slugs, fallback relationships, lookup tests, and stable MiSTer launchable UUIDs.

MiSTer core and launcher integration

Layer / File(s) Summary
Core definitions and nested RBF discovery
pkg/platforms/mister/cores/*
Adds Apple and custom core definitions, Intellivision .rom support, nested RBF directory scanning, cache format version 5, filesystem injection, and manifest/mtime tests.
Launchers and virtual launchables
pkg/platforms/mister/platform.go, pkg/platforms/mister/launchers.go, pkg/platforms/mister/launchables.go, pkg/platforms/mister/*_test.go
Adds Apple IIGS, Apple Lisa, MegaVGMDrive, OpenBOR, PICO-8, Paprium, GB/GBC, Quake, Sonic Mania, and Tamagotchi launchables, including MGL launch injection and alternate-core fallback candidates.

Platform mappings

Layer / File(s) Summary
ES-DE, RetroArch, and LaunchBox mappings
pkg/platforms/shared/esde/*, pkg/platforms/shared/retroarch/coremap.go, pkg/platforms/windows/launchbox*
Updates system identifiers and adds mappings for Commodore CDTV, Commodore Plus/4, Sega Pico, Apple IIGS, Amstrad GX4000, Nintendo Switch 2, PocketStation, Tapwave Zodiac, Uzebox, and other systems.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant SystemRegistry
  participant MiSTerCoreScanner
  participant RBFCache
  participant Launcher
  participant MGL
  SystemRegistry->>MiSTerCoreScanner: Provide registered system IDs
  MiSTerCoreScanner->>RBFCache: Discover nested RBF files
  RBFCache->>Launcher: Resolve core and fallback MGL
  Launcher->>MGL: Launch selected MGL file
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: expanded system definitions and MiSTer launch coverage.
Linked Issues check ✅ Passed The PR covers the requested MiSTer companion cores, Intellivision .ROM support, and the missing system definitions listed in #1021, #1104, and #655.
Out of Scope Changes check ✅ Passed The additional cache, launcher, and mapping updates support the same system-definition and MiSTer launch goals rather than introducing unrelated scope.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/expand-system-coverage

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
pkg/platforms/mister/cores/rbfs.go (1)

148-156: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

Use afero consistently for the newly added filesystem operations.

  • pkg/platforms/mister/cores/rbfs.go#L148-L156: read nested core directories through an injected afero.Fs.
  • pkg/platforms/mister/cores/rbf_persist.go#L123-L127: snapshot nested manifests through the same filesystem.
  • pkg/platforms/mister/cores/rbf_persist.go#L165-L169: obtain nested-directory metadata through afero.
  • pkg/platforms/mister/launchables.go#L273-L278: make file availability use Platform.fs.

As per coding guidelines, “Use afero for filesystem operations in testable code.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/platforms/mister/cores/rbfs.go` around lines 148 - 156, Replace the newly
added direct filesystem calls with the injected afero filesystem consistently:
in pkg/platforms/mister/cores/rbfs.go lines 148-156, use the relevant afero.Fs
for nested directory reads; in pkg/platforms/mister/cores/rbf_persist.go lines
123-127 and 165-169, use that same filesystem for nested manifest snapshots and
directory metadata; and in pkg/platforms/mister/launchables.go lines 273-278,
use Platform.fs for file-availability checks. Preserve the existing behavior
while routing all operations through afero.

Source: Coding guidelines

pkg/database/systemdefs/systemdefs.go (1)

248-548: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Move the new constants above the file’s functions.

These declarations currently follow buildLookupMap, LookupSystem, and SystemsWithFallbacks. Relocate the new constants to the top-level declaration section before functions.

As per coding guidelines, “Define Go types and consts near the top of the file, before functions and methods.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/database/systemdefs/systemdefs.go` around lines 248 - 548, Move the newly
added system constant declarations, including the groups beginning with
System3DO, SystemAcornAtom, and SystemAndroid, above the file’s functions
buildLookupMap, LookupSystem, and SystemsWithFallbacks. Keep the existing
grouping and values unchanged; only relocate the declarations into the top-level
section before any functions or methods.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pkg/platforms/mister/launchers.go`:
- Around line 2326-2331: The Pico-8 launcher filtering pipeline must support
both declared cart formats. In pkg/platforms/mister/launchers.go:2326-2331, add
.png candidates while retaining .p8; in
pkg/platforms/mister/launchers.go:622-624, update pico8PNGCartTest to accept .p8
and valid .p8.png carts while rejecting unrelated PNGs; in
pkg/platforms/mister/launchers_test.go:693-699, add coverage exercising the
complete launcher filtering pipeline for both formats.

In `@pkg/platforms/windows/launchbox_test.go`:
- Around line 141-161: Expand the LaunchBox mapping table test around the
existing system/name/expected entries to cover every newly enabled or changed
mapping in launchbox.go, including all entries from the referenced mapping
ranges. Assert both each system key and its exact platform name so missing keys
or incorrect names are detected, while preserving the existing test structure
and expectations.

---

Nitpick comments:
In `@pkg/database/systemdefs/systemdefs.go`:
- Around line 248-548: Move the newly added system constant declarations,
including the groups beginning with System3DO, SystemAcornAtom, and
SystemAndroid, above the file’s functions buildLookupMap, LookupSystem, and
SystemsWithFallbacks. Keep the existing grouping and values unchanged; only
relocate the declarations into the top-level section before any functions or
methods.

In `@pkg/platforms/mister/cores/rbfs.go`:
- Around line 148-156: Replace the newly added direct filesystem calls with the
injected afero filesystem consistently: in pkg/platforms/mister/cores/rbfs.go
lines 148-156, use the relevant afero.Fs for nested directory reads; in
pkg/platforms/mister/cores/rbf_persist.go lines 123-127 and 165-169, use that
same filesystem for nested manifest snapshots and directory metadata; and in
pkg/platforms/mister/launchables.go lines 273-278, use Platform.fs for
file-availability checks. Preserve the existing behavior while routing all
operations through afero.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2d50d966-e956-43c7-a49a-5d8301e41acf

📥 Commits

Reviewing files that changed from the base of the PR and between 5c5e6b7 and 140be91.

📒 Files selected for processing (93)
  • pkg/assets/systems/1292APVS.json
  • pkg/assets/systems/AdvancedPICOBeena.json
  • pkg/assets/systems/AirConsole.json
  • pkg/assets/systems/AmstradGX4000.json
  • pkg/assets/systems/AppleIIGS.json
  • pkg/assets/systems/AppleLisa.json
  • pkg/assets/systems/ApplePippin.json
  • pkg/assets/systems/BlackBerryOS.json
  • pkg/assets/systems/BluRayPlayer.json
  • pkg/assets/systems/CasioLoopy.json
  • pkg/assets/systems/CassetteVision.json
  • pkg/assets/systems/CommodoreCDTV.json
  • pkg/assets/systems/CommodorePlus4.json
  • pkg/assets/systems/DVDPlayer.json
  • pkg/assets/systems/Daydream.json
  • pkg/assets/systems/DigiBlast.json
  • pkg/assets/systems/Dragon32.json
  • pkg/assets/systems/ElektorTVGamesComputer.json
  • pkg/assets/systems/Evercade.json
  • pkg/assets/systems/FireTV.json
  • pkg/assets/systems/GearVR.json
  • pkg/assets/systems/GoogleStadia.json
  • pkg/assets/systems/HandheldElectronicLCD.json
  • pkg/assets/systems/HyperNeoGeo64.json
  • pkg/assets/systems/HyperScan.json
  • pkg/assets/systems/IntellivisionAmico.json
  • pkg/assets/systems/LeapTV.json
  • pkg/assets/systems/Leapster.json
  • pkg/assets/systems/LeapsterExplorer.json
  • pkg/assets/systems/LegacyComputer.json
  • pkg/assets/systems/LegacyMobileDevice.json
  • pkg/assets/systems/Linux.json
  • pkg/assets/systems/MZ2200.json
  • pkg/assets/systems/MagnavoxOdyssey.json
  • pkg/assets/systems/MetaQuest2.json
  • pkg/assets/systems/MetaQuest3.json
  • pkg/assets/systems/Microvision.json
  • pkg/assets/systems/NintendoEReader.json
  • pkg/assets/systems/NintendoSwitch2.json
  • pkg/assets/systems/Nuon.json
  • pkg/assets/systems/OculusGo.json
  • pkg/assets/systems/OculusQuest.json
  • pkg/assets/systems/OculusRift.json
  • pkg/assets/systems/OculusVR.json
  • pkg/assets/systems/OpenBOR.json
  • pkg/assets/systems/PC50XFamily.json
  • pkg/assets/systems/PC6000.json
  • pkg/assets/systems/PDP10.json
  • pkg/assets/systems/PLATO.json
  • pkg/assets/systems/PalmOS.json
  • pkg/assets/systems/PanasonicJungle.json
  • pkg/assets/systems/PanasonicM2.json
  • pkg/assets/systems/Pinball.json
  • pkg/assets/systems/PlayStationVR.json
  • pkg/assets/systems/PlayStationVR2.json
  • pkg/assets/systems/Playdate.json
  • pkg/assets/systems/Playdia.json
  • pkg/assets/systems/PocketStation.json
  • pkg/assets/systems/Polymega.json
  • pkg/assets/systems/RZone.json
  • pkg/assets/systems/SegaCD32X.json
  • pkg/assets/systems/SegaPico.json
  • pkg/assets/systems/SteamVR.json
  • pkg/assets/systems/SuperCassetteVision.json
  • pkg/assets/systems/TapwaveZodiac.json
  • pkg/assets/systems/Terebikko.json
  • pkg/assets/systems/Uzebox.json
  • pkg/assets/systems/VMU.json
  • pkg/assets/systems/WebBrowser.json
  • pkg/assets/systems/WindowsMixedReality.json
  • pkg/assets/systems/WindowsMobile.json
  • pkg/assets/systems/WindowsPhone.json
  • pkg/assets/systems/Zeebo.json
  • pkg/assets/systems/visionOS.json
  • pkg/database/systemdefs/systemdefs.go
  • pkg/database/systemdefs/systemdefs_test.go
  • pkg/launchables/ids.go
  • pkg/platforms/mister/cores/cores.go
  • pkg/platforms/mister/cores/cores_test.go
  • pkg/platforms/mister/cores/rbf_persist.go
  • pkg/platforms/mister/cores/rbf_persist_test.go
  • pkg/platforms/mister/cores/rbfs.go
  • pkg/platforms/mister/cores/rbfs_test.go
  • pkg/platforms/mister/launchables.go
  • pkg/platforms/mister/launchables_test.go
  • pkg/platforms/mister/launchers.go
  • pkg/platforms/mister/launchers_test.go
  • pkg/platforms/mister/platform.go
  • pkg/platforms/shared/esde/systemmap.go
  • pkg/platforms/shared/esde/systemmap_test.go
  • pkg/platforms/shared/retroarch/coremap.go
  • pkg/platforms/windows/launchbox.go
  • pkg/platforms/windows/launchbox_test.go

Comment thread pkg/platforms/mister/launchers.go
Comment on lines +141 to +161
{systemdefs.SystemAmstradGX4000, "Amstrad GX4000", true},
{systemdefs.SystemAppleIIGS, "Apple IIGS", true},
{systemdefs.SystemCasioLoopy, "Casio Loopy", true},
{systemdefs.SystemCommodoreCDTV, "Commodore CDTV", true},
{systemdefs.SystemCommodorePlus4, "Commodore Plus 4", true},
{systemdefs.SystemDragon32, "Dragon 32/64", true},
{systemdefs.SystemElektorTVGamesComputer, "Elektor TV Games Computer", true},
{systemdefs.SystemSuperCassetteVision, "Epoch Super Cassette Vision", true},
{systemdefs.SystemLinux, "Linux", true},
{systemdefs.SystemMagnavoxOdyssey, "Magnavox Odyssey", true},
{systemdefs.SystemHyperScan, "Mattel HyperScan", true},
{systemdefs.SystemNintendoSwitch2, "Nintendo Switch 2", true},
{systemdefs.SystemNuon, "Nuon", true},
{systemdefs.SystemOpenBOR, "OpenBOR", true},
{systemdefs.SystemPinball, "Pinball", true},
{systemdefs.SystemSegaCD32X, "Sega CD 32X", true},
{systemdefs.SystemVMU, "Sega Dreamcast VMU", true},
{systemdefs.SystemSegaPico, "Sega Pico", true},
{systemdefs.SystemPocketStation, "Sony PocketStation", true},
{systemdefs.SystemTapwaveZodiac, "Tapwave Zodiac", true},
{systemdefs.SystemUzebox, "Uzebox", true},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Cover every newly enabled LaunchBox mapping.

The table tests only a subset of the mappings added or activated in pkg/platforms/windows/launchbox.go (Lines 140-186, 199-206, 236-261, 271-272, and 296-308). Add assertions for all changed entries, not just the selected systems, so incorrect platform names or missing keys cannot regress unnoticed.

As per coding guidelines, **/*.go: Write tests for all new code — see TESTING.md and pkg/testing/README.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/platforms/windows/launchbox_test.go` around lines 141 - 161, Expand the
LaunchBox mapping table test around the existing system/name/expected entries to
cover every newly enabled or changed mapping in launchbox.go, including all
entries from the referenced mapping ranges. Assert both each system key and its
exact platform name so missing keys or incorrect names are detected, while
preserving the existing test structure and expectations.

Source: Coding guidelines

@codecov

codecov Bot commented Jul 17, 2026

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pkg/platforms/mister/cores/rbf_cache.go`:
- Around line 248-252: Add a test that invokes RBFCache.SetFilesystem with the
supplied memfs before calling Refresh, then verifies filesystem discovery
through the cache. If filesystem replacement is supported, call SetFilesystem
again with a different filesystem and verify the cache is rebuilt accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e9b1636d-cd9d-44c0-9924-b27584a65742

📥 Commits

Reviewing files that changed from the base of the PR and between 140be91 and 8284416.

📒 Files selected for processing (11)
  • pkg/database/systemdefs/systemdefs.go
  • pkg/platforms/mister/cores/rbf_cache.go
  • pkg/platforms/mister/cores/rbf_persist.go
  • pkg/platforms/mister/cores/rbf_persist_test.go
  • pkg/platforms/mister/cores/rbfs.go
  • pkg/platforms/mister/cores/rbfs_test.go
  • pkg/platforms/mister/launchables.go
  • pkg/platforms/mister/launchables_test.go
  • pkg/platforms/mister/launchers.go
  • pkg/platforms/mister/launchers_test.go
  • pkg/platforms/mister/platform.go
🚧 Files skipped from review as they are similar to previous changes (8)
  • pkg/platforms/mister/cores/rbfs_test.go
  • pkg/platforms/mister/cores/rbfs.go
  • pkg/platforms/mister/launchers.go
  • pkg/platforms/mister/launchables.go
  • pkg/platforms/mister/cores/rbf_persist_test.go
  • pkg/platforms/mister/launchables_test.go
  • pkg/database/systemdefs/systemdefs.go
  • pkg/platforms/mister/cores/rbf_persist.go

Comment on lines +248 to +252
func (c *RBFCache) SetFilesystem(fs afero.Fs) {
c.mu.Lock()
defer c.mu.Unlock()
c.fs = fs
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Cover SetFilesystem directly.

The supplied memfs test initializes RBFCache.fs directly, so the new setter’s behavior is not tested. Add coverage that calls SetFilesystem(fs) before Refresh() and verifies discovery; if backend replacement is supported, also verify that replacing the filesystem rebuilds the cache.

As per coding guidelines: **/*.go: Write tests for all new code — see TESTING.md and pkg/testing/README.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/platforms/mister/cores/rbf_cache.go` around lines 248 - 252, Add a test
that invokes RBFCache.SetFilesystem with the supplied memfs before calling
Refresh, then verifies filesystem discovery through the cache. If filesystem
replacement is supported, call SetFilesystem again with a different filesystem
and verify the cache is rebuilt accordingly.

Source: Coding guidelines

@wizzomafizzo
wizzomafizzo merged commit 7085532 into main Jul 17, 2026
15 checks passed
@wizzomafizzo
wizzomafizzo deleted the feat/expand-system-coverage branch July 17, 2026 01:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant