mcp-probe-kit 3.0.14 → 3.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +17 -11
  2. package/build/lib/__tests__/gitnexus-bridge.unit.test.js +9 -1
  3. package/build/lib/gitnexus-bridge.d.ts +1 -0
  4. package/build/lib/gitnexus-bridge.js +29 -1
  5. package/build/lib/skill-bridge.d.ts +31 -0
  6. package/build/lib/skill-bridge.js +100 -0
  7. package/build/resources/ui-ux-data/charts.json +302 -0
  8. package/build/resources/ui-ux-data/colors.json +1058 -0
  9. package/build/resources/ui-ux-data/icons.json +1102 -0
  10. package/build/resources/ui-ux-data/landing.json +262 -0
  11. package/build/resources/ui-ux-data/metadata.json +6 -0
  12. package/build/resources/ui-ux-data/products.json +1058 -0
  13. package/build/resources/ui-ux-data/react-performance.json +574 -0
  14. package/build/resources/ui-ux-data/stacks/astro.json +266 -0
  15. package/build/resources/ui-ux-data/stacks/flutter.json +626 -0
  16. package/build/resources/ui-ux-data/stacks/html-tailwind.json +662 -0
  17. package/build/resources/ui-ux-data/stacks/jetpack-compose.json +626 -0
  18. package/build/resources/ui-ux-data/stacks/nextjs.json +218 -0
  19. package/build/resources/ui-ux-data/stacks/nuxt-ui.json +14 -0
  20. package/build/resources/ui-ux-data/stacks/nuxtjs.json +182 -0
  21. package/build/resources/ui-ux-data/stacks/react-native.json +350 -0
  22. package/build/resources/ui-ux-data/stacks/react.json +530 -0
  23. package/build/resources/ui-ux-data/stacks/shadcn.json +566 -0
  24. package/build/resources/ui-ux-data/stacks/svelte.json +134 -0
  25. package/build/resources/ui-ux-data/stacks/swiftui.json +26 -0
  26. package/build/resources/ui-ux-data/stacks/vue.json +170 -0
  27. package/build/resources/ui-ux-data/styles.json +1610 -0
  28. package/build/resources/ui-ux-data/typography.json +743 -0
  29. package/build/resources/ui-ux-data/ui-reasoning.json +1431 -0
  30. package/build/resources/ui-ux-data/ux-guidelines.json +1190 -0
  31. package/build/resources/ui-ux-data/web-interface.json +389 -0
  32. package/build/schemas/ui-ux-schemas.js +1 -1
  33. package/build/tools/start_product.js +8 -1
  34. package/build/tools/start_ui.js +14 -3
  35. package/build/tools/ui-ux-tools.js +21 -17
  36. package/build/utils/ui-data-loader.d.ts +18 -2
  37. package/build/utils/ui-data-loader.js +74 -12
  38. package/docs/i18n/en.json +4 -2
  39. package/docs/i18n/ja.json +4 -2
  40. package/docs/i18n/ko.json +4 -2
  41. package/docs/i18n/zh-CN.json +4 -2
  42. package/docs/pages/getting-started.html +3 -0
  43. package/package.json +2 -1
@@ -0,0 +1,626 @@
1
+ [
2
+ {
3
+ "No": "1",
4
+ "Category": "Composable",
5
+ "Guideline": "Pure UI composables",
6
+ "Description": "Composable functions should only render UI",
7
+ "Do": "Accept state and callbacks",
8
+ "Don't": "Calling usecase/repo",
9
+ "Code Good": "Pure UI composable",
10
+ "Code Bad": "Business logic in UI",
11
+ "Severity": "High",
12
+ "Docs URL": "https://developer.android.com/jetpack/compose/mental-model"
13
+ },
14
+ {
15
+ "No": "2",
16
+ "Category": "Composable",
17
+ "Guideline": "Small composables",
18
+ "Description": "Each composable has single responsibility",
19
+ "Do": "Split into components",
20
+ "Don't": "Huge composable",
21
+ "Code Good": "Reusable UI",
22
+ "Code Bad": "Monolithic UI",
23
+ "Severity": "Medium",
24
+ "Docs URL": ""
25
+ },
26
+ {
27
+ "No": "3",
28
+ "Category": "Composable",
29
+ "Guideline": "Stateless by default",
30
+ "Description": "Prefer stateless composables",
31
+ "Do": "Hoist state",
32
+ "Don't": "Local mutable state",
33
+ "Code Good": "Stateless UI",
34
+ "Code Bad": "Hidden state",
35
+ "Severity": "High",
36
+ "Docs URL": "https://developer.android.com/jetpack/compose/state#state-hoisting"
37
+ },
38
+ {
39
+ "No": "4",
40
+ "Category": "State",
41
+ "Guideline": "Single source of truth",
42
+ "Description": "UI state comes from one source",
43
+ "Do": "StateFlow from VM",
44
+ "Don't": "Multiple states",
45
+ "Code Good": "Unified UiState",
46
+ "Code Bad": "Scattered state",
47
+ "Severity": "High",
48
+ "Docs URL": "https://developer.android.com/topic/architecture/ui-layer"
49
+ },
50
+ {
51
+ "No": "5",
52
+ "Category": "State",
53
+ "Guideline": "Model UI State",
54
+ "Description": "Use sealed interface/data class",
55
+ "Do": "UiState.Loading",
56
+ "Don't": "Boolean flags",
57
+ "Code Good": "Explicit state",
58
+ "Code Bad": "Flag hell",
59
+ "Severity": "High",
60
+ "Docs URL": ""
61
+ },
62
+ {
63
+ "No": "6",
64
+ "Category": "State",
65
+ "Guideline": "remember only UI state",
66
+ "Description": "remember for UI-only state",
67
+ "Do": "Scroll, animation",
68
+ "Don't": "Business state",
69
+ "Code Good": "Correct remember",
70
+ "Code Bad": "Misuse remember",
71
+ "Severity": "High",
72
+ "Docs URL": "https://developer.android.com/jetpack/compose/state"
73
+ },
74
+ {
75
+ "No": "7",
76
+ "Category": "State",
77
+ "Guideline": "rememberSaveable",
78
+ "Description": "Persist state across config",
79
+ "Do": "rememberSaveable",
80
+ "Don't": "remember",
81
+ "Code Good": "State survives",
82
+ "Code Bad": "State lost",
83
+ "Severity": "High",
84
+ "Docs URL": "https://developer.android.com/jetpack/compose/state#restore-ui-state"
85
+ },
86
+ {
87
+ "No": "8",
88
+ "Category": "State",
89
+ "Guideline": "derivedStateOf",
90
+ "Description": "Optimize recomposition",
91
+ "Do": "derivedStateOf",
92
+ "Don't": "Recompute always",
93
+ "Code Good": "Optimized",
94
+ "Code Bad": "Jank",
95
+ "Severity": "Medium",
96
+ "Docs URL": "https://developer.android.com/jetpack/compose/performance"
97
+ },
98
+ {
99
+ "No": "9",
100
+ "Category": "SideEffect",
101
+ "Guideline": "LaunchedEffect keys",
102
+ "Description": "Use correct keys",
103
+ "Do": "LaunchedEffect(id)",
104
+ "Don't": "LaunchedEffect(Unit)",
105
+ "Code Good": "Scoped effect",
106
+ "Code Bad": "Infinite loop",
107
+ "Severity": "High",
108
+ "Docs URL": "https://developer.android.com/jetpack/compose/side-effects"
109
+ },
110
+ {
111
+ "No": "10",
112
+ "Category": "SideEffect",
113
+ "Guideline": "rememberUpdatedState",
114
+ "Description": "Avoid stale lambdas",
115
+ "Do": "rememberUpdatedState",
116
+ "Don't": "Capture directly",
117
+ "Code Good": "Safe callback",
118
+ "Code Bad": "Stale state",
119
+ "Severity": "Medium",
120
+ "Docs URL": "https://developer.android.com/jetpack/compose/side-effects"
121
+ },
122
+ {
123
+ "No": "11",
124
+ "Category": "SideEffect",
125
+ "Guideline": "DisposableEffect",
126
+ "Description": "Clean up resources",
127
+ "Do": "onDispose",
128
+ "Don't": "No cleanup",
129
+ "Code Good": "No leak",
130
+ "Code Bad": "Memory leak",
131
+ "Severity": "High",
132
+ "Docs URL": ""
133
+ },
134
+ {
135
+ "No": "12",
136
+ "Category": "Architecture",
137
+ "Guideline": "Unidirectional data flow",
138
+ "Description": "UI → VM → State",
139
+ "Do": "onEvent",
140
+ "Don't": "Two-way binding",
141
+ "Code Good": "Predictable flow",
142
+ "Code Bad": "Hard debug",
143
+ "Severity": "High",
144
+ "Docs URL": "https://developer.android.com/topic/architecture"
145
+ },
146
+ {
147
+ "No": "13",
148
+ "Category": "Architecture",
149
+ "Guideline": "No business logic in UI",
150
+ "Description": "Logic belongs to VM",
151
+ "Do": "Collect state",
152
+ "Don't": "Call repo",
153
+ "Code Good": "Clean UI",
154
+ "Code Bad": "Fat UI",
155
+ "Severity": "High",
156
+ "Docs URL": ""
157
+ },
158
+ {
159
+ "No": "14",
160
+ "Category": "Architecture",
161
+ "Guideline": "Expose immutable state",
162
+ "Description": "Expose StateFlow",
163
+ "Do": "asStateFlow",
164
+ "Don't": "Mutable exposed",
165
+ "Code Good": "Safe API",
166
+ "Code Bad": "State mutation",
167
+ "Severity": "High",
168
+ "Docs URL": ""
169
+ },
170
+ {
171
+ "No": "15",
172
+ "Category": "Lifecycle",
173
+ "Guideline": "Lifecycle-aware collect",
174
+ "Description": "Use collectAsStateWithLifecycle",
175
+ "Do": "Lifecycle aware",
176
+ "Don't": "collectAsState",
177
+ "Code Good": "No leak",
178
+ "Code Bad": "Leak",
179
+ "Severity": "High",
180
+ "Docs URL": "https://developer.android.com/jetpack/compose/lifecycle"
181
+ },
182
+ {
183
+ "No": "16",
184
+ "Category": "Navigation",
185
+ "Guideline": "Event-based navigation",
186
+ "Description": "VM emits navigation event",
187
+ "Do": "VM: Channel + receiveAsFlow(), V: Collect with Dispatchers.Main.immediate",
188
+ "Don't": "Nav in UI",
189
+ "Code Good": "Decoupled nav",
190
+ "Code Bad": "Using State / SharedFlow for navigation -> event is replayed and navigation fires again (StateFlow)",
191
+ "Severity": "High",
192
+ "Docs URL": "https://developer.android.com/jetpack/compose/navigation"
193
+ },
194
+ {
195
+ "No": "17",
196
+ "Category": "Navigation",
197
+ "Guideline": "Typed routes",
198
+ "Description": "Use sealed routes",
199
+ "Do": "sealed class Route",
200
+ "Don't": "String routes",
201
+ "Code Good": "Type-safe",
202
+ "Code Bad": "Runtime crash",
203
+ "Severity": "Medium",
204
+ "Docs URL": ""
205
+ },
206
+ {
207
+ "No": "18",
208
+ "Category": "Performance",
209
+ "Guideline": "Stable parameters",
210
+ "Description": "Prefer immutable/stable params",
211
+ "Do": "@Immutable",
212
+ "Don't": "Mutable params",
213
+ "Code Good": "Stable recomposition",
214
+ "Code Bad": "Extra recomposition",
215
+ "Severity": "High",
216
+ "Docs URL": "https://developer.android.com/jetpack/compose/performance"
217
+ },
218
+ {
219
+ "No": "19",
220
+ "Category": "Performance",
221
+ "Guideline": "Use key in Lazy",
222
+ "Description": "Provide stable keys",
223
+ "Do": "key=id",
224
+ "Don't": "No key",
225
+ "Code Good": "Stable list",
226
+ "Code Bad": "Item jump",
227
+ "Severity": "High",
228
+ "Docs URL": ""
229
+ },
230
+ {
231
+ "No": "20",
232
+ "Category": "Performance",
233
+ "Guideline": "Avoid heavy work",
234
+ "Description": "No heavy computation in UI",
235
+ "Do": "Precompute in VM",
236
+ "Don't": "Compute in UI",
237
+ "Code Good": "Smooth UI",
238
+ "Code Bad": "Jank",
239
+ "Severity": "High",
240
+ "Docs URL": ""
241
+ },
242
+ {
243
+ "No": "21",
244
+ "Category": "Performance",
245
+ "Guideline": "Remember expensive objects",
246
+ "Description": "remember heavy objects",
247
+ "Do": "remember",
248
+ "Don't": "Recreate each recomposition",
249
+ "Code Good": "Efficient",
250
+ "Code Bad": "Wasteful",
251
+ "Severity": "Medium",
252
+ "Docs URL": ""
253
+ },
254
+ {
255
+ "No": "22",
256
+ "Category": "Theming",
257
+ "Guideline": "Design system",
258
+ "Description": "Centralized theme",
259
+ "Do": "Material3 tokens",
260
+ "Don't": "Hardcoded values",
261
+ "Code Good": "Consistent UI",
262
+ "Code Bad": "Inconsistent",
263
+ "Severity": "High",
264
+ "Docs URL": "https://developer.android.com/jetpack/compose/themes"
265
+ },
266
+ {
267
+ "No": "23",
268
+ "Category": "Theming",
269
+ "Guideline": "Dark mode support",
270
+ "Description": "Theme-based colors",
271
+ "Do": "colorScheme",
272
+ "Don't": "Fixed color",
273
+ "Code Good": "Adaptive UI",
274
+ "Code Bad": "Broken dark",
275
+ "Severity": "Medium",
276
+ "Docs URL": ""
277
+ },
278
+ {
279
+ "No": "24",
280
+ "Category": "Layout",
281
+ "Guideline": "Prefer Modifier over extra layouts",
282
+ "Description": "Use Modifier to adjust layout instead of adding wrapper composables",
283
+ "Do": "Use Modifier.padding()",
284
+ "Don't": "Wrap content with extra Box",
285
+ "Code Good": "Padding via modifier",
286
+ "Code Bad": "Box just for padding",
287
+ "Severity": "High",
288
+ "Docs URL": "https://developer.android.com/jetpack/compose/modifiers"
289
+ },
290
+ {
291
+ "No": "25",
292
+ "Category": "Layout",
293
+ "Guideline": "Avoid deep layout nesting",
294
+ "Description": "Deep layout trees increase measure & layout cost",
295
+ "Do": "Keep layout flat",
296
+ "Don't": "Box ? Column ? Box ? Row",
297
+ "Code Good": "Flat hierarchy",
298
+ "Code Bad": "Deep nested tree",
299
+ "Severity": "High",
300
+ "Docs URL": ""
301
+ },
302
+ {
303
+ "No": "26",
304
+ "Category": "Layout",
305
+ "Guideline": "Use Row/Column for linear layout",
306
+ "Description": "Linear layouts are simpler and more performant",
307
+ "Do": "Use Row / Column",
308
+ "Don't": "Custom layout for simple cases",
309
+ "Code Good": "Row/Column usage",
310
+ "Code Bad": "Over-engineered layout",
311
+ "Severity": "High",
312
+ "Docs URL": ""
313
+ },
314
+ {
315
+ "No": "27",
316
+ "Category": "Layout",
317
+ "Guideline": "Use Box only for overlapping content",
318
+ "Description": "Box should be used only when children overlap",
319
+ "Do": "Stack elements",
320
+ "Don't": "Use Box as Column",
321
+ "Code Good": "Proper overlay",
322
+ "Code Bad": "Misused Box",
323
+ "Severity": "Medium",
324
+ "Docs URL": ""
325
+ },
326
+ {
327
+ "No": "28",
328
+ "Category": "Layout",
329
+ "Guideline": "Prefer LazyColumn over Column scroll",
330
+ "Description": "Lazy layouts are virtualized and efficient",
331
+ "Do": "LazyColumn",
332
+ "Don't": "Column.verticalScroll()",
333
+ "Code Good": "Lazy list",
334
+ "Code Bad": "Scrollable Column",
335
+ "Severity": "High",
336
+ "Docs URL": "https://developer.android.com/jetpack/compose/lists"
337
+ },
338
+ {
339
+ "No": "29",
340
+ "Category": "Layout",
341
+ "Guideline": "Avoid nested scroll containers",
342
+ "Description": "Nested scrolling causes UX & performance issues",
343
+ "Do": "Single scroll container",
344
+ "Don't": "Scroll inside scroll",
345
+ "Code Good": "One scroll per screen",
346
+ "Code Bad": "Nested scroll",
347
+ "Severity": "High",
348
+ "Docs URL": ""
349
+ },
350
+ {
351
+ "No": "30",
352
+ "Category": "Layout",
353
+ "Guideline": "Avoid fillMaxSize by default",
354
+ "Description": "fillMaxSize may break parent constraints",
355
+ "Do": "Use exact size",
356
+ "Don't": "Fill max everywhere",
357
+ "Code Good": "Constraint-aware size",
358
+ "Code Bad": "Overfilled layout",
359
+ "Severity": "Medium",
360
+ "Docs URL": ""
361
+ },
362
+ {
363
+ "No": "31",
364
+ "Category": "Layout",
365
+ "Guideline": "Avoid intrinsic size unless necessary",
366
+ "Description": "Intrinsic measurement is expensive",
367
+ "Do": "Explicit sizing",
368
+ "Don't": "IntrinsicSize.Min",
369
+ "Code Good": "Predictable layout",
370
+ "Code Bad": "Expensive measure",
371
+ "Severity": "High",
372
+ "Docs URL": "https://developer.android.com/jetpack/compose/layout/intrinsics"
373
+ },
374
+ {
375
+ "No": "32",
376
+ "Category": "Layout",
377
+ "Guideline": "Use Arrangement and Alignment APIs",
378
+ "Description": "Declare layout intent explicitly",
379
+ "Do": "Use Arrangement / Alignment",
380
+ "Don't": "Manual spacing hacks",
381
+ "Code Good": "Declarative spacing",
382
+ "Code Bad": "Magic spacing",
383
+ "Severity": "High",
384
+ "Docs URL": ""
385
+ },
386
+ {
387
+ "No": "33",
388
+ "Category": "Layout",
389
+ "Guideline": "Extract reusable layout patterns",
390
+ "Description": "Repeated layouts should be shared",
391
+ "Do": "Create layout composable",
392
+ "Don't": "Copy-paste layouts",
393
+ "Code Good": "Reusable scaffold",
394
+ "Code Bad": "Duplicated layout",
395
+ "Severity": "High",
396
+ "Docs URL": ""
397
+ },
398
+ {
399
+ "No": "34",
400
+ "Category": "Theming",
401
+ "Guideline": "No hardcoded text style",
402
+ "Description": "Use typography",
403
+ "Do": "MaterialTheme.typography",
404
+ "Don't": "Hardcode sp",
405
+ "Code Good": "Scalable",
406
+ "Code Bad": "Inconsistent",
407
+ "Severity": "Medium",
408
+ "Docs URL": ""
409
+ },
410
+ {
411
+ "No": "35",
412
+ "Category": "Testing",
413
+ "Guideline": "Stateless UI testing",
414
+ "Description": "Composable easy to test",
415
+ "Do": "Pass state",
416
+ "Don't": "Hidden state",
417
+ "Code Good": "Testable",
418
+ "Code Bad": "Hard test",
419
+ "Severity": "High",
420
+ "Docs URL": "https://developer.android.com/jetpack/compose/testing"
421
+ },
422
+ {
423
+ "No": "36",
424
+ "Category": "Testing",
425
+ "Guideline": "Use testTag",
426
+ "Description": "Stable UI selectors",
427
+ "Do": "Modifier.testTag",
428
+ "Don't": "Find by text",
429
+ "Code Good": "Stable tests",
430
+ "Code Bad": "Flaky tests",
431
+ "Severity": "Medium",
432
+ "Docs URL": ""
433
+ },
434
+ {
435
+ "No": "37",
436
+ "Category": "Preview",
437
+ "Guideline": "Multiple previews",
438
+ "Description": "Preview multiple states",
439
+ "Do": "@Preview",
440
+ "Don't": "Single preview",
441
+ "Code Good": "Better dev UX",
442
+ "Code Bad": "Misleading",
443
+ "Severity": "Low",
444
+ "Docs URL": "https://developer.android.com/jetpack/compose/tooling/preview"
445
+ },
446
+ {
447
+ "No": "38",
448
+ "Category": "DI",
449
+ "Guideline": "Inject VM via Hilt",
450
+ "Description": "Use hiltViewModel",
451
+ "Do": "@HiltViewModel",
452
+ "Don't": "Manual VM",
453
+ "Code Good": "Clean DI",
454
+ "Code Bad": "Coupling",
455
+ "Severity": "High",
456
+ "Docs URL": "https://developer.android.com/training/dependency-injection/hilt-jetpack"
457
+ },
458
+ {
459
+ "No": "39",
460
+ "Category": "DI",
461
+ "Guideline": "No DI in UI",
462
+ "Description": "Inject in VM",
463
+ "Do": "Constructor inject",
464
+ "Don't": "Inject composable",
465
+ "Code Good": "Proper scope",
466
+ "Code Bad": "Wrong scope",
467
+ "Severity": "High",
468
+ "Docs URL": ""
469
+ },
470
+ {
471
+ "No": "40",
472
+ "Category": "Accessibility",
473
+ "Guideline": "Content description",
474
+ "Description": "Accessible UI",
475
+ "Do": "contentDescription",
476
+ "Don't": "Ignore a11y",
477
+ "Code Good": "Inclusive",
478
+ "Code Bad": "A11y fail",
479
+ "Severity": "Medium",
480
+ "Docs URL": "https://developer.android.com/jetpack/compose/accessibility"
481
+ },
482
+ {
483
+ "No": "41",
484
+ "Category": "Accessibility",
485
+ "Guideline": "Semantics",
486
+ "Description": "Use semantics API",
487
+ "Do": "Modifier.semantics",
488
+ "Don't": "None",
489
+ "Code Good": "Testable a11y",
490
+ "Code Bad": "Invisible",
491
+ "Severity": "Medium",
492
+ "Docs URL": ""
493
+ },
494
+ {
495
+ "No": "42",
496
+ "Category": "Animation",
497
+ "Guideline": "Compose animation APIs",
498
+ "Description": "Use animate*AsState",
499
+ "Do": "AnimatedVisibility",
500
+ "Don't": "Manual anim",
501
+ "Code Good": "Smooth",
502
+ "Code Bad": "Jank",
503
+ "Severity": "Medium",
504
+ "Docs URL": "https://developer.android.com/jetpack/compose/animation"
505
+ },
506
+ {
507
+ "No": "43",
508
+ "Category": "Animation",
509
+ "Guideline": "Avoid animation logic in VM",
510
+ "Description": "Animation is UI concern",
511
+ "Do": "Animate in UI",
512
+ "Don't": "Animate in VM",
513
+ "Code Good": "Correct layering",
514
+ "Code Bad": "Mixed concern",
515
+ "Severity": "Low",
516
+ "Docs URL": ""
517
+ },
518
+ {
519
+ "No": "44",
520
+ "Category": "Modularization",
521
+ "Guideline": "Feature-based UI modules",
522
+ "Description": "UI per feature",
523
+ "Do": ":feature:ui",
524
+ "Don't": "God module",
525
+ "Code Good": "Scalable",
526
+ "Code Bad": "Tight coupling",
527
+ "Severity": "High",
528
+ "Docs URL": "https://developer.android.com/topic/modularization"
529
+ },
530
+ {
531
+ "No": "45",
532
+ "Category": "Modularization",
533
+ "Guideline": "Public UI contracts",
534
+ "Description": "Expose minimal UI API",
535
+ "Do": "Interface/Route",
536
+ "Don't": "Expose impl",
537
+ "Code Good": "Encapsulated",
538
+ "Code Bad": "Leaky module",
539
+ "Severity": "Medium",
540
+ "Docs URL": ""
541
+ },
542
+ {
543
+ "No": "46",
544
+ "Category": "State",
545
+ "Guideline": "Snapshot state only",
546
+ "Description": "Use Compose state",
547
+ "Do": "mutableStateOf",
548
+ "Don't": "Custom observable",
549
+ "Code Good": "Compose aware",
550
+ "Code Bad": "Buggy UI",
551
+ "Severity": "Medium",
552
+ "Docs URL": ""
553
+ },
554
+ {
555
+ "No": "47",
556
+ "Category": "State",
557
+ "Guideline": "Avoid mutable collections",
558
+ "Description": "Immutable list/map",
559
+ "Do": "PersistentList",
560
+ "Don't": "MutableList",
561
+ "Code Good": "Stable UI",
562
+ "Code Bad": "Silent bug",
563
+ "Severity": "High",
564
+ "Docs URL": ""
565
+ },
566
+ {
567
+ "No": "48",
568
+ "Category": "Lifecycle",
569
+ "Guideline": "RememberCoroutineScope usage",
570
+ "Description": "Only for UI jobs",
571
+ "Do": "UI coroutine",
572
+ "Don't": "Long jobs",
573
+ "Code Good": "Scoped job",
574
+ "Code Bad": "Leak",
575
+ "Severity": "Medium",
576
+ "Docs URL": "https://developer.android.com/jetpack/compose/side-effects#remembercoroutinescope"
577
+ },
578
+ {
579
+ "No": "49",
580
+ "Category": "Interop",
581
+ "Guideline": "Interop View carefully",
582
+ "Description": "Use AndroidView",
583
+ "Do": "Isolated usage",
584
+ "Don't": "Mix everywhere",
585
+ "Code Good": "Safe interop",
586
+ "Code Bad": "Messy UI",
587
+ "Severity": "Low",
588
+ "Docs URL": "https://developer.android.com/jetpack/compose/interop"
589
+ },
590
+ {
591
+ "No": "50",
592
+ "Category": "Interop",
593
+ "Guideline": "Avoid legacy patterns",
594
+ "Description": "No LiveData in UI",
595
+ "Do": "StateFlow",
596
+ "Don't": "LiveData",
597
+ "Code Good": "Modern stack",
598
+ "Code Bad": "Legacy debt",
599
+ "Severity": "Medium",
600
+ "Docs URL": ""
601
+ },
602
+ {
603
+ "No": "51",
604
+ "Category": "Debug",
605
+ "Guideline": "Use layout inspector",
606
+ "Description": "Inspect recomposition",
607
+ "Do": "Tools",
608
+ "Don't": "Blind debug",
609
+ "Code Good": "Fast debug",
610
+ "Code Bad": "Guessing",
611
+ "Severity": "Low",
612
+ "Docs URL": "https://developer.android.com/studio/debug/layout-inspector"
613
+ },
614
+ {
615
+ "No": "52",
616
+ "Category": "Debug",
617
+ "Guideline": "Enable recomposition counts",
618
+ "Description": "Track recomposition",
619
+ "Do": "Debug flags",
620
+ "Don't": "Ignore",
621
+ "Code Good": "Performance aware",
622
+ "Code Bad": "Hidden jank",
623
+ "Severity": "Low",
624
+ "Docs URL": ""
625
+ }
626
+ ]