Skip to content

feat: RetroX Sprint 1, launcher com PCSX2, perfis, biblioteca e ajustes - #1

Merged
oLuqueJs merged 56 commits into
mainfrom
feat/sprint-1
Oct 28, 2026
Merged

oLuqueJs merged 56 commits into
mainfrom
feat/sprint-1

Conversation

@oLuqueJs

Copy link
Copy Markdown
Owner

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

  • Launch do PCSX2: argv em array, sem shell (-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.
  • Emuladores como plugins: o plugin do PCSX2 descobre, a partir da pasta raiz, o app, as ROMs, as capas e a BIOS, e lê o PCSX2.ini só para consulta. As capas são associadas pelo serial do disco. O GameIndex.yaml do PCSX2 dá o nome oficial, a região e a compatibilidade.
  • Interface:
    • Tela de perfis "Quem vai jogar?".
    • Início em três visualizações (Prateleira, Carrossel e Grade).
    • Biblioteca com busca, filtro por console e cinco layouts.
    • Detalhes com capa própria e informações da Wikipedia sob demanda.
    • Ajustes dentro da janela.
    • 11 temas claros e escuros, e abertura animada.
  • Controle: o app inteiro funciona pelo controle, com presets Xbox, PlayStation (DualSense) e Switch. Teclado e mouse funcionam em tudo.
  • Skills do Claude Code: swiftui-design-skill e logo-design, com o custo reduzido.

Decisões

ADRs 0001–0014, docs/DECISOES.md (D1–D14), spikes 0001 e 0002 e docs/design/brand-spec.md.

Como testar

scripts/test.sh                 # 91 testes unitários
scripts/integration-launch.sh   # launch real de um emulador falso
scripts/bundle-app.sh debug && open .build/RetroX.app

Fora deste PR / pendências

  • Persistência em SwiftData (Fase 2): depende do Xcode, que ainda não está instalado. Por enquanto, perfis e histórico ficam em JSON.
  • Plugin do Dolphin: o Dolphin não está instalado na máquina de desenvolvimento.
  • Configurador de controle que grava no PCSX2: exige consentimento e teste com controle real (spike 0002).
  • Ainda não foram testados: navegação com controle físico, macOS 14 e Mac Intel.
  • logo-design inclui ~1.400 SVGs de marcas de terceiros (13 MB), só para estudo.

🤖 Generated with Claude Code

oLuqueJs and others added 30 commits October 27, 2026 23:35
- 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>
oLuqueJs and others added 4 commits October 28, 2026 10:14
…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>
@oLuqueJs
oLuqueJs requested a balanced review from Copilot October 28, 2026 13:41
@oLuqueJs oLuqueJs self-assigned this Oct 28, 2026

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

oLuqueJs and others added 21 commits October 28, 2026 10:42
- 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>
@oLuqueJs
oLuqueJs merged commit 7217ec0 into main Oct 28, 2026
2 checks passed
@oLuqueJs
oLuqueJs deleted the feat/sprint-1 branch October 28, 2026 16:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants