mobile-best-practices 1.4.3 → 1.6.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.
- package/assets/SKILL.md +139 -0
- package/assets/data/anti-patterns.csv +3 -0
- package/assets/data/code-snippets.csv +1 -0
- package/assets/data/platforms/android.csv +5 -0
- package/dist/commands/init.js +5 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/versions.d.ts.map +1 -1
- package/dist/commands/versions.js +9 -0
- package/dist/commands/versions.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/utils/index.js +2 -2
- package/package.json +1 -1
package/assets/SKILL.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mobile-best-practices
|
|
3
|
+
description: "Mobile development intelligence for Android, iOS, Flutter, and React Native. 2,042 searchable entries: 49 architecture patterns, 117 design patterns, 91 UI patterns, 120 anti-patterns, 103 libraries, 228 performance rules, 437 security practices, 73 testing patterns, 56 reasoning rules, 18 project templates, 592 platform-specific guidelines, 80 copy-paste code snippets, and 78 Gradle dependency declarations. Use when building, reviewing, fixing, or optimizing mobile apps."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Requires Python 3.x for BM25 search. Works with Claude Code and other skills-compatible agents.
|
|
6
|
+
metadata:
|
|
7
|
+
author: tungnk123
|
|
8
|
+
version: "1.6.0"
|
|
9
|
+
usage: "READER | AGENT | CLI"
|
|
10
|
+
invocation: "explicit-only — database is never searched automatically"
|
|
11
|
+
modes:
|
|
12
|
+
reader: "Browse CSV/markdown files directly — no Python or IDE required"
|
|
13
|
+
agent: "Explicit slash command /mobile-best-practices in Claude Code only"
|
|
14
|
+
cli: "python3 scripts/search.py — direct terminal search, works outside Claude Code"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Mobile Best Practices
|
|
18
|
+
|
|
19
|
+
**2,042 searchable best practices** for Android, iOS, Flutter, and React Native. Android-first with Jetpack Compose.
|
|
20
|
+
|
|
21
|
+
## How to Use
|
|
22
|
+
|
|
23
|
+
This skill **does not trigger automatically**. The database is only searched when you explicitly invoke it. Three ways to use it:
|
|
24
|
+
|
|
25
|
+
| Mode | How | Requires |
|
|
26
|
+
|------|-----|----------|
|
|
27
|
+
| **AGENT** | `/mobile-best-practices` slash command in Claude Code | Claude Code + IDE restart |
|
|
28
|
+
| **CLI** | `python3 scripts/search.py "<query>" -p android` | Python 3 |
|
|
29
|
+
| **READER** | Open CSV/markdown files directly | Nothing |
|
|
30
|
+
|
|
31
|
+
### AGENT — Slash command (primary mode)
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
/mobile-best-practices
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
> **Restart your IDE after installing.** The slash command registry is only loaded at startup — the skill will not appear until you restart.
|
|
38
|
+
>
|
|
39
|
+
> ⚠️ **Some IDEs do not support slash skills** (e.g. certain VS Code forks, JetBrains AI Assistant, non-Claude agents). Use CLI mode in those cases.
|
|
40
|
+
|
|
41
|
+
### CLI — Terminal search
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
python3 scripts/search.py "<query>" -p android -n 3
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Works anywhere Python 3 is available. No IDE needed.
|
|
48
|
+
|
|
49
|
+
### READER — Browse files directly
|
|
50
|
+
|
|
51
|
+
No tooling required. Open the source files:
|
|
52
|
+
|
|
53
|
+
| File | Content |
|
|
54
|
+
|------|---------|
|
|
55
|
+
| `data/platforms/android.csv` | 423 Android/Compose guidelines |
|
|
56
|
+
| `data/platforms/ios.csv` | iOS/SwiftUI guidelines |
|
|
57
|
+
| `data/code-snippets.csv` | 80 copy-paste code templates |
|
|
58
|
+
| `data/security.csv` | 437 security practices |
|
|
59
|
+
| `references/CODE-RULES.md` | Code generation rules |
|
|
60
|
+
| `references/CHECKLIST.md` | Pre-delivery checklist |
|
|
61
|
+
|
|
62
|
+
## Installation
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# via npm
|
|
66
|
+
npx mobile-best-practices install
|
|
67
|
+
|
|
68
|
+
# or manually symlink
|
|
69
|
+
ln -s /path/to/mobile-best-practices ~/.claude/skills/mobile-best-practices
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**After installing, restart your IDE** to register the `/mobile-best-practices` slash command.
|
|
73
|
+
|
|
74
|
+
## Prerequisites
|
|
75
|
+
|
|
76
|
+
Python 3.x required. Check: `python3 --version`
|
|
77
|
+
|
|
78
|
+
## Search
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
python3 scripts/search.py "<query>" --domain <domain> [-n <max_results>]
|
|
82
|
+
python3 scripts/search.py "<query>" --platform <platform>
|
|
83
|
+
python3 scripts/search.py "<query>" --domain <domain> --filter-platform <platform>
|
|
84
|
+
python3 scripts/search.py "<query>" --domain <domain> --compact # token-optimized output
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Domains (12)
|
|
88
|
+
|
|
89
|
+
| Domain | Use For |
|
|
90
|
+
|--------|---------|
|
|
91
|
+
| `snippet` | Copy-paste code templates |
|
|
92
|
+
| `gradle` | Gradle dependency declarations |
|
|
93
|
+
| `designpattern` | Design patterns & code smell detection |
|
|
94
|
+
| `reasoning` | Product type recommendations |
|
|
95
|
+
| `architecture` | Architecture patterns |
|
|
96
|
+
| `library` | Libraries and dependencies |
|
|
97
|
+
| `ui` | UI patterns and components |
|
|
98
|
+
| `antipattern` | Common mistakes |
|
|
99
|
+
| `performance` | Performance optimization |
|
|
100
|
+
| `security` | Security best practices |
|
|
101
|
+
| `testing` | Testing patterns |
|
|
102
|
+
| `template` | Project starters |
|
|
103
|
+
|
|
104
|
+
### Platforms
|
|
105
|
+
|
|
106
|
+
`android` (423) | `android-xml` (423) | `ios` (60) | `flutter` (54) | `react-native` (55)
|
|
107
|
+
|
|
108
|
+
### Flags
|
|
109
|
+
|
|
110
|
+
`--domain`/`-d` domain | `--platform`/`-p` platform | `--filter-platform`/`-fp` filter | `--stack`/`-s` tech stack | `--max-results`/`-n` count (default: 3) | `--compact`/`-c` shorter output | `--json` JSON output | `--persist` save blueprint
|
|
111
|
+
|
|
112
|
+
## Workflow
|
|
113
|
+
|
|
114
|
+
When user requests mobile work, **default to Android with Jetpack Compose** unless specified otherwise.
|
|
115
|
+
|
|
116
|
+
### Build: search snippet → gradle → platform → antipattern → designpattern → architecture
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
python3 scripts/search.py "viewmodel repository" --domain snippet -n 3
|
|
120
|
+
python3 scripts/search.py "hilt room retrofit" --domain gradle -n 5
|
|
121
|
+
python3 scripts/search.py "compose state" --platform android -n 5
|
|
122
|
+
python3 scripts/search.py "android compose" --domain antipattern
|
|
123
|
+
python3 scripts/search.py "repository factory" --domain designpattern
|
|
124
|
+
python3 scripts/search.py "mvvm clean" --domain architecture
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Review: antipattern → designpattern → platform → performance → security
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
python3 scripts/search.py "android compose viewmodel" --domain antipattern -n 5
|
|
131
|
+
python3 scripts/search.py "code smell switch if-else" --domain designpattern -n 5
|
|
132
|
+
python3 scripts/search.py "state recomposition lifecycle" --platform android -n 5
|
|
133
|
+
python3 scripts/search.py "compose lazy startup" --domain performance
|
|
134
|
+
python3 scripts/search.py "storage encryption api key" --domain security
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Code Quality
|
|
138
|
+
|
|
139
|
+
Before generating code, read [code generation rules](references/CODE-RULES.md). Before delivering, verify against [pre-delivery checklist](references/CHECKLIST.md).
|
|
@@ -116,3 +116,6 @@ Mismatched KSP and Kotlin Versions,Android,Build,Critical,ksp kotlin version mis
|
|
|
116
116
|
Mismatched AGP and Gradle Versions,Android,Build,Critical,agp gradle version incompatible plugin build fail android,Using AGP version that requires a newer Gradle than installed,AGP 9.0.1 with Gradle 8.x // AGP 9 requires Gradle 9.1+; AGP 8.13 requires Gradle 8.13,AGP 9.0.1 with Gradle 9.1+ or AGP 8.13.2 with Gradle 8.13,AGP will fail to sync or produce cryptic errors if Gradle version is too old,Check AGP release notes for minimum Gradle version before upgrading,https://developer.android.com/build/releases/gradle-plugin
|
|
117
117
|
Room with Incompatible Kotlin Version,Android,Build,Critical,room kotlin version incompatible jvm signature crash 2.6,Room 2.6.x with Kotlin 2.0+ causes unexpected jvm signature V error at compile time,"room = ""2.6.1"" with kotlin = ""2.1.20"" // Crashes: unexpected jvm signature V","room = ""2.8.4"" with kotlin = ""2.1.20"" // Room 2.7+ supports Kotlin 2.0+",Room 2.6.x uses old kotlinx-metadata-jvm incompatible with Kotlin 2.0+,Upgrade Room to 2.8.4+ when using Kotlin 2.0+,https://developer.android.com/jetpack/androidx/releases/room
|
|
118
118
|
Upgrading Single Dependency Without Checking Compatibility,Android,Build,High,version upgrade dependency compatibility matrix cascade breaking,Upgrading one library without checking cascade compatibility breaks build,"kotlin = ""2.3.10"" // upgraded but KSP Hilt AGP still on old versions","// AGP 9 track: agp=9.0.1 kotlin=2.3.10 ksp=2.3.4 hilt=2.59.1 room=2.8.4. Upgrade together.",Upgrading Kotlin alone breaks KSP; upgrading AGP to 9 requires Gradle 9.1+ and Hilt 2.59+,Always check AGP-Gradle KSP-Kotlin Room-Kotlin Hilt-AGP compatibility matrix before upgrading,https://developer.android.com/build/releases/gradle-plugin
|
|
119
|
+
Destructive Migration in Production,Android,Database,Critical,room migration destructive fallback production data loss wipe,Using fallbackToDestructiveMigration(true) in production builds causes all user data to be wiped when database schema changes,Room.databaseBuilder(ctx AppDatabase::class.java "app.db").fallbackToDestructiveMigration(true).build() // In release build: user opens app after update and all data is gone,"Room.databaseBuilder(ctx AppDatabase::class.java ""app.db"").addMigrations(MIGRATION_1_2 MIGRATION_2_3).build() // Proper migrations preserve data",Users lose all local data on app update; causes 1-star reviews and uninstalls,Use fallbackToDestructiveMigration(true) ONLY in debug builds; write proper Migration objects or use @AutoMigration for production,https://developer.android.com/training/data-storage/room/migrating-db-versions
|
|
120
|
+
No Room Migration Defined,Android,Database,Critical,room migration missing crash schema change version IllegalStateException,Incrementing Room @Database version without defining a migration causes IllegalStateException crash on app launch,"@Database(entities = [User::class] version = 2) // No migration from 1 to 2; app crashes: ""A migration from 1 to 2 was required but not found""","@Database(entities = [User::class] version = 2 autoMigrations = [@AutoMigration(from = 1 to = 2)]) // Or addMigrations(MIGRATION_1_2)",App crashes for every existing user on update; no recovery without reinstall,Always define Migration or AutoMigration for every version increment,https://developer.android.com/training/data-storage/room/migrating-db-versions
|
|
121
|
+
Room Migration Without Testing,Android,Database,High,room migration test helper untested schema sql alter,Shipping Room migrations without testing them with MigrationTestHelper; migration SQL may silently corrupt data or crash,// Released Migration(1 2) with ALTER TABLE but never tested; typo in column name causes crash on user devices,"@get:Rule val helper = MigrationTestHelper(...); helper.createDatabase(""test"" 1).close(); helper.runMigrationsAndValidate(""test"" 2 true MIGRATION_1_2)",Untested migrations may crash or corrupt data for users who upgrade; cannot reproduce in dev if only testing fresh installs,Test every migration with MigrationTestHelper; test multi-step migration paths (1->2->3),https://developer.android.com/training/data-storage/room/migrating-db-versions#test
|
|
@@ -77,4 +77,5 @@ compose_paging,Compose Paging3 List,Android,List,paging3 compose lazycolumn pagi
|
|
|
77
77
|
compose_bottom_sheet,Compose Modal Bottom Sheet,Android,UI,compose bottom sheet modal material3 scaffold state,Modal bottom sheet with Material3 and proper state handling,"@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun ScreenWithSheet() {\n val sheetState = rememberModalBottomSheetState()\n var showSheet by remember { mutableStateOf(false) }\n\n Scaffold { padding ->\n Button(onClick = { showSheet = true }) {\n Text(\""Show Options\"")\n }\n }\n\n if (showSheet) {\n ModalBottomSheet(\n onDismissRequest = { showSheet = false },\n sheetState = sheetState,\n ) {\n Column(Modifier.padding(16.dp)) {\n Text(\""Options\"" style = MaterialTheme.typography.headlineSmall)\n Spacer(Modifier.height(16.dp))\n ListItem(\n headlineContent = { Text(\""Edit\"") },\n leadingContent = { Icon(Icons.Default.Edit null) },\n modifier = Modifier.clickable { showSheet = false }\n )\n ListItem(\n headlineContent = { Text(\""Delete\"") },\n leadingContent = { Icon(Icons.Default.Delete null) },\n modifier = Modifier.clickable { showSheet = false }\n )\n Spacer(Modifier.height(32.dp))\n }\n }\n }\n}",import androidx.compose.material3.*\nimport androidx.compose.material3.rememberModalBottomSheetState,Use rememberModalBottomSheetState. Control visibility via boolean. Add Spacer at bottom for gesture area.,https://developer.android.com/develop/ui/compose/components/bottom-sheets
|
|
78
78
|
ios_error_handling,iOS Error Handling,iOS,Architecture,swift error handling result custom typed async throw,Typed error handling with custom errors and Result in Swift,"enum AppError: LocalizedError {\n case network(URLError)\n case decoding(Error)\n case unauthorized\n case notFound\n case server(statusCode: Int)\n\n var errorDescription: String? {\n switch self {\n case .network(let error): return \""Network error: \\(error.localizedDescription)\""\n case .decoding: return \""Failed to process server response\""\n case .unauthorized: return \""Please sign in again\""\n case .notFound: return \""Content not found\""\n case .server(let code): return \""Server error (\\(code))\""\n }\n }\n}\n\nclass APIClient {\n func request<T: Decodable>(_ endpoint: Endpoint) async throws(AppError) -> T {\n do {\n let (data response) = try await session.data(for: endpoint.urlRequest)\n guard let httpResponse = response as? HTTPURLResponse else { throw AppError.network(URLError(.badServerResponse)) }\n switch httpResponse.statusCode {\n case 200...299: return try JSONDecoder().decode(T.self from: data)\n case 401: throw AppError.unauthorized\n case 404: throw AppError.notFound\n default: throw AppError.server(statusCode: httpResponse.statusCode)\n }\n } catch let error as AppError { throw error }\n catch let error as URLError { throw .network(error) }\n catch { throw .decoding(error) }\n }\n}",import Foundation,Swift 6 typed throws. Custom error enum. Handle all HTTP status codes.,https://developer.apple.com/documentation/swift/error
|
|
79
79
|
flutter_testing,Flutter Widget Test,Flutter,Testing,flutter widget test pump find matcher bloc provider,Widget testing with BLoC provider and interaction verification,"testWidgets('shows items when loaded' (tester) async {\n final bloc = MockHomeBloc();\n when(() => bloc.state).thenReturn(HomeLoaded([Item(id: '1' name: 'Test')]));\n\n await tester.pumpWidget(\n MaterialApp(\n home: BlocProvider<HomeBloc>.value(\n value: bloc,\n child: const HomeScreen(),\n ),\n ),\n );\n\n expect(find.text('Test') findsOneWidget);\n expect(find.byType(CircularProgressIndicator) findsNothing);\n\n // Interaction test:\n await tester.tap(find.byType(FloatingActionButton));\n verify(() => bloc.add(RefreshItems())).called(1);\n});",import 'package:flutter_test/flutter_test.dart';\nimport 'package:bloc_test/bloc_test.dart';\nimport 'package:mocktail/mocktail.dart';,Use mocktail for mocking. Provide BLoC via BlocProvider.value. Always pump before assertions.,https://docs.flutter.dev/testing/overview
|
|
80
|
+
room_database_migration,Room Database with Migration,Android,Database,"room database migration auto fallback destructive schema version","Room database setup with migrations fallbackToDestructiveMigration and AutoMigration","@Database(\n entities = [User::class Item::class],\n version = 3,\n autoMigrations = [\n AutoMigration(from = 1, to = 2),\n AutoMigration(from = 2, to = 3, spec = AppDatabase.Migration2To3::class)\n ],\n exportSchema = true\n)\nabstract class AppDatabase : RoomDatabase() {\n abstract fun userDao(): UserDao\n abstract fun itemDao(): ItemDao\n\n @RenameColumn(tableName = ""users"", fromColumnName = ""name"", toColumnName = ""displayName"")\n class Migration2To3 : AutoMigrationSpec\n\n companion object {\n // Manual migration example for complex changes\n val MIGRATION_3_4 = object : Migration(3, 4) {\n override fun migrate(db: SupportSQLiteDatabase) {\n db.execSQL(""CREATE TABLE IF NOT EXISTS `orders` (`id` TEXT NOT NULL, `userId` TEXT NOT NULL, `total` REAL NOT NULL, PRIMARY KEY(`id`))"")\n db.execSQL(""CREATE INDEX IF NOT EXISTS `index_orders_userId` ON `orders` (`userId`)"")\n }\n }\n\n fun create(context: Context): AppDatabase {\n return Room.databaseBuilder(\n context.applicationContext,\n AppDatabase::class.java,\n ""app_database""\n )\n .addMigrations(MIGRATION_3_4)\n // ONLY for debug builds — wipes all data on failed migration\n .fallbackToDestructiveMigration(BuildConfig.DEBUG)\n .build()\n }\n }\n}","import androidx.room.*\nimport androidx.room.migration.AutoMigrationSpec\nimport androidx.room.migration.Migration\nimport androidx.sqlite.db.SupportSQLiteDatabase\nimport android.content.Context","Use @AutoMigration for additive changes. Manual Migration for complex schema changes. fallbackToDestructiveMigration(true) ONLY in debug. Always exportSchema = true and commit schemas/ to git. Test with MigrationTestHelper.",https://developer.android.com/training/data-storage/room/migrating-db-versions
|
|
80
81
|
rn_custom_hook,RN Custom Hook,React Native,Architecture,react native custom hook reusable logic composition pattern,Custom hook pattern for reusable logic composition,import { useState useEffect useCallback } from 'react';\n\nfunction useDebounce<T>(value: T delay: number): T {\n const [debouncedValue setDebouncedValue] = useState(value);\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value) delay);\n return () => clearTimeout(timer);\n } [value delay]);\n return debouncedValue;\n}\n\nfunction usePagination<T>(fetchFn: (page: number) => Promise<T[]>) {\n const [data setData] = useState<T[]>([]);\n const [page setPage] = useState(1);\n const [loading setLoading] = useState(false);\n const [hasMore setHasMore] = useState(true);\n\n const loadMore = useCallback(async () => {\n if (loading || !hasMore) return;\n setLoading(true);\n try {\n const items = await fetchFn(page);\n setData(prev => [...prev ...items]);\n setHasMore(items.length > 0);\n setPage(p => p + 1);\n } finally { setLoading(false); }\n } [page loading hasMore fetchFn]);\n\n return { data loading hasMore loadMore };\n},import { useState useEffect useCallback } from 'react';,Extract reusable logic. useDebounce for search. usePagination for lists. Always cleanup in useEffect.,https://react.dev/learn/reusing-logic-with-custom-hooks
|
|
@@ -417,3 +417,8 @@ Gradle,KSP Version Must Match Kotlin,"KSP version must be compatible with your K
|
|
|
417
417
|
Gradle,Room Kotlin 2.0 Compatibility,"Room 2.6.x is incompatible with Kotlin 2.0+ due to outdated kotlinx-metadata-jvm. Upgrade to Room 2.8.4+ which fully supports Kotlin 2.0+ and KMP.","room = ""2.8.4"" with kotlin = ""2.1.20"" // fully compatible",Using Room 2.6.x with Kotlin 2.0+,"implementation(libs.room.runtime) // 2.8.4; ksp(libs.room.compiler) // 2.8.4","implementation(libs.room.runtime) // 2.6.1 with Kotlin 2.0+ causes 'unexpected jvm signature V'",Critical,https://developer.android.com/jetpack/androidx/releases/room
|
|
418
418
|
Gradle,Compose Compiler Bundled with Kotlin 2.0+,"Since Kotlin 2.0 the Compose compiler is bundled with the Kotlin plugin. Use kotlin.plugin.compose instead of specifying a separate compose-compiler version.","plugins { id(kotlin.plugin.compose) version kotlin } // Compiler bundled",Specifying separate compose-compiler version with Kotlin 2.0+,"// build.gradle.kts: plugins { id(org.jetbrains.kotlin.plugin.compose) version 2.1.20 }","composeOptions { kotlinCompilerExtensionVersion = 1.5.14 } // Unnecessary with Kotlin 2.0+",High,https://developer.android.com/develop/ui/compose/compiler
|
|
419
419
|
Gradle,Hilt AGP Compatibility Boundary,"Hilt/Dagger 2.59+ requires AGP 9.0+ and Gradle 9.1+. Hilt 2.58 is the last version for AGP 8.x. Use hilt=2.59.1 with AGP 9.0.1 or hilt=2.58 with AGP 8.13.2.","AGP 9: hilt=2.59.1; AGP 8: hilt=2.58",Upgrading Hilt to 2.59+ while still on AGP 8.x,"implementation(libs.hilt.android) // 2.59.1 with AGP 9.0.1","implementation(libs.hilt.android) // 2.59.1 FAILS with AGP 8.x; requires AGP 9.0+",High,https://github.com/google/dagger/releases
|
|
420
|
+
Room,Room Destructive Migration,"Use .fallbackToDestructiveMigration(true) during development to wipe and recreate database on schema change. NEVER use in production — it deletes all user data. Use proper Migration objects or AutoMigration for production releases.",".fallbackToDestructiveMigration(true) for dev/debug builds only; proper Migration for release",Using fallbackToDestructiveMigration in production builds,"Room.databaseBuilder(ctx AppDatabase::class.java ""app.db"").fallbackToDestructiveMigration(true).build() // OK for debug only","Room.databaseBuilder(ctx AppDatabase::class.java ""app.db"").fallbackToDestructiveMigration(true).build() // In production: DELETES all user data on schema change",Critical,https://developer.android.com/training/data-storage/room/migrating-db-versions
|
|
421
|
+
Room,Room Manual Migration,"Define Migration objects for production schema changes. Each Migration specifies exact SQL ALTER statements from one version to the next. Always test migrations with MigrationTestHelper.","Write Migration(fromVersion toVersion) with ALTER TABLE SQL for each schema change",Skipping migrations and relying on destructive fallback in production,"val MIGRATION_1_2 = object : Migration(1 2) { override fun migrate(db: SupportSQLiteDatabase) { db.execSQL(""ALTER TABLE users ADD COLUMN email TEXT NOT NULL DEFAULT ''"") } }","// No migration defined; app crashes or loses data on schema change",Critical,https://developer.android.com/training/data-storage/room/migrating-db-versions
|
|
422
|
+
Room,Room Auto Migration,"Use @AutoMigration for simple schema changes (add column add table rename). Room generates migration code automatically. Use AutoMigrationSpec for renames and deletes.","@AutoMigration(from = 1 to = 2) for adding columns/tables; use spec for renames","Writing manual Migration SQL for simple additive schema changes","@Database(version = 3 autoMigrations = [@AutoMigration(from = 1 to = 2) @AutoMigration(from = 2 to = 3 spec = RenameSpec::class)])","// Manual Migration for every column add; error-prone and verbose",Medium,https://developer.android.com/training/data-storage/room/migrating-db-versions#automigration
|
|
423
|
+
Room,Room Migration Testing,"Test all migrations with MigrationTestHelper and Room's migration test artifact. Validate that data is preserved after each migration step and that the final schema matches @Database definition.","Use MigrationTestHelper to test every migration path; validate data preservation",Shipping migrations without testing them,"@get:Rule val helper = MigrationTestHelper(InstrumentationRegistry.getInstrumentation() AppDatabase::class.java)","// No migration tests; users hit crashes or data loss on app update",High,https://developer.android.com/training/data-storage/room/migrating-db-versions#test
|
|
424
|
+
Room,Room Export Schema,"Enable exportSchema = true in @Database and configure room.schemaLocation in build.gradle for migration validation. Room uses exported JSON schemas to verify AutoMigration correctness.","@Database(exportSchema = true); room { schemaDirectory(""$projectDir/schemas"") } in build.gradle",Disabling schema export or not storing schemas in version control,"@Database(entities = [User::class] version = 2 exportSchema = true) // schemas/ committed to git","@Database(entities = [User::class] version = 2 exportSchema = false) // Cannot validate migrations",High,https://developer.android.com/training/data-storage/room/migrating-db-versions#export-schema
|
package/dist/commands/init.js
CHANGED
|
@@ -13,19 +13,19 @@ export async function initCommand(options) {
|
|
|
13
13
|
message: 'Which AI assistant are you using?',
|
|
14
14
|
choices: [
|
|
15
15
|
{ title: 'Claude Code', value: 'claude' },
|
|
16
|
+
{ title: 'Codex CLI', value: 'codex' },
|
|
17
|
+
{ title: 'Antigravity', value: 'antigravity' },
|
|
18
|
+
{ title: 'GitHub Copilot', value: 'copilot' },
|
|
16
19
|
{ title: 'Cursor', value: 'cursor' },
|
|
20
|
+
{ title: 'OpenCode', value: 'opencode' },
|
|
17
21
|
{ title: 'Windsurf', value: 'windsurf' },
|
|
18
|
-
{ title: 'GitHub Copilot', value: 'copilot' },
|
|
19
22
|
{ title: 'Kiro', value: 'kiro' },
|
|
20
|
-
{ title: 'Codex CLI', value: 'codex' },
|
|
21
23
|
{ title: 'Gemini CLI', value: 'gemini' },
|
|
22
24
|
{ title: 'Roo Code', value: 'roocode' },
|
|
23
25
|
{ title: 'Continue', value: 'continue' },
|
|
24
|
-
{ title: 'OpenCode', value: 'opencode' },
|
|
25
26
|
{ title: 'Qoder', value: 'qoder' },
|
|
26
27
|
{ title: 'CodeBuddy', value: 'codebuddy' },
|
|
27
28
|
{ title: 'Trae', value: 'trae' },
|
|
28
|
-
{ title: 'Antigravity', value: 'antigravity' },
|
|
29
29
|
{ title: 'All assistants', value: 'all' },
|
|
30
30
|
],
|
|
31
31
|
});
|
|
@@ -83,7 +83,7 @@ export async function initCommand(options) {
|
|
|
83
83
|
console.log();
|
|
84
84
|
console.log(chalk.cyan('How to use:'));
|
|
85
85
|
console.log(chalk.dim(' No commands needed - just chat naturally with your AI assistant!'));
|
|
86
|
-
console.log(chalk.dim(' The AI will automatically search 2,
|
|
86
|
+
console.log(chalk.dim(' The AI will automatically search 2,042 best practices as you work.'));
|
|
87
87
|
console.log();
|
|
88
88
|
console.log(chalk.yellow('Examples:'));
|
|
89
89
|
if (mobilePlatform === 'android' || mobilePlatform === 'all') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAwC,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA8D;IAC9F,IAAI,UAAU,GAAG,OAAO,CAAC,EAAgB,CAAC;IAC1C,IAAI,cAAc,GAAG,OAAO,CAAC,QAAsC,CAAC;IAEpE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACzC,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AA6FA,wBAAgB,eAAe,IAAI,IAAI,CAUtC"}
|
|
@@ -78,6 +78,15 @@ const VERSIONS = [
|
|
|
78
78
|
'Fix: Remaining Moshi references in skill files and CODE-RULES.md replaced with Kotlin Serialization',
|
|
79
79
|
],
|
|
80
80
|
},
|
|
81
|
+
{
|
|
82
|
+
version: '1.5.0',
|
|
83
|
+
date: '2026-02-18',
|
|
84
|
+
changes: [
|
|
85
|
+
'Feat: Add Room migration best practices and fallback destruction patterns',
|
|
86
|
+
'Feat: Expand practice count from 2,033 to 2,042 entries',
|
|
87
|
+
'Fix: Reorder AI assistant choices in init command',
|
|
88
|
+
],
|
|
89
|
+
},
|
|
81
90
|
];
|
|
82
91
|
export function versionsCommand() {
|
|
83
92
|
console.log(chalk.bold('\nMobile Best Practices - Version History\n'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,QAAQ,GAAc;IAC1B;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,iBAAiB;YACjB,iDAAiD;YACjD,qCAAqC;YACrC,+CAA+C;YAC/C,6BAA6B;YAC7B,mEAAmE;YACnE,mCAAmC;YACnC,0BAA0B;YAC1B,qFAAqF;YACrF,gCAAgC;SACjC;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,kDAAkD;YAClD,0CAA0C;SAC3C;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,gGAAgG;YAChG,0FAA0F;YAC1F,iEAAiE;SAClE;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,sDAAsD;YACtD,qEAAqE;YACrE,gCAAgC;YAChC,yDAAyD;SAC1D;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,gDAAgD;YAChD,0DAA0D;YAC1D,gFAAgF;SACjF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,kDAAkD;YAClD,mCAAmC;SACpC;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,8EAA8E;YAC9E,wDAAwD;YACxD,iEAAiE;YACjE,4EAA4E;SAC7E;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,iGAAiG;YACjG,qGAAqG;SACtG;KACF;CACF,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAEvE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,QAAQ,GAAc;IAC1B;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,iBAAiB;YACjB,iDAAiD;YACjD,qCAAqC;YACrC,+CAA+C;YAC/C,6BAA6B;YAC7B,mEAAmE;YACnE,mCAAmC;YACnC,0BAA0B;YAC1B,qFAAqF;YACrF,gCAAgC;SACjC;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,kDAAkD;YAClD,0CAA0C;SAC3C;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,gGAAgG;YAChG,0FAA0F;YAC1F,iEAAiE;SAClE;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,sDAAsD;YACtD,qEAAqE;YACrE,gCAAgC;YAChC,yDAAyD;SAC1D;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,gDAAgD;YAChD,0DAA0D;YAC1D,gFAAgF;SACjF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,kDAAkD;YAClD,mCAAmC;SACpC;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,8EAA8E;YAC9E,wDAAwD;YACxD,iEAAiE;YACjE,4EAA4E;SAC7E;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,iGAAiG;YACjG,qGAAqG;SACtG;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP,2EAA2E;YAC3E,yDAAyD;YACzD,mDAAmD;SACpD;KACF;CACF,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAEvE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACvE,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ const program = new Command();
|
|
|
7
7
|
program
|
|
8
8
|
.name('mobile-best-practices')
|
|
9
9
|
.description('CLI to install Mobile Best Practices skill for AI coding assistants')
|
|
10
|
-
.version('1.
|
|
10
|
+
.version('1.5.0');
|
|
11
11
|
program
|
|
12
12
|
.command('init')
|
|
13
13
|
.description('Install mobile best practices skill for your AI assistant')
|
package/dist/utils/index.js
CHANGED
|
@@ -57,7 +57,7 @@ export function installToCache(mobilePlatform = 'all') {
|
|
|
57
57
|
let processedQuickRef = quickRef.replace(/\{SKILL_PATH\}/g, '~/.mobile-best-practices');
|
|
58
58
|
content = `---
|
|
59
59
|
name: mobile-best-practices
|
|
60
|
-
description: "Mobile development intelligence for Android, iOS, Flutter, and React Native. 2,
|
|
60
|
+
description: "Mobile development intelligence for Android, iOS, Flutter, and React Native. 2,042 best practices."
|
|
61
61
|
---
|
|
62
62
|
|
|
63
63
|
${processedBase}
|
|
@@ -107,7 +107,7 @@ export function generateSkillFile(config, targetDir, mobilePlatform = 'all') {
|
|
|
107
107
|
let processedQuickRef = quickRef.replace(/\{SKILL_PATH\}/g, skillPath);
|
|
108
108
|
content = `---
|
|
109
109
|
name: mobile-best-practices
|
|
110
|
-
description: "Mobile development intelligence for Android, iOS, Flutter, and React Native. 2,
|
|
110
|
+
description: "Mobile development intelligence for Android, iOS, Flutter, and React Native. 2,042 best practices."
|
|
111
111
|
---
|
|
112
112
|
|
|
113
113
|
${processedBase}
|