reis-mobile 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +20 -0
  4. package/README.md +46 -21
  5. package/THIRD_PARTY_NOTICES.md +33 -0
  6. package/agents/mobile-release-engineer.md +2 -0
  7. package/agents/mobile-staff-engineer.md +17 -3
  8. package/core/router/intent-detector.mjs +3 -2
  9. package/core/router/intents.mjs +51 -2
  10. package/package.json +1 -1
  11. package/skills/mobile-analytics/SKILL.md +55 -0
  12. package/skills/mobile-analytics/references/android.md +9 -0
  13. package/skills/mobile-analytics/references/flutter.md +10 -0
  14. package/skills/mobile-analytics/references/ios.md +9 -0
  15. package/skills/mobile-analytics/references/kotlin-multiplatform.md +8 -0
  16. package/skills/mobile-analytics/references/react-native.md +9 -0
  17. package/skills/mobile-auth/SKILL.md +55 -0
  18. package/skills/mobile-auth/references/android.md +10 -0
  19. package/skills/mobile-auth/references/flutter.md +9 -0
  20. package/skills/mobile-auth/references/ios.md +10 -0
  21. package/skills/mobile-auth/references/kotlin-multiplatform.md +9 -0
  22. package/skills/mobile-auth/references/react-native.md +9 -0
  23. package/skills/mobile-billing/SKILL.md +58 -0
  24. package/skills/mobile-billing/references/android.md +11 -0
  25. package/skills/mobile-billing/references/flutter.md +11 -0
  26. package/skills/mobile-billing/references/ios.md +11 -0
  27. package/skills/mobile-billing/references/kotlin-multiplatform.md +9 -0
  28. package/skills/mobile-billing/references/react-native.md +10 -0
  29. package/skills/mobile-ci/SKILL.md +49 -0
  30. package/skills/mobile-ci/references/android.md +8 -0
  31. package/skills/mobile-ci/references/fastlane/beta.md +75 -0
  32. package/skills/mobile-ci/references/fastlane/match.md +288 -0
  33. package/skills/mobile-ci/references/fastlane/release.md +113 -0
  34. package/skills/mobile-ci/references/fastlane/setup-fastlane.md +150 -0
  35. package/skills/mobile-ci/references/fastlane/snapshot.md +394 -0
  36. package/skills/mobile-ci/references/fastlane/xcode-cloud.md +110 -0
  37. package/skills/mobile-ci/references/flutter.md +8 -0
  38. package/skills/mobile-ci/references/ios.md +9 -0
  39. package/skills/mobile-ci/references/kotlin-multiplatform.md +8 -0
  40. package/skills/mobile-ci/references/react-native.md +8 -0
  41. package/skills/mobile-firebase/SKILL.md +3 -1
  42. package/skills/mobile-hardware/SKILL.md +58 -0
  43. package/skills/mobile-hardware/references/android.md +12 -0
  44. package/skills/mobile-hardware/references/flutter.md +10 -0
  45. package/skills/mobile-hardware/references/ios.md +11 -0
  46. package/skills/mobile-hardware/references/kotlin-multiplatform.md +9 -0
  47. package/skills/mobile-hardware/references/react-native.md +10 -0
  48. package/skills/mobile-migration/SKILL.md +66 -0
  49. package/skills/mobile-migration/references/android.md +9 -0
  50. package/skills/mobile-migration/references/flutter.md +10 -0
  51. package/skills/mobile-migration/references/ios.md +10 -0
  52. package/skills/mobile-migration/references/kotlin-multiplatform.md +9 -0
  53. package/skills/mobile-migration/references/react-native.md +10 -0
  54. package/skills/mobile-networking/SKILL.md +50 -0
  55. package/skills/mobile-networking/references/android.md +10 -0
  56. package/skills/mobile-networking/references/flutter.md +9 -0
  57. package/skills/mobile-networking/references/ios.md +10 -0
  58. package/skills/mobile-networking/references/kotlin-multiplatform.md +9 -0
  59. package/skills/mobile-networking/references/react-native.md +11 -0
  60. package/skills/mobile-notifications/SKILL.md +51 -0
  61. package/skills/mobile-notifications/references/android.md +10 -0
  62. package/skills/mobile-notifications/references/flutter.md +10 -0
  63. package/skills/mobile-notifications/references/ios.md +11 -0
  64. package/skills/mobile-notifications/references/kotlin-multiplatform.md +9 -0
  65. package/skills/mobile-notifications/references/react-native.md +10 -0
  66. package/skills/mobile-observability/SKILL.md +1 -1
  67. package/skills/mobile-offline-sync/SKILL.md +2 -0
  68. package/skills/mobile-privacy/SKILL.md +54 -0
  69. package/skills/mobile-privacy/references/android.md +10 -0
  70. package/skills/mobile-privacy/references/flutter.md +9 -0
  71. package/skills/mobile-privacy/references/ios.md +10 -0
  72. package/skills/mobile-privacy/references/kotlin-multiplatform.md +9 -0
  73. package/skills/mobile-privacy/references/react-native.md +9 -0
  74. package/skills/mobile-release/SKILL.md +1 -0
  75. package/skills/mobile-release/references/billing.md +2 -0
  76. package/skills/mobile-release/references/ci-cd.md +2 -0
  77. package/skills/mobile-security/SKILL.md +2 -0
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "AI agents for mobile engineering",
8
- "version": "0.9.0"
8
+ "version": "0.10.0"
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "reis-mobile",
13
13
  "source": "./",
14
14
  "description": "AI agents, skills and workflows for Flutter, Android, iOS and React Native development.",
15
- "version": "0.9.0",
15
+ "version": "0.10.0",
16
16
  "author": {
17
17
  "name": "Warleson Reis"
18
18
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reis-mobile",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "AI agents, skills and workflows for Flutter, Android, iOS and React Native development. Use /reis-mobile:doctor, /reis-mobile:review and /reis-mobile:test.",
5
5
  "author": {
6
6
  "name": "Warleson Reis"
package/CHANGELOG.md CHANGED
@@ -4,6 +4,26 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). The pr
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.10.0] - 2026-11-04
8
+
9
+ ### Added
10
+
11
+ - `mobile-ci` topic skill for deployment pipelines across all five stacks, with the setup, Match, beta, release and Snapshot guides plus Xcode Cloud documentation imported from `greenstevester/fastlane-skill` (MIT), attributed and pinned to their upstream revision.
12
+
13
+ - Four topic skills, each with Flutter, Android, iOS, React Native and Kotlin Multiplatform references: `mobile-privacy` for consent and data lifecycle, `mobile-networking` for API integration and request recovery, `mobile-auth` for identity/session flows, and `mobile-notifications` for push/local notification lifecycles.
14
+ - English and Portuguese `privacy`, `networking`, `auth` and `notifications` intents, handled by the existing staff engineer, with five-stack routing, prompt discovery and explicit-override tests.
15
+ - `mobile-billing`, `mobile-migration`, `mobile-analytics` and `mobile-hardware` topic skills, each with Flutter, Android, iOS, React Native and Kotlin Multiplatform references: in-app purchases verified by the backend before acknowledgement and recovered after process death; migrations planned as buildable steps, with on-device data that survives skipped releases and interrupted launches; tracking plans with typed events, identity reset on sign-out and consent-gated collection; device hardware from the availability check to the release of the resource, with real-device test matrices.
16
+ - English and Portuguese `billing`, `analytics` and `hardware` intents, handled by `mobile-staff-engineer`. `mobile-migration` joins the existing `migration` route. Plain "analytics" still routes to observability.
17
+
18
+ ### Changed
19
+
20
+ - Authentication requests now have a dedicated `auth` intent instead of relying on security vocabulary. Explicit security audits retain the security workflow.
21
+ - `mobile-staff-engineer` serves the `billing`, `analytics` and `hardware` intents and loads `mobile-migration` for migration plans.
22
+
23
+ ### Fixed
24
+
25
+ - The router counted any word starting with "pr" as a review request, so prompts such as "implementar paywall premium" or "definir funil de conversão do produto" went to review. "PR" and "PRs" now count only as whole words.
26
+
7
27
  ## [0.9.0] - 2026-10-13
8
28
 
9
29
  ### Added
package/README.md CHANGED
@@ -23,7 +23,7 @@ A mobile app is not a generic project. A code review that does not know about `B
23
23
 
24
24
  🔎 **Detects the stack on its own.** Flutter (app or plugin), React Native (including Expo), Kotlin Multiplatform, native Android and iOS, with languages and target platforms. A Flutter app with `android/` and `ios/` is still Flutter.
25
25
 
26
- 👥 **21 agents and 17 mobile skills.** Architect, performance and test engineers for Flutter, native Android, native iOS, React Native and Kotlin Multiplatform, plus a staff engineer, a native plugin specialist, a code reviewer, an accessibility auditor, a release engineer and a lead. Topic skills cover the five stacks with focused references for debugging, tests, security, Firebase, accessibility, releases, performance budgets, offline sync and production observability.
26
+ 👥 **21 agents and 26 mobile skills.** Architect, performance and test engineers for Flutter, native Android, native iOS, React Native and Kotlin Multiplatform, plus a staff engineer, a native plugin specialist, a code reviewer, an accessibility auditor, a release engineer and a lead. Topic skills cover the five stacks with focused references for debugging, tests, security, Firebase, accessibility, releases, performance budgets, offline sync, production observability, privacy, networking, authentication, notifications, in-app purchases, migrations, product analytics and device hardware.
27
27
 
28
28
  🧩 **Project-specific context.** `/reis-mobile:project` records real app symbols, owners, boundaries and validation commands in `.reis-mobile/project.md`; the team can add product rules that code cannot reveal. Refreshing the verified map preserves team-authored text.
29
29
 
@@ -44,28 +44,25 @@ A mobile app is not a generic project. A code review that does not know about `B
44
44
  ## What's new
45
45
 
46
46
  <!-- reis-mobile:latest-release:start -->
47
- ### v0.9.0
47
+ ### v0.10.0
48
48
 
49
49
  #### Added
50
50
 
51
- - `core/providers/`: the multi-provider layer. Six external providers — the `codex` and `gemini` CLIs plus the OpenAI, Gemini, OpenRouter and Ollama HTTP APIs — described as data (endpoint, credential variables, request shape, model catalog), so adding one touches no command. Status, model and allowlist resolution make no network call: a CLI is found by scanning `PATH`, an HTTP provider by its credential variable.
52
- - `reis-mobile providers [--all] [--json]` lists every provider with the evidence behind its status (`ready`, `local`, `missing`, `disabled`, `blocked`), its endpoint and the resolved model. `reis-mobile providers --models` asks each provider which models it serves, so no model id is ever shipped as a default.
53
- - `reis-mobile consult [--providers a,b] [--model <id>] [--file <path>] [--timeout <ms>] <question>` asks the selected providers the same question in parallel. The core performs the call, so no API key passes through the conversation; the question is redacted on the way out and every answer on the way in. Each requested provider is reported with its own typed status — `ok`, `unavailable`, `no-model`, `timeout`, `error` — and the exit code is 1 only when nobody answered.
54
- - `/reis-mobile:consult [options] <question>`, also reachable as `/reis-mobile consult ...`: routes the question through the stack's specialist, requires its own position first, builds a self-contained briefing in `.reis-mobile/consults/`, consults the providers and then reconciles every outside claim against the code as confirmed with `file:line`, unverifiable or wrong.
55
- - `providers:` in `.reis-mobile/config.yaml`: the allowlist of external providers a repository accepts, committed with the repository. An absent key allows all, an empty list allows none, and a blocked provider says so instead of failing.
56
- - `providers.<id>.model` and `providers.<id>.enabled` in `~/.config/reis-mobile/config.json`, with precedence `--model`, then the provider's model variable (`OPENAI_MODEL`, `GEMINI_MODEL`, `OPENROUTER_MODEL`, `OLLAMA_MODEL`), then the config file.
57
- - `reis-mobile doctor` lists the configured providers under Integrations, with a single informational row when none is configured. It still makes no network call.
51
+ - `mobile-ci` topic skill for deployment pipelines across all five stacks, with the setup, Match, beta, release and Snapshot guides plus Xcode Cloud documentation imported from `greenstevester/fastlane-skill` (MIT), attributed and pinned to their upstream revision.
52
+
53
+ - Four topic skills, each with Flutter, Android, iOS, React Native and Kotlin Multiplatform references: `mobile-privacy` for consent and data lifecycle, `mobile-networking` for API integration and request recovery, `mobile-auth` for identity/session flows, and `mobile-notifications` for push/local notification lifecycles.
54
+ - English and Portuguese `privacy`, `networking`, `auth` and `notifications` intents, handled by the existing staff engineer, with five-stack routing, prompt discovery and explicit-override tests.
55
+ - `mobile-billing`, `mobile-migration`, `mobile-analytics` and `mobile-hardware` topic skills, each with Flutter, Android, iOS, React Native and Kotlin Multiplatform references: in-app purchases verified by the backend before acknowledgement and recovered after process death; migrations planned as buildable steps, with on-device data that survives skipped releases and interrupted launches; tracking plans with typed events, identity reset on sign-out and consent-gated collection; device hardware from the availability check to the release of the resource, with real-device test matrices.
56
+ - English and Portuguese `billing`, `analytics` and `hardware` intents, handled by `mobile-staff-engineer`. `mobile-migration` joins the existing `migration` route. Plain "analytics" still routes to observability.
58
57
 
59
58
  #### Changed
60
59
 
61
- - `/reis-mobile:debate --external` selects providers through the core instead of probing with `command -v`, accepts `--providers a,b`, and no longer needs `Bash(codex:*)` or `Bash(gemini:*)`: every provider call goes through the CLI. Behavior without a ready provider is unchanged — the debate carries on with the agents alone.
62
- - CLI providers are asked for an opinion, not for work: `codex exec` now runs with `--sandbox read-only` and `gemini` with `--approval-mode plan`, both in a temporary working directory that is removed afterwards. The debate's previous invocation granted write access and the user's repository as a workspace, neither of which a second opinion needs.
63
- - `/reis-mobile:review` points at `/reis-mobile:consult` when a finding should be cross-checked outside the session, and still never sends project context itself.
60
+ - Authentication requests now have a dedicated `auth` intent instead of relying on security vocabulary. Explicit security audits retain the security workflow.
61
+ - `mobile-staff-engineer` serves the `billing`, `analytics` and `hardware` intents and loads `mobile-migration` for migration plans.
64
62
 
65
63
  #### Fixed
66
64
 
67
- - `/reis-mobile:debate --external` could not reach Codex at all on current CLI versions: `codex exec --full-auto` is rejected with `unexpected argument '--full-auto' found`, and the call ran outside a Git repository without `--skip-git-repo-check`. The provider catalog now carries the invocation verified against `codex exec --help`.
68
- - A failing CLI provider reported its opening banner (`YOLO mode is enabled...`) instead of the cause. The reported line is now the first one that names a failure, falling back to the last line of stderr.
65
+ - The router counted any word starting with "pr" as a review request, so prompts such as "implementar paywall premium" or "definir funil de conversão do produto" went to review. "PR" and "PRs" now count only as whole words.
69
66
 
70
67
  <!-- reis-mobile:latest-release:end -->
71
68
 
@@ -389,6 +386,7 @@ The router never invents a specialist: if no agent serves the intent, it warns y
389
386
  | Build a plugin or debug MethodChannel/EventChannel | agent `plugin-native-expert` | ✅ |
390
387
  | Audit a screen for TalkBack, VoiceOver, touch targets and text scaling | agent `mobile-accessibility-auditor` | ✅ |
391
388
  | Check release readiness, write release notes or set up CI/CD | agent `mobile-release-engineer` | ✅ |
389
+ | Set up fastlane lanes, Match, TestFlight or automated screenshots | skill [`mobile-ci`](skills/mobile-ci/SKILL.md) | ✅ |
392
390
  | Set startup, frame, memory and battery budgets and guard them in CI | skill `mobile-performance` | ✅ |
393
391
  | Make the app work offline, queue writes and resolve conflicts | skill `mobile-offline-sync` | ✅ |
394
392
  | Get usable crashes, errors, traces and release-health alerts in production | skill `mobile-observability` | ✅ |
@@ -407,8 +405,8 @@ The router never invents a specialist: if no agent serves the intent, it warns y
407
405
  | **Project context** | You explain the stack | Deterministic detection of stack, platform and variant |
408
406
  | **Review** | Generic | Mobile checklists: lifecycle, `BuildContext`, MASVS, manifest, ATS |
409
407
  | **Secrets in the diff** | Sent as they are | Masked before reaching the model |
410
- | **Specialists** | None | 21 agents and 17 mobile skills |
411
- | **Context cost** | Zero | ~4,700 fixed tokens (agent and skill descriptions), no hooks |
408
+ | **Specialists** | None | 21 agents and 26 mobile skills |
409
+ | **Context cost** | Zero | ~5,500 fixed tokens (agent and skill descriptions), no hooks |
412
410
  | **Best for** | General tasks | Teams and developers working on mobile apps |
413
411
 
414
412
  **In short:** Claude Code already knows how to code. reis-mobile makes it look at what matters in a mobile app.
@@ -468,7 +466,7 @@ For domain knowledge that code cannot reveal, optionally commit `.reis-mobile/pr
468
466
  | `kmp-test-engineer` | Kotlin Multiplatform | test | `commonTest`, target tests and Android/iOS host coverage |
469
467
  | `mobile-accessibility-auditor` | all | accessibility | Screen reader labels, roles and states, touch targets, text scaling, focus and announcements, with fixes per platform |
470
468
  | `mobile-release-engineer` | all | release, deployment, observability | Go/no-go readiness, versions and signing, crash symbols, release notes and store copy, CI/CD, staged rollout, production crash and release-health signals |
471
- | `mobile-staff-engineer` | all | debug, architecture, performance, test, security, migration, dependency, build, offline, observability | Cross-toolchain diagnosis and migrations when no stack specialist owns the intent |
469
+ | `mobile-staff-engineer` | all | debug, architecture, performance, test, security, migration, dependency, build, offline, observability, privacy, networking, auth, notifications, billing, analytics, hardware | Cross-toolchain diagnosis, migrations and capability workflows when no stack specialist owns the intent |
472
470
  | `plugin-native-expert` | Flutter | on demand | MethodChannel, EventChannel, Pigeon and Kotlin/Swift bridges, threading and lifecycle |
473
471
  | `lead-mobile` | all | on demand | Coordinates the other agents and consolidates a single action plan |
474
472
 
@@ -487,9 +485,18 @@ Every skill starts with `mobile-`. **Topic** skills cover every stack with one r
487
485
  | `mobile-security` | OWASP MASVS security checks | review, security, release | Flutter (token storage), Android (intents), iOS, React Native, KMP, OAuth/OIDC and PKCE |
488
486
  | `mobile-accessibility` | Screen readers, touch targets, text scaling, contrast, localization | accessibility | Flutter (Semantics), Android (Compose and Views), iOS (SwiftUI and UIKit), React Native, KMP, localization and RTL |
489
487
  | `mobile-release` | Release readiness, store copy, billing and CI/CD | release, deployment | Flutter, Android, iOS, React Native, KMP, release notes and store listing, in-app purchases, CI/CD |
488
+ | `mobile-ci` | CI/CD and fastlane setup, Match, beta, release and Snapshot | deployment | Flutter, Android, iOS, React Native, KMP, imported fastlane guides and Xcode Cloud |
490
489
  | `mobile-performance` | Startup, rendering, memory, battery, app size and regression gates | performance | Flutter, Android, iOS, React Native, KMP, background execution and battery |
491
490
  | `mobile-offline-sync` | Local store, outbox, idempotency, conflict resolution, reconnection | offline | Flutter, Android, iOS, React Native, KMP |
492
491
  | `mobile-observability` | Crashes, errors, breadcrumbs, traces, alerts, sampling and privacy | observability | Flutter, Android, iOS, React Native, KMP |
492
+ | `mobile-privacy` | Consent lifecycle, SDK collection, account/data deletion and retention | privacy | Flutter, Android, iOS, React Native, KMP |
493
+ | `mobile-networking` | API contracts, cancellation, pagination, refresh coordination and resumable transfers | networking | Flutter, Android, iOS, React Native, KMP |
494
+ | `mobile-auth` | Sign-in, passkeys, recovery, provider linking and session transitions | auth | Flutter, Android, iOS, React Native, KMP |
495
+ | `mobile-notifications` | Push/local notifications, token bindings, permissions and cold-start taps | notifications | Flutter, Android, iOS, React Native, KMP |
496
+ | `mobile-billing` | In-app purchases, subscriptions, backend verification, acknowledgement and restore | billing | Flutter, Android, iOS, React Native, KMP |
497
+ | `mobile-migration` | Toolchain and library upgrades, incremental UI moves and on-device data migrations | migration | Flutter, Android, iOS, React Native, KMP |
498
+ | `mobile-analytics` | Tracking plans, typed events, funnels, analytics identity and consent-gated collection | analytics | Flutter, Android, iOS, React Native, KMP |
499
+ | `mobile-hardware` | Camera, Bluetooth and BLE, NFC, location, sensors, scanning and haptics | hardware | Flutter, Android, iOS, React Native, KMP |
493
500
  | `mobile-firebase` | Firebase setup and 13 products | — | Flutter, Android, iOS, React Native, KMP; check installed SDK support |
494
501
  | `mobile-flutter` | Flutter and Dart specifics | review, performance, accessibility, migration | UI and navigation, data, native code, performance, accessibility and i18n, Dart, setup |
495
502
  | `mobile-android` | Native Android specifics, from the Android team | performance, release, migration, build, dependency | Compose UI, AGP 9 and R8, profiling, Google Play, identity, camera and media, on-device AI, Wear OS, TV, XR |
@@ -498,7 +505,23 @@ Every skill starts with `mobile-`. **Topic** skills cover every stack with one r
498
505
  | `mobile-kmp` | Kotlin Multiplatform shared and target boundaries | architecture, test, performance, review, debug and more | Source sets, Apple interop, shared Compose UI, build and profiling |
499
506
  | `mobile-detect-stack` | Deterministic stack detection with the CLI | — | — |
500
507
 
501
- Skills marked — are triggered by Claude Code when the request matches their description, for example *"add push notifications with FCM"* → `mobile-firebase`.
508
+ Skills marked — are triggered by Claude Code when the request matches their description, for example *"configure Firestore rules"* → `mobile-firebase`. Notification requests route to `mobile-notifications`, which links Firebase guidance when FCM is the installed provider.
509
+
510
+ The seven capability intents (`privacy`, `networking`, `auth`, `notifications`, `billing`, `analytics` and `hardware`) select `mobile-staff-engineer` and the matching topic skill; `mobile-migration` joins the existing `migration` route. Use these from your mobile app directory:
511
+
512
+ ```bash
513
+ reis-mobile route "implement account deletion"
514
+ reis-mobile route "implement resumable uploads"
515
+ reis-mobile route "implement sign-in with passkeys"
516
+ reis-mobile route "implement local notifications"
517
+ reis-mobile route "add in-app purchases"
518
+ reis-mobile route "create a tracking plan"
519
+ reis-mobile route "connect to a Bluetooth device"
520
+ reis-mobile route "migrate from BLoC to Riverpod"
521
+ reis-mobile route --intent auth "review the session lifecycle"
522
+ ```
523
+
524
+ The CLI returns the selected agent and instruction paths; it does not implement a login, delete an account, send a notification or make a purchase. An explicit intent takes precedence over the prompt. Existing security audits, tests and release work retain their own routes, and a plain "analytics" request still goes to `mobile-observability`. When a short prompt is ambiguous, pass `--intent` or invoke the skill directly in the host.
502
525
 
503
526
  About 85 guides come from [flutter/skills](https://github.com/flutter/skills), [dart-lang/skills](https://github.com/dart-lang/skills), [evanca/flutter-ai-rules](https://github.com/evanca/flutter-ai-rules) and [android/skills](https://github.com/android/skills), unchanged and credited in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
504
527
 
@@ -514,7 +537,7 @@ About 85 guides come from [flutter/skills](https://github.com/flutter/skills), [
514
537
 
515
538
  **Exception: external providers.** Two workflows, and only these two, send project context to a third party: `/reis-mobile:debate --external` and `/reis-mobile:consult`. Both state which providers receive it, and both are opt-in — no other command calls a provider. What leaves is the briefing, including the code excerpts you include; each provider has its own data policy. The question and every answer pass through `redact.mjs`, which is a protection layer and not a guarantee: read the briefing before sending it. API keys are read from the environment by the CLI and never enter the conversation, and `providers:` in `.reis-mobile/config.yaml` lets a team restrict which providers a repository allows. CLI providers (`codex`, `gemini-cli`) are asked for an opinion, not for work: they run in read-only mode (`codex exec --sandbox read-only`, `gemini --approval-mode plan`) inside a temporary directory, never in your repository.
516
539
 
517
- **Context cost.** Claude Code loads the descriptions of 21 agents and 17 skills; the full content of each skill is loaded only when it is used. The exact description cost depends on the host and plugin version.
540
+ **Context cost.** Claude Code loads the descriptions of 21 agents and 26 skills; the full content of each skill is loaded only when it is used. The exact description cost depends on the host and plugin version.
518
541
 
519
542
  **One session hook.** On session startup or resume, the plugin checks for a newer release and warns only when the installed plugin is outdated. It does not read the project or modify the plugin installation.
520
543
 
@@ -544,7 +567,8 @@ About 85 guides come from [flutter/skills](https://github.com/flutter/skills), [
544
567
  | v0.7.3 | `/reis-mobile:release` with per-target evidence, required gates and deterministic readiness verdicts (previously planned for v0.8.0) | ✅ |
545
568
  | v0.8.0 | `mobile-performance`, `mobile-offline-sync` and `mobile-observability` topic skills with a reference per stack, plus background execution, OAuth/PKCE, billing lifecycle and localization references | ✅ |
546
569
  | v0.9.0 | Multi-provider layer (OpenAI, Gemini, OpenRouter, Ollama and the Codex/Gemini CLIs), `reis-mobile providers`, `reis-mobile consult` and `/reis-mobile:consult` — previously planned for v0.10.0 | ✅ |
547
- | v0.10.0 | MCP server | ⏳ |
570
+ | v0.10.0 | `mobile-privacy`, `mobile-networking`, `mobile-auth` and `mobile-notifications` topic skills with a reference per stack, plus the `privacy`, `networking`, `auth` and `notifications` intents | ✅ |
571
+ | v0.11.0 | MCP server | ⏳ |
548
572
  | v1.0.0 | First stable version: Flutter, Android, iOS and React Native | ⏳ |
549
573
 
550
574
  ---
@@ -576,7 +600,7 @@ The plugin's skills live in the `reis-mobile:` namespace and do not conflict, bu
576
600
  Yes: `reis-mobile init eng` installs the plugin in Codex too. See [installation](#install). Installation does not confirm parity with the Claude Code agents and commands; the `reis-mobile` CLI can also be run by Codex to get diagnostics and context.
577
601
 
578
602
  **Does it work in Cursor?**
579
- The Cursor integration has not been validated yet. The MCP server remains on the roadmap for v0.8.0.
603
+ The Cursor integration has not been validated yet. The MCP server remains on the roadmap for v0.11.0.
580
604
 
581
605
  **What does reis-mobile send outside my machine?**
582
606
  The project analysis commands do not make network requests. The update hook and `reis-mobile update-check` request the public npm package metadata without sending project files or identifiers. What the model reads during `/reis-mobile:review` follows the same rules as any Claude Code session.
@@ -612,6 +636,7 @@ Questions: [Discussions](https://github.com/wrsilva/reis-mobile/discussions). Wh
612
636
 
613
637
  ## Attribution
614
638
 
639
+ - **[greenstevester/fastlane-skill](https://github.com/greenstevester/fastlane-skill)** (MIT): five fastlane guides and Xcode Cloud documentation in [`mobile-ci`](skills/mobile-ci/SKILL.md). The source revision and license are recorded in [Third-Party Notices](THIRD_PARTY_NOTICES.md).
615
640
  - **[flutter/skills](https://github.com/flutter/skills)** (BSD-3-Clause): 25 Flutter skills.
616
641
  - **[dart-lang/skills](https://github.com/dart-lang/skills)** (BSD-3-Clause): 8 Dart skills.
617
642
  - **[evanca/flutter-ai-rules](https://github.com/evanca/flutter-ai-rules)** (MIT): 28 Flutter, testing and Firebase skills.
@@ -1,5 +1,38 @@
1
1
  # Third-Party Notices
2
2
 
3
+ ## greenstevester/fastlane-skill
4
+
5
+ - Source: https://github.com/greenstevester/fastlane-skill
6
+ - Revision: `cab4eff8e678391671916228d7b6446d438da4a9`
7
+ - License: MIT
8
+ - Integrated into `mobile-ci` as references; no standalone upstream skills are registered.
9
+ - Adapted files under `skills/`: `setup-fastlane` → `mobile-ci/references/fastlane/setup-fastlane.md` and `mobile-ci/references/fastlane/xcode-cloud.md` (upstream `docs/xcode-cloud.md`); `match` → `mobile-ci/references/fastlane/match.md`; `beta` → `mobile-ci/references/fastlane/beta.md`; `release` → `mobile-ci/references/fastlane/release.md`; `snapshot` → `mobile-ci/references/fastlane/snapshot.md`.
10
+ - Adaptation: removed skill frontmatter, added attribution and relocated the Xcode Cloud link. Original guide bodies are otherwise preserved; project-specific integration guidance lives in `mobile-ci/SKILL.md`.
11
+
12
+ ```text
13
+ MIT License
14
+
15
+ Copyright (c) 2024 greenstevester
16
+
17
+ Permission is hereby granted, free of charge, to any person obtaining a copy
18
+ of this software and associated documentation files (the "Software"), to deal
19
+ in the Software without restriction, including without limitation the rights
20
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
21
+ copies of the Software, and to permit persons to whom the Software is
22
+ furnished to do so, subject to the following conditions:
23
+
24
+ The above copyright notice and this permission notice shall be included in all
25
+ copies or substantial portions of the Software.
26
+
27
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
30
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
31
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
32
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33
+ SOFTWARE.
34
+ ```
35
+
3
36
  reis-mobile is distributed under the MIT License (see [LICENSE](LICENSE)). The skills listed below were derived from third-party projects and remain under their original licenses. Each of these skills declares `source` and `license` in its `SKILL.md` frontmatter.
4
37
 
5
38
  Changes made by reis-mobile: every third-party skill was moved into a reis-mobile skill (`mobile-test`, `mobile-firebase`, `mobile-code-review`, `mobile-debug`, `mobile-security`, `mobile-architecture`, `mobile-flutter`, `mobile-android`). Its instructions are unchanged apart from a leading attribution line and the removed frontmatter; skills that shipped extra files (references, scripts, examples) moved as whole folders with the instructions in `GUIDE.md`, so their relative links still work. Each section lists the upstream skill and the file that holds it now. Some copies correspond to earlier revisions of the upstream files.
@@ -28,6 +28,8 @@ Use the [project brief](../docs/agent-context.md) once or reuse the supplied bri
28
28
 
29
29
  ## Scope and decision
30
30
 
31
+ For pipeline implementation and fastlane automation, load [mobile-ci](../skills/mobile-ci/SKILL.md) and its relevant platform and task references.
32
+
31
33
  A release audit authorizes inspection and preparation. Version bumps, tags and publishing follow the user's requested scope; do not infer an upload from a readiness question. For an explicitly requested deployment, complete the reviewable preparation and reuse existing authorization. Avoid executing a lane before inspecting whether it publishes.
32
34
 
33
35
  Return the release identity, GO/GO WITH RISKS/NO-GO verdict where relevant, gates with evidence, exact prepared commands/artifacts and outstanding external state. Define rollout monitoring using the project's metrics and thresholds; proposed thresholds must be labeled as proposals. Never imply that halting store distribution removes a binary already installed.
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: mobile-staff-engineer
3
- description: Use this agent for senior-level guidance across Flutter/Dart, Android (Kotlin) and iOS (Swift) — debugging complex build and runtime issues, architecture decisions for native apps, migrations, dependency and build problems, CI/CD and release pipelines, security and cross-platform trade-offs. Typical triggers are "the Android build broke after upgrading Gradle", planning a payment flow and choosing between native and cross-platform approaches.
3
+ description: Use this agent for senior-level guidance across Flutter/Dart, Android (Kotlin) and iOS (Swift) — debugging complex build and runtime issues, architecture decisions for native apps, migrations, dependency and build problems, CI/CD and release pipelines, security, privacy, API integration, authentication, notifications, in-app purchases, product analytics, device hardware and cross-platform trade-offs. Typical triggers are "the Android build broke after upgrading Gradle", planning a payment flow and choosing between native and cross-platform approaches.
4
4
  model: inherit
5
5
  color: blue
6
6
  tools: ["Read", "Grep", "Glob", "Bash"]
7
- intents: [debug, architecture, performance, test, security, migration, dependency, build, offline, observability]
7
+ intents: [debug, architecture, performance, test, security, migration, dependency, build, offline, observability, privacy, networking, auth, notifications, billing, analytics, hardware]
8
8
  stacks: ["*"]
9
9
  ---
10
10
 
@@ -14,6 +14,20 @@ Read the [project brief](../docs/agent-context.md) once or reuse the supplied br
14
14
 
15
15
  ## Build a causal chain
16
16
 
17
+ For privacy work, load [mobile-privacy](../skills/mobile-privacy/SKILL.md). Follow its implementation and verification workflow using actual app objects; the failure record below applies when diagnosing a defect, not to every capability request.
18
+
19
+ For API integration and network lifecycle work, load [mobile-networking](../skills/mobile-networking/SKILL.md) and bind its request/cancellation contract to the actual client and repository.
20
+
21
+ For identity and session flows, load [mobile-auth](../skills/mobile-auth/SKILL.md) and trace the provider, session owner and account-scoped data boundaries.
22
+
23
+ For push or local notification flows, load [mobile-notifications](../skills/mobile-notifications/SKILL.md) and trace token ownership, app lifecycle and authorized tap navigation.
24
+
25
+ For in-app purchases and subscriptions, load [mobile-billing](../skills/mobile-billing/SKILL.md) and trace the purchase listener, backend verification and every entitlement read.
26
+
27
+ For product analytics, load [mobile-analytics](../skills/mobile-analytics/SKILL.md) and trace each event from its trigger through the app's analytics boundary to the destination.
28
+
29
+ For camera, Bluetooth, NFC, location, sensors or haptics, load [mobile-hardware](../skills/mobile-hardware/SKILL.md) and trace each capability from its availability check to the release of the resource.
30
+
17
31
  1. Recover the exact command, working directory, app root, variant/scheme and first actionable error. Locate the failure phase: resolution, generation, compilation, linking, signing, packaging, startup or runtime.
18
32
  2. Read the last relevant change and the versions actually selected by wrappers, lock files and CI. Compare local and CI toolchain evidence; a declared dependency constraint is not necessarily the resolved version.
19
33
  3. Trace the failing symbol/configuration from the error to its source file or build input. In cross-platform apps, distinguish Dart/JavaScript callers, generated integration code and native implementation. Identify the source of generated files before proposing an edit.
@@ -22,7 +36,7 @@ Read the [project brief](../docs/agent-context.md) once or reuse the supplied br
22
36
 
23
37
  ## Migrations need a compatibility contract
24
38
 
25
- Record the current and target toolchain/dependency versions from verified sources, minimum supported platforms, affected native modules and generated code. Split the migration into buildable steps with a check after each. Preserve the app's existing state, storage and public API contracts unless changing them is the objective.
39
+ Load [mobile-migration](../skills/mobile-migration/SKILL.md) for the step plan, on-device data migrations and rollout. Record the current and target toolchain/dependency versions from verified sources, minimum supported platforms, affected native modules and generated code. Split the migration into buildable steps with a check after each. Preserve the app's existing state, storage and public API contracts unless changing them is the objective.
26
40
 
27
41
  Compare two viable options only when the choice matters. Name the actual module/type changed by each, operational cost, reversible step and condition that would invalidate the decision. Avoid broad prescriptions such as replacing the state library or upgrading every dependency to solve one failure.
28
42
 
@@ -1,4 +1,4 @@
1
- import { AREAS, DEBUG_DOMINATES, INTENTS, INTENT_IDS, STACK_HINTS } from './intents.mjs';
1
+ import { AREAS, DEBUG_DOMINATES, INTENTS, INTENT_IDS, STACK_HINTS, WHOLE_WORDS } from './intents.mjs';
2
2
 
3
3
  export function normalize(text) {
4
4
  return String(text ?? '')
@@ -48,7 +48,8 @@ function matchTerms(text, groups) {
48
48
  const counts = new Map();
49
49
 
50
50
  for (const { id, word } of terms) {
51
- const pattern = new RegExp(`(?<![\\p{L}\\p{N}])${escapeRegExp(word)}`, 'gu');
51
+ const wordEnd = WHOLE_WORDS.has(word) ? '(?![\\p{L}\\p{N}])' : '';
52
+ const pattern = new RegExp(`(?<![\\p{L}\\p{N}])${escapeRegExp(word)}${wordEnd}`, 'gu');
52
53
  for (const match of text.matchAll(pattern)) {
53
54
  const start = match.index;
54
55
  const end = start + word.length;
@@ -11,7 +11,7 @@ export const INTENTS = {
11
11
  security: [
12
12
  'seguranca', 'security', 'vulnerab', 'owasp', 'secret', 'credencia', 'criptograf',
13
13
  'encrypt', 'ssl pinning', 'certificate pinning', 'jailbreak', 'root detection',
14
- 'keychain', 'secure storage', 'autentica',
14
+ 'keychain', 'secure storage',
15
15
  ],
16
16
  performance: [
17
17
  'performance', 'desempenho', 'lento', 'lentidao', 'slow', 'jank', 'fps', 'memoria',
@@ -52,7 +52,7 @@ export const INTENTS = {
52
52
  'talkback', 'voiceover', 'contraste', 'semantics',
53
53
  ],
54
54
  review: [
55
- 'review', 'revis', 'code review', 'pull request', 'pr', 'analis', 'avali', 'audit',
55
+ 'review', 'revis', 'code review', 'pull request', 'pr', 'prs', 'analis', 'avali', 'audit',
56
56
  'code smell',
57
57
  ],
58
58
  migration: ['migra', 'migrate', 'upgrade', 'null safety'],
@@ -67,10 +67,59 @@ export const INTENTS = {
67
67
  'deploy', 'pipeline', 'ci/cd', 'github actions', 'fastlane', 'codemagic', 'bitrise',
68
68
  'azure devops',
69
69
  ],
70
+ privacy: [
71
+ 'privacy', 'privacidade', 'consent', 'consentimento', 'account deletion',
72
+ 'delete account', 'exclusao de conta', 'excluir conta', 'data retention',
73
+ 'retencao de dados', 'privacy manifest', 'data safety', 'analytics consent',
74
+ ],
75
+ networking: [
76
+ 'networking', 'api integration', 'integracao de api', 'integrar api',
77
+ 'http client', 'cliente http', 'pagination', 'paginacao', 'resumable upload',
78
+ 'upload retomavel', 'websocket', 'request cancellation', 'cancelar requisic',
79
+ ],
80
+ auth: [
81
+ 'authentication', 'autentica', 'passkey', 'sign-in', 'sign in', 'login',
82
+ 'logout', 'oauth', 'oidc', 'pkce', 'session management', 'gestao de sessao',
83
+ 'account linking', 'vincular conta', 'token refresh', 'renovacao de token',
84
+ ],
85
+ notifications: [
86
+ 'push notification', 'local notification', 'notification permission',
87
+ 'notification channel', 'notification tap', 'notifica', 'fcm', 'apns',
88
+ ],
89
+ // "assinatura", "subscription" and "entitlement" alone also mean code signing, a stream
90
+ // subscription and an iOS signing entitlement, so only specific phrases route here.
91
+ billing: [
92
+ 'billing', 'cobranca', 'in-app purchase', 'in app purchase', 'compra no app',
93
+ 'compras no app', 'compra dentro do app', 'compras dentro do app', 'compra in-app',
94
+ 'compras in-app', 'subscription purchase', 'in-app subscription', 'auto-renewable',
95
+ 'assinatura no app', 'assinaturas no app', 'assinatura recorrente', 'paywall', 'storekit',
96
+ 'play billing', 'restore purchase', 'restaurar compra', 'revenuecat',
97
+ ],
98
+ // Plain "analytics" stays with observability; these longer phrases claim their span first.
99
+ analytics: [
100
+ 'product analytics', 'analytics de produto', 'tracking plan', 'plano de tracking',
101
+ 'plano de rastreamento', 'event tracking', 'rastreamento de eventos', 'event taxonomy',
102
+ 'taxonomia de eventos', 'analytics event', 'evento de analytics', 'eventos de analytics',
103
+ 'funnel', 'funil', 'conversion event', 'evento de conversao', 'user properties',
104
+ 'propriedades de usuario', 'mixpanel', 'posthog', 'amplitude analytics', 'amplitude sdk',
105
+ ],
106
+ // "localizacao" alone also means translation, so location uses specific phrases; "ble" is a
107
+ // whole word (see WHOLE_WORDS). Biometrics belongs to auth and security.
108
+ hardware: [
109
+ 'hardware', 'bluetooth', 'ble', 'nfc', 'camera', 'microphone', 'microfone', 'sensor',
110
+ 'accelerometer', 'acelerometro', 'gyroscope', 'giroscopio', 'gps', 'geolocation',
111
+ 'geolocaliza', 'geofenc', 'background location', 'localizacao em segundo plano',
112
+ 'location updates', 'atualizacoes de localizacao', 'barcode', 'codigo de barras', 'qr code',
113
+ 'codigo qr', 'haptic', 'vibration', 'vibracao', 'usb',
114
+ ],
70
115
  };
71
116
 
72
117
  export const INTENT_IDS = Object.keys(INTENTS);
73
118
 
119
+ // Terms matched as whole words instead of stems: as stems, "pr" would also claim "premium",
120
+ // "product" and "preço", and "ble" would claim "blend".
121
+ export const WHOLE_WORDS = new Set(['pr', 'prs', 'ble']);
122
+
74
123
  // A failing build or pipeline is a debugging task, not a build/deploy task.
75
124
  export const DEBUG_DOMINATES = new Set(['build', 'deployment', 'dependency', 'migration']);
76
125
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reis-mobile",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "AI agents and skills for Flutter, Android, iOS, React Native and Kotlin Multiplatform — a Claude Code and Codex plugin for reviews, debugging, tests, architecture, security and Firebase.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: mobile-analytics
3
+ description: Designs and reviews product analytics across Flutter, Android, iOS, React Native and Kotlin Multiplatform. Use for tracking plans, event names and properties, funnels and conversion events, screen tracking, analytics identity across sign-in and sign-out, consent-gated collection and validating events before release. Crash, error and performance telemetry belong to mobile-observability.
4
+ intents: [analytics]
5
+ stacks: ["*"]
6
+ ---
7
+
8
+ # Mobile Analytics
9
+
10
+ An analytics event is a contract with whoever reads the dashboard. Trace each event from the user action to the destination and to the question it answers. Reuse the [project brief](../../docs/agent-context.md), then inspect the SDK initialization, the existing event calls, the tracking plan if one exists and the owner of consent state before adding events.
11
+
12
+ ## Pick the reference
13
+
14
+ | Project | Read |
15
+ |---|---|
16
+ | Flutter | [references/flutter.md](references/flutter.md) |
17
+ | Android | [references/android.md](references/android.md) |
18
+ | iOS | [references/ios.md](references/ios.md) |
19
+ | React Native / Expo | [references/react-native.md](references/react-native.md) |
20
+ | Kotlin Multiplatform | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
21
+
22
+ Cross-platform apps also need the native references: SDKs often collect automatically before Dart or JavaScript runs. Confirm the SDK and its version from the lock file.
23
+
24
+ ## Write the tracking plan first
25
+
26
+ For each event record the name, the exact trigger, the properties with their types and allowed values, the owner and the product question it answers. "Order completed" fires after the server confirms the order, not when the button is tapped. Follow the naming already in the plan or the SDK's conventions, and check the destination's documented limits for names, property counts and value lengths. An event nobody reads costs battery, data and privacy review; remove it from the plan.
27
+
28
+ ## Emit through one boundary
29
+
30
+ - Send every event through one app-owned analytics interface with typed events. SDK calls scattered across screens cannot be gated by consent, tested or moved to another vendor.
31
+ - Fire each event once, on the confirmed outcome. Rebuilds, recomposition, re-renders, retries, back navigation and app resume must not duplicate it.
32
+ - Track screen views from the navigation owner, not from build or render code.
33
+ - Attach no direct personal data: no email, phone number, name or free text the user typed. Identify users with a stable internal id, never with an email.
34
+
35
+ ## Identity and consent
36
+
37
+ - Before sign-in, events belong to the SDK's anonymous id. On sign-in, set the internal user id. On sign-out or an account switch, reset the analytics identity so the next user's events are not attributed to the previous one.
38
+ - Collection follows the consent state owned by [mobile-privacy](../mobile-privacy/SKILL.md). Start with collection disabled where the SDK supports it until consent is known, and stop sending on withdrawal.
39
+ - Whether a use counts as tracking under Apple's rules, and what the store data disclosures must declare, depends on the data and its recipients. Check the declarations against the actual collection.
40
+
41
+ ## Delivery and trust
42
+
43
+ SDKs batch and upload events, so events can arrive late, offline events can be dropped by the SDK's limits and events in flight can be lost when the process dies. Do not use client analytics as the source of truth for revenue or business records: purchase revenue comes from the backend and store notifications through [mobile-billing](../mobile-billing/SKILL.md).
44
+
45
+ ## Verify and deliver
46
+
47
+ Unit-test that a flow produces the expected typed events through a fake analytics implementation, including no events before consent, one event per confirmed outcome and an identity reset on sign-out. Then use the destination's debug or live event view with a debug build to confirm names and properties arrive as planned.
48
+
49
+ Return the tracking plan changes, `path:symbol` for each emission, test results and any dashboard or destination configuration you could not verify. Use [mobile-observability](../mobile-observability/SKILL.md) for crashes, errors and performance signals and [mobile-firebase](../mobile-firebase/SKILL.md) for Firebase Analytics setup.
50
+
51
+ ## Official sources
52
+
53
+ - [Firebase Analytics events](https://firebase.google.com/docs/analytics/events)
54
+ - [Apple user privacy and data use](https://developer.apple.com/app-store/user-privacy-and-data-use/)
55
+ - [Google Play Data safety](https://support.google.com/googleplay/android-developer/answer/10787469)
@@ -0,0 +1,9 @@
1
+ # Analytics on Android
2
+
3
+ - Read the SDK from the version catalog or Gradle files and inspect what it collects automatically at startup; a consent switch in the UI cannot stop an initializer that already ran. When collection must wait for consent, disable automatic collection in the manifest as the [data collection guide](https://firebase.google.com/docs/analytics/configure-data-collection?platform=android) describes for Firebase, and enable it after consent.
4
+ - In Compose, do not log from a composable body: recomposition repeats it. Log screen views from navigation callbacks such as `NavController.addOnDestinationChangedListener`, and one-time events from the ViewModel after the outcome is confirmed.
5
+ - Firebase consent, screen views and DebugView setup are in the [Firebase Analytics reference](../../mobile-firebase/references/android/analytics.md).
6
+ - Reset the analytics identity in the sign-out flow, before the next account's events start.
7
+ - Test the ViewModel or use case with a fake analytics interface, and confirm delivery in the destination's debug view with a debug build.
8
+
9
+ Official reference: [Firebase Analytics events](https://firebase.google.com/docs/analytics/events?platform=android).
@@ -0,0 +1,10 @@
1
+ # Analytics in Flutter
2
+
3
+ - Confirm the SDK in `pubspec.lock` and the native SDK it wraps. Native code can collect automatic events before `runApp`, so disable that natively when collection must wait for consent. For Firebase, use the [Firebase Analytics reference](../../mobile-firebase/references/flutter/analytics.md) and the native switches in [Android](android.md) and [iOS](ios.md).
4
+ - Keep one Dart analytics interface with typed events, injected where the state owners can reach it. Do not call the SDK from `build()`: rebuilds repeat it.
5
+ - Track screen views with a navigator observer on the app's router (`FirebaseAnalyticsObserver` for Firebase) or from the router's route-change callback.
6
+ - Fire conversion events from the state owner after the repository confirms the outcome, not from the button callback.
7
+ - On sign-out, reset the SDK identity in the same flow that clears account data.
8
+ - Test with a fake analytics implementation in unit and widget tests, and confirm delivery on device builds.
9
+
10
+ Official reference: [FirebaseAnalyticsObserver](https://pub.dev/documentation/firebase_analytics/latest/observer/FirebaseAnalyticsObserver-class.html).
@@ -0,0 +1,9 @@
1
+ # Analytics on iOS
2
+
3
+ - Inventory the SDKs linked into the app and its extensions, what they collect at launch and what their privacy manifests declare. When Firebase collection must wait for consent, set `FIREBASE_ANALYTICS_COLLECTION_ENABLED` to `NO` in `Info.plist` and call `Analytics.setAnalyticsCollectionEnabled(true)` after consent.
4
+ - In SwiftUI, `.onAppear` runs again on tab switches and back navigation. Decide what a screen view means and log it from the navigation owner or with the SDK's screen modifier, not from `body`.
5
+ - Keep App Tracking Transparency separate from analytics consent: request ATT only when the data use is tracking, and never infer one from the other.
6
+ - Firebase consent, screen views and DebugView are in the [Firebase Analytics reference](../../mobile-firebase/references/ios/analytics.md).
7
+ - Reset the analytics identity during sign-out. Test event emission with a fake analytics protocol, and confirm delivery with the destination's debug view.
8
+
9
+ Official references: [configure data collection](https://firebase.google.com/docs/analytics/configure-data-collection?platform=ios), [user privacy and data use](https://developer.apple.com/app-store/user-privacy-and-data-use/).
@@ -0,0 +1,8 @@
1
+ # Analytics in Kotlin Multiplatform
2
+
3
+ - Define the typed events and the analytics interface in `commonMain`, and implement it per host with the native SDK unless the project already uses a multiplatform SDK.
4
+ - Keep consent and identity transitions in shared code when the project shares them, but leave automatic collection settings and SDK startup in each host: a `commonMain` flag does not stop a collector the host initialized first.
5
+ - Emit events from shared state owners after the outcome is confirmed, and map them to each SDK's names in one place.
6
+ - Test event emission in `commonTest` with a fake implementation. Verify each host's SDK delivery separately with [Android](android.md) and [iOS](ios.md).
7
+
8
+ Official reference: [platform-specific declarations](https://kotlinlang.org/docs/multiplatform/multiplatform-expect-actual.html).
@@ -0,0 +1,9 @@
1
+ # Analytics in React Native and Expo
2
+
3
+ - Confirm the SDK in `package.json` and the native SDK it wraps. Native code can collect before the JavaScript bundle runs: configure collection defaults natively, through a config plugin or the native files, instead of in a `useEffect`.
4
+ - Track screen views from the navigation container: with React Navigation, compare routes in `onStateChange` through a navigation ref; with Expo Router, react to `usePathname` changes.
5
+ - Fire conversion events after the mutation resolves, not on press. React Strict Mode runs effects twice in development, so emit from the handler of the confirmed outcome rather than from a mount effect.
6
+ - Firebase screen views, consent flags and DebugView are in the [Firebase Analytics reference](../../mobile-firebase/references/react-native/analytics.md).
7
+ - Reset the analytics identity in the sign-out flow. Test the boundary in Jest with the SDK mocked, and confirm delivery on native builds.
8
+
9
+ Official references: [React Navigation screen tracking](https://reactnavigation.org/docs/screen-tracking/), [Expo Router screen tracking](https://docs.expo.dev/router/reference/screen-tracking/). Apply the [Android](android.md) and [iOS](ios.md) references to native collection settings.
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: mobile-auth
3
+ description: Implements and reviews mobile identity and session flows across Flutter, Android, iOS, React Native and Kotlin Multiplatform. Use for sign-in, passkeys, account recovery, provider linking, reauthentication, logout and concurrent refresh. Security audits belong to mobile-security; account deletion belongs to mobile-privacy.
4
+ intents: [auth]
5
+ stacks: ["*"]
6
+ ---
7
+
8
+ # Mobile Authentication
9
+
10
+ Use the [project brief](../../docs/agent-context.md) to find the provider SDK/configuration, session owner, credential store, redirect handlers and account-scoped repositories. Preserve the chosen provider and the requested audit/implementation scope. Read installed versions and the provider's actual backend contract before selecting APIs.
11
+
12
+ ## Pick the reference
13
+
14
+ | Project | Read |
15
+ |---|---|
16
+ | Flutter | [references/flutter.md](references/flutter.md) |
17
+ | Android | [references/android.md](references/android.md) |
18
+ | iOS | [references/ios.md](references/ios.md) |
19
+ | React Native / Expo | [references/react-native.md](references/react-native.md) |
20
+ | Kotlin Multiplatform | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
21
+
22
+ ## Define identity and session transitions
23
+
24
+ - Separate provider identity, backend account, session credentials and local unlock. Biometric approval alone is not server authentication.
25
+ - Model restoring, signed out, authenticating, signed in, reauthentication required and signing out as needed by the real flow. Temporary offline restoration is distinct from proven invalid credentials.
26
+ - Give each attempt a correlation identifier and cancellation owner. A cancelled sign-in or reauthentication preserves any existing valid session; it cannot silently replace it with a partially authenticated account.
27
+ - Complete account switching by invalidating old jobs, caches and notification bindings before exposing the new account's data. Fence late callbacks with account/session generation.
28
+
29
+ ## Choose the provider-supported ceremony
30
+
31
+ - For OAuth/OIDC native login, use a maintained provider/library implementation of Authorization Code with PKCE through the system authentication browser. Keep client secrets off the app; verify redirect association and response binding using the SDK's documented protections.
32
+ - For passkeys, the backend issues challenges and verifies registration/authentication responses, relying-party identity and replay protections. Native credential APIs alone do not prove identity to your backend. Define recovery for unavailable credentials without weakening authentication.
33
+ - Link providers only after proving control according to the provider contract; matching email strings is not sufficient authority to merge accounts. Define collisions, cancellation and recovery before altering account ownership.
34
+ - Treat sensitive actions as backend-authorized operations with the required fresh authentication. Do not bypass reauthentication by changing a UI flag.
35
+
36
+ ## Refresh, logout and recovery
37
+
38
+ - Use the provider SDK's session management if it already owns refresh. Otherwise coalesce refresh work per session; every waiter receives success, cancellation or failure, and retries have a bound.
39
+ - Before saving a refresh result, check that the session is still current. Logout/account switch must make an old result inert, including its queued request replays.
40
+ - Apply the provider's supported refresh-token protection. OAuth security guidance supports rotation or sender-constrained refresh tokens for public clients; do not invent a rotation endpoint or override SDK behavior.
41
+ - On logout, invalidate local access and clear scoped state. Track remote revocation separately when supported; if offline, report that it was not confirmed and use the provider's documented recovery strategy. Browser SSO logout and app logout are different operations.
42
+ - Recovery, MFA and linking error messages follow the actual identity provider and product requirements. Avoid exposing whether another account exists through custom recovery behavior.
43
+
44
+ ## Verify and deliver
45
+
46
+ Test cancelled login, malformed/replayed callback, process recreation during login, concurrent refresh, offline restoration, logout during refresh, account switching, unavailable passkey, linking collision and cancelled reauthentication. Exercise provider integration in its test environment; keep tokens and personal data out of fixtures/logs.
47
+
48
+ Return a transition table tied to real symbols, provider/backend boundaries, storage and redirect changes, test results and remaining configuration evidence. Use [mobile-security](../mobile-security/SKILL.md) for threat review and secure storage, [mobile-firebase](../mobile-firebase/SKILL.md) for Firebase Auth APIs, and [mobile-privacy](../mobile-privacy/SKILL.md) for deletion.
49
+
50
+ ## Official sources
51
+
52
+ - [OAuth for native apps, RFC 8252](https://www.rfc-editor.org/rfc/rfc8252.html)
53
+ - [OAuth security best current practice, RFC 9700](https://www.rfc-editor.org/rfc/rfc9700.html)
54
+ - [Android Credential Manager](https://developer.android.com/identity/credential-manager)
55
+ - [Apple AuthenticationServices](https://developer.apple.com/documentation/authenticationservices)