.agents/skills/guideline-apple/SKILL.md
Audits a Flutter app for compliance with Apple App Store Review Guidelines. Checks privacy keys (NSUsageDescription), ATT, Info.plist, SafeArea/notch handling, IAP for digital goods, age rating, accessibility, metadata accuracy, Kids Category rules, and HIG design basics. Use when the user asks to review, prepare or audit an app for App Store submission. Activate even when the user says 'my app was rejected by Apple', 'what do I need to submit to the App Store?', 'App Store review checklist', 'is my app ready for App Store?', 'Apple rejected my binary', 'NSUserTrackingUsageDescription is missing', or 'how to pass App Store review' without explicitly mentioning App Store Review Guidelines or HIG.
npx skillsauth add andrelucassvt/CleanMacForDevsWeb guideline-appleInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Analisa o projeto Flutter e verifica conformidade com as principais exigências das Apple App Store Review Guidelines.
Leia as instruções do projeto:
.github/instructions/architecture.instructions.md.github/instructions/view.instructions.mdArquivos-chave a inspecionar no projeto:
ios/Runner/Info.plistios/Runner.xcodeproj/project.pbxprojpubspec.yamllib/app.dartlib/main_production.dartlib/presentation/**/view/**lib/common/services/lib/l10n/arb/app_en.arbPara cada permissão usada no app, verificar se a chave e descrição existem em ios/Runner/Info.plist:
| Permissão | Chave Info.plist | Criticidade |
|---|---|---|
| Câmera | NSCameraUsageDescription | 🔴 Bloqueante |
| Galeria (leitura) | NSPhotoLibraryUsageDescription | 🔴 Bloqueante |
| Galeria (escrita) | NSPhotoLibraryAddUsageDescription | 🔴 Bloqueante |
| Microfone | NSMicrophoneUsageDescription | 🔴 Bloqueante |
| Localização (em uso) | NSLocationWhenInUseUsageDescription | 🔴 Bloqueante |
| Localização (sempre) | NSLocationAlwaysAndWhenInUseUsageDescription | 🔴 Bloqueante |
| Contatos | NSContactsUsageDescription | 🔴 Bloqueante |
| Calendário (leitura) | NSCalendarsUsageDescription | 🔴 Bloqueante |
| Calendário (escrita) | NSCalendarsWriteOnlyAccessUsageDescription | 🔴 Bloqueante |
| Lembretes | NSRemindersUsageDescription | 🔴 Bloqueante |
| Notificações locais | NSUserNotificationsUsageDescription | 🟡 Recomendado |
| Bluetooth | NSBluetoothAlwaysUsageDescription | 🔴 Bloqueante |
| Face ID / Touch ID | NSFaceIDUsageDescription | 🔴 Bloqueante |
| Rastreamento / ATT | NSUserTrackingUsageDescription | 🔴 Bloqueante |
| Saúde (leitura) | NSHealthShareUsageDescription | 🔴 Bloqueante |
| Saúde (escrita) | NSHealthUpdateUsageDescription | 🔴 Bloqueante |
| Movimento / Pedômetro | NSMotionUsageDescription | 🔴 Bloqueante |
| Siri | NSSiriUsageDescription | 🔴 Bloqueante |
| Reconhecimento de fala | NSSpeechRecognitionUsageDescription | 🔴 Bloqueante |
| Rede local | NSLocalNetworkUsageDescription | 🔴 Bloqueante |
Regras de qualidade para as descrições:
AppTrackingTransparency frameworkNSUserTrackingUsageDescription presente no Info.plistpubspec.yaml se google_mobile_ads ou similar está presente → exige ATTPrivacyInfo.xcprivacy)PrivacyInfo.xcprivacy em ios/Runner/pubspec.yaml se há in_app_purchase ou purchases_flutter (RevenueCat)Casos que NÃO precisam de IAP (permitido uso de pagamento externo):
itms-apps://apps.apple.com/account/subscriptions)SafeArealib/presentation/**/view/*.dartPadrão esperado no projeto:
// Com AppBar
Scaffold(
appBar: AppBar(...),
body: SafeArea(top: false, child: ...),
)
// Sem AppBar / fullscreen
SafeArea(
child: Scaffold(body: ...),
)
UISupportedInterfaceOrientations~ipad no Info.plistmain_production.dart não contém AppFlavor.development ou AppFlavor.stagingprint() — use log() do dart:developer apenas em dev)Semantics ou Tooltip descritivosExcludeSemantics ou semanticLabel: ''TextStyle sem tamanhos fixos muito pequenos)Info.plist:
NSAppTransportSecurity não deve ter NSAllowsArbitraryLoads: true em produçãoUserDefaults / SharedPreferences sem criptografiapubspec.yaml para sign_in_with_appleflutter build ipa --release sem warnings críticosios/Podfile)bitcode desabilitado se algum plugin não suporta (já padrão no Xcode 14+)_ ou headers privados)LSApplicationQueriesSchemes no Info.plist declarado para todos os url_launcher schemes usadosPara cada categoria auditada, usar o seguinte formato:
## [Número]. [Nome da Categoria]
**Status:** ✅ Conforme | ⚠️ Atenção | ❌ Não conforme | ⏭️ Não aplicável
### Problemas encontrados:
1. [criticidade] Descrição do problema
- Arquivo: `caminho/do/arquivo.ext`
- Linha: X (se aplicável)
- Atual: `código ou valor atual`
- Correção: `código ou valor esperado`
### Itens conformes:
- ✅ Descrição do item ok
Ao final da auditoria, gerar um resumo executivo:
## 📋 Relatório de Conformidade Apple App Store
### Resumo
| Categoria | Status | Bloqueantes | Atenções |
|---|---|---|---|
| 1. Privacidade | ✅/⚠️/❌ | N | N |
| 2. Compras IAP | ✅/⚠️/❌ | N | N |
| 3. Design / HIG | ✅/⚠️/❌ | N | N |
| 4. Acessibilidade | ✅/⚠️/❌ | N | N |
| 5. Classificação Etária | ✅/⚠️/❌ | N | N |
| 6. Metadados | ✅/⚠️/❌ | N | N |
| 7. Segurança / ATS | ✅/⚠️/❌ | N | N |
| 8. Notificações | ✅/⚠️/❌ | N | N |
| 9. Login / Apple Sign-In | ✅/⚠️/❌ | N | N |
| 10. Flutter/iOS Específico | ✅/⚠️/❌ | N | N |
### Veredicto
🔴 NÃO PRONTO — X item(ns) bloqueante(s) devem ser corrigidos antes do envio.
🟡 QUASE PRONTO — Sem bloqueantes, mas X atenção(ões) recomendadas.
🟢 PRONTO — App em conformidade com as principais diretrizes da Apple.
### Próximos Passos (ordenados por prioridade)
1. [BLOQUEANTE] Ação corretiva
2. [ATENÇÃO] Ação recomendada
Última atualização: 28 de março de 2026
testing
Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. Activate even when the user says 'create a skill for X', 'the skill is not triggering', 'improve this skill description', 'the agent is not using the skill', 'add a skill to teach the agent how to do X', 'this skill is wrong', or 'update the skill' without explicitly mentioning evals or benchmark.
development
Implements Flutter reusable widgets following the project architecture. Use whenever creating or modifying widgets in presentation/<feature>/widgets/, presentation/<feature>/content/, or common/widgets/. Covers StatelessWidget vs StatefulWidget decision, Entity as parameter, i18n, dispose, componentization rules, and when to access the Cubit via context.read. Activate even when the user says 'extract this to a widget', 'create a list item widget', 'build a reusable card', 'factor out this UI block', 'create a component for this', or 'this View is getting too big' without explicitly mentioning StatelessWidget or reusable components.
tools
Implements Flutter View screens following the project architecture. Use whenever creating or modifying a View (StatefulWidget + Cubit + BlocBuilder), adding a new screen, wiring up BlocBuilder/BlocConsumer/BlocListener, setting up SafeArea, or navigating from the View. Covers State, Cubit, View file, route, DI registration, and common mistakes. Activate even when the user just says "create a screen" or "add a new page", without explicitly mentioning Cubit or BLoC.
testing
Implements Flutter Cubit and State (View Model layer) following the project architecture. Use whenever creating or modifying a Cubit or State class, adding an async method to a Cubit, handling form submission or validation, implementing debounce search, managing loading/error/navigation states, or wiring a Cubit to a Repository or StorageService. Covers sealed States, async patterns with Result<T>, CRUD Cubits, local persistence via StorageService, navigation states, debounce, and common mistakes. Activate even when the user says "add a method", "handle the loading state", or "save locally" without explicitly mentioning Cubit or BLoC.