@buivietphi/skill-mobile-mt 1.2.0 → 1.3.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.
Potentially problematic release.
This version of @buivietphi/skill-mobile-mt might be problematic. Click here for more details.
- package/AGENTS.md +66 -19
- package/README.md +68 -19
- package/SKILL.md +329 -6
- package/bin/install.mjs +280 -12
- package/package.json +1 -1
- package/shared/code-review.md +12 -0
- package/shared/prompt-engineering.md +28 -0
- package/shared/version-management.md +17 -0
package/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Skill Mobile MT — Agent Rules
|
|
2
2
|
|
|
3
|
-
> Multi-agent compatibility layer for Claude Code, Codex, Gemini CLI, Kimi,
|
|
3
|
+
> Multi-agent compatibility layer for Claude Code, Cline, Roo Code, Cursor, Windsurf, Copilot, Codex, Gemini CLI, Kimi, Kilo Code, Kiro, Antigravity, and all Agent Skills-compatible tools.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -9,12 +9,16 @@
|
|
|
9
9
|
| Agent | How it loads rules | Setup | Think Block |
|
|
10
10
|
|-------|-------------------|-------|-------------|
|
|
11
11
|
| Claude Code | `~/.claude/skills/` (auto) | `npx skill-mobile-mt --claude` | `<think>...</think>` |
|
|
12
|
+
| **Cline** | **`.clinerules/` in project root** | **`npx skill-mobile-mt --init cline`** | Inline reasoning |
|
|
13
|
+
| **Roo Code** | **`.roo/rules/` in project root** | **`npx skill-mobile-mt --init roocode`** | Inline reasoning |
|
|
14
|
+
| **Cursor** | **`.cursorrules` in project root** | **`npx skill-mobile-mt --init cursor`** | Inline reasoning |
|
|
15
|
+
| **Windsurf** | **`.windsurfrules` in project root** | **`npx skill-mobile-mt --init windsurf`** | Inline reasoning |
|
|
16
|
+
| **Copilot** | **`.github/copilot-instructions.md`** | **`npx skill-mobile-mt --init copilot`** | `// PLAN:` comments |
|
|
12
17
|
| Codex | `~/.codex/skills/` (auto) | `npx skill-mobile-mt --codex` | `<think>...</think>` |
|
|
13
18
|
| Gemini CLI | `~/.gemini/skills/` (auto) | `npx skill-mobile-mt --gemini` | `## Thinking:` block |
|
|
14
19
|
| Kimi | `~/.kimi/skills/` (manual) | `npx skill-mobile-mt --kimi` | `【思考】` or markdown |
|
|
15
|
-
| **
|
|
16
|
-
| **
|
|
17
|
-
| **Windsurf** | **`.windsurfrules` in project root** | **`npx skill-mobile-mt --init windsurf`** | Inline reasoning |
|
|
20
|
+
| **Kilo Code** | **`.kilocode/rules/` in project root** | **`npx skill-mobile-mt --init kilocode`** | Inline reasoning |
|
|
21
|
+
| **Kiro** | **`.kiro/steering/` in project root** | **`npx skill-mobile-mt --init kiro`** | Inline reasoning |
|
|
18
22
|
| Antigravity | `~/.agents/skills/` (auto) | `npx skill-mobile-mt --antigravity` | Agent-native format |
|
|
19
23
|
|
|
20
24
|
---
|
|
@@ -137,7 +141,7 @@ The agent reads the task, then decides which extra file to load:
|
|
|
137
141
|
```yaml
|
|
138
142
|
skill:
|
|
139
143
|
name: skill-mobile-mt
|
|
140
|
-
version: "1.
|
|
144
|
+
version: "1.3.0"
|
|
141
145
|
author: buivietphi
|
|
142
146
|
category: engineering
|
|
143
147
|
tags:
|
|
@@ -299,24 +303,51 @@ Priority 6 (ON-DEMAND): shared/common-pitfalls.md — Known issue patterns
|
|
|
299
303
|
- Supports both Chinese and English prompts
|
|
300
304
|
- Think blocks use `【思考】` format
|
|
301
305
|
|
|
306
|
+
### Cline
|
|
307
|
+
- Reads `.clinerules/` directory from project root (also supports `.clinerules` single file)
|
|
308
|
+
- Also reads from `~/.cline/skills/` for global skills
|
|
309
|
+
- Run `npx @buivietphi/skill-mobile-mt --init cline` to generate `.clinerules/mobile-rules.md`
|
|
310
|
+
- Supports conditional rules with YAML frontmatter `paths:` field
|
|
311
|
+
|
|
312
|
+
### Roo Code
|
|
313
|
+
- Reads `.roo/rules/` directory from project root (recursive, multi-file)
|
|
314
|
+
- Also reads from `~/.roo/skills/` for global skills
|
|
315
|
+
- Supports mode-specific rules: `.roo/rules-code/`, `.roo/rules-architect/`
|
|
316
|
+
- Run `npx @buivietphi/skill-mobile-mt --init roocode` to generate `.roo/rules/mobile-rules.md`
|
|
317
|
+
- Auto-loads `AGENTS.md` from workspace root
|
|
318
|
+
|
|
302
319
|
### Cursor
|
|
303
|
-
-
|
|
304
|
-
- Run `npx @buivietphi/skill-mobile-mt --init cursor`
|
|
320
|
+
- Reads `.cursorrules` from project root
|
|
321
|
+
- Run `npx @buivietphi/skill-mobile-mt --init cursor` to generate `.cursorrules`
|
|
305
322
|
- The generated file includes auto-detected framework, rules, and security patterns
|
|
306
323
|
- Think blocks embedded as inline reasoning in Composer
|
|
307
324
|
|
|
308
325
|
### GitHub Copilot
|
|
309
|
-
-
|
|
310
|
-
- Run `npx @buivietphi/skill-mobile-mt --init copilot`
|
|
326
|
+
- Reads `.github/copilot-instructions.md` from project
|
|
327
|
+
- Run `npx @buivietphi/skill-mobile-mt --init copilot` to generate the file
|
|
311
328
|
- The generated file includes code patterns, required templates, and rules
|
|
312
329
|
- Think blocks as `// PLAN:` comments before code
|
|
313
330
|
|
|
314
331
|
### Windsurf
|
|
315
|
-
-
|
|
316
|
-
- Run `npx @buivietphi/skill-mobile-mt --init windsurf`
|
|
332
|
+
- Reads `.windsurfrules` from project root
|
|
333
|
+
- Run `npx @buivietphi/skill-mobile-mt --init windsurf` to generate `.windsurfrules`
|
|
317
334
|
- The generated file includes coding rules, security rules, and architecture patterns
|
|
318
335
|
- Think blocks as inline reasoning
|
|
319
336
|
|
|
337
|
+
### Kilo Code
|
|
338
|
+
- Reads `.kilocode/rules/` directory from project root
|
|
339
|
+
- Also reads from `~/.kilocode/rules/` for global rules
|
|
340
|
+
- Supports mode-specific rules: `.kilocode/rules-code/`, `.kilocode/rules-architect/`
|
|
341
|
+
- Run `npx @buivietphi/skill-mobile-mt --init kilocode` to generate `.kilocode/rules/mobile-rules.md`
|
|
342
|
+
- Auto-loads `AGENTS.md` from workspace root
|
|
343
|
+
|
|
344
|
+
### Kiro (AWS)
|
|
345
|
+
- Reads `.kiro/steering/` directory from project root
|
|
346
|
+
- Also reads from `~/.kiro/steering/` for global steering
|
|
347
|
+
- Uses YAML frontmatter with `inclusion: always|fileMatch|manual|auto`
|
|
348
|
+
- Run `npx @buivietphi/skill-mobile-mt --init kiro` to generate `.kiro/steering/mobile-rules.md`
|
|
349
|
+
- Separate specs system in `.kiro/specs/` for feature development
|
|
350
|
+
|
|
320
351
|
### Antigravity
|
|
321
352
|
- Orchestrator loads based on detected project type
|
|
322
353
|
- Follows `platform_detection` rules above
|
|
@@ -332,12 +363,16 @@ These are separate from the skill files — they go in the user's project, not i
|
|
|
332
363
|
| Agent | File | Location |
|
|
333
364
|
|-------|------|----------|
|
|
334
365
|
| Claude Code | `CLAUDE.md` | Project root |
|
|
366
|
+
| Cline | `.clinerules/` directory | Project root |
|
|
367
|
+
| Roo Code | `.roo/rules/` directory | Project root |
|
|
335
368
|
| Cursor | `.cursorrules` | Project root |
|
|
336
369
|
| Windsurf | `.windsurfrules` | Project root |
|
|
337
370
|
| GitHub Copilot | `.github/copilot-instructions.md` | `.github/` folder |
|
|
338
371
|
| Codex | `AGENTS.md` | Project root |
|
|
339
372
|
| Gemini CLI | `GEMINI.md` | Project root |
|
|
340
373
|
| Kimi | No auto-load — paste as context | — |
|
|
374
|
+
| Kilo Code | `.kilocode/rules/` directory | Project root |
|
|
375
|
+
| Kiro | `.kiro/steering/` directory | Project root |
|
|
341
376
|
| Antigravity | YAML `context.rules` field | Antigravity config |
|
|
342
377
|
|
|
343
378
|
**Templates for all agents:** `shared/agent-rules-template.md`
|
|
@@ -356,11 +391,14 @@ Copy the relevant section to your project to enable auto-check rules in every se
|
|
|
356
391
|
### Skill directory install (agents that read from skills/)
|
|
357
392
|
|
|
358
393
|
```bash
|
|
359
|
-
# Claude Code
|
|
394
|
+
# Claude Code
|
|
360
395
|
~/.claude/skills/skill-mobile-mt/
|
|
361
396
|
|
|
362
|
-
#
|
|
363
|
-
|
|
397
|
+
# Cline
|
|
398
|
+
~/.cline/skills/skill-mobile-mt/
|
|
399
|
+
|
|
400
|
+
# Roo Code
|
|
401
|
+
~/.roo/skills/skill-mobile-mt/
|
|
364
402
|
|
|
365
403
|
# Codex
|
|
366
404
|
~/.codex/skills/skill-mobile-mt/
|
|
@@ -371,6 +409,12 @@ Copy the relevant section to your project to enable auto-check rules in every se
|
|
|
371
409
|
# Kimi
|
|
372
410
|
~/.kimi/skills/skill-mobile-mt/
|
|
373
411
|
|
|
412
|
+
# Kilo Code
|
|
413
|
+
~/.kilocode/skills/skill-mobile-mt/
|
|
414
|
+
|
|
415
|
+
# Kiro
|
|
416
|
+
~/.kiro/skills/skill-mobile-mt/
|
|
417
|
+
|
|
374
418
|
# Antigravity (shared agent directory)
|
|
375
419
|
~/.agents/skills/skill-mobile-mt/
|
|
376
420
|
|
|
@@ -380,8 +424,7 @@ npx @buivietphi/skill-mobile-mt --path /your/custom/path
|
|
|
380
424
|
|
|
381
425
|
### Project-level files (agents that read from project root)
|
|
382
426
|
|
|
383
|
-
These agents read rules from project-level files
|
|
384
|
-
Use `--init` to generate them:
|
|
427
|
+
These agents read rules from project-level files. Use `--init` to generate them:
|
|
385
428
|
|
|
386
429
|
```bash
|
|
387
430
|
# Generate all project-level files (interactive selector)
|
|
@@ -389,9 +432,13 @@ npx @buivietphi/skill-mobile-mt --init
|
|
|
389
432
|
|
|
390
433
|
# Generate specific agent file
|
|
391
434
|
npx @buivietphi/skill-mobile-mt --init cursor # → .cursorrules
|
|
435
|
+
npx @buivietphi/skill-mobile-mt --init cline # → .clinerules/mobile-rules.md
|
|
436
|
+
npx @buivietphi/skill-mobile-mt --init roocode # → .roo/rules/mobile-rules.md
|
|
392
437
|
npx @buivietphi/skill-mobile-mt --init copilot # → .github/copilot-instructions.md
|
|
393
438
|
npx @buivietphi/skill-mobile-mt --init windsurf # → .windsurfrules
|
|
394
|
-
npx @buivietphi/skill-mobile-mt --init
|
|
439
|
+
npx @buivietphi/skill-mobile-mt --init kilocode # → .kilocode/rules/mobile-rules.md
|
|
440
|
+
npx @buivietphi/skill-mobile-mt --init kiro # → .kiro/steering/mobile-rules.md
|
|
441
|
+
npx @buivietphi/skill-mobile-mt --init all # → all files
|
|
395
442
|
```
|
|
396
443
|
|
|
397
444
|
**What `--init` does:**
|
|
@@ -408,7 +455,7 @@ npx @buivietphi/skill-mobile-mt --init all # → all three files
|
|
|
408
455
|
{
|
|
409
456
|
"id": "skill-mobile-mt",
|
|
410
457
|
"name": "skill-mobile-mt",
|
|
411
|
-
"version": "1.
|
|
458
|
+
"version": "1.3.0",
|
|
412
459
|
"author": "buivietphi",
|
|
413
460
|
"category": "engineering",
|
|
414
461
|
"description": "Master Senior Mobile Engineer. Pre-built patterns from 18 production apps + project adaptation. Auto-detects language and framework. React Native, Flutter, iOS, Android.",
|
|
@@ -416,6 +463,6 @@ npx @buivietphi/skill-mobile-mt --init all # → all three files
|
|
|
416
463
|
"source": "buivietphi (MIT)",
|
|
417
464
|
"platforms": ["react-native", "flutter", "ios", "android"],
|
|
418
465
|
"languages": ["typescript", "javascript", "dart", "swift", "kotlin", "java"],
|
|
419
|
-
"agents": ["claude-code", "
|
|
466
|
+
"agents": ["claude-code", "cline", "roo-code", "cursor", "windsurf", "copilot", "codex", "gemini", "kimi", "kilo-code", "kiro", "antigravity"]
|
|
420
467
|
}
|
|
421
468
|
```
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @buivietphi/skill-mobile-mt
|
|
2
2
|
|
|
3
|
-
**Master Senior Mobile Engineer** — AI skill for Claude Code, Codex, Gemini CLI, Kimi,
|
|
3
|
+
**Master Senior Mobile Engineer** — AI skill for Claude Code, Cline, Roo Code, Cursor, Windsurf, Copilot, Codex, Gemini CLI, Kimi, Kilo Code, Kiro, and Antigravity.
|
|
4
4
|
|
|
5
5
|
Pre-built architecture patterns from **30+ production repos (200k+ GitHub stars)** including Ignite, Expensify, Mattermost, Immich, AppFlowy, Now in Android, TCA + auto-adaptation to your current project.
|
|
6
6
|
|
|
@@ -24,16 +24,20 @@ npx @buivietphi/skill-mobile-mt --all # All agents
|
|
|
24
24
|
npx @buivietphi/skill-mobile-mt --path ./dir # Custom directory
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
### Generate project-level rules
|
|
27
|
+
### Generate project-level rules
|
|
28
28
|
|
|
29
|
-
Cursor, Copilot, and
|
|
29
|
+
Cline, Roo Code, Cursor, Windsurf, Copilot, Kilo Code, and Kiro read rules from **project-level files**. Run `--init` inside your project to generate them:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
npx @buivietphi/skill-mobile-mt --init # Interactive selector
|
|
33
33
|
npx @buivietphi/skill-mobile-mt --init cursor # .cursorrules
|
|
34
|
+
npx @buivietphi/skill-mobile-mt --init cline # .clinerules/mobile-rules.md
|
|
35
|
+
npx @buivietphi/skill-mobile-mt --init roocode # .roo/rules/mobile-rules.md
|
|
34
36
|
npx @buivietphi/skill-mobile-mt --init copilot # .github/copilot-instructions.md
|
|
35
37
|
npx @buivietphi/skill-mobile-mt --init windsurf # .windsurfrules
|
|
36
|
-
npx @buivietphi/skill-mobile-mt --init
|
|
38
|
+
npx @buivietphi/skill-mobile-mt --init kilocode # .kilocode/rules/mobile-rules.md
|
|
39
|
+
npx @buivietphi/skill-mobile-mt --init kiro # .kiro/steering/mobile-rules.md
|
|
40
|
+
npx @buivietphi/skill-mobile-mt --init all # All files
|
|
37
41
|
```
|
|
38
42
|
|
|
39
43
|
**What `--init` does:**
|
|
@@ -84,16 +88,20 @@ You'll see an interactive checkbox — use arrow keys to navigate, space to sele
|
|
|
84
88
|
↑↓ navigate Space toggle A select all Enter confirm Q cancel
|
|
85
89
|
|
|
86
90
|
› ◉ Claude Code [detected]
|
|
91
|
+
◯ Cline [detected]
|
|
92
|
+
◯ Roo Code [not found]
|
|
87
93
|
◯ Cursor [detected]
|
|
88
94
|
◯ Windsurf [not found]
|
|
89
95
|
◯ Copilot [not found]
|
|
90
96
|
◯ Codex [not found]
|
|
91
97
|
◉ Gemini CLI [detected]
|
|
92
98
|
◯ Kimi [not found]
|
|
99
|
+
◯ Kilo Code [not found]
|
|
100
|
+
◯ Kiro [not found]
|
|
93
101
|
◯ Antigravity [not found]
|
|
94
102
|
```
|
|
95
103
|
|
|
96
|
-
### Step 2
|
|
104
|
+
### Step 2: Generate project rules
|
|
97
105
|
|
|
98
106
|
```bash
|
|
99
107
|
# cd into your mobile project first
|
|
@@ -111,9 +119,13 @@ Output:
|
|
|
111
119
|
|
|
112
120
|
✓ .cursorrules → Cursor (auto-detected: Expo (React Native))
|
|
113
121
|
✓ .github/copilot-instructions.md → GitHub Copilot
|
|
122
|
+
✓ .clinerules/mobile-rules.md → Cline
|
|
123
|
+
✓ .roo/rules/mobile-rules.md → Roo Code
|
|
124
|
+
✓ .kilocode/rules/mobile-rules.md → Kilo Code
|
|
125
|
+
✓ .kiro/steering/mobile-rules.md → Kiro
|
|
114
126
|
✓ .windsurfrules → Windsurf
|
|
115
127
|
|
|
116
|
-
✅ Done! →
|
|
128
|
+
✅ Done! → 7 file(s) generated
|
|
117
129
|
```
|
|
118
130
|
|
|
119
131
|
### Step 3: Use in your AI agent
|
|
@@ -132,27 +144,28 @@ Output:
|
|
|
132
144
|
> Add cart feature following the same pattern as ProductList
|
|
133
145
|
```
|
|
134
146
|
|
|
135
|
-
####
|
|
147
|
+
#### Cline / Roo Code / Kilo Code
|
|
136
148
|
|
|
137
|
-
After running `--init
|
|
149
|
+
After running `--init cline` (or `roocode`, `kilocode`), rules are auto-loaded from the project directory. Just open your project and ask:
|
|
138
150
|
|
|
139
151
|
```
|
|
140
|
-
# In Cursor Composer, just ask:
|
|
141
152
|
> Create a login screen with email/password
|
|
142
153
|
> Fix the crash in ProductDetail when images is null
|
|
143
154
|
> Review this PR for mobile best practices
|
|
144
155
|
```
|
|
145
156
|
|
|
157
|
+
#### Cursor
|
|
158
|
+
|
|
159
|
+
After running `--init cursor`, Cursor auto-loads `.cursorrules` every session. Just open your project and code normally.
|
|
160
|
+
|
|
161
|
+
#### Kiro (AWS)
|
|
162
|
+
|
|
163
|
+
After running `--init kiro`, Kiro loads `.kiro/steering/mobile-rules.md` as steering context. The generated file uses `inclusion: always` frontmatter.
|
|
164
|
+
|
|
146
165
|
#### GitHub Copilot
|
|
147
166
|
|
|
148
167
|
After running `--init copilot`, Copilot reads `.github/copilot-instructions.md` as workspace context.
|
|
149
168
|
|
|
150
|
-
```
|
|
151
|
-
# In VS Code with Copilot Chat:
|
|
152
|
-
> Add pagination to the product list
|
|
153
|
-
> Handle offline mode for the cart feature
|
|
154
|
-
```
|
|
155
|
-
|
|
156
169
|
#### Windsurf
|
|
157
170
|
|
|
158
171
|
After running `--init windsurf`, Windsurf auto-loads `.windsurfrules`. Just code normally.
|
|
@@ -252,7 +265,7 @@ iOS only?
|
|
|
252
265
|
## Installed Structure
|
|
253
266
|
|
|
254
267
|
```
|
|
255
|
-
~/.claude/skills/ (or ~/.
|
|
268
|
+
~/.claude/skills/ (or ~/.cline/skills/, ~/.roo/skills/, ~/.gemini/skills/, etc.)
|
|
256
269
|
└── skill-mobile-mt/
|
|
257
270
|
├── SKILL.md Entry point + auto-detect + quality gates
|
|
258
271
|
├── AGENTS.md Multi-agent compatibility
|
|
@@ -288,6 +301,17 @@ iOS only?
|
|
|
288
301
|
your-project/
|
|
289
302
|
├── .cursorrules Cursor rules (auto-detected stack)
|
|
290
303
|
├── .windsurfrules Windsurf rules (auto-detected stack)
|
|
304
|
+
├── .clinerules/
|
|
305
|
+
│ └── mobile-rules.md Cline rules (auto-detected stack)
|
|
306
|
+
├── .roo/
|
|
307
|
+
│ └── rules/
|
|
308
|
+
│ └── mobile-rules.md Roo Code rules (auto-detected stack)
|
|
309
|
+
├── .kilocode/
|
|
310
|
+
│ └── rules/
|
|
311
|
+
│ └── mobile-rules.md Kilo Code rules (auto-detected stack)
|
|
312
|
+
├── .kiro/
|
|
313
|
+
│ └── steering/
|
|
314
|
+
│ └── mobile-rules.md Kiro steering (auto-detected stack)
|
|
291
315
|
└── .github/
|
|
292
316
|
└── copilot-instructions.md Copilot rules (auto-detected stack)
|
|
293
317
|
```
|
|
@@ -309,6 +333,27 @@ your-project/
|
|
|
309
333
|
- Security vulnerabilities, performance issues, UX problems
|
|
310
334
|
- Platform-specific detection rules
|
|
311
335
|
|
|
336
|
+
### Grounding Protocol (Anti-Hallucination)
|
|
337
|
+
- **Source hierarchy**: project code > skill files > official docs > production repos > AI knowledge
|
|
338
|
+
- **Mandatory rules**: Read before answer, verify APIs exist, cite sources, say "I don't know" when unsure
|
|
339
|
+
- **No phantom packages**: verify package exists in package.json before suggesting
|
|
340
|
+
- **Version-specific**: check actual SDK version, never assume latest
|
|
341
|
+
- **Grounded bug fix**: read file → find exact line → verify types → cite source
|
|
342
|
+
- **Anti-hallucination checklist**: runs before every AI response
|
|
343
|
+
|
|
344
|
+
### Docs-First Protocol (Always Use Latest)
|
|
345
|
+
- **WebSearch before coding**: when setting up any library, ALWAYS search official docs first
|
|
346
|
+
- **Never rely on AI memory**: docs change, APIs change, syntax changes between versions
|
|
347
|
+
- **Package installation protocol**: verify exists → check compatibility → search install guide → test both platforms
|
|
348
|
+
- **Common AI traps**: React Navigation v5 vs v7, Firebase v8 vs v9 modular, Swift async/await availability
|
|
349
|
+
- **Version matrix + live verification**: snapshot matrix in skill + mandatory WebSearch for current data
|
|
350
|
+
|
|
351
|
+
### Security Protocol
|
|
352
|
+
- **7-category security scan** on every feature: secrets, token storage, input validation, network, data protection, auth flow, platform-specific
|
|
353
|
+
- **6 absolute rules**: never store tokens in plain storage, never hardcode secrets, never log sensitive data, never trust deep links, never disable SSL, never commit .env
|
|
354
|
+
- **Platform-specific checks**: iOS ATS + privacy manifest, Android cleartext + ProGuard + exported components
|
|
355
|
+
- **Never skip security**: even for prototypes, internal apps, or "quick fixes"
|
|
356
|
+
|
|
312
357
|
### Advanced AI Patterns (from Windsurf, Cursor, Devin, Cline)
|
|
313
358
|
- **Status Update Pattern**: Brief progress notes before tool use (no monologues)
|
|
314
359
|
- **Execution Modes**: Discovery → Implementation → Completion (prevents thrashing)
|
|
@@ -364,13 +409,17 @@ your-project/
|
|
|
364
409
|
| Agent | How it works | Setup command |
|
|
365
410
|
|-------|-------------|---------------|
|
|
366
411
|
| **Claude Code** | Reads from `~/.claude/skills/` | `npx skill-mobile-mt --claude` |
|
|
412
|
+
| **Cline** | Reads `.clinerules/` from project root | `npx skill-mobile-mt --init cline` |
|
|
413
|
+
| **Roo Code** | Reads `.roo/rules/` from project root | `npx skill-mobile-mt --init roocode` |
|
|
414
|
+
| **Cursor** | Reads `.cursorrules` from project root | `npx skill-mobile-mt --init cursor` |
|
|
415
|
+
| **Windsurf** | Reads `.windsurfrules` from project root | `npx skill-mobile-mt --init windsurf` |
|
|
416
|
+
| **Copilot** | Reads `.github/copilot-instructions.md` | `npx skill-mobile-mt --init copilot` |
|
|
367
417
|
| **Codex** | Reads from `~/.codex/skills/` | `npx skill-mobile-mt --codex` |
|
|
368
418
|
| **Gemini CLI** | Reads from `~/.gemini/skills/` | `npx skill-mobile-mt --gemini` |
|
|
369
419
|
| **Kimi** | Reads from `~/.kimi/skills/` | `npx skill-mobile-mt --kimi` |
|
|
420
|
+
| **Kilo Code** | Reads `.kilocode/rules/` from project root | `npx skill-mobile-mt --init kilocode` |
|
|
421
|
+
| **Kiro** | Reads `.kiro/steering/` from project root | `npx skill-mobile-mt --init kiro` |
|
|
370
422
|
| **Antigravity** | Reads from `~/.agents/skills/` | `npx skill-mobile-mt --antigravity` |
|
|
371
|
-
| **Cursor** | Reads `.cursorrules` from project root | `npx skill-mobile-mt --init cursor` |
|
|
372
|
-
| **Copilot** | Reads `.github/copilot-instructions.md` | `npx skill-mobile-mt --init copilot` |
|
|
373
|
-
| **Windsurf** | Reads `.windsurfrules` from project root | `npx skill-mobile-mt --init windsurf` |
|
|
374
423
|
|
|
375
424
|
## License
|
|
376
425
|
|
package/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: skill-mobile-mt
|
|
3
3
|
description: "Master Senior Mobile Engineer. Patterns from 30+ production repos (200k+ GitHub stars: Ignite, Expensify, Mattermost, Immich, AppFlowy, Now in Android, TCA). Use when: building mobile features, fixing mobile bugs, reviewing mobile code, mobile architecture, React Native, Flutter, iOS Swift, Android Kotlin, mobile performance, mobile security audit, mobile code review, app release. Two modes: (1) default = pre-built production patterns, (2) 'project' = reads current project and adapts."
|
|
4
|
-
version: "1.
|
|
4
|
+
version: "1.3.0"
|
|
5
5
|
author: buivietphi
|
|
6
6
|
priority: high
|
|
7
7
|
user-invocable: true
|
|
@@ -48,9 +48,12 @@ allowed-tools:
|
|
|
48
48
|
10. [Quality Gate](#quality-gate)
|
|
49
49
|
11. [Build & Deploy Gates](#build--deploy-gates)
|
|
50
50
|
12. [Smart Loading](#smart-loading)
|
|
51
|
-
13. [
|
|
52
|
-
14. [
|
|
53
|
-
15. [
|
|
51
|
+
13. [Grounding Protocol (Anti-Hallucination)](#grounding-protocol-anti-hallucination)
|
|
52
|
+
14. [Docs-First Protocol (Always Use Latest)](#docs-first-protocol-always-use-latest)
|
|
53
|
+
15. [Security Protocol](#security-protocol)
|
|
54
|
+
16. [Hard Bans](#hard-bans)
|
|
55
|
+
17. [Mobile Anti-Patterns](#mobile-anti-patterns)
|
|
56
|
+
18. [Reference Files](#reference-files)
|
|
54
57
|
|
|
55
58
|
---
|
|
56
59
|
|
|
@@ -101,8 +104,12 @@ USER REQUEST → ACTION (Read tool required)
|
|
|
101
104
|
Read: shared/anti-patterns.md
|
|
102
105
|
then: scan for all violations
|
|
103
106
|
|
|
104
|
-
"Add package/library" → Read: shared/version-management.md
|
|
105
|
-
then: check SDK compat
|
|
107
|
+
"Add package/library" → Docs-First Protocol (below) + Read: shared/version-management.md
|
|
108
|
+
then: WebSearch official docs → check SDK compat → install
|
|
109
|
+
|
|
110
|
+
"Setup/configure X library" → Docs-First Protocol (below)
|
|
111
|
+
then: WebSearch "[library] [version] setup guide [year]"
|
|
112
|
+
then: follow official docs, NOT memory
|
|
106
113
|
|
|
107
114
|
"Platform UI / guidelines" → Read: shared/platform-excellence.md
|
|
108
115
|
then: apply iOS 18+ vs Android 15+ native patterns
|
|
@@ -728,6 +735,322 @@ FOR UI CHANGES:
|
|
|
728
735
|
|
|
729
736
|
---
|
|
730
737
|
|
|
738
|
+
## Grounding Protocol (Anti-Hallucination)
|
|
739
|
+
|
|
740
|
+
**Every answer MUST be grounded in verifiable sources. NEVER answer from "memory" or "intuition".**
|
|
741
|
+
|
|
742
|
+
### Source Hierarchy (use in order)
|
|
743
|
+
|
|
744
|
+
```
|
|
745
|
+
PRIORITY 1: PROJECT CODE (highest trust)
|
|
746
|
+
→ Read the actual file → cite file:line
|
|
747
|
+
→ "Based on src/services/authService.ts:42, your project uses axios with interceptor"
|
|
748
|
+
|
|
749
|
+
PRIORITY 2: SKILL REFERENCE FILES
|
|
750
|
+
→ Read shared/*.md or platform/*.md → cite which file
|
|
751
|
+
→ "Per react-native/react-native.md, use FlatList instead of ScrollView for lists"
|
|
752
|
+
|
|
753
|
+
PRIORITY 3: OFFICIAL DOCS (via WebSearch)
|
|
754
|
+
→ Search official docs → cite URL
|
|
755
|
+
→ "Per React Native docs: https://reactnative.dev/docs/flatlist"
|
|
756
|
+
|
|
757
|
+
PRIORITY 4: PRODUCTION REPOS (from architecture-intelligence.md)
|
|
758
|
+
→ Cite which repo the pattern comes from
|
|
759
|
+
→ "Ignite (19.7k stars) uses this folder structure for features"
|
|
760
|
+
|
|
761
|
+
⛔ PRIORITY 5: AI GENERAL KNOWLEDGE (lowest trust — AVOID)
|
|
762
|
+
→ Only when Priorities 1-4 return nothing
|
|
763
|
+
→ MUST prefix with: "⚠️ Not verified from your project or docs:"
|
|
764
|
+
→ MUST add: "Verify this before using in production"
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
### Mandatory Rules
|
|
768
|
+
|
|
769
|
+
```
|
|
770
|
+
RULE 1: READ BEFORE ANSWER
|
|
771
|
+
⛔ NEVER suggest code changes to a file you haven't Read
|
|
772
|
+
⛔ NEVER reference a function/class without verifying it exists
|
|
773
|
+
✅ ALWAYS: Read file → find the code → then suggest fix
|
|
774
|
+
|
|
775
|
+
RULE 2: VERIFY APIs AND LIBRARIES EXIST
|
|
776
|
+
⛔ NEVER suggest an import without verifying the package is installed
|
|
777
|
+
⛔ NEVER use a function name without checking it exists in the codebase
|
|
778
|
+
✅ Check package.json/pubspec.yaml FIRST → then suggest usage
|
|
779
|
+
✅ Grep for the function → confirm it exists → then reference it
|
|
780
|
+
|
|
781
|
+
RULE 3: CITE YOUR SOURCE
|
|
782
|
+
Every code suggestion MUST cite where it came from:
|
|
783
|
+
- "Cloned from src/features/product/productService.ts" (project code)
|
|
784
|
+
- "Pattern from shared/architecture-intelligence.md" (skill file)
|
|
785
|
+
- "Per React Navigation v6 docs" (official docs)
|
|
786
|
+
⛔ If you can't cite a source → say "I need to verify this first"
|
|
787
|
+
|
|
788
|
+
RULE 4: SAY "I DON'T KNOW" WHEN YOU DON'T KNOW
|
|
789
|
+
✅ "I'm not sure about this API. Let me check the docs."
|
|
790
|
+
✅ "I need to read your codebase to answer this correctly."
|
|
791
|
+
✅ "This might work but I haven't verified — let me check."
|
|
792
|
+
⛔ NEVER confidently state something you haven't verified
|
|
793
|
+
⛔ NEVER invent function signatures, API endpoints, or library names
|
|
794
|
+
|
|
795
|
+
RULE 5: VERSION-SPECIFIC ANSWERS
|
|
796
|
+
⛔ NEVER suggest code for "React Native" without knowing the version
|
|
797
|
+
⛔ NEVER assume latest version — check package.json first
|
|
798
|
+
✅ "Your project uses RN 0.73, so the correct API is..."
|
|
799
|
+
✅ "Expo SDK 51 uses expo-router v3, here's the correct import..."
|
|
800
|
+
|
|
801
|
+
RULE 6: NO PHANTOM PACKAGES
|
|
802
|
+
Before suggesting ANY npm/pub/pod package:
|
|
803
|
+
✅ Verify it exists: check package.json or search npm/pub
|
|
804
|
+
✅ Verify it's compatible: check version against project SDK
|
|
805
|
+
⛔ NEVER suggest a package name from memory without verification
|
|
806
|
+
⛔ NEVER mix up similar packages (e.g., @react-navigation vs react-navigation)
|
|
807
|
+
```
|
|
808
|
+
|
|
809
|
+
### When Fixing Bugs
|
|
810
|
+
|
|
811
|
+
```
|
|
812
|
+
GROUNDED BUG FIX PROTOCOL:
|
|
813
|
+
|
|
814
|
+
1. READ the file with the bug (don't guess from error message alone)
|
|
815
|
+
2. FIND the exact line causing the issue
|
|
816
|
+
3. UNDERSTAND the data flow (what calls this? what does it return?)
|
|
817
|
+
4. VERIFY the fix works with the actual types/interfaces in the project
|
|
818
|
+
5. CHECK side effects (grep for other files using this function)
|
|
819
|
+
6. CITE: "Fix in [file]:[line] — [root cause] — [why fix works]"
|
|
820
|
+
|
|
821
|
+
⛔ NEVER:
|
|
822
|
+
- "The error is probably because..." (guess without reading code)
|
|
823
|
+
- "Try changing X to Y" (without reading the file first)
|
|
824
|
+
- "This should fix it" (without verifying types match)
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
### Anti-Hallucination Checklist (run before EVERY response)
|
|
828
|
+
|
|
829
|
+
```
|
|
830
|
+
Before responding, verify:
|
|
831
|
+
□ Did I READ the relevant files? (not just guess from file names)
|
|
832
|
+
□ Are all function/class names I mentioned REAL? (verified via Grep/Read)
|
|
833
|
+
□ Are all package names I mentioned INSTALLED? (checked package.json)
|
|
834
|
+
□ Are my API suggestions compatible with the project's SDK version?
|
|
835
|
+
□ Did I cite where my solution comes from?
|
|
836
|
+
□ If I'm unsure about something, did I flag it?
|
|
837
|
+
|
|
838
|
+
If ANY checkbox fails → go back and verify before responding.
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
---
|
|
842
|
+
|
|
843
|
+
## Docs-First Protocol (Always Use Latest)
|
|
844
|
+
|
|
845
|
+
**When setting up, installing, or configuring ANY library/SDK/tool — ALWAYS search official docs FIRST.**
|
|
846
|
+
|
|
847
|
+
### When This Triggers
|
|
848
|
+
|
|
849
|
+
```
|
|
850
|
+
TRIGGERS:
|
|
851
|
+
- "Install X" / "Add X package" / "Setup X"
|
|
852
|
+
- "Configure X" / "Integrate X"
|
|
853
|
+
- "How to use X" / "What's the API for X"
|
|
854
|
+
- "Upgrade from X to Y"
|
|
855
|
+
- ANY new library, framework feature, or SDK API
|
|
856
|
+
|
|
857
|
+
⛔ DO NOT answer from memory. Docs change. APIs change. Syntax changes.
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
### Docs-First Protocol
|
|
861
|
+
|
|
862
|
+
```
|
|
863
|
+
STEP 1: CHECK PROJECT VERSION
|
|
864
|
+
Read package.json / pubspec.yaml → get exact version of:
|
|
865
|
+
- Framework (react-native, expo, flutter)
|
|
866
|
+
- Target library (if already installed)
|
|
867
|
+
- Related dependencies
|
|
868
|
+
|
|
869
|
+
STEP 2: SEARCH OFFICIAL DOCS (WebSearch)
|
|
870
|
+
Search: "[library name] [version] official documentation [current year]"
|
|
871
|
+
Examples:
|
|
872
|
+
- "react-navigation v7 installation guide 2026"
|
|
873
|
+
- "expo-camera SDK 52 setup documentation"
|
|
874
|
+
- "riverpod 2.0 getting started flutter"
|
|
875
|
+
|
|
876
|
+
✅ ALWAYS search with the CURRENT YEAR to get latest docs
|
|
877
|
+
⛔ NEVER rely on training data — it may be outdated
|
|
878
|
+
|
|
879
|
+
STEP 3: VERIFY API / SYNTAX
|
|
880
|
+
From the docs, confirm:
|
|
881
|
+
- Import path (packages rename, move, split)
|
|
882
|
+
- Function signatures (params change between versions)
|
|
883
|
+
- Configuration format (config files change)
|
|
884
|
+
- Peer dependencies (new requirements)
|
|
885
|
+
- Breaking changes (v6 → v7 migration)
|
|
886
|
+
|
|
887
|
+
STEP 4: APPLY WITH CITATION
|
|
888
|
+
"Per [library] v[X] docs ([URL]):
|
|
889
|
+
import { X } from '[correct-package]';"
|
|
890
|
+
|
|
891
|
+
⛔ If docs not found → say "I couldn't find current docs, let me try..."
|
|
892
|
+
⛔ If conflicting info → use the OFFICIAL source, not blog posts
|
|
893
|
+
```
|
|
894
|
+
|
|
895
|
+
### Common Outdated Patterns (AI memory traps)
|
|
896
|
+
|
|
897
|
+
```
|
|
898
|
+
⛔ AI OFTEN GETS WRONG:
|
|
899
|
+
- React Navigation: v5 syntax vs v6 vs v7 (changed significantly)
|
|
900
|
+
- Expo Router: file-based routing changed between SDK versions
|
|
901
|
+
- Firebase: modular v9+ syntax vs old v8 namespaced syntax
|
|
902
|
+
- Swift: async/await vs completion handlers (iOS 15+ only)
|
|
903
|
+
- Jetpack Compose: API surface changes rapidly between versions
|
|
904
|
+
- React Native: New Architecture (Fabric/TurboModules) vs Bridge
|
|
905
|
+
|
|
906
|
+
✅ ALWAYS WebSearch for the exact version in the project:
|
|
907
|
+
"react-navigation v7 createStackNavigator" ← correct for v7
|
|
908
|
+
NOT "react-navigation createStackNavigator" ← could return v4/v5 syntax
|
|
909
|
+
```
|
|
910
|
+
|
|
911
|
+
### Package Installation Protocol
|
|
912
|
+
|
|
913
|
+
```
|
|
914
|
+
BEFORE running npm install / flutter pub add / pod install:
|
|
915
|
+
|
|
916
|
+
1. CHECK if the package exists:
|
|
917
|
+
→ WebSearch "[package name] npm" or "[package name] pub.dev"
|
|
918
|
+
→ Verify it's maintained (last publish date)
|
|
919
|
+
→ Verify it's compatible with project SDK version
|
|
920
|
+
|
|
921
|
+
2. CHECK the correct install command:
|
|
922
|
+
→ WebSearch "[package name] installation [framework version]"
|
|
923
|
+
→ Some packages need peer dependencies
|
|
924
|
+
→ Some packages need native setup (pod install, gradle sync)
|
|
925
|
+
→ Expo packages: use "npx expo install" NOT "npm install"
|
|
926
|
+
|
|
927
|
+
3. CHECK for breaking changes:
|
|
928
|
+
→ If upgrading: WebSearch "[package name] migration guide v[old] to v[new]"
|
|
929
|
+
→ Read CHANGELOG for breaking changes
|
|
930
|
+
→ Check if config format changed
|
|
931
|
+
|
|
932
|
+
4. AFTER install:
|
|
933
|
+
→ Verify import works (no red squiggles)
|
|
934
|
+
→ Run build to check native linking
|
|
935
|
+
→ Test on BOTH platforms (iOS + Android)
|
|
936
|
+
|
|
937
|
+
⛔ NEVER:
|
|
938
|
+
- "npm install [package]" without checking version compatibility
|
|
939
|
+
- Copy import from memory (import paths change between versions)
|
|
940
|
+
- Assume the API is the same as 6 months ago
|
|
941
|
+
- Skip native setup steps (pod install, gradle sync)
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
---
|
|
945
|
+
|
|
946
|
+
## Security Protocol
|
|
947
|
+
|
|
948
|
+
**Security is NOT optional. Every feature MUST pass security checks before completion.**
|
|
949
|
+
|
|
950
|
+
### Security Scan (run on EVERY feature)
|
|
951
|
+
|
|
952
|
+
```
|
|
953
|
+
BEFORE marking any feature as done, scan for:
|
|
954
|
+
|
|
955
|
+
1. 🔴 SECRETS & CREDENTIALS
|
|
956
|
+
□ No hardcoded API keys, tokens, passwords, or secrets
|
|
957
|
+
□ No secrets in source code, comments, or config files
|
|
958
|
+
□ .env files in .gitignore (NEVER committed)
|
|
959
|
+
□ API keys loaded from environment variables or secure config
|
|
960
|
+
|
|
961
|
+
2. 🔴 TOKEN & AUTH STORAGE
|
|
962
|
+
□ Auth tokens → SecureStore (Expo) / Keychain (iOS) / EncryptedSharedPreferences (Android)
|
|
963
|
+
□ ⛔ NEVER AsyncStorage / SharedPreferences / UserDefaults for tokens
|
|
964
|
+
□ ⛔ NEVER localStorage / sessionStorage for tokens
|
|
965
|
+
□ Refresh tokens stored separately from access tokens
|
|
966
|
+
□ Token cleared on logout (all storage locations)
|
|
967
|
+
|
|
968
|
+
3. 🔴 INPUT VALIDATION
|
|
969
|
+
□ User input sanitized before display (prevent XSS)
|
|
970
|
+
□ User input validated before API calls (prevent injection)
|
|
971
|
+
□ Deep link parameters validated before navigation
|
|
972
|
+
□ File uploads: validate type, size, content (not just extension)
|
|
973
|
+
□ Search/filter inputs: debounced + length-limited
|
|
974
|
+
|
|
975
|
+
4. 🔴 NETWORK SECURITY
|
|
976
|
+
□ All API calls over HTTPS (never HTTP)
|
|
977
|
+
□ Certificate pinning for sensitive endpoints (banking, health)
|
|
978
|
+
□ API responses validated (don't trust server blindly)
|
|
979
|
+
□ Timeout on all network requests (prevent hanging)
|
|
980
|
+
□ No sensitive data in URL query parameters (use POST body)
|
|
981
|
+
|
|
982
|
+
5. 🟠 DATA PROTECTION
|
|
983
|
+
□ PII (name, email, phone, location) never in logs
|
|
984
|
+
□ PII never in analytics events without anonymization
|
|
985
|
+
□ Crash reports don't contain user data
|
|
986
|
+
□ Cache/temp files cleared on logout
|
|
987
|
+
□ Clipboard cleared after paste of sensitive data
|
|
988
|
+
|
|
989
|
+
6. 🟠 AUTHENTICATION FLOW
|
|
990
|
+
□ Login: rate-limited (prevent brute force)
|
|
991
|
+
□ 401 response → auto-refresh token OR logout
|
|
992
|
+
□ Session timeout after inactivity
|
|
993
|
+
□ Biometric auth: use system APIs (Face ID / fingerprint)
|
|
994
|
+
□ OAuth: validate redirect URI, use PKCE
|
|
995
|
+
|
|
996
|
+
7. 🟡 PLATFORM-SPECIFIC
|
|
997
|
+
iOS:
|
|
998
|
+
□ App Transport Security (ATS) enabled
|
|
999
|
+
□ Keychain access groups configured correctly
|
|
1000
|
+
□ Privacy manifest (PrivacyInfo.xcprivacy) for required APIs
|
|
1001
|
+
□ NSCameraUsageDescription / NSLocationUsageDescription set
|
|
1002
|
+
|
|
1003
|
+
Android:
|
|
1004
|
+
□ android:usesCleartextTraffic="false" in manifest
|
|
1005
|
+
□ ProGuard/R8 rules for obfuscation in release
|
|
1006
|
+
□ Exported activities/receivers properly restricted
|
|
1007
|
+
□ Backup rules exclude sensitive data (android:allowBackup)
|
|
1008
|
+
```
|
|
1009
|
+
|
|
1010
|
+
### Security Non-Negotiables (NEVER bypass)
|
|
1011
|
+
|
|
1012
|
+
```
|
|
1013
|
+
⛔ ABSOLUTE RULES — no exceptions, no workarounds:
|
|
1014
|
+
|
|
1015
|
+
1. NEVER store tokens in plain storage
|
|
1016
|
+
AsyncStorage / SharedPreferences / UserDefaults = ❌ CRITICAL
|
|
1017
|
+
SecureStore / Keychain / EncryptedSharedPreferences = ✅ ONLY
|
|
1018
|
+
|
|
1019
|
+
2. NEVER hardcode secrets
|
|
1020
|
+
const API_KEY = "sk-..." = ❌ CRITICAL
|
|
1021
|
+
process.env.API_KEY / Config.API_KEY = ✅ ONLY
|
|
1022
|
+
|
|
1023
|
+
3. NEVER log sensitive data
|
|
1024
|
+
console.log(user.password) = ❌ CRITICAL
|
|
1025
|
+
console.log("Login attempt for user:", user.id) = ✅ OK (ID only)
|
|
1026
|
+
|
|
1027
|
+
4. NEVER trust deep links
|
|
1028
|
+
navigation.navigate(params.screen) = ❌ CRITICAL (arbitrary navigation)
|
|
1029
|
+
if (ALLOWED_SCREENS.includes(params.screen)) navigate(params.screen) = ✅
|
|
1030
|
+
|
|
1031
|
+
5. NEVER disable SSL verification
|
|
1032
|
+
rejectUnauthorized: false = ❌ CRITICAL
|
|
1033
|
+
Proper certificate handling = ✅ ONLY
|
|
1034
|
+
|
|
1035
|
+
6. NEVER commit .env files
|
|
1036
|
+
.env in git = ❌ CRITICAL
|
|
1037
|
+
.env in .gitignore + .env.example committed = ✅
|
|
1038
|
+
```
|
|
1039
|
+
|
|
1040
|
+
### When User Asks to "Skip Security" or "Do It Quick"
|
|
1041
|
+
|
|
1042
|
+
```
|
|
1043
|
+
✅ Response: "I'll implement it correctly AND quickly. Security doesn't slow down development — it prevents emergency patches later."
|
|
1044
|
+
|
|
1045
|
+
⛔ NEVER skip security checks because:
|
|
1046
|
+
- "It's just a prototype" → Prototypes become production
|
|
1047
|
+
- "We'll fix it later" → Technical debt compounds
|
|
1048
|
+
- "It's internal only" → Internal apps get attacked too
|
|
1049
|
+
- "Just hardcode it for now" → Secrets leak to git history permanently
|
|
1050
|
+
```
|
|
1051
|
+
|
|
1052
|
+
---
|
|
1053
|
+
|
|
731
1054
|
## Hard Bans
|
|
732
1055
|
|
|
733
1056
|
**❌ These will CRASH, LEAK, or get REJECTED from app stores:**
|
package/bin/install.mjs
CHANGED
|
@@ -18,7 +18,11 @@
|
|
|
18
18
|
* npx @buivietphi/skill-mobile --init cursor # Generate .cursorrules
|
|
19
19
|
* npx @buivietphi/skill-mobile --init copilot # Generate .github/copilot-instructions.md
|
|
20
20
|
* npx @buivietphi/skill-mobile --init windsurf # Generate .windsurfrules
|
|
21
|
-
* npx @buivietphi/skill-mobile --init
|
|
21
|
+
* npx @buivietphi/skill-mobile --init cline # Generate .clinerules/mobile-rules.md
|
|
22
|
+
* npx @buivietphi/skill-mobile --init roocode # Generate .roo/rules/mobile-rules.md
|
|
23
|
+
* npx @buivietphi/skill-mobile --init kilocode # Generate .kilocode/rules/mobile-rules.md
|
|
24
|
+
* npx @buivietphi/skill-mobile --init kiro # Generate .kiro/steering/mobile-rules.md
|
|
25
|
+
* npx @buivietphi/skill-mobile --init all # Generate all project-level files
|
|
22
26
|
*/
|
|
23
27
|
|
|
24
28
|
import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync } from 'node:fs';
|
|
@@ -44,12 +48,16 @@ const SUBFOLDERS = {
|
|
|
44
48
|
|
|
45
49
|
const AGENTS = {
|
|
46
50
|
claude: { name: 'Claude Code', dir: join(HOME, '.claude', 'skills'), detect: () => existsSync(join(HOME, '.claude')) },
|
|
51
|
+
cline: { name: 'Cline', dir: join(HOME, '.cline', 'skills'), detect: () => existsSync(join(HOME, '.cline')) },
|
|
52
|
+
roocode: { name: 'Roo Code', dir: join(HOME, '.roo', 'skills'), detect: () => existsSync(join(HOME, '.roo')) },
|
|
47
53
|
cursor: { name: 'Cursor', dir: join(HOME, '.cursor', 'skills'), detect: () => existsSync(join(HOME, '.cursor')) },
|
|
48
54
|
windsurf: { name: 'Windsurf', dir: join(HOME, '.windsurf', 'skills'), detect: () => existsSync(join(HOME, '.windsurf')) },
|
|
49
55
|
copilot: { name: 'Copilot', dir: join(HOME, '.copilot', 'skills'), detect: () => existsSync(join(HOME, '.copilot')) },
|
|
50
56
|
codex: { name: 'Codex', dir: join(HOME, '.codex', 'skills'), detect: () => existsSync(join(HOME, '.codex')) },
|
|
51
57
|
gemini: { name: 'Gemini CLI', dir: join(HOME, '.gemini', 'skills'), detect: () => existsSync(join(HOME, '.gemini')) },
|
|
52
58
|
kimi: { name: 'Kimi', dir: join(HOME, '.kimi', 'skills'), detect: () => existsSync(join(HOME, '.kimi')) },
|
|
59
|
+
kilocode: { name: 'Kilo Code', dir: join(HOME, '.kilocode', 'skills'), detect: () => existsSync(join(HOME, '.kilocode')) },
|
|
60
|
+
kiro: { name: 'Kiro', dir: join(HOME, '.kiro', 'skills'), detect: () => existsSync(join(HOME, '.kiro')) },
|
|
53
61
|
antigravity: { name: 'Antigravity', dir: join(HOME, '.agents', 'skills'), detect: () => existsSync(join(HOME, '.agents')) },
|
|
54
62
|
};
|
|
55
63
|
|
|
@@ -60,14 +68,15 @@ const info = m => log(` ${c.blue}ℹ${c.reset} ${m}`);
|
|
|
60
68
|
const fail = m => log(` ${c.red}✗${c.reset} ${m}`);
|
|
61
69
|
|
|
62
70
|
function banner() {
|
|
63
|
-
log(`\n${c.bold}${c.cyan}
|
|
64
|
-
log(` │ 📱 @buivietphi/skill-mobile-mt v1.
|
|
65
|
-
log(` │ Master Senior Mobile Engineer
|
|
66
|
-
log(` │
|
|
67
|
-
log(` │ Claude ·
|
|
68
|
-
log(` │
|
|
69
|
-
log(` │
|
|
70
|
-
log(`
|
|
71
|
+
log(`\n${c.bold}${c.cyan} ┌──────────────────────────────────────────────────┐`);
|
|
72
|
+
log(` │ 📱 @buivietphi/skill-mobile-mt v1.3.0 │`);
|
|
73
|
+
log(` │ Master Senior Mobile Engineer │`);
|
|
74
|
+
log(` │ │`);
|
|
75
|
+
log(` │ Claude · Cline · Roo Code · Cursor · Windsurf │`);
|
|
76
|
+
log(` │ Copilot · Codex · Gemini · Kimi · Kilo · Kiro │`);
|
|
77
|
+
log(` │ Antigravity │`);
|
|
78
|
+
log(` │ React Native · Flutter · iOS · Android │`);
|
|
79
|
+
log(` └──────────────────────────────────────────────────┘${c.reset}\n`);
|
|
71
80
|
}
|
|
72
81
|
|
|
73
82
|
function tokenCount(filePath) {
|
|
@@ -319,6 +328,265 @@ Full skill with patterns from 30+ production repos: ~/.copilot/skills/skill-mobi
|
|
|
319
328
|
`,
|
|
320
329
|
},
|
|
321
330
|
|
|
331
|
+
cline: {
|
|
332
|
+
name: 'Cline',
|
|
333
|
+
file: 'mobile-rules.md',
|
|
334
|
+
dir: '.clinerules',
|
|
335
|
+
generate: (p) => `# ${p.framework} Project — Mobile Rules
|
|
336
|
+
# Generated by @buivietphi/skill-mobile-mt
|
|
337
|
+
|
|
338
|
+
## Project
|
|
339
|
+
- Framework: ${p.framework}
|
|
340
|
+
- Language: ${p.language}
|
|
341
|
+
- State: ${p.state}
|
|
342
|
+
- Navigation: ${p.nav}
|
|
343
|
+
- API: ${p.api}
|
|
344
|
+
- Package Manager: ${p.pkgMgr}
|
|
345
|
+
|
|
346
|
+
## Code Style
|
|
347
|
+
- PascalCase for screens and components
|
|
348
|
+
- camelCase for hooks, services, utils
|
|
349
|
+
- Absolute imports with @/ alias (if configured)
|
|
350
|
+
|
|
351
|
+
## Auto-Check (before every completion)
|
|
352
|
+
- No console.log / print in production code
|
|
353
|
+
- No hardcoded secrets or API keys
|
|
354
|
+
- All async wrapped in try/catch
|
|
355
|
+
- All 4 states: loading / error / empty / success
|
|
356
|
+
- useEffect has cleanup (return () => ...)
|
|
357
|
+
- FlatList (not ScrollView) for dynamic lists > 20 items
|
|
358
|
+
- No implicit 'any' in TypeScript
|
|
359
|
+
- No force unwrap (! / !!) without null check
|
|
360
|
+
- New screens registered in navigator
|
|
361
|
+
|
|
362
|
+
## Performance
|
|
363
|
+
- React.memo / const widget for expensive components
|
|
364
|
+
- useMemo/useCallback for stable references
|
|
365
|
+
- Images cached and resized
|
|
366
|
+
- No main thread blocking
|
|
367
|
+
|
|
368
|
+
## Security (non-negotiable)
|
|
369
|
+
- Tokens → SecureStore / Keychain / EncryptedSharedPreferences
|
|
370
|
+
- API calls → HTTPS only
|
|
371
|
+
- Sensitive data → never in logs
|
|
372
|
+
- User input → sanitize before display
|
|
373
|
+
- Deep links → validate before navigation
|
|
374
|
+
|
|
375
|
+
## Never
|
|
376
|
+
- Change framework or architecture
|
|
377
|
+
- Change state management library
|
|
378
|
+
- Add packages without checking SDK compatibility
|
|
379
|
+
- Mix package managers
|
|
380
|
+
- Use ScrollView for long lists
|
|
381
|
+
- Leave empty catch blocks
|
|
382
|
+
- Store tokens in AsyncStorage / SharedPreferences / UserDefaults
|
|
383
|
+
|
|
384
|
+
## Architecture
|
|
385
|
+
- Dependencies flow inward: UI → Domain → Data
|
|
386
|
+
- Single responsibility per file (max 300 lines)
|
|
387
|
+
- Feature-based organization preferred
|
|
388
|
+
|
|
389
|
+
## Reference
|
|
390
|
+
- Full skill: ~/.cline/skills/skill-mobile-mt/
|
|
391
|
+
- Patterns from 30+ production repos (200k+ GitHub stars)
|
|
392
|
+
`,
|
|
393
|
+
},
|
|
394
|
+
|
|
395
|
+
roocode: {
|
|
396
|
+
name: 'Roo Code',
|
|
397
|
+
file: 'mobile-rules.md',
|
|
398
|
+
dir: '.roo/rules',
|
|
399
|
+
generate: (p) => `# ${p.framework} Project — Mobile Rules
|
|
400
|
+
# Generated by @buivietphi/skill-mobile-mt
|
|
401
|
+
|
|
402
|
+
## Project
|
|
403
|
+
- Framework: ${p.framework}
|
|
404
|
+
- Language: ${p.language}
|
|
405
|
+
- State: ${p.state}
|
|
406
|
+
- Navigation: ${p.nav}
|
|
407
|
+
- API: ${p.api}
|
|
408
|
+
- Package Manager: ${p.pkgMgr}
|
|
409
|
+
|
|
410
|
+
## Code Style
|
|
411
|
+
- PascalCase for screens and components
|
|
412
|
+
- camelCase for hooks, services, utils
|
|
413
|
+
- Absolute imports with @/ alias (if configured)
|
|
414
|
+
|
|
415
|
+
## Auto-Check (before every completion)
|
|
416
|
+
- No console.log / print in production code
|
|
417
|
+
- No hardcoded secrets or API keys
|
|
418
|
+
- All async wrapped in try/catch
|
|
419
|
+
- All 4 states: loading / error / empty / success
|
|
420
|
+
- useEffect has cleanup (return () => ...)
|
|
421
|
+
- FlatList (not ScrollView) for dynamic lists > 20 items
|
|
422
|
+
- No implicit 'any' in TypeScript
|
|
423
|
+
- No force unwrap (! / !!) without null check
|
|
424
|
+
- New screens registered in navigator
|
|
425
|
+
|
|
426
|
+
## Performance
|
|
427
|
+
- React.memo / const widget for expensive components
|
|
428
|
+
- useMemo/useCallback for stable references
|
|
429
|
+
- Images cached and resized
|
|
430
|
+
- No main thread blocking
|
|
431
|
+
|
|
432
|
+
## Security (non-negotiable)
|
|
433
|
+
- Tokens → SecureStore / Keychain / EncryptedSharedPreferences
|
|
434
|
+
- API calls → HTTPS only
|
|
435
|
+
- Sensitive data → never in logs
|
|
436
|
+
- User input → sanitize before display
|
|
437
|
+
- Deep links → validate before navigation
|
|
438
|
+
|
|
439
|
+
## Never
|
|
440
|
+
- Change framework or architecture
|
|
441
|
+
- Change state management library
|
|
442
|
+
- Add packages without checking SDK compatibility
|
|
443
|
+
- Mix package managers
|
|
444
|
+
- Use ScrollView for long lists
|
|
445
|
+
- Leave empty catch blocks
|
|
446
|
+
- Store tokens in AsyncStorage / SharedPreferences / UserDefaults
|
|
447
|
+
|
|
448
|
+
## Architecture
|
|
449
|
+
- Dependencies flow inward: UI → Domain → Data
|
|
450
|
+
- Single responsibility per file (max 300 lines)
|
|
451
|
+
- Feature-based organization preferred
|
|
452
|
+
|
|
453
|
+
## Reference
|
|
454
|
+
- Full skill: ~/.roo/skills/skill-mobile-mt/
|
|
455
|
+
- Patterns from 30+ production repos (200k+ GitHub stars)
|
|
456
|
+
`,
|
|
457
|
+
},
|
|
458
|
+
|
|
459
|
+
kilocode: {
|
|
460
|
+
name: 'Kilo Code',
|
|
461
|
+
file: 'mobile-rules.md',
|
|
462
|
+
dir: '.kilocode/rules',
|
|
463
|
+
generate: (p) => `# ${p.framework} Project — Mobile Rules
|
|
464
|
+
# Generated by @buivietphi/skill-mobile-mt
|
|
465
|
+
|
|
466
|
+
## Project
|
|
467
|
+
- Framework: ${p.framework}
|
|
468
|
+
- Language: ${p.language}
|
|
469
|
+
- State: ${p.state}
|
|
470
|
+
- Navigation: ${p.nav}
|
|
471
|
+
- API: ${p.api}
|
|
472
|
+
- Package Manager: ${p.pkgMgr}
|
|
473
|
+
|
|
474
|
+
## Code Style
|
|
475
|
+
- PascalCase for screens and components
|
|
476
|
+
- camelCase for hooks, services, utils
|
|
477
|
+
- Absolute imports with @/ alias (if configured)
|
|
478
|
+
|
|
479
|
+
## Auto-Check (before every completion)
|
|
480
|
+
- No console.log / print in production code
|
|
481
|
+
- No hardcoded secrets or API keys
|
|
482
|
+
- All async wrapped in try/catch
|
|
483
|
+
- All 4 states: loading / error / empty / success
|
|
484
|
+
- useEffect has cleanup (return () => ...)
|
|
485
|
+
- FlatList (not ScrollView) for dynamic lists > 20 items
|
|
486
|
+
- No implicit 'any' in TypeScript
|
|
487
|
+
- No force unwrap (! / !!) without null check
|
|
488
|
+
- New screens registered in navigator
|
|
489
|
+
|
|
490
|
+
## Performance
|
|
491
|
+
- React.memo / const widget for expensive components
|
|
492
|
+
- useMemo/useCallback for stable references
|
|
493
|
+
- Images cached and resized
|
|
494
|
+
- No main thread blocking
|
|
495
|
+
|
|
496
|
+
## Security (non-negotiable)
|
|
497
|
+
- Tokens → SecureStore / Keychain / EncryptedSharedPreferences
|
|
498
|
+
- API calls → HTTPS only
|
|
499
|
+
- Sensitive data → never in logs
|
|
500
|
+
- User input → sanitize before display
|
|
501
|
+
- Deep links → validate before navigation
|
|
502
|
+
|
|
503
|
+
## Never
|
|
504
|
+
- Change framework or architecture
|
|
505
|
+
- Change state management library
|
|
506
|
+
- Add packages without checking SDK compatibility
|
|
507
|
+
- Mix package managers
|
|
508
|
+
- Use ScrollView for long lists
|
|
509
|
+
- Leave empty catch blocks
|
|
510
|
+
- Store tokens in AsyncStorage / SharedPreferences / UserDefaults
|
|
511
|
+
|
|
512
|
+
## Architecture
|
|
513
|
+
- Dependencies flow inward: UI → Domain → Data
|
|
514
|
+
- Single responsibility per file (max 300 lines)
|
|
515
|
+
- Feature-based organization preferred
|
|
516
|
+
|
|
517
|
+
## Reference
|
|
518
|
+
- Full skill: ~/.kilocode/skills/skill-mobile-mt/
|
|
519
|
+
- Patterns from 30+ production repos (200k+ GitHub stars)
|
|
520
|
+
`,
|
|
521
|
+
},
|
|
522
|
+
|
|
523
|
+
kiro: {
|
|
524
|
+
name: 'Kiro',
|
|
525
|
+
file: 'mobile-rules.md',
|
|
526
|
+
dir: '.kiro/steering',
|
|
527
|
+
generate: (p) => `---
|
|
528
|
+
inclusion: always
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
# ${p.framework} Project — Mobile Rules
|
|
532
|
+
# Generated by @buivietphi/skill-mobile-mt
|
|
533
|
+
|
|
534
|
+
## Project
|
|
535
|
+
- Framework: ${p.framework}
|
|
536
|
+
- Language: ${p.language}
|
|
537
|
+
- State: ${p.state}
|
|
538
|
+
- Navigation: ${p.nav}
|
|
539
|
+
- API: ${p.api}
|
|
540
|
+
- Package Manager: ${p.pkgMgr}
|
|
541
|
+
|
|
542
|
+
## Code Style
|
|
543
|
+
- PascalCase for screens and components
|
|
544
|
+
- camelCase for hooks, services, utils
|
|
545
|
+
- Absolute imports with @/ alias (if configured)
|
|
546
|
+
|
|
547
|
+
## Auto-Check (before every completion)
|
|
548
|
+
- No console.log / print in production code
|
|
549
|
+
- No hardcoded secrets or API keys
|
|
550
|
+
- All async wrapped in try/catch
|
|
551
|
+
- All 4 states: loading / error / empty / success
|
|
552
|
+
- useEffect has cleanup (return () => ...)
|
|
553
|
+
- FlatList (not ScrollView) for dynamic lists > 20 items
|
|
554
|
+
- No implicit 'any' in TypeScript
|
|
555
|
+
- No force unwrap (! / !!) without null check
|
|
556
|
+
- New screens registered in navigator
|
|
557
|
+
|
|
558
|
+
## Performance
|
|
559
|
+
- React.memo / const widget for expensive components
|
|
560
|
+
- useMemo/useCallback for stable references
|
|
561
|
+
- Images cached and resized
|
|
562
|
+
- No main thread blocking
|
|
563
|
+
|
|
564
|
+
## Security (non-negotiable)
|
|
565
|
+
- Tokens → SecureStore / Keychain / EncryptedSharedPreferences
|
|
566
|
+
- API calls → HTTPS only
|
|
567
|
+
- Sensitive data → never in logs
|
|
568
|
+
- User input → sanitize before display
|
|
569
|
+
- Deep links → validate before navigation
|
|
570
|
+
|
|
571
|
+
## Never
|
|
572
|
+
- Change framework or architecture
|
|
573
|
+
- Change state management library
|
|
574
|
+
- Add packages without checking SDK compatibility
|
|
575
|
+
- Mix package managers
|
|
576
|
+
- Use ScrollView for long lists
|
|
577
|
+
- Leave empty catch blocks
|
|
578
|
+
- Store tokens in AsyncStorage / SharedPreferences / UserDefaults
|
|
579
|
+
|
|
580
|
+
## Architecture
|
|
581
|
+
- Dependencies flow inward: UI → Domain → Data
|
|
582
|
+
- Single responsibility per file (max 300 lines)
|
|
583
|
+
- Feature-based organization preferred
|
|
584
|
+
|
|
585
|
+
## Reference
|
|
586
|
+
- Patterns from 30+ production repos (200k+ GitHub stars)
|
|
587
|
+
`,
|
|
588
|
+
},
|
|
589
|
+
|
|
322
590
|
windsurf: {
|
|
323
591
|
name: 'Windsurf',
|
|
324
592
|
file: '.windsurfrules',
|
|
@@ -380,7 +648,7 @@ Patterns from 30+ production repos (200k+ GitHub stars)
|
|
|
380
648
|
};
|
|
381
649
|
|
|
382
650
|
// Agents that need project-level files (don't just read from skills dir)
|
|
383
|
-
const NEEDS_PROJECT_FILE = new Set(['cursor', 'copilot', 'windsurf']);
|
|
651
|
+
const NEEDS_PROJECT_FILE = new Set(['cursor', 'copilot', 'windsurf', 'cline', 'roocode', 'kilocode', 'kiro']);
|
|
384
652
|
|
|
385
653
|
function initProjectFiles(dir, agents) {
|
|
386
654
|
const project = detectProject(dir);
|
|
@@ -671,8 +939,8 @@ async function main() {
|
|
|
671
939
|
log('');
|
|
672
940
|
log(` ${c.cyan}npx @buivietphi/skill-mobile-mt --init${c.reset}`);
|
|
673
941
|
log('');
|
|
674
|
-
log(` This generates
|
|
675
|
-
log(` with auto-detected
|
|
942
|
+
log(` This generates project-level rules files`);
|
|
943
|
+
log(` (${c.bold}.cursorrules${c.reset}, ${c.bold}.clinerules/${c.reset}, ${c.bold}.roo/rules/${c.reset}, etc.) with auto-detected settings.\n`);
|
|
676
944
|
} else {
|
|
677
945
|
log('');
|
|
678
946
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buivietphi/skill-mobile-mt",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Master Senior Mobile Engineer skill for AI agents. Pre-built patterns from 18 production apps + local project adaptation. React Native, Flutter, iOS, Android. Supports Claude, Gemini, Kimi, Cursor, Copilot, Antigravity.",
|
|
5
5
|
"author": "buivietphi",
|
|
6
6
|
"license": "MIT",
|
package/shared/code-review.md
CHANGED
|
@@ -68,6 +68,18 @@
|
|
|
68
68
|
❌ Missing loading / error / empty state (blank screen)
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
+
### Grounding Auto-Fail (AI-generated code)
|
|
72
|
+
|
|
73
|
+
**If the code was generated by AI, also check:**
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
❌ Import from a package NOT in package.json / pubspec.yaml
|
|
77
|
+
❌ Function/method call that doesn't exist in the codebase
|
|
78
|
+
❌ API endpoint or response shape not verified from actual service code
|
|
79
|
+
❌ Library version syntax that doesn't match installed version
|
|
80
|
+
❌ Platform API that doesn't exist in the project's min SDK
|
|
81
|
+
```
|
|
82
|
+
|
|
71
83
|
---
|
|
72
84
|
|
|
73
85
|
## Review Comment Templates
|
|
@@ -66,6 +66,14 @@
|
|
|
66
66
|
BUG: [description]
|
|
67
67
|
FILE: [path]
|
|
68
68
|
|
|
69
|
+
<source_verification>
|
|
70
|
+
⚠️ BEFORE analyzing — verify I have real data:
|
|
71
|
+
- [ ] Read the actual file (not guessing from error message)
|
|
72
|
+
- [ ] Verified function/class names exist (grep)
|
|
73
|
+
- [ ] Checked package versions in package.json/pubspec.yaml
|
|
74
|
+
- [ ] Identified data types from actual code (not assumed)
|
|
75
|
+
</source_verification>
|
|
76
|
+
|
|
69
77
|
<context_needed>
|
|
70
78
|
- Read [file] to understand current implementation
|
|
71
79
|
- Grep for similar patterns: grep "[pattern]" src/
|
|
@@ -77,6 +85,7 @@ FILE: [path]
|
|
|
77
85
|
- What code is executed?
|
|
78
86
|
- What values are passed?
|
|
79
87
|
- What conditions are checked?
|
|
88
|
+
SOURCE: [file:line where the bug is — cite exact location]
|
|
80
89
|
</root_cause>
|
|
81
90
|
|
|
82
91
|
<fix>
|
|
@@ -84,6 +93,7 @@ FILE: [path]
|
|
|
84
93
|
|
|
85
94
|
WHY IT WORKS:
|
|
86
95
|
[Explain the fix based on root cause]
|
|
96
|
+
SOURCE: [where this fix pattern comes from — project code / skill file / official docs]
|
|
87
97
|
</fix>
|
|
88
98
|
|
|
89
99
|
<side_effects>
|
|
@@ -165,6 +175,14 @@ BUG: App crashes when tapping product with no images
|
|
|
165
175
|
FEATURE: [description]
|
|
166
176
|
PLATFORM: [React Native / Flutter / iOS / Android]
|
|
167
177
|
|
|
178
|
+
<source_verification>
|
|
179
|
+
⚠️ GROUNDING CHECK:
|
|
180
|
+
- [ ] Scanned actual project structure (not assumed)
|
|
181
|
+
- [ ] Found real reference feature (not imagined)
|
|
182
|
+
- [ ] Will read reference files before cloning pattern
|
|
183
|
+
- [ ] Will verify all imports/packages exist before using
|
|
184
|
+
</source_verification>
|
|
185
|
+
|
|
168
186
|
STEP 1: SCAN PROJECT
|
|
169
187
|
- List screens: ls src/screens/
|
|
170
188
|
- Find similar features: grep -r "useState" src/screens/
|
|
@@ -620,6 +638,16 @@ Faster than reading documentation.
|
|
|
620
638
|
"Create login screen following pattern in src/screens/ProductScreen
|
|
621
639
|
using Redux slice from src/store/slices/authSlice
|
|
622
640
|
with email/password fields + remember me checkbox"
|
|
641
|
+
|
|
642
|
+
❌ Hallucinated answers (AI "intuition")
|
|
643
|
+
"Use react-native-awesome-picker for this" ← package may not exist
|
|
644
|
+
"Call the fetchUserData() method" ← function may not exist
|
|
645
|
+
"This API returns { data: [...] }" ← response shape may be wrong
|
|
646
|
+
|
|
647
|
+
✅ Grounded answers (verified from source)
|
|
648
|
+
Read package.json → verify package exists → then suggest usage
|
|
649
|
+
Grep "fetchUser" src/ → find actual function → then reference it
|
|
650
|
+
Read API service file → check actual response shape → then use it
|
|
623
651
|
```
|
|
624
652
|
|
|
625
653
|
---
|
|
@@ -9,6 +9,23 @@
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## ⚠️ IMPORTANT: Always WebSearch for Latest
|
|
13
|
+
|
|
14
|
+
**The version matrix below is a SNAPSHOT and may be outdated.**
|
|
15
|
+
**Before installing ANY package or suggesting ANY version:**
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
1. WebSearch "[package] latest version [current year]"
|
|
19
|
+
2. WebSearch "[package] [framework version] compatibility"
|
|
20
|
+
3. Read the OFFICIAL changelog/migration guide
|
|
21
|
+
4. Cross-reference with the matrix below
|
|
22
|
+
|
|
23
|
+
⛔ NEVER rely solely on the matrix below — it was written at a point in time
|
|
24
|
+
✅ ALWAYS verify with WebSearch for the most current information
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
12
29
|
## Version Matrix (React Native / Expo)
|
|
13
30
|
|
|
14
31
|
### Expo SDK Compatibility
|