@biggora/claude-plugins 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -4
- package/package.json +1 -1
- package/registry/registry.json +319 -244
- package/specs/coding.md +24 -0
- package/specs/pod.md +2 -0
- package/src/skills/captcha/README.md +221 -0
- package/src/skills/captcha/SKILL.md +355 -0
- package/src/skills/captcha/references/captcha-types.md +254 -0
- package/src/skills/captcha/references/services.md +172 -0
- package/src/skills/captcha/references/stealth.md +238 -0
- package/src/skills/captcha/scripts/solve_captcha.py +323 -0
- package/src/skills/captcha/scripts/solve_image_grid.py +350 -0
- package/src/skills/google-merchant-api/SKILL.md +581 -0
- package/src/skills/google-merchant-api/references/accounts.md +247 -0
- package/src/skills/google-merchant-api/references/content-api-legacy.md +216 -0
- package/src/skills/google-merchant-api/references/datasources.md +233 -0
- package/src/skills/google-merchant-api/references/inventories.md +201 -0
- package/src/skills/google-merchant-api/references/migration.md +267 -0
- package/src/skills/google-merchant-api/references/products.md +316 -0
- package/src/skills/google-merchant-api/references/promotions.md +201 -0
- package/src/skills/google-merchant-api/references/reports.md +240 -0
- package/src/skills/lv-aggregators-api/SKILL.md +113 -0
- package/src/skills/lv-aggregators-api/references/integration-guide.md +368 -0
- package/src/skills/lv-aggregators-api/references/kurpirkt.md +103 -0
- package/src/skills/lv-aggregators-api/references/salidzini.md +122 -0
- package/src/skills/tailwindcss-best-practices/SKILL.md +180 -0
- package/src/skills/tailwindcss-best-practices/references/best-practices-utility-patterns.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/core-installation.md +109 -0
- package/src/skills/tailwindcss-best-practices/references/core-preflight.md +200 -0
- package/src/skills/tailwindcss-best-practices/references/core-responsive.md +163 -0
- package/src/skills/tailwindcss-best-practices/references/core-source-detection.md +114 -0
- package/src/skills/tailwindcss-best-practices/references/core-theme.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/core-utility-classes.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/core-variants.md +204 -0
- package/src/skills/tailwindcss-best-practices/references/effects-form-controls.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/effects-mask.md +91 -0
- package/src/skills/tailwindcss-best-practices/references/effects-scroll-snap.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/effects-text-shadow.md +78 -0
- package/src/skills/tailwindcss-best-practices/references/effects-transition-animation.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/effects-visibility-interactivity.md +82 -0
- package/src/skills/tailwindcss-best-practices/references/features-content-detection.md +175 -0
- package/src/skills/tailwindcss-best-practices/references/features-custom-styles.md +203 -0
- package/src/skills/tailwindcss-best-practices/references/features-dark-mode.md +137 -0
- package/src/skills/tailwindcss-best-practices/references/features-functions-directives.md +241 -0
- package/src/skills/tailwindcss-best-practices/references/features-upgrade.md +160 -0
- package/src/skills/tailwindcss-best-practices/references/layout-aspect-ratio.md +39 -0
- package/src/skills/tailwindcss-best-practices/references/layout-columns.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/layout-display.md +110 -0
- package/src/skills/tailwindcss-best-practices/references/layout-flexbox.md +112 -0
- package/src/skills/tailwindcss-best-practices/references/layout-grid.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/layout-height.md +97 -0
- package/src/skills/tailwindcss-best-practices/references/layout-inset.md +103 -0
- package/src/skills/tailwindcss-best-practices/references/layout-logical-properties.md +92 -0
- package/src/skills/tailwindcss-best-practices/references/layout-margin.md +126 -0
- package/src/skills/tailwindcss-best-practices/references/layout-min-max-sizing.md +63 -0
- package/src/skills/tailwindcss-best-practices/references/layout-object-fit-position.md +64 -0
- package/src/skills/tailwindcss-best-practices/references/layout-overflow.md +57 -0
- package/src/skills/tailwindcss-best-practices/references/layout-padding.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/layout-position.md +85 -0
- package/src/skills/tailwindcss-best-practices/references/layout-tables.md +67 -0
- package/src/skills/tailwindcss-best-practices/references/layout-width.md +102 -0
- package/src/skills/tailwindcss-best-practices/references/transform-base.md +68 -0
- package/src/skills/tailwindcss-best-practices/references/transform-rotate.md +70 -0
- package/src/skills/tailwindcss-best-practices/references/transform-scale.md +83 -0
- package/src/skills/tailwindcss-best-practices/references/transform-skew.md +62 -0
- package/src/skills/tailwindcss-best-practices/references/transform-translate.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/typography-font-text.md +142 -0
- package/src/skills/tailwindcss-best-practices/references/typography-list-style.md +65 -0
- package/src/skills/tailwindcss-best-practices/references/typography-text-align.md +60 -0
- package/src/skills/tailwindcss-best-practices/references/visual-background.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/visual-border.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/visual-effects.md +111 -0
- package/src/skills/tailwindcss-best-practices/references/visual-svg.md +82 -0
- package/src/skills/test-mobile-app/SKILL.md +11 -6
- package/src/skills/test-mobile-app/scripts/analyze_apk.py +15 -4
- package/src/skills/test-mobile-app/scripts/check_environment.py +5 -5
- package/src/skills/test-mobile-app/scripts/run_tests.py +1 -1
- package/src/skills/test-web-ui/SKILL.md +264 -84
- package/src/skills/test-web-ui/scripts/discover.py +25 -12
- package/src/skills/test-web-ui/scripts/run_tests.py +3 -2
- package/src/skills/vite-best-practices/SKILL.md +115 -0
- package/src/skills/vite-best-practices/references/build-and-ssr.md +255 -0
- package/src/skills/vite-best-practices/references/core-config.md +231 -0
- package/src/skills/vite-best-practices/references/core-features.md +222 -0
- package/src/skills/vite-best-practices/references/core-plugin-api.md +294 -0
- package/src/skills/vite-best-practices/references/environment-api.md +108 -0
- package/src/skills/vite-best-practices/references/rolldown-migration.md +242 -0
- package/codex-cli-workspace/iteration-1/benchmark.json +0 -122
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/outputs/response.md +0 -163
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/outputs/response.md +0 -151
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -86
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/outputs/response.md +0 -130
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/grading.json +0 -64
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/outputs/response.md +0 -209
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-1/benchmark.json +0 -86
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/outputs/response.md +0 -401
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/outputs/response.md +0 -405
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -212
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -427
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -171
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -199
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-2/benchmark.json +0 -173
- package/gemini-cli-workspace/iteration-2/benchmark.md +0 -28
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/outputs/response.md +0 -195
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/outputs/response.md +0 -377
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -127
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -91
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -112
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-viewer.html +0 -1325
- package/screen-recording-workspace/evals.json +0 -41
- package/screen-recording-workspace/iteration-1/benchmark.json +0 -102
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/record_screen.py +0 -67
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/review.html +0 -1325
- package/src/skills/codex-cli/evals/evals.json +0 -47
- package/src/skills/gemini-cli/evals/evals.json +0 -46
- package/src/skills/tm-search/evals/evals.json +0 -23
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typography-list-style
|
|
3
|
+
description: Controlling list marker style and position with list-style-type and list-style-position
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# List Style
|
|
7
|
+
|
|
8
|
+
Utilities for controlling the marker style and position of list items.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### List style type
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<ul class="list-disc">
|
|
16
|
+
<li>Disc bullets (default for ul)</li>
|
|
17
|
+
</ul>
|
|
18
|
+
|
|
19
|
+
<ol class="list-decimal">
|
|
20
|
+
<li>Decimal numbers (default for ol)</li>
|
|
21
|
+
</ol>
|
|
22
|
+
|
|
23
|
+
<ul class="list-none">
|
|
24
|
+
<li>No markers (often with custom bullets via before/after)</li>
|
|
25
|
+
</ul>
|
|
26
|
+
|
|
27
|
+
<!-- Custom value -->
|
|
28
|
+
<ol class="list-[upper-roman]">Roman numerals</ol>
|
|
29
|
+
<ul class="list-(--my-marker)">Custom property</ul>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### List style position
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<!-- Bullets inside content flow -->
|
|
36
|
+
<ul class="list-inside list-disc">
|
|
37
|
+
<li>5 cups chopped Porcini mushrooms</li>
|
|
38
|
+
</ul>
|
|
39
|
+
|
|
40
|
+
<!-- Bullets outside content flow (default) -->
|
|
41
|
+
<ul class="list-outside list-disc">
|
|
42
|
+
<li>5 cups chopped Porcini mushrooms</li>
|
|
43
|
+
</ul>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Responsive
|
|
47
|
+
|
|
48
|
+
```html
|
|
49
|
+
<ul class="list-none md:list-disc md:list-outside">...</ul>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Key Points
|
|
53
|
+
|
|
54
|
+
- `list-disc` - disc bullets (ul default)
|
|
55
|
+
- `list-decimal` - decimal numbers (ol default)
|
|
56
|
+
- `list-none` - no markers
|
|
57
|
+
- Custom: `list-[upper-roman]`, `list-[lower-alpha]`, `list-(--var)`
|
|
58
|
+
- `list-inside` - markers inside content box
|
|
59
|
+
- `list-outside` - markers outside content box (default)
|
|
60
|
+
|
|
61
|
+
<!--
|
|
62
|
+
Source references:
|
|
63
|
+
- https://tailwindcss.com/docs/list-style-type
|
|
64
|
+
- https://tailwindcss.com/docs/list-style-position
|
|
65
|
+
-->
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typography-text-align
|
|
3
|
+
description: Controlling text alignment with left, center, right, justify, and logical properties
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Text Align
|
|
7
|
+
|
|
8
|
+
Utilities for controlling the alignment of text.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### Basic alignment
|
|
13
|
+
|
|
14
|
+
Use `text-left`, `text-center`, `text-right`, `text-justify`:
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<p class="text-left">Left aligned</p>
|
|
18
|
+
<p class="text-center">Center aligned</p>
|
|
19
|
+
<p class="text-right">Right aligned</p>
|
|
20
|
+
<p class="text-justify">Justified text</p>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Logical properties
|
|
24
|
+
|
|
25
|
+
Use `text-start` and `text-end` for RTL-aware alignment:
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<div dir="ltr">
|
|
29
|
+
<p class="text-start">Left in LTR</p>
|
|
30
|
+
<p class="text-end">Right in LTR</p>
|
|
31
|
+
</div>
|
|
32
|
+
<div dir="rtl">
|
|
33
|
+
<p class="text-start">Right in RTL</p>
|
|
34
|
+
<p class="text-end">Left in RTL</p>
|
|
35
|
+
</div>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Responsive alignment
|
|
39
|
+
|
|
40
|
+
```html
|
|
41
|
+
<p class="text-left md:text-center lg:text-right">
|
|
42
|
+
Responsive alignment
|
|
43
|
+
</p>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Key Points
|
|
47
|
+
|
|
48
|
+
- `text-left` - aligns to left edge
|
|
49
|
+
- `text-center` - centers text
|
|
50
|
+
- `text-right` - aligns to right edge
|
|
51
|
+
- `text-justify` - justifies text (spaces words evenly)
|
|
52
|
+
- `text-start` - aligns to start (left in LTR, right in RTL)
|
|
53
|
+
- `text-end` - aligns to end (right in LTR, left in RTL)
|
|
54
|
+
- Use logical properties (`text-start`, `text-end`) for internationalization
|
|
55
|
+
- Common pattern: `text-center` for headings, `text-left` for body text
|
|
56
|
+
|
|
57
|
+
<!--
|
|
58
|
+
Source references:
|
|
59
|
+
- https://tailwindcss.com/docs/text-align
|
|
60
|
+
-->
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-background
|
|
3
|
+
description: Background color, gradient, image, and attachment utilities
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Background
|
|
7
|
+
|
|
8
|
+
Utilities for background color, gradients, images, and attachment.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### Background color
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div class="bg-white">White</div>
|
|
16
|
+
<div class="bg-gray-100">Light gray</div>
|
|
17
|
+
<div class="bg-blue-500">Blue</div>
|
|
18
|
+
<div class="bg-sky-500/50">50% opacity</div>
|
|
19
|
+
<div class="bg-[#1da1f2]">Arbitrary</div>
|
|
20
|
+
<div class="bg-(--my-bg)">CSS variable</div>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Color palette follows theme (red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose, slate, gray, zinc, neutral, stone).
|
|
24
|
+
|
|
25
|
+
### Background image and gradient
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<div class="bg-gradient-to-r from-blue-500 to-purple-600">Linear gradient</div>
|
|
29
|
+
<div class="bg-gradient-to-br from-indigo-500 via-purple-500 to-pink-500">Multi-stop</div>
|
|
30
|
+
|
|
31
|
+
<div class="bg-[url('/img/hero.jpg')]">Image</div>
|
|
32
|
+
<div class="bg-[url('/img/hero.jpg')] bg-cover bg-center">Image with size/position</div>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Gradient directions: `to-t`, `to-tr`, `to-r`, `to-br`, `to-b`, `to-bl`, `to-l`, `to-tl`.
|
|
36
|
+
|
|
37
|
+
### Background size and position
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<div class="bg-auto">auto</div>
|
|
41
|
+
<div class="bg-cover">cover</div>
|
|
42
|
+
<div class="bg-contain">contain</div>
|
|
43
|
+
|
|
44
|
+
<div class="bg-center">center</div>
|
|
45
|
+
<div class="bg-top">top</div>
|
|
46
|
+
<div class="bg-bottom">bottom</div>
|
|
47
|
+
<div class="bg-left">left</div>
|
|
48
|
+
<div class="bg-right">right</div>
|
|
49
|
+
<div class="bg-[position:2rem_2rem]">Arbitrary</div>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Background repeat and attachment
|
|
53
|
+
|
|
54
|
+
```html
|
|
55
|
+
<div class="bg-repeat">repeat (default)</div>
|
|
56
|
+
<div class="bg-no-repeat">no-repeat</div>
|
|
57
|
+
<div class="bg-repeat-x">repeat-x</div>
|
|
58
|
+
|
|
59
|
+
<div class="bg-fixed">fixed (parallax)</div>
|
|
60
|
+
<div class="bg-local">local</div>
|
|
61
|
+
<div class="bg-scroll">scroll</div>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Key Points
|
|
65
|
+
|
|
66
|
+
- Colors: `bg-{color}-{shade}`, opacity `/50`, arbitrary `bg-[#hex]`
|
|
67
|
+
- Gradients: `bg-gradient-to-{dir}`, `from-*`, `via-*`, `to-*`
|
|
68
|
+
- Image: `bg-[url('...')]`, `bg-cover`, `bg-center`, etc.
|
|
69
|
+
- Size: `bg-auto`, `bg-cover`, `bg-contain`
|
|
70
|
+
- Position: `bg-center`, `bg-top`, `bg-[position:...]`
|
|
71
|
+
|
|
72
|
+
<!--
|
|
73
|
+
Source references:
|
|
74
|
+
- https://tailwindcss.com/docs/background-color
|
|
75
|
+
- https://tailwindcss.com/docs/background-image
|
|
76
|
+
-->
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-border
|
|
3
|
+
description: Border width, color, style, and border radius
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Border
|
|
7
|
+
|
|
8
|
+
Utilities for border width, color, style, and radius.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### Border width
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div class="border">1px all sides</div>
|
|
16
|
+
<div class="border-2">2px</div>
|
|
17
|
+
<div class="border-0">No border</div>
|
|
18
|
+
|
|
19
|
+
<div class="border-t border-r border-b border-l">Per side</div>
|
|
20
|
+
<div class="border-x-2">Horizontal</div>
|
|
21
|
+
<div class="border-y">Vertical</div>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Border color
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<div class="border border-gray-300">Gray border</div>
|
|
28
|
+
<div class="border-2 border-blue-500">Blue</div>
|
|
29
|
+
<div class="border border-red-500/50">With opacity</div>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Border style
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<div class="border border-solid">Solid (default)</div>
|
|
36
|
+
<div class="border border-dashed">Dashed</div>
|
|
37
|
+
<div class="border border-dotted">Dotted</div>
|
|
38
|
+
<div class="border border-double">Double</div>
|
|
39
|
+
<div class="border border-none">None</div>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Border radius
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<div class="rounded">Small (default)</div>
|
|
46
|
+
<div class="rounded-sm">2px</div>
|
|
47
|
+
<div class="rounded-md">6px</div>
|
|
48
|
+
<div class="rounded-lg">8px</div>
|
|
49
|
+
<div class="rounded-xl">12px</div>
|
|
50
|
+
<div class="rounded-2xl">16px</div>
|
|
51
|
+
<div class="rounded-full">Pill/circle</div>
|
|
52
|
+
<div class="rounded-none">0</div>
|
|
53
|
+
|
|
54
|
+
<div class="rounded-t-lg rounded-b-none">Per corner</div>
|
|
55
|
+
<div class="rounded-s-md rounded-e-xl">Logical (start/end)</div>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Divide (between children)
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<div class="divide-y divide-gray-200">
|
|
62
|
+
<div>Item 1</div>
|
|
63
|
+
<div>Item 2</div>
|
|
64
|
+
<div>Item 3</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="divide-x divide-gray-300 flex">
|
|
67
|
+
<div>Col 1</div>
|
|
68
|
+
<div>Col 2</div>
|
|
69
|
+
</div>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Ring (focus outline)
|
|
73
|
+
|
|
74
|
+
```html
|
|
75
|
+
<button class="ring-2 ring-blue-500 ring-offset-2">Ring</button>
|
|
76
|
+
<button class="focus:ring-3 focus:ring-blue-500">Focus ring</button>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Outline
|
|
80
|
+
|
|
81
|
+
Separate from border; used for focus states. In v4: `outline` = 1px; `outline-2`, `outline-4` for width. Use `outline-offset-2` for offset.
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<button class="outline outline-offset-2 outline-sky-500">Outline</button>
|
|
85
|
+
<button class="focus:outline-2 focus:outline-cyan-500">Focus outline</button>
|
|
86
|
+
<!-- Accessibility: invisible but visible in forced-colors -->
|
|
87
|
+
<button class="focus:outline-hidden">Focus outline-hidden</button>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
v4: `outline-none` = `outline-style: none`; `outline-hidden` = invisible but shows in forced-colors mode.
|
|
91
|
+
|
|
92
|
+
## Key Points
|
|
93
|
+
|
|
94
|
+
- Width: `border`, `border-{0,2,4,8}`, `border-{t,r,b,l,x,y}`
|
|
95
|
+
- Color: `border-{color}`, opacity modifier
|
|
96
|
+
- Radius: `rounded-{size}`, `rounded-full`, `rounded-{t,r,b,l,s,e}-*`, logical `rounded-s-*`, `rounded-e-*`
|
|
97
|
+
- Divide: `divide-{x,y}`, `divide-{color}` for borders between flex/grid children
|
|
98
|
+
- Ring: `ring`, `ring-{n}`, `ring-{color}`, `ring-offset-{n}` (v4 default ring = 1px; use `ring-3` for 3px)
|
|
99
|
+
- Outline: `outline`, `outline-{n}`, `outline-{color}`, `outline-offset-{n}`, `outline-hidden`, `outline-none`
|
|
100
|
+
|
|
101
|
+
<!--
|
|
102
|
+
Source references:
|
|
103
|
+
- https://tailwindcss.com/docs/border-width
|
|
104
|
+
- https://tailwindcss.com/docs/border-color
|
|
105
|
+
- https://tailwindcss.com/docs/border-radius
|
|
106
|
+
- https://tailwindcss.com/docs/divide-width
|
|
107
|
+
- https://tailwindcss.com/docs/ring-width
|
|
108
|
+
-->
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-effects
|
|
3
|
+
description: Box shadow, opacity, mix-blend, and filter effects
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Effects
|
|
7
|
+
|
|
8
|
+
Utilities for box shadow, opacity, mix-blend, and filters.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### Box shadow
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<div class="shadow-sm">Small</div>
|
|
16
|
+
<div class="shadow">Default</div>
|
|
17
|
+
<div class="shadow-md">Medium</div>
|
|
18
|
+
<div class="shadow-lg">Large</div>
|
|
19
|
+
<div class="shadow-xl">Extra large</div>
|
|
20
|
+
<div class="shadow-2xl">2xl</div>
|
|
21
|
+
<div class="shadow-none">None</div>
|
|
22
|
+
|
|
23
|
+
<div class="shadow-lg shadow-blue-500/50">Colored shadow</div>
|
|
24
|
+
<div class="shadow-[0_0_15px_rgba(0,0,0,0.2)]">Arbitrary</div>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Opacity
|
|
28
|
+
|
|
29
|
+
```html
|
|
30
|
+
<div class="opacity-0">Invisible</div>
|
|
31
|
+
<div class="opacity-50">50%</div>
|
|
32
|
+
<div class="opacity-100">Full</div>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Mix blend mode
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<div class="mix-blend-normal">Normal</div>
|
|
39
|
+
<div class="mix-blend-multiply">Multiply</div>
|
|
40
|
+
<div class="mix-blend-screen">Screen</div>
|
|
41
|
+
<div class="mix-blend-overlay">Overlay</div>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Backdrop blur and filter
|
|
45
|
+
|
|
46
|
+
```html
|
|
47
|
+
<div class="backdrop-blur-sm">Blur backdrop</div>
|
|
48
|
+
<div class="backdrop-blur-md">Medium blur</div>
|
|
49
|
+
<div class="backdrop-blur-none">No blur</div>
|
|
50
|
+
|
|
51
|
+
<div class="backdrop-opacity-50">Backdrop opacity</div>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Filter (blur, brightness, contrast, etc.)
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<div class="blur-sm">Blur</div>
|
|
58
|
+
<div class="brightness-90">Brightness</div>
|
|
59
|
+
<div class="contrast-125">Contrast</div>
|
|
60
|
+
<div class="grayscale">Grayscale</div>
|
|
61
|
+
<div class="invert">Invert</div>
|
|
62
|
+
<div class="sepia">Sepia</div>
|
|
63
|
+
<div class="blur-none">No filter</div>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Object fit (images/video)
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<img class="object-contain" /> <!-- Fit within bounds -->
|
|
70
|
+
<img class="object-cover" /> <!-- Cover area, may crop -->
|
|
71
|
+
<img class="object-fill" /> <!-- Stretch -->
|
|
72
|
+
<img class="object-none" /> <!-- No resize -->
|
|
73
|
+
<img class="object-scale-down" /> <!-- contain or none, whichever is smaller -->
|
|
74
|
+
<img class="object-top object-cover" /> <!-- Position -->
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Drop shadow with colors (v4.1+)
|
|
78
|
+
|
|
79
|
+
```html
|
|
80
|
+
<svg class="drop-shadow-xl drop-shadow-cyan-500/50">Logo</svg>
|
|
81
|
+
<img class="drop-shadow-lg drop-shadow-blue-500">Image</img>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Drop shadows can now take color utilities and opacity modifiers, just like box shadows.
|
|
85
|
+
|
|
86
|
+
### Shadow opacity modifiers (v4.1+)
|
|
87
|
+
|
|
88
|
+
All shadow types support opacity modifiers:
|
|
89
|
+
|
|
90
|
+
```html
|
|
91
|
+
<div class="shadow-lg/50">50% opacity box shadow</div>
|
|
92
|
+
<div class="drop-shadow-xl/75">75% opacity drop shadow</div>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Key Points
|
|
96
|
+
|
|
97
|
+
- Shadow: `shadow-{size}`, `shadow-{color}/opacity`, `shadow-none`
|
|
98
|
+
- Shadow opacity: `shadow-lg/50` (v4.1+)
|
|
99
|
+
- Drop shadow colors: `drop-shadow-{color}`, `drop-shadow-{color}/{opacity}` (v4.1+)
|
|
100
|
+
- Opacity: `opacity-{0-100}`
|
|
101
|
+
- Mix blend: `mix-blend-{mode}`
|
|
102
|
+
- Backdrop: `backdrop-blur-*`, `backdrop-opacity-*`
|
|
103
|
+
- Filter: `blur-*`, `brightness-*`, `contrast-*`, `grayscale`, `invert`, `sepia`
|
|
104
|
+
- **v4 scale shift**: v3's `shadow` → v4's `shadow-sm`, v3's `shadow-sm` → v4's `shadow-xs`
|
|
105
|
+
|
|
106
|
+
<!--
|
|
107
|
+
Source references:
|
|
108
|
+
- https://tailwindcss.com/docs/box-shadow
|
|
109
|
+
- https://tailwindcss.com/docs/opacity
|
|
110
|
+
- https://tailwindcss.com/docs/backdrop-blur
|
|
111
|
+
-->
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-svg
|
|
3
|
+
description: Styling SVG elements with fill, stroke, and stroke-width utilities
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SVG Styling
|
|
7
|
+
|
|
8
|
+
Utilities for styling SVG fill and stroke. Essential when working with icon sets like Heroicons.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### Fill
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<!-- Theme colors -->
|
|
16
|
+
<svg class="fill-blue-500">...</svg>
|
|
17
|
+
<svg class="fill-indigo-500 hover:fill-indigo-600">...</svg>
|
|
18
|
+
|
|
19
|
+
<!-- Inherit from text color -->
|
|
20
|
+
<button class="text-indigo-600 hover:text-white">
|
|
21
|
+
<svg class="size-5 fill-current">...</svg>
|
|
22
|
+
Check for updates
|
|
23
|
+
</button>
|
|
24
|
+
|
|
25
|
+
<!-- Special values -->
|
|
26
|
+
<svg class="fill-none">...</svg>
|
|
27
|
+
<svg class="fill-inherit">...</svg>
|
|
28
|
+
<svg class="fill-transparent">...</svg>
|
|
29
|
+
|
|
30
|
+
<!-- Custom -->
|
|
31
|
+
<svg class="fill-[#243c5a]">...</svg>
|
|
32
|
+
<svg class="fill-(--my-fill)">...</svg>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Stroke
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<!-- Theme colors -->
|
|
39
|
+
<svg class="stroke-cyan-500" fill="none">...</svg>
|
|
40
|
+
|
|
41
|
+
<!-- Inherit from text -->
|
|
42
|
+
<button class="text-pink-600 hover:text-white">
|
|
43
|
+
<svg class="size-5 stroke-current" fill="none">...</svg>
|
|
44
|
+
Download
|
|
45
|
+
</button>
|
|
46
|
+
|
|
47
|
+
<!-- Special values -->
|
|
48
|
+
<svg class="stroke-none stroke-inherit stroke-transparent">...</svg>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Stroke width
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<svg class="stroke-1">Thin stroke</svg>
|
|
55
|
+
<svg class="stroke-2">Medium stroke</svg>
|
|
56
|
+
<svg class="stroke-[1.5]">Custom width</svg>
|
|
57
|
+
<svg class="stroke-(length:--my-stroke)">Custom property</svg>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Combined
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<svg class="size-6 fill-blue-500 stroke-blue-700 stroke-2" fill="none">
|
|
64
|
+
<!-- Outlined icon with colored stroke -->
|
|
65
|
+
</svg>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Key Points
|
|
69
|
+
|
|
70
|
+
- `fill-*` / `stroke-*` - all theme colors (e.g. `fill-red-500`)
|
|
71
|
+
- `fill-current` / `stroke-current` - use current text color (common for icons in buttons)
|
|
72
|
+
- `fill-none` / `stroke-none` - no fill/stroke
|
|
73
|
+
- `stroke-1`, `stroke-2`, etc. - stroke width (number = px)
|
|
74
|
+
- Custom: `fill-[#hex]`, `stroke-(--var)`, `stroke-[1.5]`
|
|
75
|
+
- Use with variants: `hover:fill-blue-600`, `md:stroke-2`
|
|
76
|
+
|
|
77
|
+
<!--
|
|
78
|
+
Source references:
|
|
79
|
+
- https://tailwindcss.com/docs/fill
|
|
80
|
+
- https://tailwindcss.com/docs/stroke
|
|
81
|
+
- https://tailwindcss.com/docs/stroke-width
|
|
82
|
+
-->
|
|
@@ -151,15 +151,20 @@ python3 scripts/run_tests.py --apk path/to/app.apk --device emulator-5554 --outp
|
|
|
151
151
|
|
|
152
152
|
### Test Execution Without Emulator (Static Mode)
|
|
153
153
|
|
|
154
|
-
If no emulator is available
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
If no emulator is available (which is common — most users won't have Appium set up),
|
|
155
|
+
Claude can still provide significant value:
|
|
156
|
+
1. Analyze source code / screenshots / APK statically
|
|
157
|
+
2. Generate use cases and write all test scenarios
|
|
157
158
|
3. Mark execution status as `MANUAL_REQUIRED`
|
|
158
|
-
4. Generate a report with all test cases ready to be run manually
|
|
159
|
+
4. Generate a comprehensive report with all test cases ready to be run manually
|
|
160
|
+
5. Provide step-by-step manual testing instructions the user can follow
|
|
161
|
+
|
|
162
|
+
This is the **most common execution path** — don't treat it as a fallback.
|
|
163
|
+
Make the static report just as polished and detailed as the automated one.
|
|
159
164
|
|
|
160
165
|
Use `--static` flag:
|
|
161
166
|
```bash
|
|
162
|
-
python3 scripts/run_tests.py --static --output results/
|
|
167
|
+
python3 scripts/run_tests.py --static --tests tests.json --output results/
|
|
163
168
|
```
|
|
164
169
|
|
|
165
170
|
---
|
|
@@ -208,5 +213,5 @@ Read `references/report-template.md` for report structure details.
|
|
|
208
213
|
- **Locators**: Prefer `accessibility id` > `resource-id` > `xpath`. Never use index-based xpath.
|
|
209
214
|
- **Waits**: Always use explicit waits (`WebDriverWait`), never `time.sleep`.
|
|
210
215
|
- **Screenshots**: Capture on every assertion failure automatically.
|
|
211
|
-
- **Crash detection**: After every interaction, check for crash dialogs (`scripts/
|
|
216
|
+
- **Crash detection**: After every interaction, check for crash dialogs (the `check_for_crash()` function in `scripts/run_tests.py` handles this automatically).
|
|
212
217
|
- **Language**: Generate use cases and reports in the language the user is using.
|
|
@@ -50,10 +50,21 @@ def analyze_apk(apk_path: str) -> dict:
|
|
|
50
50
|
|
|
51
51
|
# String resources (sample)
|
|
52
52
|
try:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
# Try modern androguard API first, fall back to legacy
|
|
54
|
+
try:
|
|
55
|
+
from androguard.core.axml import AXMLPrinter
|
|
56
|
+
res_parser = apk.get_android_resources()
|
|
57
|
+
if res_parser:
|
|
58
|
+
strings = res_parser.get_resolved_strings()
|
|
59
|
+
if strings:
|
|
60
|
+
for lang_strings in strings.values():
|
|
61
|
+
result["strings_sample"] = list(lang_strings.values())[:30]
|
|
62
|
+
break
|
|
63
|
+
except (ImportError, AttributeError):
|
|
64
|
+
# Fallback: extract string-like values from manifest
|
|
65
|
+
manifest_xml = apk.get_android_manifest_xml()
|
|
66
|
+
if manifest_xml is not None:
|
|
67
|
+
result["strings_sample"] = []
|
|
57
68
|
except Exception:
|
|
58
69
|
pass
|
|
59
70
|
|
|
@@ -44,11 +44,12 @@ def check_appium_python():
|
|
|
44
44
|
|
|
45
45
|
def check_python_deps():
|
|
46
46
|
missing = []
|
|
47
|
-
|
|
47
|
+
pkg_map = {"pytest": "pytest", "jinja2": "jinja2", "PIL": "pillow"}
|
|
48
|
+
for import_name, install_name in pkg_map.items():
|
|
48
49
|
try:
|
|
49
|
-
__import__(
|
|
50
|
+
__import__(import_name)
|
|
50
51
|
except ImportError:
|
|
51
|
-
missing.append(
|
|
52
|
+
missing.append(install_name)
|
|
52
53
|
if missing:
|
|
53
54
|
raise RuntimeError(f"Missing packages: {missing}. Run: pip install {' '.join(missing)} --break-system-packages")
|
|
54
55
|
return "All Python deps OK"
|
|
@@ -66,12 +67,11 @@ def check_avd():
|
|
|
66
67
|
def main():
|
|
67
68
|
checks = [
|
|
68
69
|
("ADB", check_adb),
|
|
69
|
-
("Android
|
|
70
|
+
("Android Virtual Devices", check_avd),
|
|
70
71
|
("Connected Device/Emulator", check_emulator),
|
|
71
72
|
("Appium Server", check_appium_server),
|
|
72
73
|
("Appium Python Client", check_appium_python),
|
|
73
74
|
("Python Dependencies", check_python_deps),
|
|
74
|
-
("Android Virtual Devices", check_avd),
|
|
75
75
|
]
|
|
76
76
|
|
|
77
77
|
print("\n🔍 MOBILE TESTING ENVIRONMENT CHECK")
|