Repository navigation
feat: RetroX Sprint 1, launcher com PCSX2, perfis, biblioteca e ajustes - #1
Merged
Merged
Conversation
- PRD 0.2 com a seção de revisão do plano técnico. - ADRs 0001-0009 aceitos, com emendas onde o plano pediu. - Novos ADR-0010 (build SwiftPM-first) e ADR-0012 (detecção de sistema). - docs/DECISOES.md com decisões D1-D3, suposições e pendências. - Prompts originais movidos para docs/origem/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Package.swift (tools 6.0, macOS 14, modo Swift 6) com RetroXCore e testes. - scripts/check-toolchain.sh informa Xcode, SwiftData e Rosetta. - GameSystemID, catálogo estático (PS2) e TitleParser, com testes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- AppBundleInspector lê Info.plist e arquiteturas Mach-O (thin/fat/fat64)
sem carregar o bundle.
- HostEnvironment classifica nativo / Rosetta / incompatível.
- Contrato EmulatorAdapter, EmulatorRegistry e PCSX2Adapter com argv
tipado ("-batch", "--", caminho) e validação de argumentos extras.
- LaunchError com mensagens em pt-BR e ações de correção.
- Testes com disco falso e cabeçalhos sintéticos; caminhos comparados
byte a byte (NFC/NFD, hífen inicial, aspas, $(), newline, emoji).
- scripts/test.sh contorna a descoberta intermitente do plugin do
Swift Testing nas Command Line Tools (registrado no ADR-0010).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- GameLauncher.prepare valida ROM, emulador, arquitetura e instância aberta e devolve um LaunchPlan puro (base do modo simulado). - WorkspaceLauncher (LaunchServices) e FoundationProcessLauncher (exec direto, stdout/stderr para arquivo ou /dev/null), sem shell. - Término observado por kqueue (DispatchSource), sem depender de run loop. - SessionOutcome classifica saída precoce (< 5 s) como falha provável. - Logs os.Logger com argumentos privados e signpost do North Star. - Testes com disco, apps em execução e launcher falsos. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- rx-fake-emulator grava o argv recebido em JSON e fica aberto 4 s. - LaunchIntegrationTests (opt-in via scripts/integration-launch.sh): argv chega byte a byte via NSWorkspace e via Process (pasta NFD, CJK, emoji, nome com hífen inicial e caracteres de shell); com o app já aberto, o LaunchServices reaproveita a instância e descarta os novos argumentos. - FoundationProcessLauncher para de esperar assim que o app registra. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CLI que usa o mesmo GameLauncher do app: valida, mostra emulador, avisos, estratégia e argv (JSON) e, sem --dry-run, abre o emulador e opcionalmente espera o término (--wait) para classificar a sessão. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- LaunchViewModel (@observable, @mainactor): escolhe emulador e ROM, valida, mostra o plano no modo simulado ou abre o emulador e volta à frente quando ele fecha; erros vêm com ações de correção. - LaunchView em Form agrupado, Return joga, anúncios para VoiceOver. - Sem @State: no SDK 27 ele é macro e as CLT não têm o plugin SwiftUIMacros (registrado no ADR-0010). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Support/Info.plist (macOS 14, bundle ID provisório local.retrox.RetroX) e scripts/bundle-app.sh [debug|release]. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Redirecionada para arquivo, a saída só era gravada no fim, e scripts não conseguiam ler o "pid:" enquanto o emulador rodava. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Três launches reais do PCSX2 2.9.144 (NSWorkspace e Process; espaços, NFD/CJK/emoji, hífen inicial, NFC): o caminho no log do emulador é idêntico ao argv byte a byte e o jogo inicia. Pasta de ROMs com stat idêntico antes/depois. ADR-0011: NSWorkspace por padrão, Process como alternativa, recusa quando o emulador já está aberto. README com os comandos de build, teste e diagnóstico. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Introduced anti-AI-slop rules to avoid generic UI patterns in SwiftUI. - Created a structured 5-dimension design review framework for evaluating UI quality. - Compiled practical layout patterns for common SwiftUI design scenarios. - Added essential Swift extensions for color handling and typography. - Established a typography and color system with clear guidelines. - Provided a brand specification template for consistent branding. - Initialized skills-lock.json for versioning and tracking changes.
- Contrato EmulatorPlugin: o usuário ativa um plugin e escolhe a pasta raiz do emulador; o plugin descobre app, pastas de jogos, capas e BIOS. - PCSX2Plugin lê (sem alterar) o PCSX2.ini, inclusive no modo portátil: pastas da lista de jogos (Paths/RecursivePaths), capas e BIOS. - GameScanner e LibraryBuilder montam a biblioteca sem tocar nas ROMs; CoverMatcher associa capas locais pelo nome (ex.: gt4-cover.png). - JSONFileStore para configuração de plugins e histórico até a Fase 2. - Paleta "Portátil quente" como dados, com teste de contraste WCAG. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- PS2DiscReader lê o SYSTEM.CNF de ISOs (ISO 9660, poucos KB, sem
hash) e devolve o serial ("SLUS-21490").
- CoverMatcher prefere a capa nomeada pelo serial, que é como o PCSX2
salva as capas que baixa; depois tenta pelo nome.
- PCSX2Plugin escolhe a versão mais nova quando há mais de um app.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O LaunchServices ainda lista o app por um instante depois que o processo termina; jogar de novo logo em seguida dava "já aberto". Agora só conta como aberto se o processo existe (kill(pid, 0)). Achado pela integração com o emulador falso. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Substitui a janela de prova técnica, cujo seletor de arquivos perdia a escolha: o fileImporter zerava o estado antes de entregar o arquivo. - Home "Portátil quente": palco com o jogo em foco, prateleira de capas (Recentes, Todos, Favoritos) com a capa em foco subindo, halo na cor de tema e reflexo no chão; barra de comandos com os glifos do controle conectado ou as teclas. - Emuladores: ativar o plugin, escolher a pasta raiz (NSOpenPanel) e ver o que foi encontrado (app, jogos, capas, BIOS do PCSX2.ini). - Detalhes do jogo (com o argv exato), sobreposição da partida com recuperação de erros, Ajustes de aparência e cor de tema. - Teclado e controle (GameController) passam pelo mesmo roteador; Reduce Motion respeitado; anúncios para VoiceOver. - Favoritos e histórico persistidos em JSON até a Fase 2. - Argumentos de revisão visual: -RetroXSnapshot e -RetroXInitialScreen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ADR-0013: plugin por emulador com pasta raiz; leitura só leitura do PCSX2.ini; capas por serial; JSON até a Fase 2. - docs/design/brand-spec.md com a direção "Portátil quente". - PRD, DECISOES e README atualizados (como usar, teclado). - Spike 0001: CLI do PCSX2 2.9.147 conferida no binário. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SystemCatalog com PS1, PS2, PS3, PSP, GameCube, Wii, NDS, 3DS, Switch, GBA, SNES e N64 (para o filtro por console; só o PS2 tem plugin por enquanto) e tons de capa gerada por sistema. - ThemeID: RetroX, Gruvbox, Catppuccin, Tokyo Night, Nord, Solarized, Dracula, Rosé Pine, Everforest, Kanagawa e One, cada um claro e escuro, com cores oficiais ajustadas só onde não atingiam AA. - ThemeTests confere contraste e hierarquia de todos os temas. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Profile (nome, foto, tema, aparência, usuário do RetroAchievements) e ProfileStorage com histórico por perfil; o history.json antigo migra para o primeiro perfil e fica guardado como legacy. - ImageImporter copia fotos e capas como PNG reduzido, sem tocar no original; ArtworkStorage guarda capa própria e metadados por jogo. - WikipediaMetadataProvider: busca (pt, depois en) e resumo da Wikipedia, completados pelo Wikidata (ano, desenvolvedora, editora, gênero) quando ele responde. Sem chave nem conta. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- PCSX2GameIndex lê o GameIndex.yaml do app (serial → nome oficial, região e compatibilidade), só para os seriais da biblioteca. - A descoberta do plugin lê do PCSX2.ini o estado do RetroAchievements (ativado, hardcore, usuário; o token nunca é consultado) e o mapeamento do controle da porta 1. - TitleParser.searchTitle limpa região, tags e versão para buscas. - Testes de perfis, importação de imagem, índice, conquistas, controle e metadados com HTTP falso. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tela "Quem vai jogar?" ao abrir, como num console: avatares com foco por teclado, controle e hover; criar, editar e excluir perfis com foto, nome, tema, aparência e usuário do RetroAchievements. Favoritos, recentes e tema são de cada perfil. - Biblioteca em grade com busca (nome, nome oficial ou serial), chips e menu por console (catálogo inteiro, sem jogos desativado), favoritos, ordenação e quatro layouts: Capas, Capas grandes, Capas e nomes, Lista. Navegação 2D por teclado e controle. - Temas aplicados por perfil (galeria com claro e escuro lado a lado), inclusive na janela de Ajustes. - Detalhes: trocar/restaurar capa, nome oficial, região e compatibilidade do PCSX2, informações da Wikipedia com escolha do resultado e atribuição da fonte. - Emuladores: estado do RetroAchievements e mapeamento do controle do PCSX2 (só leitura). Ajustes > Controle: botão de confirmar estilo Nintendo e teste ao vivo dos botões. - Acabamento com a swiftui-design-skill: cantos contínuos, hover com leve elevação, animações snappy/smooth, abas com matchedGeometry. - Argumentos de revisão visual: -RetroXTheme e -RetroXAppearance. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RX_NETWORK=1 scripts/test.sh --filter MetadataNetworkTests consulta a Wikipedia de verdade (busca + resumo). Fora da suíte normal, que continua sem rede. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ADR-0014: banco do PCSX2 offline + Wikipedia/Wikidata sob demanda, com escolha do resultado e atribuição; sem download de capas. - Spike 0002: RetroAchievements e controle do PCSX2 validados em leitura; conta por perfil e gravação de perfil de entrada pendentes de consentimento e teste com controle. - Brand spec com os 11 temas, movimento e telas; decisões D8-D11; README com perfis, biblioteca e atalhos. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A pedido do usuário, o RetroX deixa de ler e mostrar o estado do RetroAchievements do emulador e o campo de usuário do perfil. Perfis antigos com o campo continuam abrindo (chave ignorada). Um teste garante que a seção [Achievements] do PCSX2.ini, inclusive o token, não é lida. Decisão D12; spike 0002 atualizado. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ProfilePreferences: estilo da tela inicial (prateleira, carrossel, grade), tamanho das capas, prateleira inicial, fonte, tamanho do texto, fundo ambiente, nível e velocidade das animações, abertura animada, selo de favorito e relógio. Decodificação tolerante. - ControllerPreset: Automático, Xbox, PlayStation (DualSense) e Nintendo Switch, com glifos SF por posição de botão, confirmação à direita no layout Nintendo e detecção pela categoria do controle. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Navegação: quatro abas fixas (Início, Biblioteca, Emuladores, Ajustes); o conteúdo desliza para o lado da aba escolhida. Detalhes e edição de perfil viram cartões na janela, com mola suave e fundo escurecendo. - Abertura animada (símbolo com anel se desenhando e nome letra a letra), desligável no perfil. - Fundo ambiente: a capa do jogo em foco desfocada atrás da tela, a partir de uma miniatura minúscula (sem filtro caro, sem esticar o layout). Some com Reduzir Transparência. - Tela inicial com três visualizações: Prateleira, Carrossel (capas vizinhas inclinadas em 3D) e Grade; Biblioteca ganha "Capas pequenas". - Ajustes dentro da janela, no estilo console, navegáveis por controle e teclado: aparência, tela inicial, biblioteca, texto (fonte e tamanho), controle, animações (nível e velocidade) e sobre. - Controle no app inteiro, com presets Xbox, PlayStation (DualSense), Nintendo Switch e automático; gatilhos trocam de aba, Start abre Ajustes, View abre Emuladores; inverter confirmar/voltar, velocidade de repetição e modo das dicas. - Emuladores: ícone real do app instalado, selo de estado, blocos de resumo, detalhes recolhíveis e outros emuladores detectados no Mac. - Menu "Ir" (⌘1-⌘4, ⌘, para Ajustes, ⇧⌘P para trocar de perfil). - Modo de captura (-RetroXSnapshot) inerte: ignora entradas e nunca abre jogo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-0007 emendado (controle em todas as telas, presets, níveis de animação), decisões D13-D14, brand spec com movimento, telas e texto, README com os atalhos de teclado e controle. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Modelo sonnet, sem pesquisa/download de marca (usa a brand spec do projeto), 3 direções e revisão por captura só quando pedidas, referências lidas sob demanda e seções repetidas removidas. O arquivo agora diverge do hash em skills-lock.json; um `npx skills update` sobrescreveria estas mudanças. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Instalada com `npx skills add kaankiziltug/logo-design-skill`. Scripts revisados: sem rede, só renderizadores locais e pastas temporárias. A biblioteca de ~1.400 SVGs é de marcas de terceiros: só estudo. Redução: modelo sonnet, brand spec do projeto como brief, 4–6 conceitos, um ciclo de teste, biblioteca e folhas de prévia só quando exigidas ou pedidas, referências sob demanda. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…matching logic feat(app): enhance LibraryModel focused index handling and game focus logic chore: add ambientInFlight tracking in CoverImageStore for better image loading management test: add tests for CoverMatcher's prepared cover priority and order
Conceito C escolhido: R de traço único com pontas arredondadas, salvo em docs/design/logo/retrox-mark.svg (master ainda em traço). Decisão D15 e brand spec atualizados; a personagem de anime fica registrada como complemento futuro da marca. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rior - Support/RetroX.icns gerado a partir de docs/design/rayo/rayo.png, encaixado na grade do macOS (corpo 824/1024, cantos transparentes); ligado via CFBundleIconFile e copiado pelo bundle-app.sh. - Recursos do SwiftPM (RayoMark, RayoAvatar) carregados por Brand; a abertura usa o tile da Rayo no lugar do "R" provisório, e a barra superior mostra o avatar dela ao lado do nome. - Originais da personagem guardados em docs/design/rayo/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O avatar redondo parecia uma foto de perfil (e já existe uma à direita). A barra agora usa o mesmo tile do ícone do app, e o "X" do nome leva a cor de acento. Remove o RayoAvatar, sem uso. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iúsculas Substitui o kit do R geométrico. scripts/brand-kit.swift gera, a partir de docs/design/rayo/rayo.png, o ícone (e o .icns), o tile, as assinaturas horizontal e empilhada e o nome, sobre claro e escuro, e a prancha do kit. Regras: tile = 2C (horizontal) ou 3C (empilhada), faixa das maiúsculas centrada no tile, vão de 0,75C medido da tinta e aperto extra no par "o→X". Atualiza D15 e o brand-spec. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- BrandLockup/BrandWordmark aplicam as regras do kit (tile = 2C, maiúsculas centradas no tile). - Abertura em três tempos: a Rayo sobe do desfoque sobre um halo na cor de tema e um brilho atravessa o tile; "Retro" assenta e o "X" gira até o lugar; a saída esmaece com leve zoom e desfoque. Composição empilhada do kit. Com Reduzir Movimento, só esmaece. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Added package.json to manage project dependencies and scripts for semantic release. - Introduced scripts/package-app.sh to create a signed ZIP package of the app for the host architecture.
Remove halo, faixa de brilho, desfoques, o X girando, a frase e o zoom de saída. A abertura agora é a assinatura horizontal do kit (a mesma da barra superior): a Rayo aparece e o nome se revela a partir dela, da esquerda para a direita; depois tudo esmaece. Cerca de 1,3 s. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No bash 3.2 (macOS e runners do GitHub), expandir "${extra[@]}" vazio com set -u dá "unbound
variable". Com o Xcode ativo no runner o array fica vazio; usa ${extra[@]+"${extra[@]}"}.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
README reorganizado no formato do projeto Nari: assinatura clara/escura no topo, selos, instalação, uso, documentação, desenvolvimento, implementação, estrutura e licença. Adiciona o LICENSE (texto oficial da GPL-3.0) e o copyright de Otávio Luque no Info.plist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O X da assinatura passa a ser construído com duas hastes em cápsula (na caixa e na espessura do X
da fonte), com vão em volta da haste da frente e gradiente misturado em OKLCH: #FEB5B8 → #7BADFD
sobre o escuro e #D63A62 → #2F6BDF ("Vivo") sobre o claro. Novos arquivos retrox-x-on-*.png e
prancha com assinaturas, o X, as cores e o ícone. Guia atualizado.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Escuro: noite em índigo (#191A2E) com texto branco-pétala, secundário lavanda e acento no rosa do cabelo (#FEB5B8). Claro: céu do fundo do tile (#EDF3FF) com texto índigo e acento framboesa (#D63A62), as mesmas cores do X do kit. Contraste AA conferido pelos ThemeTests nos dois modos. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BrandX desenha o X da marca num Canvas: duas hastes em cápsula na caixa e na espessura do X da fonte, vão em volta da haste da frente e gradiente em OKLCH da cor de destaque do tema até o céu da Rayo (#7BADFD no escuro, #2F6BDF no claro). Alinhado pela linha de base do "Retro"; geometria em cache por corpo. O gradiente em OKLCH fica no RetroXCore, com testes de contraste do X (≥ 3:1 sobre o fundo em todos os temas) e das pontas do gradiente. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Troca o X de duas hastes pelo glifo da fonte preenchido com o mesmo gradiente em OKLCH, no app (BrandX) e no kit (assinaturas, nome, X e prancha regenerados). Cores mantidas: #FEB5B8 → #7BADFD no escuro e #D63A62 → #2F6BDF no claro; no app, da cor de destaque do tema até o céu da Rayo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
O gradiente framboesa → azul ficava roxo e pesado sobre o fundo claro. No claro o X agora é a cor de destaque, sólida (#D63A62 no kit, a cor de destaque do tema no app); no escuro continua o gradiente em OKLCH até o céu da Rayo. Kit regenerado e guia atualizado. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…Xcode 16.4 O lipo do runner exige `lipo <arquivo> -verify_arch <arch>`; com a ordem invertida ele lia o caminho do binário como nome de arquitetura e falhava. O lipo mais novo aceitava as duas ordens, por isso só quebrava no CI. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resumo
Primeira entrega do RetroX: launcher nativo para macOS (Swift 6/SwiftUI) que reúne os jogos dos emuladores instalados e abre cada um no emulador externo. Não inclui emuladores, jogos nem BIOS, e não copia, move ou altera arquivos de jogo.
O que entra
-batch -- <rom>), via NSWorkspace, com Process como alternativa. Validado com o PCSX2 real no spike 0001 e com um emulador falso nos testes de integração.PCSX2.inisó para consulta. As capas são associadas pelo serial do disco. OGameIndex.yamldo PCSX2 dá o nome oficial, a região e a compatibilidade.swiftui-design-skillelogo-design, com o custo reduzido.Decisões
ADRs 0001–0014,
docs/DECISOES.md(D1–D14), spikes 0001 e 0002 edocs/design/brand-spec.md.Como testar
Fora deste PR / pendências
logo-designinclui ~1.400 SVGs de marcas de terceiros (13 MB), só para estudo.🤖 Generated with Claude Code