[Agent] feat(SaveSystem): third-party emulator detection & migration guide#3571
[Agent] feat(SaveSystem): third-party emulator detection & migration guide#3571github-actions[bot] wants to merge 8 commits intodevelopfrom
Conversation
|
PR created. AI review starting automatically. |
343ace2 to
cc516c0
Compare
cc516c0 to
2b36ccf
Compare
|
@claude self review this, be thorough, fix all issues |
🤔 Working on RequestProgress
Started: 2026-03-28 09:39 UTC |
Self-Review Complete — 7 Issues FixedThorough review found and fixed the following: Critical
Correctness
Code Quality
|
|
@claude self review this, be thorough, fix all issues |
de19899 to
4f1fb49
Compare
|
✅ Self-review complete — fixes pushed Issues found and fixed in
The rest of the PR is clean: correct |
|
@claude self review this, be thorough, fix all issues |
|
✅ Self-review complete — 3 issues fixed:
Everything else reviewed and looks correct:
|
|
@claude self review this, be thorough, fix all issues |
Self-Review — 3 fixes appliedFixed1. tvOS focus handling missing on 2. 3. Deprecated Not Changed
|
|
@claude self review this, be thorough, fix all issues |
Self-Review Complete — 2 fixes pushedIssues Found and Fixed1. Every other settings sub-page ( #if os(tvOS)
.focusSection()
.onExitCommand { dismiss() }
#endif
2. Duplicate "Delta" rows when Delta/Delta Lite is installed Both No Other Issues Found
|
- Add KnownEmulator enum to PVPrimitives with detection via canOpenURL - Add ExternalEmulatorMigrationView with per-emulator step-by-step guides for Delta, RetroArch, Manic Emu, PPSSPP, and Gamma - Wire view into Settings → Library section - Add delta/retroarch/ppsspp to LSApplicationQueriesSchemes in all iOS and tvOS Info.plist variants - Add whats-new.json entry for 3.9.2 - Add .changelog/3556.md fragment Part of #3551 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove duplicate KnownEmulator from PVPrimitives; use canonical PVLibrary version (proper UIKit, Codable, deltaLite, exportDeepLinkURL) - Add symbolName/systemSummary/installedEmulators as private PVUI extensions on KnownEmulator, keeping display concerns out of PVLibrary - Fix private RetroTheme enum shadowing public RetroTheme from PVUIBase; re-adds retro grid background to migration views - Correct emulator name: "Manic Emu" → "Mantic Emu" throughout - Replace deprecated edgesIgnoringSafeArea with ignoresSafeArea - Fix manualImportSection: replace Button+NavigationLink overlay hack with a plain NavigationLink - Handle .deltaLite case in all switch statements; filter from all-cases list to avoid duplicate Delta entry in UI Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…VThemes import - Wrap .navigationBarTitleDisplayMode(.inline) in #if !os(tvOS) in all three views (ExternalEmulatorMigrationView, EmulatorMigrationGuideView, ManualFileImportGuideView) — unavailable on tvOS - Wrap ToolbarItem(placement: .navigationBarTrailing) in #if !os(tvOS) — unavailable on tvOS - Remove unused `import PVThemes` (RetroTheme/colors come from PVUIBase) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add @retroactive to extension KnownEmulator: Identifiable to satisfy Swift 5.7+ retroactive conformance requirement - Fix "Manic Emu" → "Mantic Emu" typo in whats-new.json - Add LSApplicationQueriesSchemes to ProvenanceTV-Lite-Info.plist so it matches ProvenanceTV-AppStore-Info.plist Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add `#if os(tvOS) .focusSection() .onExitCommand { dismiss() } #endif`
to EmulatorMigrationGuideView, matching the pattern used by every other
settings sub-page view (AppearanceView, ManualFileImportGuideView, etc.)
- Filter deltaLite out of `installedEmulators`: delta and deltaLite share
the same `"delta://"` URL scheme, so canOpenURL returns true for both
when either app is installed, producing duplicate "Delta" rows in the
detected list. The empty-state list already skipped deltaLite; now the
detected list is consistent.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3c2b1f7 to
914ab25
Compare
|
@claude self review this, be thorough, fix all issues |
- Rename .changelog/3556.md to .changelog/3571.md (use PR not issue number) - Make loadInstalledEmulators() async to eliminate potential Swift warning - Expand saveFormatNote to show state file extensions alongside battery saves (Delta: .dvsave, PPSSPP: .ppst); retitle to Save & State Extensions Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Self-Review CompleteReviewed all 11 changed files thoroughly. Three fixes applied: Issues Fixed1. Changelog fragment named after issue instead of PR
2.
3.
Confirmed Correct (no changes needed)
|
|
@claude self review this, be thorough, fix all issues make sure tvos uses caches not docs |
…lists - Remove delta/ppsspp/retroarch from tvOS LSApplicationQueriesSchemes (isInstalled always returns false on tvOS; canOpenURL is not used there) - Guard Files.app references behind #if !os(tvOS) throughout migration views - Show "Web Server" label/icon instead of "Files.app" on tvOS - Hide the iOS-only emulator discovery list in empty state on tvOS - Remove the Files.app method section in ManualFileImportGuideView on tvOS Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
✅ Self-review fixes pushed — tvOS now uses Web Server copy (not Files.app), spurious URL schemes removed from tvOS plists |
Summary
KnownEmulatorenum — new type inPVPrimitivesmodelling Delta, RetroArch, Manic Emu, PPSSPP, and Gamma with display name, bundle ID, URL scheme, save extensions, system summary, and a@MainActor isInstalleddetection helper viaUIApplication.canOpenURL.ExternalEmulatorMigrationView— SwiftUI settings screen under Settings → Library → "Import from Another Emulator". Detects installed emulators and shows tailored step-by-step export guides. Falls back to a "no emulators detected" state listing all options. Includes aManualFileImportGuideViewfor Files.app / web-server imports.LSApplicationQueriesSchemes— all iOS and tvOS Info.plist variants now includedelta,retroarch, andppssppsocanOpenURLworks at runtime.whats-new.json..changelog/3556.mdfragment added.How detection works
iOS sandboxing prevents direct file access to other apps' containers. This PR uses URL scheme probing (
UIApplication.canOpenURL("delta://")) which requires the schemes to be pre-declared inLSApplicationQueriesSchemes. The result is a guidance-only feature — all file transfer remains manual via the other app's share sheet → Files.app → Provenance.Test plan
ManualFileImportGuideViewcanOpenURL/ detection called on tvOS —isInstalledalways returnsfalse)swiftlint lintpasses on changed Swift filesPart of #3551
🤖 Generated with Claude Code