reis-mobile 0.7.1 → 0.7.2

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 (39) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +15 -0
  4. package/README.md +40 -25
  5. package/agents/kmp-architect.md +26 -0
  6. package/agents/kmp-performance-engineer.md +24 -0
  7. package/agents/kmp-test-engineer.md +26 -0
  8. package/agents/lead-mobile.md +3 -0
  9. package/commands/debate.md +4 -1
  10. package/commands/project.md +48 -0
  11. package/commands/reis-mobile.md +8 -3
  12. package/core/registry/registry.mjs +1 -0
  13. package/docs/agent-context.md +2 -2
  14. package/package.json +3 -2
  15. package/skills/mobile-accessibility/SKILL.md +2 -1
  16. package/skills/mobile-accessibility/references/flutter.md +1 -1
  17. package/skills/mobile-accessibility/references/kotlin-multiplatform.md +9 -0
  18. package/skills/mobile-architecture/SKILL.md +2 -1
  19. package/skills/mobile-architecture/references/kotlin-multiplatform.md +11 -0
  20. package/skills/mobile-code-review/SKILL.md +2 -1
  21. package/skills/mobile-code-review/references/flutter/widget-review.md +1 -1
  22. package/skills/mobile-code-review/references/flutter.md +1 -1
  23. package/skills/mobile-code-review/references/kotlin-multiplatform.md +11 -0
  24. package/skills/mobile-debug/SKILL.md +2 -1
  25. package/skills/mobile-debug/references/kotlin-multiplatform.md +10 -0
  26. package/skills/mobile-firebase/SKILL.md +2 -1
  27. package/skills/mobile-firebase/references/kotlin-multiplatform.md +10 -0
  28. package/skills/mobile-flutter/SKILL.md +1 -1
  29. package/skills/mobile-kmp/SKILL.md +26 -0
  30. package/skills/mobile-kmp/references/apple-interop.md +9 -0
  31. package/skills/mobile-kmp/references/build-performance.md +9 -0
  32. package/skills/mobile-kmp/references/compose-ui.md +9 -0
  33. package/skills/mobile-kmp/references/source-sets.md +9 -0
  34. package/skills/mobile-release/SKILL.md +2 -1
  35. package/skills/mobile-release/references/kotlin-multiplatform.md +12 -0
  36. package/skills/mobile-security/SKILL.md +2 -1
  37. package/skills/mobile-security/references/kotlin-multiplatform.md +10 -0
  38. package/skills/mobile-test/SKILL.md +2 -1
  39. package/skills/mobile-test/references/kotlin-multiplatform.md +12 -0
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "AI agents for mobile engineering",
8
- "version": "0.7.1"
8
+ "version": "0.7.2"
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.7.1",
15
+ "version": "0.7.2",
16
16
  "author": {
17
17
  "name": "Warleson Reis"
18
18
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reis-mobile",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
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,21 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). The pr
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.7.2] - 2026-09-18
8
+
9
+ ### Added
10
+
11
+ - Kotlin Multiplatform architect, test and performance specialists, a `mobile-kmp` platform skill and focused KMP references in the eight cross-stack topic skills. Routing and coverage tests guard the new paths.
12
+ - `/reis-mobile:project [feature]` creates or refreshes a verified app object map in `.reis-mobile/project.md` while preserving team-authored product context.
13
+
14
+ ### Changed
15
+
16
+ - Specialist guidance distinguishes configured shared source sets, Android/iOS host behavior and target-specific validation; the shared brief verifies profile paths and separates team knowledge from code evidence.
17
+
18
+ ### Fixed
19
+
20
+ - Release automation opens a pull request for synchronized files instead of pushing directly to a protected `main` branch, and waits for those changes to merge before tagging and publishing.
21
+
7
22
  ## [0.7.1] - 2026-09-17
8
23
 
9
24
  ### Added
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # 📱 reis-mobile
2
2
 
3
- A mobile app is not a generic project. A code review that does not know about `BuildContext` after `await`, `android:exported`, `NSAllowsArbitraryLoads` or `Podfile.lock` lets through exactly the bugs that only show up on the device. **reis-mobile** detects your project's stack, picks the right specialist and loads only the skills that apply to Flutter, Android, iOS or React Native.
3
+ A mobile app is not a generic project. A code review that does not know about `BuildContext` after `await`, `android:exported`, `NSAllowsArbitraryLoads` or `Podfile.lock` lets through exactly the bugs that only show up on the device. **reis-mobile** detects your project's stack, picks the right specialist and loads only the skills that apply to Flutter, Android, iOS, React Native or Kotlin Multiplatform.
4
4
 
5
- **AI agents and skills for mobile development — Flutter, Android, iOS and React Native.** A plugin for Claude Code and Codex with specialist agents and skills for code review, debugging, tests, architecture, security and Firebase.
5
+ **AI agents and skills for mobile development — Flutter, Android, iOS, React Native and Kotlin Multiplatform.** A plugin for Claude Code and Codex with specialist agents and skills for code review, debugging, tests, architecture, security and Firebase.
6
6
 
7
7
  <p align="center">
8
8
  <a href="https://github.com/wrsilva/reis-mobile/actions/workflows/ci.yml"><img src="https://github.com/wrsilva/reis-mobile/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
@@ -23,7 +23,9 @@ 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
- 👥 **18 agents and 13 mobile skills.** Architect, performance and test engineers for Flutter, native Android, native iOS and React Native, a staff engineer, a native plugin specialist, a code reviewer, an accessibility auditor, a release engineer and a lead that coordinates them all, plus skills for Gradle, Xcode and CocoaPods builds, Jetpack Compose, BLoC, Riverpod, Firebase and testing on every platform, plugins, security, accessibility and releases.
26
+ 👥 **21 agents and 14 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 and releases.
27
+
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.
27
29
 
28
30
  🌐 **Answers in English or Portuguese.** `reis-mobile init eng` or `reis-mobile init pt` sets the language of reports, explanations and debates.
29
31
 
@@ -42,17 +44,20 @@ A mobile app is not a generic project. A code review that does not know about `B
42
44
  ## What's new
43
45
 
44
46
  <!-- reis-mobile:latest-release:start -->
45
- ### v0.7.1
47
+ ### v0.7.2
46
48
 
47
49
  #### Added
48
50
 
49
- - A `SessionStart` hook for Claude Code and Codex that warns when the installed plugin is behind npm's latest release. It caches registry results for 24 hours, stays silent offline and can be disabled with `REIS_MOBILE_UPDATE_CHECK=0`.
50
- - `reis-mobile update-check [--force]` for manually checking the CLI version.
51
+ - Kotlin Multiplatform architect, test and performance specialists, a `mobile-kmp` platform skill and focused KMP references in the eight cross-stack topic skills. Routing and coverage tests guard the new paths.
52
+ - `/reis-mobile:project [feature]` creates or refreshes a verified app object map in `.reis-mobile/project.md` while preserving team-authored product context.
51
53
 
52
54
  #### Changed
53
55
 
54
- - `package.json` is the only editable version source. CI synchronizes the plugin manifests and the Release workflow tests, tags and publishes a new version after it reaches `main`.
55
- - Version synchronization now promotes authored `[Unreleased]` notes to a dated changelog section and refreshes the README's latest-release summary without changing historical entries.
56
+ - Specialist guidance distinguishes configured shared source sets, Android/iOS host behavior and target-specific validation; the shared brief verifies profile paths and separates team knowledge from code evidence.
57
+
58
+ #### Fixed
59
+
60
+ - Release automation opens a pull request for synchronized files instead of pushing directly to a protected `main` branch, and waits for those changes to merge before tagging and publishing.
56
61
 
57
62
  <!-- reis-mobile:latest-release:end -->
58
63
 
@@ -225,10 +230,11 @@ After editing agents, skills or commands, restart Claude Code or Codex.
225
230
  ## Commands
226
231
 
227
232
  ```bash
228
- /reis-mobile # Lists the commands (also accepts doctor, review, debug, test, debate or a free-form request)
233
+ /reis-mobile # Lists the commands (also accepts doctor, project, review, debug, test, debate or a free-form request)
229
234
  /reis-mobile my android build fails on gradle # Free-form request: detects the stack and applies the right agent and skills
230
235
  /reis-mobile:doctor # Environment and project: SDKs, Xcode, CocoaPods, Gradle wrapper, lock files
231
236
  /reis-mobile:doctor --all # Checks every tool, not only those for the detected stack
237
+ /reis-mobile:project checkout # Records actual checkout objects and test commands in .reis-mobile/project.md
232
238
  /reis-mobile:review # Reviews uncommitted changes (or the whole project, if there are none)
233
239
  /reis-mobile:review --base main # Reviews the current branch against main, pull request style
234
240
  /reis-mobile:review --base main focus on security # Free-form focus, in English or Portuguese
@@ -261,6 +267,10 @@ reis-mobile test --base main -- "write regression tests for these changes"
261
267
 
262
268
  Its output includes the resolved project directory, explicit `test` intent, selected specialist and skills, redacted change context, toolchain diagnostics and answer language. `/reis-mobile test ...` forwards to the same slash-command workflow.
263
269
 
270
+ ### Project context
271
+
272
+ `/reis-mobile:project [feature]` resolves the mobile app, traces real entry points, state owners, data or native boundaries and nearby tests, then creates or refreshes `.reis-mobile/project.md`. In a monorepo it writes beside `.reis-mobile/config.yaml`; otherwise it writes in the app root. The generated section contains only facts tied to code or configuration and identifies unknown product rules. Team-authored sections remain intact on refresh. Agents check its paths and commands against the current checkout before using them.
273
+
264
274
  ### Debate
265
275
 
266
276
  `/reis-mobile:debate` puts three specialists with conflicting priorities to defend positions on the same question. Round 1 is blind, so the first to answer does not anchor the others; in round 2 each one rebuts specific points from the others; at the end, `lead-mobile` decides and delivers the action plan. The rounds are stored in `.reis-mobile/debates/`.
@@ -299,9 +309,10 @@ The router never invents a specialist: if no agent serves the intent, it warns y
299
309
  | Review a PR or my changes | `/reis-mobile:review` | ✅ |
300
310
  | Audit an entire Flutter project | `/reis-mobile:review` with no pending changes | ✅ |
301
311
  | Find out a project's stack | `reis-mobile detect` | ✅ |
302
- | Review the architecture of an app | agent `flutter-architect`, `android-architect`, `ios-architect` or `rn-architect` | ✅ |
303
- | Find the cause of jank, rebuilds, hangs or leaks | agent `flutter-`, `android-`, `ios-` or `rn-performance-engineer` | ✅ |
304
- | Write or audit tests | agent `flutter-`, `android-`, `ios-` or `rn-test-engineer` | ✅ |
312
+ | Record the app's real objects and team context | `/reis-mobile:project [feature]` | ✅ |
313
+ | Review the architecture of an app | agent `flutter-architect`, `android-architect`, `ios-architect`, `rn-architect` or `kmp-architect` | ✅ |
314
+ | Find the cause of jank, rebuilds, hangs or leaks | stack-specific `*-performance-engineer` | ✅ |
315
+ | Write or audit tests | stack-specific `*-test-engineer` | ✅ |
305
316
  | Debug a Gradle, Xcode, CocoaPods or Flutter build | `/reis-mobile:debug` | ✅ |
306
317
  | Build a plugin or debug MethodChannel/EventChannel | agent `plugin-native-expert` | ✅ |
307
318
  | Audit a screen for TalkBack, VoiceOver, touch targets and text scaling | agent `mobile-accessibility-auditor` | ✅ |
@@ -321,7 +332,7 @@ The router never invents a specialist: if no agent serves the intent, it warns y
321
332
  | **Project context** | You explain the stack | Deterministic detection of stack, platform and variant |
322
333
  | **Review** | Generic | Mobile checklists: lifecycle, `BuildContext`, MASVS, manifest, ATS |
323
334
  | **Secrets in the diff** | Sent as they are | Masked before reaching the model |
324
- | **Specialists** | None | 18 agents and 13 mobile skills |
335
+ | **Specialists** | None | 21 agents and 14 mobile skills |
325
336
  | **Context cost** | Zero | ~4,300 fixed tokens (agent and skill descriptions), no hooks |
326
337
  | **Best for** | General tasks | Teams and developers working on mobile apps |
327
338
 
@@ -377,13 +388,16 @@ For domain knowledge that code cannot reveal, optionally commit `.reis-mobile/pr
377
388
  | `rn-architect` | React Native | architecture | Feature structure, server vs client state, navigation, native modules |
378
389
  | `rn-performance-engineer` | React Native | performance | Re-renders, lists, JavaScript thread, animations, startup, bundle size |
379
390
  | `rn-test-engineer` | React Native | test | Jest, React Native Testing Library, native module mocks, Detox or Maestro |
391
+ | `kmp-architect` | Kotlin Multiplatform | architecture | Shared source-set ownership, Android/iOS callers and Swift-facing contracts |
392
+ | `kmp-performance-engineer` | Kotlin Multiplatform | performance | Shared Kotlin cost versus Android/iOS host traces and bridge overhead |
393
+ | `kmp-test-engineer` | Kotlin Multiplatform | test | `commonTest`, target tests and Android/iOS host coverage |
380
394
  | `mobile-accessibility-auditor` | all | accessibility | Screen reader labels, roles and states, touch targets, text scaling, focus and announcements, with fixes per platform |
381
395
  | `mobile-release-engineer` | all | release, deployment | Go/no-go readiness, versions and signing, crash symbols, release notes and store copy, CI/CD, staged rollout |
382
- | `mobile-staff-engineer` | all | debug, architecture, performance, test, security, migration, dependency, build | Senior Flutter/Android/iOS specialist for whatever no specific agent covers |
396
+ | `mobile-staff-engineer` | all | debug, architecture, performance, test, security, migration, dependency, build | Cross-toolchain diagnosis and migrations when no stack specialist owns the intent |
383
397
  | `plugin-native-expert` | Flutter | on demand | MethodChannel, EventChannel, Pigeon and Kotlin/Swift bridges, threading and lifecycle |
384
398
  | `lead-mobile` | all | on demand | Coordinates the other agents and consolidates a single action plan |
385
399
 
386
- When more than one agent serves the intent, the stack-specific one wins. In a Flutter app, `performance` goes to `flutter-performance-engineer`; in a native Android app, to `android-performance-engineer`. `accessibility` goes to `mobile-accessibility-auditor` and `release` or `deployment` to `mobile-release-engineer` on every stack. Other intents without a stack specialist, such as `debug`, go to `mobile-staff-engineer`.
400
+ When more than one agent serves the intent, the stack-specific one wins. In a Flutter app, `performance` goes to `flutter-performance-engineer`; in a KMP app, to `kmp-performance-engineer`. `accessibility` goes to `mobile-accessibility-auditor` and `release` or `deployment` to `mobile-release-engineer` on every stack. Other intents without a stack specialist, such as `debug`, go to `mobile-staff-engineer`.
387
401
 
388
402
  ### Skills
389
403
 
@@ -391,18 +405,19 @@ Every skill starts with `mobile-`. **Topic** skills cover every stack with one r
391
405
 
392
406
  | Skill | Covers | Auto-routed for | References |
393
407
  |---|---|---|---|
394
- | `mobile-architecture` | Layers, state management, modularization, DI, navigation | architecture | Flutter (BLoC, Riverpod, Provider, ChangeNotifier...), Android, iOS, React Native |
395
- | `mobile-code-review` | Review process and checklists | review, performance | Flutter (PR review, widgets, project audit, static analysis), Android, iOS, React Native |
396
- | `mobile-debug` | Failing builds and runtime errors | debug, build, dependency, migration | Flutter (build, runtime, layout, packages), Android (Gradle, crashes, ANRs, memory leaks), iOS (Xcode, CocoaPods, crash logs), React Native (Metro, native modules), deep links |
397
- | `mobile-test` | Unit, UI, integration and end-to-end tests | test | Flutter (widget, integration, Patrol, mocks, coverage), Android, iOS, React Native |
398
- | `mobile-security` | OWASP MASVS security checks | review, security, release | Flutter (token storage), Android (intents), iOS, React Native |
399
- | `mobile-accessibility` | Screen readers, touch targets, text scaling, contrast | accessibility | Flutter (Semantics), Android (Compose and Views), iOS (SwiftUI and UIKit), React Native |
400
- | `mobile-release` | Release readiness, store copy and CI/CD | release, deployment | Flutter, Android, iOS, React Native, release notes and store listing, CI/CD |
401
- | `mobile-firebase` | Firebase setup and 13 products | — | Flutter, Android, iOS, React Native, each with a guide per product |
408
+ | `mobile-architecture` | Layers, state management, modularization, DI, navigation | architecture | Flutter (BLoC, Riverpod, Provider, ChangeNotifier...), Android, iOS, React Native, KMP |
409
+ | `mobile-code-review` | Review process and checklists | review, performance | Flutter (PR review, widgets, project audit, static analysis), Android, iOS, React Native, KMP |
410
+ | `mobile-debug` | Failing builds and runtime errors | debug, build, dependency, migration | Flutter (build, runtime, layout, packages), Android (Gradle, crashes, ANRs, memory leaks), iOS (Xcode, CocoaPods, crash logs), React Native (Metro, native modules), KMP, deep links |
411
+ | `mobile-test` | Unit, UI, integration and end-to-end tests | test | Flutter (widget, integration, Patrol, mocks, coverage), Android, iOS, React Native, KMP |
412
+ | `mobile-security` | OWASP MASVS security checks | review, security, release | Flutter (token storage), Android (intents), iOS, React Native, KMP |
413
+ | `mobile-accessibility` | Screen readers, touch targets, text scaling, contrast | accessibility | Flutter (Semantics), Android (Compose and Views), iOS (SwiftUI and UIKit), React Native, KMP |
414
+ | `mobile-release` | Release readiness, store copy and CI/CD | release, deployment | Flutter, Android, iOS, React Native, KMP, release notes and store listing, CI/CD |
415
+ | `mobile-firebase` | Firebase setup and 13 products | — | Flutter, Android, iOS, React Native, KMP; check installed SDK support |
402
416
  | `mobile-flutter` | Flutter and Dart specifics | review, performance, accessibility, migration | UI and navigation, data, native code, performance, accessibility and i18n, Dart, setup |
403
417
  | `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 |
404
418
  | `mobile-ios` | Native iOS specifics | performance, release, accessibility | UI and navigation, data and networking, platform features, performance and release |
405
419
  | `mobile-rn` | React Native and Expo specifics | performance, release, accessibility | UI and navigation, data and networking, platform features, performance and release |
420
+ | `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 |
406
421
  | `mobile-detect-stack` | Deterministic stack detection with the CLI | — | — |
407
422
 
408
423
  Skills marked — are triggered by Claude Code when the request matches their description, for example *"add push notifications with FCM"* → `mobile-firebase`.
@@ -413,7 +428,7 @@ About 85 guides come from [flutter/skills](https://github.com/flutter/skills), [
413
428
 
414
429
  ## Trust, security and limits
415
430
 
416
- **Read-only CLI context.** `doctor`, `detect`, `route`, `review` and `test` do not modify your project. The `/reis-mobile:test` slash command can write or fix tests and execute runners when requested. The `/reis-mobile:review` and `/reis-mobile:debate` commands instruct the model not to edit files; the debate only writes its rounds to `.reis-mobile/debates/`, outside your code.
431
+ **Read-only CLI context.** `doctor`, `detect`, `route`, `review` and `test` do not modify your project. The `/reis-mobile:test` slash command can write or fix tests and execute runners when requested. `/reis-mobile:project` writes only the optional project profile. The `/reis-mobile:review` and `/reis-mobile:debate` commands instruct the model not to edit app code; the debate writes its rounds to `.reis-mobile/debates/`.
417
432
 
418
433
  **Secrets masked.** The diff goes through [`core/security/redact.mjs`](core/security/redact.mjs) before reaching the model. Lock files and generated code (`*.g.dart`, `*.freezed.dart`, `*.pbxproj`) stay out of the diff. Redaction is a protection layer, not a guarantee. See [SECURITY.md](SECURITY.md).
419
434
 
@@ -421,7 +436,7 @@ About 85 guides come from [flutter/skills](https://github.com/flutter/skills), [
421
436
 
422
437
  **Exception: `/reis-mobile:debate --external`.** This flag, and only this flag, sends the debate context — including excerpts of the files mentioned in the question — to the `codex` and `gemini` CLIs, which are third-party and have their own data policies. Without the flag, the debate context stays in your session. The `review` diff is masked by `redact.mjs`, but the context you cite in a debate question does not go through that layer: check what you are sending before using `--external`.
423
438
 
424
- **Context cost.** The descriptions of the 18 agents and 13 skills add up to about 4,300 fixed tokens per session, estimated from their length (v0.3 measured about 4,800 with `claude plugin details reis-mobile`). The full content of each skill is only loaded when it is used.
439
+ **Context cost.** Claude Code loads the descriptions of 21 agents and 14 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.
425
440
 
426
441
  **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.
427
442
 
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: kmp-architect
3
+ description: Use this agent to design or review Kotlin Multiplatform architecture across `commonMain`, Android/iOS source sets and host apps. It traces real shared domain types, `expect`/`actual` or injected interfaces, framework exports and state ownership before choosing what to share. Typical triggers are moving a feature into a shared module, untangling `iosMain`/`androidMain`, and deciding whether UI or only logic should be shared.
4
+ model: inherit
5
+ color: cyan
6
+ tools: ["Read", "Grep", "Glob"]
7
+ intents: [architecture]
8
+ stacks: [kotlin-multiplatform]
9
+ ---
10
+
11
+ You own the shared-versus-target boundary, not an Android module diagram with an iOS folder appended. Produce a read-only design based on the targets and symbols this project actually builds.
12
+
13
+ Read the [project brief](../docs/agent-context.md) once or reuse the caller's verified brief. Apply [mobile-kmp](../skills/mobile-kmp/SKILL.md), its [source-set guide](../skills/mobile-kmp/references/source-sets.md) and [mobile-architecture](../skills/mobile-architecture/SKILL.md) with the [KMP architecture reference](../skills/mobile-architecture/references/kotlin-multiplatform.md).
14
+
15
+ ## Trace the contract
16
+
17
+ 1. Map included Gradle modules, configured targets, source-set `dependsOn` edges and iOS framework/host integration. Mark generated artifacts separately from editable source.
18
+ 2. Follow one requested action from the Android and iOS entry points to the same shared Kotlin type. Name the state owner, repository/service interface, platform implementation and where each error returns to UI. If the UIs are separate, document their adapters instead of assuming shared Compose.
19
+ 3. Inventory the actual feature objects: identifiers, domain values, DTOs, persisted models and Swift-facing types. Show conversion and validation at each boundary; identify which object is authoritative and who can write it.
20
+ 4. Compare `expect`/`actual` and injected interfaces against the size of the platform behavior and the project's existing pattern. Check target completeness and the ownership of coroutine scopes, callbacks and native resources.
21
+
22
+ ## Decide and hand off
23
+
24
+ Choose the smallest boundary that removes a demonstrated duplication or coupling problem. Specify the shared API, target implementations, error/nullability contract, construction site and migration seam; name new symbols as proposed. Avoid a framework migration or shared UI proposal without evidence from both host apps.
25
+
26
+ Return a table of **object → source set → owner/lifetime → Android caller → iOS caller → test seam**, plus the current source-set graph and a stepwise design with actual paths. Include the target builds and tests that would prove each contract. A Kotlin compilation alone does not prove the Swift consumer works.
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: kmp-performance-engineer
3
+ description: Use this agent to diagnose Kotlin Multiplatform performance across shared Kotlin work, Compose Multiplatform and Android/iOS hosts. It separates shared algorithm or serialization cost from Android frame/ANR evidence, iOS hangs and framework-bridge overhead. Typical triggers are a shared repository making both apps slow, iOS-only jank after a KMP change, startup delay from framework initialization, and retained objects across a Swift/Kotlin boundary.
4
+ model: inherit
5
+ color: yellow
6
+ tools: ["Read", "Grep", "Glob", "Bash"]
7
+ intents: [performance]
8
+ stacks: [kotlin-multiplatform]
9
+ ---
10
+
11
+ You isolate one measured KMP regression and its target-specific consequence. Return a falsifiable cause and a bounded fix proposal, not a generic performance checklist.
12
+
13
+ Read or reuse the [project brief](../docs/agent-context.md). Apply [mobile-kmp](../skills/mobile-kmp/SKILL.md), its [build/performance guide](../skills/mobile-kmp/references/build-performance.md), and the [KMP review reference](../skills/mobile-code-review/references/kotlin-multiplatform.md).
14
+
15
+ ## Split the cost by boundary
16
+
17
+ 1. Fix the app revision, module, affected Android/iOS target, build configuration, device and user journey. Trace the initiating UI action through the shared Kotlin symbol, platform implementation, native framework/API and visible result.
18
+ 2. For shared code, inspect the exact algorithm, allocation, serialization or cache path and its input volume. Compare outputs and work performed on both targets before calling it a common-code regression.
19
+ 3. For Android, use the app's frame/ANR/heap evidence and name the Kotlin call on the blocked path. For iOS, use a symbolicated hang/Time Profiler or memory trace and the exported framework boundary. If UI is shared, distinguish Compose state invalidation from Kotlin data work and host rendering.
20
+ 4. For retained memory or startup, find the creator and owner of the shared object, coroutine/task and Swift callback. Show the retaining or blocking chain; do not recommend weak references, dispatchers or memoization without that chain.
21
+
22
+ ## Measurement artifact
23
+
24
+ State whether the evidence came from Android, iOS or both. Provide **journey → trace interval → source symbol → cost owner → proposed change → correctness risk → comparable before/after metric**. Use the same input and release-like conditions for comparisons. If no profiler run was possible, label the finding a static hypothesis and provide the exact capture needed; never transfer a JVM timing result to iOS.
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: kmp-test-engineer
3
+ description: Use this agent to write, fix or audit Kotlin Multiplatform tests in `commonTest` and configured target test source sets, including `expect`/`actual` behavior, Kotlin/Native iOS test binaries, Android host tests and Compose Multiplatform UI. Typical triggers are testing shared business logic, a bug that appears only on iOS, flaky target-specific tests, or a KMP project where Android tests pass but iOS behavior is unknown.
4
+ model: inherit
5
+ color: green
6
+ tools: ["Read", "Grep", "Glob", "Bash", "Edit", "Write"]
7
+ intents: [test]
8
+ stacks: [kotlin-multiplatform]
9
+ ---
10
+
11
+ You own the test matrix across shared logic, target implementations and host apps. An audit request stays read-only; a request to add or fix tests authorizes the relevant files.
12
+
13
+ Reuse the [project brief](../docs/agent-context.md) or read it once. Load [mobile-kmp](../skills/mobile-kmp/SKILL.md), [mobile-test](../skills/mobile-test/SKILL.md) and the [KMP testing reference](../skills/mobile-test/references/kotlin-multiplatform.md).
14
+
15
+ ## Choose the test target
16
+
17
+ 1. Read the affected module's targets, source sets, test dependencies and Gradle tasks. Locate the real Kotlin symbol, `actual` implementations, nearest tests and any Android/iOS app test targets. Do not assume a `commonTest` case runs on every declared target in CI.
18
+ 2. Put shared rules and serialization cases in the source set that owns them. For platform behavior, test the Android and iOS implementation with the relevant target runner and controlled external boundary. Name the observable result, not just a mock invocation.
19
+ 3. For `expect`/`actual`, include a contract case that both implementations can satisfy, then target-specific cases for permissions, storage, threading or interop that differ. Verify the test source set is connected to each target and the task discovers a nonzero test count.
20
+ 4. For Compose Multiplatform, use the test API supported by the installed version and prove the interaction on relevant targets. A common UI test does not replace Android instrumentation or XCUITest when the behavior crosses a host, system dialog or native SDK.
21
+
22
+ ## Execute and report
23
+
24
+ Discover exact tasks with the Gradle wrapper instead of guessing target names. Run the narrow shared and target suites available here; iOS tests need a compatible macOS/Xcode environment. Keep fixture data, schedulers and native stores isolated; avoid arbitrary sleeps.
25
+
26
+ Return a matrix of **production symbol → source set/target → test file → scenario/assertion → task → executed count/result**. Separate Android, iOS and host UI coverage. If one target cannot run, mark it unrun with the concrete prerequisite; a green JVM task is not a KMP-wide pass.
@@ -30,6 +30,9 @@ Agents use the `reis-mobile:` prefix in the Agent tool. Choose by stack and deli
30
30
  | Route, cache/client-state and native-module boundaries | `reis-mobile:rn-architect` |
31
31
  | React render, JavaScript and native-thread costs | `reis-mobile:rn-performance-engineer` |
32
32
  | Jest/component tests and configured device journeys | `reis-mobile:rn-test-engineer` |
33
+ | KMP source-set, shared object and Android/iOS contract design | `reis-mobile:kmp-architect` |
34
+ | KMP common/target tests and host coverage | `reis-mobile:kmp-test-engineer` |
35
+ | Shared Kotlin versus Android/iOS host performance cause | `reis-mobile:kmp-performance-engineer` |
33
36
  | Diff regression with concrete trigger and consequence | `reis-mobile:mobile-code-reviewer` |
34
37
  | Assistive-technology journey and control semantics | `reis-mobile:mobile-accessibility-auditor` |
35
38
  | Release identity, artifact gates, notes or pipeline | `reis-mobile:mobile-release-engineer` |
@@ -48,6 +48,9 @@ Choose **three** agents whose priorities genuinely conflict on the question. A d
48
48
  | `reis-mobile:rn-architect` | Feature boundaries, server vs client state, native module isolation | `opus` |
49
49
  | `reis-mobile:rn-performance-engineer` | Re-renders, lists, JavaScript thread, startup | `sonnet` |
50
50
  | `reis-mobile:rn-test-engineer` | Testability through the UI, mocks at boundaries, coverage cost | `sonnet` |
51
+ | `reis-mobile:kmp-architect` | Shared source-set ownership, host API contracts and migration cost | `opus` |
52
+ | `reis-mobile:kmp-performance-engineer` | Shared Kotlin cost versus Android/iOS host traces and bridge overhead | `sonnet` |
53
+ | `reis-mobile:kmp-test-engineer` | Common and target tests, host integration and coverage gaps | `sonnet` |
51
54
  | `reis-mobile:plugin-native-expert` | Flutter–native boundary, platform channels, lifecycle | `opus` |
52
55
  | `reis-mobile:mobile-staff-engineer` | Build, release, migration, cross-platform trade-offs | `opus` |
53
56
  | `reis-mobile:mobile-code-reviewer` | Concrete risk in the code that already exists | `sonnet` |
@@ -58,7 +61,7 @@ Automatic selection must end with **at least two different models** among the pa
58
61
 
59
62
  Selection rules:
60
63
 
61
- - The detected stack rules. The `flutter-*` agents only join Flutter projects, `android-*` native Android, `ios-*` native iOS and `rn-*` React Native. Pick the architect, performance and test specialists of the detected stack first; `mobile-staff-engineer` and `mobile-code-reviewer` fit any stack.
64
+ - The detected stack rules. The `flutter-*` agents only join Flutter projects, `android-*` native Android, `ios-*` native iOS, `rn-*` React Native and `kmp-*` Kotlin Multiplatform. Pick the architect, performance and test specialists of the detected stack first; `mobile-staff-engineer` and `mobile-code-reviewer` fit any stack.
62
65
  - Without native code in the project, do not call `plugin-native-expert`.
63
66
  - `--agents` overrides the automatic choice, but not the models: each agent keeps the one from the table. Unknown name: warn and stop.
64
67
  - `reis-mobile:lead-mobile` never debates — it moderates in step 7, always on `opus`, because synthesizing conflicting positions is the heaviest work in the flow.
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: Build or refresh a project-specific mobile brief from actual app objects, boundaries and validation commands
3
+ argument-hint: "[feature or flow to prioritize]"
4
+ allowed-tools: ["Bash(node:*)", "Bash(git:*)", "Read", "Grep", "Glob", "Edit", "Write"]
5
+ ---
6
+
7
+ # reis-mobile project
8
+
9
+ Arguments received: `$ARGUMENTS`
10
+
11
+ ## Resolve the mobile app and profile
12
+
13
+ Run `node "${CLAUDE_PLUGIN_ROOT}/bin/reis-mobile.mjs" detect --json --dir "$PWD"`. Parse the JSON result; use `projectDir` as the app root. If `projectConfig` is present, place the profile at `.reis-mobile/project.md` beside that config file. Otherwise place it at `<projectDir>/.reis-mobile/project.md`. Do not write a profile for an unknown stack or a missing project root. Read `${CLAUDE_PLUGIN_ROOT}/docs/agent-context.md` before collecting evidence.
14
+
15
+ The optional arguments identify a feature or flow to prioritize, not a shell command. Never evaluate them as shell code. Resolve source paths against the app root, and paths in a monorepo-wide CI file against the repository root.
16
+
17
+ ## Collect project evidence
18
+
19
+ Inspect applicable repository instructions, architecture docs, build manifests, lock files, source entry points, navigation, dependency wiring, two or three representative features and their nearest tests. For the requested feature, inspect its actual user action, state owner, repository/service, data model, external or native boundary, and failure path. For an unscoped run, select one critical journey only when code or team documentation identifies it; otherwise record a representative implemented flow and label it as such.
20
+
21
+ Use the detected stack and configured targets. For Kotlin Multiplatform, map `commonMain`, target source sets and Android/iOS host callers. Read the real CI jobs, package scripts, Gradle tasks or Xcode schemes before listing validation commands. Never invent a domain object, test target, supported OS, business invariant or command from a skill example. Mark facts without evidence as unknown and state what could establish them.
22
+
23
+ ## Write or refresh the brief
24
+
25
+ Create the profile if absent. On refresh, replace only the content between these exact markers:
26
+
27
+ ```markdown
28
+ <!-- reis-mobile:verified:start -->
29
+ ## Verified code map
30
+ ...
31
+ <!-- reis-mobile:verified:end -->
32
+ ```
33
+
34
+ If an existing profile lacks the markers, preserve all existing text and append the marked block. Do not rewrite or remove team-authored sections, even when they conflict with code; identify the discrepancy after the block. Never copy secrets, credentials, tokens, personal data or raw environment values into the profile.
35
+
36
+ The verified block contains:
37
+
38
+ 1. App root, detected stack/targets and the manifest or configuration paths that prove them.
39
+ 2. A compact table of **real object/symbol → path → owner/lifetime → caller or event → next boundary → nearest test**. Mark an absent test as `none found`, not as a claim that no tests exist.
40
+ 3. One concrete flow from entry action through state and data/native boundary to observable result, with paths and symbols.
41
+ 4. Existing validation commands with working directory and their source (CI/script/task/scheme). Distinguish commands inspected from commands actually run.
42
+ 5. Unknowns and stale references that require team confirmation.
43
+
44
+ For a new profile, add a short `## Team context` section after the verified block with prompts for product vocabulary, critical journeys, business invariants, supported environments and deliberate exceptions. Leave values as `Unknown — team input needed` until the team supplies them. Do not fabricate a product description.
45
+
46
+ ## Report
47
+
48
+ State the profile path, the flow and objects recorded, evidence that was verified, commands actually run and the remaining unknowns. Follow the CLI's `language`: `pt` is Brazilian Portuguese; `en` is English; otherwise follow the user's language. Code identifiers, paths and quoted output remain unchanged.
@@ -1,7 +1,7 @@
1
1
  ---
2
- description: reis-mobile entry point — lists the commands or forwards to doctor, review, debug, test, debate or the right agent from a free-form request
3
- argument-hint: "[doctor | review | debug | test | debate | free-form request]"
4
- allowed-tools: ["Bash(node:*)", "Bash(git:*)", "Read", "Grep", "Glob"]
2
+ description: reis-mobile entry point — lists the commands or forwards to doctor, project, review, debug, test, debate or the right agent from a free-form request
3
+ argument-hint: "[doctor | project | review | debug | test | debate | free-form request]"
4
+ allowed-tools: ["Bash(node:*)", "Bash(git:*)", "Read", "Grep", "Glob", "Edit", "Write"]
5
5
  ---
6
6
 
7
7
  # reis-mobile
@@ -20,6 +20,7 @@ Reply only with this list. The only thing to run is `node "${CLAUDE_PLUGIN_ROOT}
20
20
 
21
21
  ```text
22
22
  /reis-mobile:doctor Environment and project: SDKs, Xcode, CocoaPods, Gradle wrapper, lock files
23
+ /reis-mobile:project [feature] Creates or refreshes a brief with actual app objects and team context
23
24
  /reis-mobile:review [--base <ref>] Code review of the changes (or the whole project)
24
25
  /reis-mobile:debug <problem> Finds the cause of a build or runtime failure and proposes the fix
25
26
  /reis-mobile:test [request] Runs, writes, audits or fixes tests using the project's test setup
@@ -34,6 +35,10 @@ When the language is `pt`, translate the descriptions and keep the commands as t
34
35
  1. Run via Bash: `node "${CLAUDE_PLUGIN_ROOT}/bin/reis-mobile.mjs" doctor --dir "$PWD" <options>`.
35
36
  2. Read `${CLAUDE_PLUGIN_ROOT}/commands/doctor.md` and follow its **Instructions** section on that output.
36
37
 
38
+ ## `project [feature]`
39
+
40
+ Read `${CLAUDE_PLUGIN_ROOT}/commands/project.md` and follow all of it, treating the rest of the arguments (without the word `project`) as `$ARGUMENTS`. This entry point has the same behavior as `/reis-mobile:project`.
41
+
37
42
  ## `review [options] [focus]`
38
43
 
39
44
  Read `${CLAUDE_PLUGIN_ROOT}/commands/review.md` and follow all of it, treating the rest of the arguments (without the word `review`) as `$ARGUMENTS`.
@@ -17,6 +17,7 @@ export const PLATFORM_SKILLS = {
17
17
  'mobile-android': 'android',
18
18
  'mobile-ios': 'ios',
19
19
  'mobile-rn': 'react-native',
20
+ 'mobile-kmp': 'kotlin-multiplatform',
20
21
  };
21
22
 
22
23
  /**
@@ -6,7 +6,7 @@ Read this contract once per task. If the caller supplied a brief, reuse it and v
6
6
 
7
7
  Use the CLI's resolved `Project` directory and stack/platform focus. Read repository instructions that apply to the files in scope, then relevant architecture docs, build manifests, lock files, nearby implementation and tests. In a monorepo, keep repository-wide constraints and app-specific conventions distinct. Skip generated files and unrelated features.
8
8
 
9
- If the repository contains `.reis-mobile/project.md`, read it for team knowledge that code cannot explain: product vocabulary, critical journeys, intentional boundaries and supported environments. This is optional Markdown read by the model, not a new CLI configuration key. Verify its file paths, symbols and commands against the current checkout; mark stale statements. Do not require a setup interview or create the file unless requested.
9
+ If the repository contains `.reis-mobile/project.md`, read it for team knowledge that code cannot explain: product vocabulary, critical journeys, intentional boundaries and supported environments. In a monorepo with `.reis-mobile/config.yaml`, look beside that config; otherwise look under the resolved app root. This is optional Markdown read by the model, not a new CLI configuration key. Verify its file paths, symbols and commands against the current checkout; mark stale statements and distinguish team-authored business rules from facts inferred from code. Do not require a setup interview or create the file unless requested.
10
10
 
11
11
  ## Build a compact brief
12
12
 
@@ -33,7 +33,7 @@ Trace at least one concrete path through the relevant objects: an action to a st
33
33
 
34
34
  ## Optional team context
35
35
 
36
- A team can commit `.reis-mobile/project.md` alongside the existing `.reis-mobile/config.yaml` (which continues to support only `app`). Useful content is short and specific:
36
+ A team can run `/reis-mobile:project [feature]` to create or refresh a verified object map in `.reis-mobile/project.md`, then add product knowledge that cannot be inferred from code. The command preserves team-authored text on refresh. The optional profile can live beside the existing `.reis-mobile/config.yaml` (which continues to support only `app`). Useful content is short and specific:
37
37
 
38
38
  ```markdown
39
39
  # Mobile project context
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "reis-mobile",
3
- "version": "0.7.1",
4
- "description": "AI agents and skills for mobile development — Flutter, Android, iOS and React Native — as a plugin for Claude Code and Codex: code review, debugging, tests, architecture, security and Firebase.",
3
+ "version": "0.7.2",
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",
7
7
  "author": "Warleson Reis",
@@ -43,6 +43,7 @@
43
43
  "swift",
44
44
  "swiftui",
45
45
  "kotlin",
46
+ "kotlin-multiplatform",
46
47
  "jetpack-compose",
47
48
  "dart",
48
49
  "firebase",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-accessibility
3
- description: Audits and fixes accessibility in mobile apps on every stack — screen reader labels, roles, states and reading order for TalkBack and VoiceOver, decorative elements, grouping, touch target size, text scaling and Dynamic Type, color contrast, focus in dialogs and announcements for dynamic content — with the exact APIs for Flutter (Semantics), native Android (Jetpack Compose semantics and Views), native iOS (SwiftUI and UIKit) and React Native, plus automated checks in tests. Use when building or reviewing UI for accessibility, preparing an accessibility audit, fixing TalkBack or VoiceOver issues, or when the user mentions a11y, WCAG, screen readers, font scaling or contrast, even if they only point at one screen.
3
+ description: Audits and fixes mobile accessibility across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform, including shared Compose UI and native hosts. Covers TalkBack/VoiceOver labels, roles, state, reading order, touch targets, text scaling, contrast and focus. Use for a11y audits, screen-reader bugs or accessible UI implementation.
4
4
  intents: [accessibility]
5
5
  stacks: ["*"]
6
6
  ---
@@ -17,6 +17,7 @@ One accessibility process for every mobile stack. This file holds what is true e
17
17
  | Native Android: Jetpack Compose or Views | [references/android.md](references/android.md) |
18
18
  | Native iOS: SwiftUI or UIKit | [references/ios.md](references/ios.md) |
19
19
  | React Native or Expo | [references/react-native.md](references/react-native.md) |
20
+ | Kotlin Multiplatform with shared Compose UI or native host UI | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
20
21
 
21
22
  In Flutter and React Native apps, the native reference applies only to screens or components written natively (platform views, native modules with UI).
22
23
 
@@ -27,7 +27,7 @@ Pitfalls:
27
27
  ## Announcements and focus
28
28
 
29
29
  - Mark text that changes on its own (a counter, a status) with `Semantics(liveRegion: true, ...)`.
30
- - For one-off messages, `SemanticsService.announce(message, textDirection)` exists in `package:flutter/semantics.dart`; check its status in the Flutter version in `pubspec.lock`'s SDK constraint before recommending it, since the announcement APIs have been evolving for multi-view support.
30
+ - For one-off messages, inspect the installed Flutter SDK's `SemanticsService` API and the project's SDK pin before recommending an announcement call; `pubspec.lock` does not identify the exact Flutter SDK version.
31
31
  - `SnackBar`s shown through `ScaffoldMessenger` are announced by the framework.
32
32
  - Dialogs opened with `showDialog` and routes block the semantics of what is behind them; custom overlays built with `Stack` and `Positioned` do not — use `BlockSemantics` or a route.
33
33
  - Control reading order with `Semantics(sortKey: OrdinalSortKey(n))` only when the visual order and the widget order genuinely differ.
@@ -0,0 +1,9 @@
1
+ # Kotlin Multiplatform accessibility
2
+
3
+ Determine whether the changed screen is shared Compose Multiplatform UI, native Android UI, native SwiftUI/UIKit, or a mix. KMP shared domain code has no accessibility tree by itself.
4
+
5
+ - For shared Compose UI, inspect semantics and state on the actual component, then verify the Android and iOS host experience with TalkBack and VoiceOver. Check the installed Compose version's iOS accessibility behavior against [JetBrains' iOS accessibility guide](https://kotlinlang.org/docs/multiplatform/compose-ios-accessibility.html).
6
+ - For native host UI, use the [Android](android.md) or [iOS](ios.md) reference and inspect the adapter that turns a shared state/error into labels, announcements and focus transitions.
7
+ - Test the same critical journey on both targets at large text sizes. A shared composable test does not prove native screen-reader behavior on either device.
8
+
9
+ Give **screen path:symbol → rendered target UI → missing name/role/state/order or focus behavior → target-specific fix → verification**. If a target UI is absent, report that fact instead of claiming parity.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-architecture
3
- description: Designs and reviews the architecture of mobile apps on every stack — layers (UI, domain, data), unidirectional data flow, state ownership and state management, feature-first modularization, dependency injection, navigation, offline data and use cases — for Flutter (BLoC, Riverpod, Provider, ChangeNotifier), native Android (ViewModel, Hilt, Gradle modules), native iOS (SwiftUI and UIKit, Observation, Swift packages, actors) and React Native (server vs client state, React Navigation, Expo Router, native modules). Use when structuring a new app or feature, choosing or implementing state management, refactoring to layers or modules, or when the user asks where code should live, even if they only mention one class or screen.
3
+ description: Designs and reviews mobile architecture across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform. Covers state ownership, data flow, modules, dependency boundaries, navigation, offline data and KMP shared source sets versus host apps. Use when structuring a feature, choosing state management, refactoring layers or deciding where a real class or screen belongs.
4
4
  intents: [architecture]
5
5
  stacks: ["*"]
6
6
  ---
@@ -17,6 +17,7 @@ What makes a mobile codebase keep up with its team, and how each stack expresses
17
17
  | Native Android (Kotlin), or the Android side of Kotlin Multiplatform | [references/android.md](references/android.md) |
18
18
  | Native iOS (Swift) | [references/ios.md](references/ios.md) |
19
19
  | React Native or Expo | [references/react-native.md](references/react-native.md) |
20
+ | Kotlin Multiplatform shared code and target boundaries | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
20
21
 
21
22
  ## 2. Map before judging
22
23
 
@@ -0,0 +1,11 @@
1
+ # Kotlin Multiplatform architecture
2
+
3
+ Read the [KMP source-set guide](../../mobile-kmp/references/source-sets.md) before assigning a responsibility to shared or target code.
4
+
5
+ 1. Draw the actual module and source-set graph from Gradle configuration. Mark `commonMain`, intermediate sets, target sets and the Android/iOS host entry points that consume the module. Do not infer a shared UI from the KMP plugin.
6
+ 2. Trace one user action through each host into the same shared domain object. Record the state owner, repository or use-case interface, platform adapter, persistence model and error conversion. Include the Swift-facing API if iOS calls shared Kotlin.
7
+ 3. Put platform-neutral rules and data contracts in shared code only when both callers need the same behavior. Keep lifecycle, permissions, UI navigation and platform SDK setup with their actual owners. For small platform operations, compare an `expect`/`actual` seam with an injected interface; follow the project's existing pattern.
8
+ 4. Specify object mappings at API and persistence boundaries, especially nullability and error types exported to Swift. Name who writes each object and which cache is authoritative.
9
+ 5. Return a table of **object/symbol → source set → owner → Android caller → iOS caller → test seam**, plus a minimal migration sequence. Mark proposed paths as proposed.
10
+
11
+ Check [Kotlin's source-set hierarchy](https://kotlinlang.org/docs/multiplatform/multiplatform-dsl-reference.html) and [platform API connection guidance](https://kotlinlang.org/docs/multiplatform/multiplatform-connect-to-apis.html) against the installed Kotlin version.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-code-review
3
- description: Reviews mobile code for the bugs that reach production on every stack — Flutter and Dart (pull request checklist, widget lifecycle and rebuilds, project health, static analysis), native Android (Kotlin, coroutines, Jetpack Compose, lifecycle), native iOS (Swift concurrency, SwiftUI, retain cycles) and React Native (hooks, re-renders, platform code, Expo) — with file:line evidence and a structured report. Use whenever the user asks for a code review, PR or merge request review, project audit or quality check of a mobile app, or runs /reis-mobile:review, even if they only point at a diff or a folder.
3
+ description: Reviews mobile code for production bugs across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform, including KMP source-set and host API contracts. Covers lifecycle, concurrency, UI state and native boundaries with file:line evidence. Use for a code review, PR, project audit, quality check or /reis-mobile:review.
4
4
  intents: [review, performance]
5
5
  stacks: ["*"]
6
6
  ---
@@ -19,6 +19,7 @@ Detect the stack first, then apply the platform checklist to the files in scope:
19
19
  | Native Android (Kotlin/Java), or the Android side of Kotlin Multiplatform | [references/android.md](references/android.md) |
20
20
  | Native iOS (Swift/Objective-C) | [references/ios.md](references/ios.md) |
21
21
  | React Native or Expo | [references/react-native.md](references/react-native.md) |
22
+ | Kotlin Multiplatform shared and target changes | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
22
23
 
23
24
  In a cross-platform app, native code in `android/`, `ios/` or native modules gets the native checklist too. Security findings follow `mobile-security` when it is loaded.
24
25
 
@@ -23,7 +23,7 @@ Apply to Dart files with widgets (`StatelessWidget`, `StatefulWidget`, `Consumer
23
23
  - [ ] Long lists with `ListView(children: [...])` / `Column` inside `SingleChildScrollView`: use `ListView.builder` or `SliverList`.
24
24
  - [ ] `shrinkWrap: true` on a large list inside another scroll view: forces layout of every item.
25
25
  - [ ] Rebuild scope too large: `setState`, `BlocBuilder` or `Consumer` at the top of the screen when only one part changes. Use `buildWhen`, `select` or extract the widget.
26
- - [ ] `MediaQuery.of(context)` used only for the size: `MediaQuery.sizeOf(context)` rebuilds less. Confirm the Flutter version in `pubspec.lock` before suggesting it.
26
+ - [ ] `MediaQuery.of(context)` used only for the size: `MediaQuery.sizeOf(context)` rebuilds less. Confirm the project's Flutter SDK pin or installed toolchain before suggesting it.
27
27
  - [ ] Network images without `cacheWidth`/`cacheHeight` or without caching, decoded at full resolution to display thumbnails.
28
28
  - [ ] Animated `Opacity` or `ClipRRect`/`BackdropFilter` in list items: prefer `FadeTransition`/`AnimatedOpacity` and avoid unnecessary clipping.
29
29
  - [ ] Heavy work (parsing large JSON, cryptography, image processing) on the UI thread: use `compute`/`Isolate.run`.
@@ -13,6 +13,6 @@ Apply the checklists in this order; stop early for a small diff that only touche
13
13
 
14
14
  - Dart style and idioms: the Effective Dart and Dart 3 guides in the `mobile-flutter` skill (`references/dart.md`).
15
15
  - Follow the project's state management (BLoC/Cubit, Riverpod, Provider) instead of suggesting another one.
16
- - Check the Flutter and Dart versions in `pubspec.lock` before recommending newer APIs (`MediaQuery.sizeOf`, Dart 3 patterns).
16
+ - Check the Flutter SDK pin or installed toolchain before recommending newer APIs (`MediaQuery.sizeOf`, Dart 3 patterns); `pubspec.lock` records dependency resolution, not the exact Flutter SDK version.
17
17
  - Generated files (`*.g.dart`, `*.freezed.dart`, `*.mocks.dart`) are reviewed through their source annotations, not line by line.
18
18
  - Native code under `android/` and `ios/` follows [android.md](android.md) and [ios.md](ios.md).
@@ -0,0 +1,11 @@
1
+ # Kotlin Multiplatform review
2
+
3
+ Read the changed module's source-set graph and all configured target implementations. Review the public contract as it is consumed by Android and the Swift/iOS host.
4
+
5
+ - **Shared logic:** check that DTO/domain conversions, error mapping, coroutine ownership and repository state remain target-neutral. Cite the exact shared symbol and affected caller.
6
+ - **Target completeness:** compare every changed `expect` declaration and actual implementation or injected adapter across configured targets. Check target-only dependencies are declared in the correct source set.
7
+ - **iOS boundary:** inspect framework export, Swift nullability/error handling and callback or coroutine lifetime when a shared API changes. A shared Kotlin compile alone does not validate the Swift caller.
8
+ - **UI boundary:** first determine whether the project shares Compose UI. Review the Android/iOS host lifecycle and accessibility in the correct native or Compose reference.
9
+ - **Tests:** look for common tests for the rule and target/host tests where behavior depends on platform services. Verify that CI actually runs the relevant target tasks.
10
+
11
+ Return only reproducible findings at `path:line`, with the affected target and smallest fix. Use the [source-set guide](../../mobile-kmp/references/source-sets.md) for the dependency graph.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-debug
3
- description: Finds the cause of failing builds and runtime errors in mobile apps on every stack — Flutter (pub version solving, Dart compilation, generated code, layout overflows, runtime exceptions), native Android (Gradle, AGP, JDK and Kotlin mismatches, dependency conflicts, manifest merger, R8, logcat crashes, ANRs and memory leaks), native iOS (Xcode signing and provisioning, deployment targets, CocoaPods, Swift Package Manager, crash logs) and React Native (Metro, native modules not found, Hermes, the Android and iOS builds underneath), plus deep links, App Links and Universal Links that do not open the app. Use whenever a build, `flutter run`, `pod install`, Gradle task, Xcode archive or app launch fails, when the user pastes a stack trace, "BUILD FAILED" or a red screen, or runs /reis-mobile:debug, even if they only paste the error.
3
+ description: Diagnoses build and runtime failures across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform. Covers pub/Dart, Gradle/AGP, Xcode/CocoaPods, Metro, KMP source sets and iOS frameworks, crashes and deep links. Use for failing builds, app launches, stack traces or /reis-mobile:debug.
4
4
  intents: [debug, build, dependency, migration]
5
5
  stacks: ["*"]
6
6
  ---
@@ -19,6 +19,7 @@ Choose by the stack **and** by the layer the error comes from — a Flutter or R
19
19
  | Gradle, the Android build, logcat crashes or ANRs (native Android, or the `android/` folder of any app) | [references/android.md](references/android.md) |
20
20
  | Xcode, signing, CocoaPods, Swift packages or iOS crash logs (native iOS, or the `ios/` folder of any app) | [references/ios.md](references/ios.md) |
21
21
  | A React Native or Expo app: Metro, native modules, JavaScript errors | [references/react-native.md](references/react-native.md) |
22
+ | Kotlin Multiplatform compilation, source-set or framework integration | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
22
23
  | A deep link, App Link or Universal Link that opens the browser, the wrong screen or crashes (any stack) | [references/deep-links.md](references/deep-links.md) |
23
24
 
24
25
  When `reis-mobile debug` (or `/reis-mobile:debug`) ran, its `area` line points at the layer: `gradle`, `manifest`, `proguard` → Android; `xcode`, `signing`, `cocoapods`, `spm` → iOS; `pub` → Flutter; `metro` → React Native.
@@ -0,0 +1,10 @@
1
+ # Kotlin Multiplatform debugging
2
+
3
+ Find the first failing module, Gradle task, compilation and target in the log. Read `settings.gradle.kts`, the affected `build.gradle.kts`, version catalog and source-set directories before suggesting a fix.
4
+
5
+ 1. For an unresolved symbol, check whether its dependency and declaration belong to `commonMain`, an intermediate source set or a target source set. Confirm that the failing target actually depends on that set.
6
+ 2. For `expect`/`actual` errors, compare declarations and implementations for every configured target; follow the installed Kotlin compiler's message rather than assuming a missing iOS file.
7
+ 3. For an iOS framework or Xcode failure, separate Kotlin framework compilation/linking from the Swift host build, then inspect the project's integration method and selected architecture. Use the [Apple integration guide](../../mobile-kmp/references/apple-interop.md).
8
+ 4. For an Android failure, apply the [Android debugging reference](android.md) to the host/module. For a native iOS failure, apply the [iOS reference](ios.md) to the host. A shared-source error remains a KMP issue.
9
+
10
+ Report the first error line, affected source set/target, configuration evidence and the exact project task that reproduces it. Discover task names from the wrapper instead of guessing them. Kotlin's [source-set reference](https://kotlinlang.org/docs/multiplatform/multiplatform-dsl-reference.html) defines the hierarchy.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-firebase
3
- description: Integrates Firebase into mobile apps on every stack — Flutter (FlutterFire), native Android (Kotlin), native iOS (Swift) and React Native (React Native Firebase) — covering project setup, Authentication, Cloud Firestore, Realtime Database, Cloud Storage, callable Cloud Functions, Cloud Messaging push notifications, Analytics, Crashlytics, Remote Config, App Check, In-App Messaging, AI Logic and SQL Connect (formerly Data Connect). Use whenever the user adds, configures, debugs or reviews any Firebase product in a mobile app, including google-services.json, GoogleService-Info.plist, FCM tokens, security rules and the Firebase Local Emulator Suite, even if they only name the product.
3
+ description: Integrates and reviews Firebase across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform. Covers Auth, databases, Storage, Functions, FCM, Analytics, Crashlytics, Remote Config, App Check and KMP shared-to-platform SDK boundaries. Use for any Firebase setup, bug, security rule, emulator, configuration file or product integration.
4
4
  routing: manual
5
5
  stacks: ["*"]
6
6
  ---
@@ -19,6 +19,7 @@ Detect the stack first, then read the platform guide (shared setup and the produ
19
19
  | Native Android (Kotlin), or the Android side of Kotlin Multiplatform | [references/android.md](references/android.md) |
20
20
  | Native iOS (Swift) | [references/ios.md](references/ios.md) |
21
21
  | React Native or Expo | [references/react-native.md](references/react-native.md) |
22
+ | Kotlin Multiplatform shared API and Android/iOS Firebase boundaries | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
22
23
 
23
24
  In a Flutter or React Native app, native code in `android/` and `ios/` (a notification service, an app extension) follows the native guides.
24
25
 
@@ -0,0 +1,10 @@
1
+ # Firebase in Kotlin Multiplatform
2
+
3
+ Start with the installed Gradle dependencies and source sets. Do not assume a Firebase SDK is available to `commonMain`, or that Android and iOS use the same API surface. Identify the actual Firebase wrapper and platform initialization in this repository.
4
+
5
+ 1. Map each requested product operation to a shared interface or target implementation, the Android Firebase setup and the iOS Firebase setup. Record who owns listeners, token refresh and error conversion.
6
+ 2. Verify target dependency availability against the installed library and version. If a third-party KMP wrapper is used, inspect its target support and native integration before moving a call into shared code.
7
+ 3. Keep each host's configuration, push notification entitlement/permission and lifecycle handling in that host. Read the [Android](android.md) or [iOS](ios.md) product reference only for the affected target.
8
+ 4. Test shared mapping against fakes, then test each real target's configuration or emulator setup separately. Do not treat a `commonTest` pass as proof of FCM delivery or native SDK setup.
9
+
10
+ Report **product → shared symbol → Android implementation/config → iOS implementation/config → verification**, marking unsupported or unverified targets explicitly. Check [Kotlin's platform API guidance](https://kotlinlang.org/docs/multiplatform/multiplatform-connect-to-apis.html) for the boundary options.
@@ -26,5 +26,5 @@ Each topic file lists its guides; open only the ones the task needs.
26
26
  ## Before writing code
27
27
 
28
28
  - Follow the project: its state management, folder structure, lints and packages already in `pubspec.yaml`.
29
- - Check the Flutter and Dart versions in `pubspec.lock` before using newer APIs; guides may describe features that a pinned SDK does not have.
29
+ - Check the Flutter SDK pin (`.fvmrc`, toolchain config or CI) and the installed `flutter --version` before using newer APIs; `pubspec.lock` records resolved packages, not the exact Flutter SDK version.
30
30
  - Prefer packages the project already depends on over adding new ones; when adding one, check that it supports every platform the app targets.
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: mobile-kmp
3
+ description: Works on Kotlin Multiplatform mobile projects with shared Kotlin source sets and Android/iOS targets. Use for architecture, tests, debugging, reviews, performance, security, accessibility, dependencies and releases when `org.jetbrains.kotlin.multiplatform` is applied; inspect actual targets, `commonMain`/`commonTest`, target source sets, Compose Multiplatform and the iOS framework/host app before giving platform advice.
4
+ intents: [architecture, test, performance, review, debug, security, release, accessibility, migration, dependency, build, deployment]
5
+ stacks: [kotlin-multiplatform]
6
+ ---
7
+
8
+ # Kotlin Multiplatform
9
+
10
+ KMP is a sharing mechanism, not a promise that both apps use the same UI or SDK. Resolve the module and target graph before choosing Android, iOS or shared-code guidance.
11
+
12
+ | Question | Read |
13
+ |---|---|
14
+ | Which code and dependencies can be shared? | [references/source-sets.md](references/source-sets.md) |
15
+ | How does shared Kotlin reach the iOS app? | [references/apple-interop.md](references/apple-interop.md) |
16
+ | Is UI shared with Compose Multiplatform or native on each target? | [references/compose-ui.md](references/compose-ui.md) |
17
+ | Which build, measurement or release task applies? | [references/build-performance.md](references/build-performance.md) |
18
+
19
+ ## Ground the answer
20
+
21
+ 1. Read `settings.gradle.kts`, the affected module's `build.gradle.kts`, version catalog and source-set directories. Record the configured targets; `androidMain` and `iosMain` are not proof that a target is built in CI.
22
+ 2. Trace a real symbol from `commonMain` through an interface or `expect` declaration to each configured implementation and its Android/iOS caller. Name the module, source set and owner at every boundary. For shared Compose UI, trace its host entry too.
23
+ 3. Match validation to the changed boundary: shared Kotlin tests on configured targets, target tests for `actual` implementations, and host UI/device tests for behavior that crosses into Android or iOS. A JVM test is not iOS coverage.
24
+ 4. Use the topic skill for the requested work. Use `mobile-android` or `mobile-ios` only for an affected host or target-specific implementation; do not apply native-app instructions blindly to `commonMain`.
25
+
26
+ The [Kotlin Multiplatform source-set reference](https://kotlinlang.org/docs/multiplatform/multiplatform-dsl-reference.html) defines `commonMain`, `commonTest` and target compilations. Confirm DSL and task names in the project's installed Kotlin and Gradle versions.
@@ -0,0 +1,9 @@
1
+ # iOS host and framework integration
2
+
3
+ Locate the iOS app target, scheme and the shared framework declaration in the KMP build. Determine whether the app integrates it through an Xcode build phase, a local/remote Swift package, CocoaPods or another checked-in path. Trace the same Kotlin API to its Swift call and back through errors, callbacks or state observation.
4
+
5
+ For an iOS build failure, separate Kotlin/Native compilation, framework export/linking, Xcode signing and Swift source errors. Inspect the actual build phase and artifact path before changing Gradle or Pods. Match architecture, configuration and framework version to the failing simulator or device. For a release, verify the framework embedded in the signed app matches the shared module revision and preserve the app's existing symbol upload path.
6
+
7
+ An iOS simulator test of shared Kotlin does not exercise the Swift app's navigation, permissions or VoiceOver. Use the iOS topic reference when the changed behavior lives in the host.
8
+
9
+ Reference: [official iOS integration methods](https://kotlinlang.org/docs/multiplatform-ios-integration-overview.html).
@@ -0,0 +1,9 @@
1
+ # Build, profiling and delivery
2
+
3
+ List Gradle tasks for the affected module and configured target before naming a command. Use the wrapper, version catalog and CI matrix as the source of the Kotlin, Gradle, Compose and Android plugin versions. A compilation failure in `commonMain` affects all targets; an `ios*` link failure or Android variant failure has a narrower owner.
4
+
5
+ For performance, identify whether the cost is shared algorithm work, Android UI, iOS host/Compose UI or framework crossing. Measure the same journey and input on each affected target with that target's profiler and release-like configuration; do not infer iOS frame time from JVM or Android traces. Attribute retained state to the shared object, native host or bridge that owns it.
6
+
7
+ For delivery, trace Android artifact and iOS archive separately to their app IDs, signing, symbols and store workflow. The shared library is an input to both; publishing one platform does not publish the other. Preserve the host app's rollout and rollback process.
8
+
9
+ References: [KMP test tasks and reports](https://kotlinlang.org/docs/multiplatform-run-tests.html), [iOS framework integration](https://kotlinlang.org/docs/multiplatform-ios-integration-overview.html).
@@ -0,0 +1,9 @@
1
+ # Shared UI versus native UI
2
+
3
+ First find where the screen is implemented. A KMP app may share only logic and render with Jetpack Compose on Android and SwiftUI/UIKit on iOS, or share UI with Compose Multiplatform. Do not apply Compose tests or semantics to a native Swift screen.
4
+
5
+ For shared Compose UI, trace the screen's state owner, Composable entry, navigation owner and the Android/iOS host that installs it. Keep platform services behind the project's existing boundary. Inspect resource generation and the source set holding each resource; Android `R` resources and Compose Multiplatform `Res` accessors are different APIs.
6
+
7
+ For accessibility, inspect Compose semantics and verify them on both targets with TalkBack/VoiceOver. For target-specific dialogs, text input, insets or navigation, inspect the native host as well. Verify API availability against the installed Compose Multiplatform version.
8
+
9
+ References: [Compose resources](https://kotlinlang.org/docs/multiplatform/compose-multiplatform-resources.html), [iOS accessibility](https://kotlinlang.org/docs/multiplatform/compose-ios-accessibility.html).
@@ -0,0 +1,9 @@
1
+ # Shared-code boundaries
2
+
3
+ Read the actual `kotlin {}` targets and `sourceSets {}` dependency graph. Identify `commonMain`, intermediate source sets (such as `iosMain`) and target sources. A file's folder does not establish that every configured binary includes it; check `dependsOn` and the target hierarchy.
4
+
5
+ For a requested feature, record the shared public type, its caller on each target, input/output values and error/cancellation contract. Keep pure business rules and serialization in common code when all targets use the same contract. Put platform SDK calls behind a small common interface or `expect`/`actual` declaration; confirm every configured target has the implementation. Prefer the project's existing injection pattern rather than adding a second one.
6
+
7
+ When a shared type is exported to Swift, check the actual framework API and conversion at the call site. Kotlin nullability, exceptions, collections and asynchronous work can have a different Swift-facing shape from the Kotlin call. Do not infer that a Kotlin unit test covers the Swift consumer.
8
+
9
+ References: [source-set DSL](https://kotlinlang.org/docs/multiplatform/multiplatform-dsl-reference.html), [platform APIs and interfaces](https://kotlinlang.org/docs/multiplatform/multiplatform-connect-to-apis.html).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-release
3
- description: Prepares and checks mobile app releases on every stack — release readiness (go/no-go) checklist, version name and build number, signing, crash symbols (R8 mappings, dSYMs, Dart split debug info, JavaScript source maps), store requirements, staged rollout and rollback, release notes and store listing copy with the Google Play and App Store character limits, and CI/CD pipelines with GitHub Actions, fastlane and EAS — for Flutter, native Android, native iOS and React Native. Use when preparing a version for Google Play or the App Store, auditing whether a build is ready to ship, writing release notes or store descriptions from the git history, setting up or reviewing a build and deploy pipeline, or planning a rollout, even if the user only says "we ship on Friday".
3
+ description: Prepares mobile releases across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform, including separate Android/iOS artifacts from a shared KMP revision. Covers versions, signing, symbols, store readiness, rollout, release notes and CI/CD. Use for release audits, store submission, build pipelines or rollout planning.
4
4
  intents: [release, deployment]
5
5
  stacks: ["*"]
6
6
  ---
@@ -17,6 +17,7 @@ One release process for every mobile stack. This file holds the process and what
17
17
  | Native Android, or the Android build of any app | [references/android.md](references/android.md) |
18
18
  | Native iOS, or the iOS build of any app | [references/ios.md](references/ios.md) |
19
19
  | React Native or Expo app | [references/react-native.md](references/react-native.md) |
20
+ | Kotlin Multiplatform shared module and both host apps | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
20
21
  | Release notes and store listing text | [references/store-copy.md](references/store-copy.md) |
21
22
  | A CI/CD pipeline that builds, signs and uploads | [references/ci-cd.md](references/ci-cd.md) |
22
23
 
@@ -0,0 +1,12 @@
1
+ # Kotlin Multiplatform release
2
+
3
+ A shared module revision can affect two separate app artifacts. Inventory the Android application, iOS host project and framework integration that this repository actually ships.
4
+
5
+ | Boundary | Verify |
6
+ |---|---|
7
+ | Shared module | Exact commit/version consumed by both hosts, configured target builds and common/target tests. |
8
+ | Android app | Version/build number, signing, release variant, R8 mapping and Play rollout using the [Android guide](android.md). |
9
+ | iOS app | Host version/build number, framework architecture, archive/signing, dSYM and App Store rollout using the [iOS guide](ios.md). |
10
+ | CI | Both artifacts built from the intended shared revision; host tests and upload jobs are distinguished from framework compilation. |
11
+
12
+ Record **artifact → shared revision → build/test evidence → signing/symbol evidence → rollout owner**. One target passing does not make the other ready. Use the [Apple integration guide](../../mobile-kmp/references/apple-interop.md) to identify the framework path, and confirm current store requirements in each store's official portal.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-security
3
- description: Security review and hardening for mobile apps on every stack, organized by the OWASP MASVS categories — insecure token and credential storage, hardcoded secrets, cleartext traffic and TLS validation bypass, certificate pinning, exported components and intent handling, deep links, WebView bridges, biometrics, sensitive logging, backups, screenshots and release hardening — with concrete checks for Flutter, native Android, native iOS and React Native. Use when reviewing mobile code for security, auditing an app before release, storing tokens or credentials, handling authentication, deep links or WebViews, or when the user mentions OWASP, MASVS, pentest findings or store security requirements.
3
+ description: Reviews mobile security across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform using OWASP MASVS. Covers credential storage, secrets, transport, deep links, WebViews, logging and platform implementations of shared KMP contracts. Use for security audits, auth/token handling, pentest findings or release hardening.
4
4
  intents: [review, security, release]
5
5
  stacks: ["*"]
6
6
  ---
@@ -17,6 +17,7 @@ Organized by the OWASP MASVS categories. Apply the general checks below, then th
17
17
  | Native Android (Kotlin/Java), or `android/` in any app | [references/android.md](references/android.md) |
18
18
  | Native iOS (Swift/Objective-C), or `ios/` in any app | [references/ios.md](references/ios.md) |
19
19
  | React Native or Expo | [references/react-native.md](references/react-native.md) |
20
+ | Kotlin Multiplatform shared code and platform implementations | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
20
21
 
21
22
  Firebase-specific protection (security rules, App Check) is covered by `mobile-firebase`.
22
23
 
@@ -0,0 +1,10 @@
1
+ # Kotlin Multiplatform security
2
+
3
+ Trace a credential or sensitive value through shared code and both host apps. Mark the concrete storage and network implementations used by each target.
4
+
5
+ - A `commonMain` interface called `SecureStorage` is not proof of protection: inspect Android's Keystore-backed implementation and iOS Keychain implementation, their failure behavior and how logout clears each store. Do not claim an API exists until the dependency and target code confirm it.
6
+ - Check that shared serializers, caches and logs do not persist or emit tokens or personal data in plain text. Identify the exact object, path and caller.
7
+ - Check platform transport configuration in Android and iOS hosts: cleartext allowances, TLS overrides, deep-link handlers and WebView bridges are target-specific.
8
+ - Check that secrets are not embedded in shared resources or framework exports; anything bundled into either app is extractable.
9
+
10
+ For each finding, give **source path:line → target(s) → exposed object → consequence → fix**. Apply the [Android](android.md) and [iOS](ios.md) references to affected host files, and follow the project's actual storage/network dependencies. The shared source-set boundary is explained in [mobile-kmp](../../mobile-kmp/references/source-sets.md).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mobile-test
3
- description: Writes, runs and reviews automated tests for mobile apps on every stack — Flutter and Dart (unit, widget and integration tests, Patrol, mocktail, mockito, coverage, package:checks), native Android (JUnit, coroutines and Flow tests, Robolectric, Compose UI tests, Espresso, Hilt, screenshot tests), native iOS (Swift Testing, XCTest, XCUITest) and React Native (Jest, React Native Testing Library, Detox, Maestro). Use whenever the user wants to add, fix or audit tests, set up a test stack, mock dependencies, measure coverage or deal with flaky tests in a mobile project, even if they only name a class to test.
3
+ description: Writes, runs and reviews mobile tests across Flutter, native Android, native iOS, React Native and Kotlin Multiplatform. Covers Dart widget/integration tests, JUnit/Compose/Espresso, XCTest/XCUITest, Jest/Detox, and KMP common/target tests. Use to add, fix, run or audit tests, test setup, mocks, coverage and flaky tests for a real app behavior.
4
4
  intents: [test]
5
5
  stacks: ["*"]
6
6
  ---
@@ -19,6 +19,7 @@ Detect the stack first (the router result, or `pubspec.yaml`, Gradle files, the
19
19
  | Native Android (Kotlin), or the Android side of Kotlin Multiplatform | [references/android.md](references/android.md); for setting up a test stack from scratch, [references/android/setup/GUIDE.md](references/android/setup/GUIDE.md) |
20
20
  | Native iOS (Swift) | [references/ios.md](references/ios.md) |
21
21
  | React Native or Expo | [references/react-native.md](references/react-native.md) |
22
+ | Kotlin Multiplatform shared and target tests | [references/kotlin-multiplatform.md](references/kotlin-multiplatform.md) |
22
23
 
23
24
  A cross-platform app with native code (`android/`, `ios/`, native modules) uses the native reference for that code.
24
25
 
@@ -0,0 +1,12 @@
1
+ # Kotlin Multiplatform tests
2
+
3
+ Resolve the configured targets and actual Gradle test tasks before running a command. Use the [KMP testing guide](https://kotlinlang.org/docs/multiplatform-run-tests.html) and the project's Kotlin plugin version to interpret the task graph.
4
+
5
+ | Behavior under test | Location and runner |
6
+ |---|---|
7
+ | Shared domain rule or mapper | `commonTest`; run the configured target test tasks that compile and execute it. |
8
+ | Android or iOS `actual` implementation | The matching target test source set and runner; a JVM-only pass does not cover Kotlin/Native. |
9
+ | Swift adapter or native host flow | The host app's XCTest/XCUITest or Android local/instrumented suite, depending on the boundary. |
10
+ | Shared Compose screen | Compose Multiplatform UI test where supported by the installed version; also verify the target accessibility and host flow. |
11
+
12
+ For each requested test, record **source path:symbol → input → result → dependency seam → test source set → real task**. Use existing fixtures and test libraries. Discover task names with the project's Gradle wrapper; avoid assuming all iOS targets run on the current machine. Inspect test counts and target results, not only a successful compilation. [Compose Multiplatform UI testing](https://kotlinlang.org/docs/multiplatform/compose-test.html) has separate host constraints.