flutter-skill 0.8.0 → 0.8.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 +197 -227
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,67 +1,66 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<
|
|
2
|
+
<a href="https://github.com/ai-dashboad/flutter-skill">
|
|
3
|
+
<img src="assets/demo-teaser.gif" alt="AI testing a TikTok clone across 8 platforms" width="640">
|
|
4
|
+
</a>
|
|
3
5
|
</p>
|
|
4
6
|
|
|
5
7
|
<h1 align="center">flutter-skill</h1>
|
|
6
8
|
|
|
7
9
|
<p align="center">
|
|
8
|
-
<strong>Give
|
|
9
|
-
|
|
10
|
+
<strong>Give any AI agent eyes and hands inside any running app.</strong><br>
|
|
11
|
+
8 platforms. Zero test code. One MCP server.
|
|
10
12
|
</p>
|
|
11
13
|
|
|
12
14
|
<p align="center">
|
|
15
|
+
<a href="https://github.com/ai-dashboad/flutter-skill/stargazers"><img src="https://img.shields.io/github/stars/ai-dashboad/flutter-skill?style=flat&color=yellow" alt="Stars"></a>
|
|
13
16
|
<a href="https://pub.dev/packages/flutter_skill"><img src="https://img.shields.io/pub/v/flutter_skill.svg" alt="pub.dev"></a>
|
|
14
17
|
<a href="https://www.npmjs.com/package/flutter-skill"><img src="https://img.shields.io/npm/v/flutter-skill.svg" alt="npm"></a>
|
|
15
18
|
<a href="https://github.com/ai-dashboad/flutter-skill/actions"><img src="https://img.shields.io/github/actions/workflow/status/ai-dashboad/flutter-skill/ci.yml?label=tests" alt="CI"></a>
|
|
16
|
-
<a href="https://github.com/ai-dashboad/flutter-skill/stargazers"><img src="https://img.shields.io/github/stars/ai-dashboad/flutter-skill?style=social" alt="Stars"></a>
|
|
17
19
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License"></a>
|
|
18
|
-
<a href="https://skills.sh/ai-dashboad/flutter-skill/flutter-skill-testing"><img src="https://img.shields.io/badge/skills.sh-agent%20skill-black" alt="Agent Skill"></a>
|
|
19
20
|
</p>
|
|
20
21
|
|
|
21
22
|
<p align="center">
|
|
23
|
+
<a href="#30-second-demo">Demo</a> •
|
|
22
24
|
<a href="#quick-start">Quick Start</a> •
|
|
23
|
-
<a href="#platforms">Platforms</a> •
|
|
24
|
-
<a href="#
|
|
25
|
-
<a href="#install">Install</a> •
|
|
25
|
+
<a href="#8-platforms-one-tool">Platforms</a> •
|
|
26
|
+
<a href="#why-not-playwright--appium--detox">vs Others</a> •
|
|
26
27
|
<a href="docs/USAGE_GUIDE.md">Docs</a>
|
|
27
28
|
</p>
|
|
28
29
|
|
|
29
30
|
---
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
<strong>🎬 AI tests a full TikTok clone — 28 actions, zero test code</strong>
|
|
33
|
-
</p>
|
|
32
|
+
## 30-Second Demo
|
|
34
33
|
|
|
35
34
|
https://github.com/user-attachments/assets/d4617c73-043f-424c-9a9a-1a61d4c2d3c6
|
|
36
35
|
|
|
36
|
+
> **One prompt. 28 AI-driven actions. Zero test code.** The AI explores a TikTok clone, navigates tabs, scrolls feeds, tests search, fills forms — all autonomously.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Why This Exists
|
|
41
|
+
|
|
42
|
+
Writing E2E tests is painful. Maintaining them is worse.
|
|
43
|
+
|
|
44
|
+
**flutter-skill** connects your AI agent (Claude, Cursor, Windsurf, Copilot, OpenClaw) directly to your running app via [MCP](https://modelcontextprotocol.io/). The agent can see the screen, tap buttons, type text, scroll — like a human tester who never sleeps.
|
|
45
|
+
|
|
37
46
|
```
|
|
38
|
-
You: "Test the
|
|
39
|
-
|
|
40
|
-
AI Agent:
|
|
41
|
-
1. screenshot() → sees the login screen
|
|
42
|
-
2. enter_text("email") → types the email
|
|
43
|
-
3. enter_text("pass") → types the password
|
|
44
|
-
4. tap("Login") → taps the button
|
|
45
|
-
5. wait_for_element("Dashboard") → confirms navigation
|
|
46
|
-
✅ Login flow verified!
|
|
47
|
-
```
|
|
47
|
+
You: "Test the checkout flow with an empty cart, then add 3 items and complete purchase"
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
Your AI agent handles the rest — screenshots, taps, text entry, assertions, navigation.
|
|
50
|
+
No Page Objects. No XPath. No brittle selectors. Just plain English.
|
|
51
|
+
```
|
|
50
52
|
|
|
51
53
|
---
|
|
52
54
|
|
|
53
55
|
## Quick Start
|
|
54
56
|
|
|
55
|
-
**1. Install**
|
|
57
|
+
**1. Install** (30 seconds)
|
|
56
58
|
|
|
57
59
|
```bash
|
|
58
|
-
npm install -g flutter-skill
|
|
59
|
-
# or: brew install ai-dashboad/flutter-skill/flutter-skill
|
|
60
|
-
# or: dart pub global activate flutter_skill
|
|
61
|
-
# or: npx skills add ai-dashboad/flutter-skill # Agent Skill (Claude Code, Cursor, Copilot, Cline, etc.)
|
|
60
|
+
npm install -g flutter-skill
|
|
62
61
|
```
|
|
63
62
|
|
|
64
|
-
**2. Add to your
|
|
63
|
+
**2. Add to your AI** (copy-paste into MCP config)
|
|
65
64
|
|
|
66
65
|
```json
|
|
67
66
|
{
|
|
@@ -74,7 +73,9 @@ npm install -g flutter-skill # npm (recommended)
|
|
|
74
73
|
}
|
|
75
74
|
```
|
|
76
75
|
|
|
77
|
-
**
|
|
76
|
+
> Works with **Claude Desktop, Cursor, Windsurf, Copilot, Cline, OpenClaw** — any MCP-compatible agent.
|
|
77
|
+
|
|
78
|
+
**3. Add to your app** (2 lines for Flutter)
|
|
78
79
|
|
|
79
80
|
```dart
|
|
80
81
|
import 'package:flutter_skill/flutter_skill.dart';
|
|
@@ -87,162 +88,118 @@ void main() {
|
|
|
87
88
|
|
|
88
89
|
**4. Test** — just talk to your AI:
|
|
89
90
|
|
|
90
|
-
> *"Launch my app,
|
|
91
|
+
> *"Launch my app, explore every screen, and report any bugs"*
|
|
91
92
|
|
|
92
|
-
That's it. Zero configuration.
|
|
93
|
+
That's it. **Zero configuration. Zero test code.**
|
|
93
94
|
|
|
94
95
|
<details>
|
|
95
|
-
<summary
|
|
96
|
-
|
|
97
|
-
| Method | Command |
|
|
98
|
-
|
|
99
|
-
| npm | `npm install -g flutter-skill` |
|
|
100
|
-
| Homebrew | `brew install ai-dashboad/flutter-skill/flutter-skill` |
|
|
101
|
-
| Scoop | `scoop install flutter-skill` |
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
| Agent Skill | `npx skills add ai-dashboad/flutter-skill` | All (28+ agents) |
|
|
109
|
-
|
|
110
|
-
</details>
|
|
111
|
-
|
|
112
|
-
<details>
|
|
113
|
-
<summary><strong>🔧 Zero-config onboarding</strong> (auto-detect & patch your app)</summary>
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
cd your-app/
|
|
117
|
-
flutter-skill init # Detects platform, patches entry point, configures MCP
|
|
118
|
-
flutter-skill demo # Launches built-in demo app to try it out
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
`init` auto-detects Flutter, iOS, Android, React Native, or Web projects and patches them automatically.
|
|
96
|
+
<summary>📦 More install methods (Homebrew, Scoop, Docker, IDE, Agent Skill)</summary>
|
|
97
|
+
|
|
98
|
+
| Method | Command |
|
|
99
|
+
|--------|---------|
|
|
100
|
+
| npm | `npm install -g flutter-skill` |
|
|
101
|
+
| Homebrew | `brew install ai-dashboad/flutter-skill/flutter-skill` |
|
|
102
|
+
| Scoop | `scoop install flutter-skill` |
|
|
103
|
+
| Docker | `docker pull ghcr.io/ai-dashboad/flutter-skill` |
|
|
104
|
+
| pub.dev | `dart pub global activate flutter_skill` |
|
|
105
|
+
| VSCode | Extensions → "Flutter Skill" |
|
|
106
|
+
| JetBrains | Plugins → "Flutter Skill" |
|
|
107
|
+
| Agent Skill | `npx skills add ai-dashboad/flutter-skill` |
|
|
108
|
+
| Zero-config | `flutter-skill init` (auto-detects & patches your app) |
|
|
122
109
|
|
|
123
110
|
</details>
|
|
124
111
|
|
|
125
112
|
---
|
|
126
113
|
|
|
127
|
-
## Platforms
|
|
128
|
-
|
|
129
|
-
flutter-skill works across **8 platforms** with a unified bridge protocol:
|
|
130
|
-
|
|
131
|
-
| Platform | SDK | Tests | Status |
|
|
132
|
-
|----------|-----|-------|--------|
|
|
133
|
-
| **Electron** | [`sdks/electron`](sdks/electron/) | 75/75 ✅ | Stable |
|
|
134
|
-
| **KMP Desktop** | [`sdks/kmp`](sdks/kmp/) | 75/75 ✅ | Stable |
|
|
135
|
-
| **Tauri** (Rust) | [`sdks/tauri`](sdks/tauri/) | 75/75 ✅ | Stable |
|
|
136
|
-
| **.NET MAUI** | [`sdks/dotnet-maui`](sdks/dotnet-maui/) | 75/75 ✅ | Stable |
|
|
137
|
-
| **React Native** | [`sdks/react-native`](sdks/react-native/) | 75/75 ✅ | Stable |
|
|
138
|
-
|
|
139
|
-
| **Android** (Kotlin) | [`sdks/android`](sdks/android/) | 74/75 ✅ | Stable |
|
|
140
|
-
| **Flutter iOS** | `flutter_skill` (pub.dev) | 60/65 ✅ | Stable |
|
|
141
|
-
| **Flutter Web** | `flutter_skill` (pub.dev) | 63/65 ✅ | Stable |
|
|
114
|
+
## 8 Platforms, One Tool
|
|
142
115
|
|
|
143
|
-
|
|
116
|
+
Most testing tools work on 1-2 platforms. flutter-skill works on **8**.
|
|
144
117
|
|
|
145
|
-
|
|
146
|
-
|
|
118
|
+
| Platform | SDK | Test Score |
|
|
119
|
+
|----------|-----|:----------:|
|
|
120
|
+
| **Flutter** (iOS/Android/Web) | [`flutter_skill`](https://pub.dev/packages/flutter_skill) | ✅ 188/195 |
|
|
121
|
+
| **React Native** | [`sdks/react-native`](sdks/react-native/) | ✅ 75/75 |
|
|
122
|
+
| **Electron** | [`sdks/electron`](sdks/electron/) | ✅ 75/75 |
|
|
123
|
+
| **Tauri** (Rust) | [`sdks/tauri`](sdks/tauri/) | ✅ 75/75 |
|
|
124
|
+
| **Android** (Kotlin) | [`sdks/android`](sdks/android/) | ✅ 74/75 |
|
|
125
|
+
| **KMP Desktop** | [`sdks/kmp`](sdks/kmp/) | ✅ 75/75 |
|
|
126
|
+
| **.NET MAUI** | [`sdks/dotnet-maui`](sdks/dotnet-maui/) | ✅ 75/75 |
|
|
127
|
+
| **iOS** (Swift/UIKit) | [`sdks/ios`](sdks/ios/) | ✅ 19/19 |
|
|
147
128
|
|
|
148
|
-
|
|
129
|
+
**Total: 656/664 tests passing (98.8%)** — each platform tested against a complex social media app with 50+ elements.
|
|
149
130
|
|
|
150
|
-
|
|
151
|
-
<summary><strong>Platform setup examples</strong></summary>
|
|
152
|
-
|
|
153
|
-
**Web** — add one script tag:
|
|
154
|
-
```html
|
|
155
|
-
<script src="flutter-skill.js"></script>
|
|
156
|
-
<script>FlutterSkill.start({ port: 50000 });</script>
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
**React Native** — npm install:
|
|
160
|
-
```bash
|
|
161
|
-
npm install flutter-skill
|
|
162
|
-
```
|
|
163
|
-
```js
|
|
164
|
-
import FlutterSkill from 'flutter-skill';
|
|
165
|
-
FlutterSkill.start();
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
**iOS (Swift/SwiftUI)** — Swift Package Manager:
|
|
169
|
-
```swift
|
|
170
|
-
import FlutterSkill
|
|
171
|
-
FlutterSkillBridge.shared.start()
|
|
172
|
-
|
|
173
|
-
Text("Hello").flutterSkillId("greeting")
|
|
174
|
-
Button("Submit") { submit() }.flutterSkillButton("submitBtn")
|
|
175
|
-
```
|
|
131
|
+
---
|
|
176
132
|
|
|
177
|
-
|
|
178
|
-
```kotlin
|
|
179
|
-
implementation("com.flutterskill:flutter-skill:0.7.5")
|
|
180
|
-
FlutterSkillBridge.start(this)
|
|
181
|
-
```
|
|
133
|
+
## Why Not Playwright / Appium / Detox?
|
|
182
134
|
|
|
183
|
-
|
|
135
|
+
| | flutter-skill | Playwright | Appium | Detox |
|
|
136
|
+
|---|:---:|:---:|:---:|:---:|
|
|
137
|
+
| **Setup time** | 30 sec | Minutes | Hours | Hours |
|
|
138
|
+
| **Test code needed** | ❌ None | ✅ Yes | ✅ Yes | ✅ Yes |
|
|
139
|
+
| **AI-native (MCP)** | ✅ | ❌ | ❌ | ❌ |
|
|
140
|
+
| **Platforms** | 8 | 3 (web) | Mobile | React Native |
|
|
141
|
+
| **Natural language** | ✅ | ❌ | ❌ | ❌ |
|
|
142
|
+
| **Maintenance** | Zero | High | High | Medium |
|
|
143
|
+
| **Flutter support** | ✅ Native | Partial | Partial | ❌ |
|
|
144
|
+
| **Desktop apps** | ✅ | ✅ | ❌ | ❌ |
|
|
184
145
|
|
|
185
|
-
|
|
146
|
+
**flutter-skill is the only AI-native E2E testing tool that works across mobile, web, and desktop.**
|
|
186
147
|
|
|
187
148
|
---
|
|
188
149
|
|
|
189
|
-
## What Can
|
|
190
|
-
|
|
191
|
-
**40+ MCP tools** organized in 4 categories:
|
|
150
|
+
## What It Can Do
|
|
192
151
|
|
|
193
152
|
<table>
|
|
194
153
|
<tr>
|
|
195
154
|
<td width="50%" valign="top">
|
|
196
155
|
|
|
197
|
-
### 👀 See
|
|
198
|
-
- `screenshot` —
|
|
199
|
-
- `
|
|
200
|
-
- `
|
|
201
|
-
- `
|
|
202
|
-
- `get_text_content` — extract all text
|
|
156
|
+
### 👀 See
|
|
157
|
+
- `screenshot` — capture the screen
|
|
158
|
+
- `inspect_interactive` — all tappable/typeable elements with semantic refs
|
|
159
|
+
- `find_element` / `wait_for_element`
|
|
160
|
+
- `get_elements` — full element tree
|
|
203
161
|
|
|
204
162
|
</td>
|
|
205
163
|
<td width="50%" valign="top">
|
|
206
164
|
|
|
207
|
-
### 👆 Interact
|
|
208
|
-
- `tap` / `
|
|
209
|
-
- `enter_text`
|
|
210
|
-
- `
|
|
211
|
-
- `go_back`
|
|
212
|
-
- Native: `native_tap`, `native_swipe`
|
|
165
|
+
### 👆 Interact
|
|
166
|
+
- `tap` / `long_press` / `swipe` / `drag`
|
|
167
|
+
- `enter_text` / `set_text` / `clear_text`
|
|
168
|
+
- `scroll` — all directions
|
|
169
|
+
- `go_back` / `press_key`
|
|
213
170
|
|
|
214
171
|
</td>
|
|
215
172
|
</tr>
|
|
216
173
|
<tr>
|
|
217
174
|
<td valign="top">
|
|
218
175
|
|
|
219
|
-
###
|
|
220
|
-
-
|
|
221
|
-
-
|
|
222
|
-
- `
|
|
223
|
-
-
|
|
176
|
+
### 🔍 Inspect (v0.8.0)
|
|
177
|
+
- **Semantic refs**: `button:Login`, `input:Email`
|
|
178
|
+
- Stable across UI changes
|
|
179
|
+
- `tap(ref: "button:Submit")`
|
|
180
|
+
- 7 roles: button, input, toggle, slider, select, link, item
|
|
224
181
|
|
|
225
182
|
</td>
|
|
226
183
|
<td valign="top">
|
|
227
184
|
|
|
228
|
-
### 🚀
|
|
229
|
-
- `launch_app` — launch with flavors
|
|
230
|
-
- `scan_and_connect` — find running apps
|
|
185
|
+
### 🚀 Control
|
|
186
|
+
- `launch_app` — launch with flavors
|
|
231
187
|
- `hot_reload` / `hot_restart`
|
|
232
|
-
- `
|
|
188
|
+
- `get_logs` / `get_errors`
|
|
189
|
+
- `scan_and_connect` — auto-find apps
|
|
233
190
|
|
|
234
191
|
</td>
|
|
235
192
|
</tr>
|
|
236
193
|
</table>
|
|
237
194
|
|
|
238
195
|
<details>
|
|
239
|
-
<summary><strong>
|
|
196
|
+
<summary><strong>40+ tools — full reference</strong></summary>
|
|
240
197
|
|
|
241
198
|
**Launch & Connect:** `launch_app`, `scan_and_connect`, `hot_reload`, `hot_restart`, `list_sessions`, `switch_session`, `close_session`
|
|
242
199
|
|
|
243
|
-
**Screen:** `screenshot`, `screenshot_region`, `screenshot_element`, `native_screenshot`, `inspect`, `get_widget_tree`, `find_by_type`, `get_text_content`
|
|
200
|
+
**Screen:** `screenshot`, `screenshot_region`, `screenshot_element`, `native_screenshot`, `inspect`, `inspect_interactive`, `get_widget_tree`, `find_by_type`, `get_text_content`
|
|
244
201
|
|
|
245
|
-
**Interaction:** `tap`, `double_tap`, `long_press`, `enter_text`, `swipe`, `scroll_to`, `drag`, `go_back`, `native_tap`, `native_input_text`, `native_swipe`
|
|
202
|
+
**Interaction:** `tap`, `double_tap`, `long_press`, `enter_text`, `set_text`, `clear_text`, `swipe`, `scroll_to`, `drag`, `go_back`, `press_key`, `native_tap`, `native_input_text`, `native_swipe`
|
|
246
203
|
|
|
247
204
|
**Assertions:** `assert_text`, `assert_visible`, `assert_not_visible`, `assert_element_count`, `wait_for_element`, `wait_for_gone`, `get_checkbox_state`, `get_slider_value`, `get_text_value`
|
|
248
205
|
|
|
@@ -252,132 +209,145 @@ FlutterSkillBridge.start(this)
|
|
|
252
209
|
|
|
253
210
|
---
|
|
254
211
|
|
|
255
|
-
##
|
|
212
|
+
## Platform Setup
|
|
213
|
+
|
|
214
|
+
<details>
|
|
215
|
+
<summary><strong>Flutter</strong> (iOS / Android / Web)</summary>
|
|
216
|
+
|
|
217
|
+
```yaml
|
|
218
|
+
dependencies:
|
|
219
|
+
flutter_skill: ^0.8.2
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
```dart
|
|
223
|
+
import 'package:flutter_skill/flutter_skill.dart';
|
|
224
|
+
|
|
225
|
+
void main() {
|
|
226
|
+
if (kDebugMode) FlutterSkillBinding.ensureInitialized();
|
|
227
|
+
runApp(MyApp());
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
</details>
|
|
232
|
+
|
|
233
|
+
<details>
|
|
234
|
+
<summary><strong>React Native</strong></summary>
|
|
256
235
|
|
|
236
|
+
```bash
|
|
237
|
+
npm install flutter-skill-react-native
|
|
257
238
|
```
|
|
258
|
-
"Test login with test@example.com / password123, verify it reaches the dashboard"
|
|
259
239
|
|
|
260
|
-
|
|
240
|
+
```js
|
|
241
|
+
import FlutterSkill from 'flutter-skill-react-native';
|
|
242
|
+
FlutterSkill.start();
|
|
243
|
+
```
|
|
261
244
|
|
|
262
|
-
|
|
245
|
+
</details>
|
|
246
|
+
|
|
247
|
+
<details>
|
|
248
|
+
<summary><strong>Electron</strong></summary>
|
|
263
249
|
|
|
264
|
-
|
|
250
|
+
```bash
|
|
251
|
+
npm install flutter-skill-electron
|
|
265
252
|
```
|
|
266
253
|
|
|
267
|
-
|
|
254
|
+
```js
|
|
255
|
+
const { FlutterSkillBridge } = require('flutter-skill-electron');
|
|
256
|
+
FlutterSkillBridge.start(mainWindow);
|
|
257
|
+
```
|
|
268
258
|
|
|
269
|
-
|
|
259
|
+
</details>
|
|
270
260
|
|
|
271
|
-
|
|
261
|
+
<details>
|
|
262
|
+
<summary><strong>iOS (Swift)</strong></summary>
|
|
272
263
|
|
|
273
|
-
|
|
264
|
+
```swift
|
|
265
|
+
// Swift Package Manager: FlutterSkillSDK
|
|
266
|
+
import FlutterSkill
|
|
267
|
+
FlutterSkillBridge.shared.start()
|
|
274
268
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
| Screenshot | `xcrun simctl` | `adb screencap` |
|
|
278
|
-
| Tap | macOS Accessibility | `adb input tap` |
|
|
279
|
-
| Text input | Pasteboard + Cmd+V | `adb input text` |
|
|
280
|
-
| Swipe | Accessibility scroll | `adb input swipe` |
|
|
269
|
+
Text("Hello").flutterSkillId("greeting")
|
|
270
|
+
```
|
|
281
271
|
|
|
282
|
-
|
|
272
|
+
</details>
|
|
283
273
|
|
|
284
|
-
|
|
274
|
+
<details>
|
|
275
|
+
<summary><strong>Android (Kotlin)</strong></summary>
|
|
285
276
|
|
|
286
|
-
|
|
277
|
+
```kotlin
|
|
278
|
+
implementation("com.flutterskill:flutter-skill:0.8.0")
|
|
287
279
|
|
|
288
|
-
|
|
280
|
+
FlutterSkillBridge.start(this)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
</details>
|
|
289
284
|
|
|
290
285
|
<details>
|
|
291
|
-
<summary><strong>
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
| Inspect Interactive | 5 | Semantic refs, actions, bounds, cross-page |
|
|
298
|
-
| Tap | 6 | By key, text, coordinates, ref, invalid key/ref |
|
|
299
|
-
| Enter Text | 6 | Basic, empty, emoji/unicode 🌍世界, overwrite, long (500+ chars), error handling |
|
|
300
|
-
| Get Text | 4 | Counter, input readback, missing key, button label |
|
|
301
|
-
| Find Element | 5 | By key, missing, by text, partial text, bounds |
|
|
302
|
-
| Wait For Element | 4 | By key, by text, timeout, fast resolution |
|
|
303
|
-
| Press Key | 10 | Enter, Tab, Escape, Backspace, arrows, Ctrl+A, Delete, Home/End, invalid key |
|
|
304
|
-
| Scroll | 6 | Up, down, left, right, large distance, zero |
|
|
305
|
-
| Swipe | 4 | Up, down, left, right |
|
|
306
|
-
| Screenshot | 2 | Base64 encoding, image format (PNG/JPEG) |
|
|
307
|
-
| Navigation | 8 | Detail page, inspect after nav, interactive elements, go_back, round-trip |
|
|
308
|
-
| Logs | 3 | Get, clear, verify empty |
|
|
309
|
-
| Eval | 2 | Expression evaluation, return values |
|
|
310
|
-
| Error Handling | 3 | Unknown method, missing params, malformed request |
|
|
311
|
-
| **Total** | **75** | |
|
|
312
|
-
|
|
313
|
-
**Test apps per platform:**
|
|
314
|
-
|
|
315
|
-
| Platform | Test App | Elements |
|
|
316
|
-
|----------|----------|----------|
|
|
317
|
-
| Electron | Social media app (HTML/JS) | 60+ items, dark theme |
|
|
318
|
-
| Android | Native Kotlin app with Fragments | 50+ items, Material Design |
|
|
319
|
-
| KMP | Compose Desktop app | 50+ items, tab navigation |
|
|
320
|
-
| Tauri | Web frontend (Rust backend) | 55+ feed cards |
|
|
321
|
-
| .NET MAUI | Simulated bridge with 6 screens | 114 elements |
|
|
322
|
-
| React Native | Real RN app on iOS simulator | Self-registering components |
|
|
323
|
-
| Flutter iOS | TikTok clone (10 feature modules) | Full social media app |
|
|
324
|
-
| Flutter Web | TikTok clone via bridge proxy | Full social media app |
|
|
286
|
+
<summary><strong>Tauri (Rust)</strong></summary>
|
|
287
|
+
|
|
288
|
+
```toml
|
|
289
|
+
[dependencies]
|
|
290
|
+
flutter-skill-tauri = "0.8.0"
|
|
291
|
+
```
|
|
325
292
|
|
|
326
293
|
</details>
|
|
327
294
|
|
|
328
|
-
|
|
295
|
+
<details>
|
|
296
|
+
<summary><strong>KMP Desktop</strong></summary>
|
|
329
297
|
|
|
330
|
-
|
|
298
|
+
Add Gradle dependency — see [`sdks/kmp`](sdks/kmp/) for details.
|
|
331
299
|
|
|
332
|
-
|
|
333
|
-
|---------|-----|
|
|
334
|
-
| "Not connected" | `flutter-skill scan_and_connect` to auto-find apps |
|
|
335
|
-
| "Unknown method" | `flutter pub add flutter_skill` then restart (not hot reload) |
|
|
336
|
-
| No VM Service URI | Add `--vm-service-port=50000` to launch args |
|
|
337
|
-
| Claude Code priority | Run `flutter_skill setup` for priority rules |
|
|
300
|
+
</details>
|
|
338
301
|
|
|
339
|
-
|
|
302
|
+
<details>
|
|
303
|
+
<summary><strong>.NET MAUI</strong></summary>
|
|
340
304
|
|
|
341
|
-
|
|
305
|
+
Add NuGet package — see [`sdks/dotnet-maui`](sdks/dotnet-maui/) for details.
|
|
342
306
|
|
|
343
|
-
|
|
307
|
+
</details>
|
|
344
308
|
|
|
345
|
-
|
|
346
|
-
<tr>
|
|
347
|
-
<td>
|
|
309
|
+
---
|
|
348
310
|
|
|
349
|
-
|
|
350
|
-
- [pub.dev](https://pub.dev/packages/flutter_skill)
|
|
351
|
-
- [npm](https://www.npmjs.com/package/flutter-skill)
|
|
352
|
-
- [Homebrew](https://github.com/ai-dashboad/homebrew-flutter-skill)
|
|
311
|
+
## Example Prompts
|
|
353
312
|
|
|
354
|
-
|
|
355
|
-
<td>
|
|
313
|
+
Just tell your AI what to test:
|
|
356
314
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
315
|
+
| Prompt | What happens |
|
|
316
|
+
|--------|-------------|
|
|
317
|
+
| *"Test login with wrong password"* | Screenshots → enters creds → taps login → verifies error |
|
|
318
|
+
| *"Explore every screen and report bugs"* | Systematically navigates all screens, tests all elements |
|
|
319
|
+
| *"Fill registration with edge cases"* | Tests emoji 🌍, long strings, empty fields, special chars |
|
|
320
|
+
| *"Compare checkout flow on iOS and Android"* | Runs same test on both platforms, compares screenshots |
|
|
321
|
+
| *"Take screenshots of all 5 tabs"* | Taps each tab, captures state |
|
|
360
322
|
|
|
361
|
-
|
|
362
|
-
<td>
|
|
323
|
+
---
|
|
363
324
|
|
|
364
|
-
|
|
365
|
-
- [Roadmap](docs/ROADMAP.md)
|
|
366
|
-
- [Changelog](CHANGELOG.md)
|
|
367
|
-
- [Architecture](docs/ARCHITECTURE.md)
|
|
325
|
+
## Contributing
|
|
368
326
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
327
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
git clone https://github.com/ai-dashboad/flutter-skill
|
|
331
|
+
cd flutter-skill
|
|
332
|
+
dart pub get
|
|
333
|
+
dart run bin/flutter_skill.dart server # Start MCP server
|
|
334
|
+
```
|
|
372
335
|
|
|
373
336
|
---
|
|
374
337
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
338
|
+
## Links
|
|
339
|
+
|
|
340
|
+
| | |
|
|
341
|
+
|---|---|
|
|
342
|
+
| 📦 [pub.dev](https://pub.dev/packages/flutter_skill) | 🧩 [VSCode](https://marketplace.visualstudio.com/items?itemName=AIDashboard.flutter-skill) |
|
|
343
|
+
| 📦 [npm](https://www.npmjs.com/package/flutter-skill) | 🧩 [JetBrains](https://plugins.jetbrains.com/plugin/29991-flutter-skill) |
|
|
344
|
+
| 🍺 [Homebrew](https://github.com/ai-dashboad/homebrew-flutter-skill) | 📖 [Docs](docs/USAGE_GUIDE.md) |
|
|
345
|
+
| 🤖 [Agent Skill](https://skills.sh/ai-dashboad/flutter-skill) | 📋 [Changelog](CHANGELOG.md) |
|
|
346
|
+
|
|
347
|
+
---
|
|
378
348
|
|
|
379
349
|
<p align="center">
|
|
380
|
-
<
|
|
350
|
+
<strong>⭐ If flutter-skill saves you time, star it so others can find it too!</strong>
|
|
381
351
|
</p>
|
|
382
352
|
|
|
383
|
-
<p align="center">MIT License</p>
|
|
353
|
+
<p align="center">MIT License © 2025</p>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flutter-skill",
|
|
3
3
|
"mcpName": "io.github.ai-dashboad/flutter-skill",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.2",
|
|
5
5
|
"description": "MCP Server for app automation - Give your AI Agent eyes and hands inside any app (Flutter, React, Web, Native)",
|
|
6
6
|
"main": "index.js",
|
|
7
7
|
"bin": {
|