flutter-skill 0.7.4 → 0.7.7
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 +211 -316
- package/dart/lib/src/cli/server.dart +1 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,100 +1,68 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/social-preview.jpg" alt="flutter-skill" width="640">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">flutter-skill</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>Give your AI eyes and hands inside any app.</strong><br>
|
|
9
|
+
E2E testing bridge for Claude, Cursor, Windsurf — across 8 platforms.
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="https://pub.dev/packages/flutter_skill"><img src="https://img.shields.io/pub/v/flutter_skill.svg" alt="pub.dev"></a>
|
|
14
|
+
<a href="https://www.npmjs.com/package/flutter-skill"><img src="https://img.shields.io/npm/v/flutter-skill.svg" alt="npm"></a>
|
|
15
|
+
<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
|
+
<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
|
+
</p>
|
|
20
|
+
|
|
21
|
+
<p align="center">
|
|
22
|
+
<a href="#quick-start">Quick Start</a> •
|
|
23
|
+
<a href="#platforms">Platforms</a> •
|
|
24
|
+
<a href="#what-can-it-do">Features</a> •
|
|
25
|
+
<a href="#install">Install</a> •
|
|
26
|
+
<a href="docs/USAGE_GUIDE.md">Docs</a>
|
|
27
|
+
</p>
|
|
2
28
|
|
|
3
|
-
|
|
29
|
+
---
|
|
4
30
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-

|
|
31
|
+
<p align="center">
|
|
32
|
+
<strong>🎬 AI tests a full TikTok clone — 28 actions, zero test code</strong>
|
|
33
|
+
</p>
|
|
9
34
|
|
|
10
|
-
|
|
35
|
+
https://github.com/user-attachments/assets/d4617c73-043f-424c-9a9a-1a61d4c2d3c6
|
|
11
36
|
|
|
12
37
|
```
|
|
13
|
-
You: "Test the login flow
|
|
38
|
+
You: "Test the login flow — enter test@example.com and password123, tap Login, verify Dashboard"
|
|
14
39
|
|
|
15
40
|
AI Agent:
|
|
16
|
-
1. screenshot()
|
|
17
|
-
2. enter_text("email")
|
|
18
|
-
3. enter_text("
|
|
19
|
-
4. tap("Login")
|
|
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
|
|
20
45
|
5. wait_for_element("Dashboard") → confirms navigation
|
|
21
|
-
6. screenshot() → captures the result
|
|
22
46
|
✅ Login flow verified!
|
|
23
47
|
```
|
|
24
48
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
| Traditional E2E Testing | Flutter Skill |
|
|
28
|
-
|------------------------|---------------|
|
|
29
|
-
| Write Dart test code manually | Describe tests in natural language |
|
|
30
|
-
| Learn WidgetTester API | AI handles the automation |
|
|
31
|
-
| Maintain brittle test scripts | AI adapts to UI changes |
|
|
32
|
-
| Debug test failures manually | AI sees screenshots and self-corrects |
|
|
33
|
-
| Setup takes hours | Setup takes 2 minutes |
|
|
34
|
-
|
|
35
|
-
**Flutter Skill is for you if:**
|
|
36
|
-
- You want E2E tests without writing test code
|
|
37
|
-
- You're using AI coding agents (Claude Code, Cursor, Windsurf)
|
|
38
|
-
- You want to automate QA workflows with natural language
|
|
39
|
-
- You need to test real app behavior on simulators/emulators
|
|
49
|
+
**No test code. No selectors. Just tell the AI what to test.**
|
|
40
50
|
|
|
41
51
|
---
|
|
42
52
|
|
|
43
|
-
## Quick Start
|
|
53
|
+
## Quick Start
|
|
44
54
|
|
|
45
|
-
|
|
55
|
+
**1. Install**
|
|
46
56
|
|
|
47
57
|
```bash
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
#
|
|
52
|
-
npm install -g flutter-skill
|
|
53
|
-
|
|
54
|
-
# Or: Homebrew (macOS/Linux)
|
|
55
|
-
brew tap ai-dashboad/flutter-skill && brew install flutter-skill
|
|
56
|
-
|
|
57
|
-
# Or: Dart
|
|
58
|
-
dart pub global activate flutter_skill
|
|
58
|
+
npm install -g flutter-skill # npm (recommended)
|
|
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.)
|
|
59
62
|
```
|
|
60
63
|
|
|
61
|
-
|
|
62
|
-
<summary>More installation methods (Windows, Docker, IDE extensions...)</summary>
|
|
63
|
-
|
|
64
|
-
| Method | Command | Platform |
|
|
65
|
-
|--------|---------|----------|
|
|
66
|
-
| **One-click** | `curl -fsSL .../install.sh \| bash` | macOS/Linux |
|
|
67
|
-
| **Windows** | `iwr .../install.ps1 -useb \| iex` | Windows |
|
|
68
|
-
| **npm** | `npm install -g flutter-skill` | All |
|
|
69
|
-
| **Homebrew** | `brew install ai-dashboad/flutter-skill/flutter-skill` | macOS/Linux |
|
|
70
|
-
| **Scoop** | `scoop install flutter-skill` | Windows |
|
|
71
|
-
| **Docker** | `docker pull ghcr.io/ai-dashboad/flutter-skill` | All |
|
|
72
|
-
| **pub.dev** | `dart pub global activate flutter_skill` | All |
|
|
73
|
-
| **VSCode** | Extensions -> "Flutter Skill" | All |
|
|
74
|
-
| **IntelliJ** | Plugins -> "Flutter Skill" | All |
|
|
75
|
-
|
|
76
|
-
</details>
|
|
77
|
-
|
|
78
|
-
### 2. Configure Your AI Agent
|
|
79
|
-
|
|
80
|
-
Add to your agent's MCP config:
|
|
81
|
-
|
|
82
|
-
**Claude Code** (`~/.claude/settings.json`):
|
|
83
|
-
```json
|
|
84
|
-
{
|
|
85
|
-
"mcpServers": {
|
|
86
|
-
"flutter-skill": {
|
|
87
|
-
"command": "flutter-skill",
|
|
88
|
-
"args": ["server"]
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
<details>
|
|
95
|
-
<summary>Cursor, Windsurf, and other agents</summary>
|
|
64
|
+
**2. Add to your MCP config** (Claude Code / Cursor / Windsurf)
|
|
96
65
|
|
|
97
|
-
**Cursor** (`~/.cursor/mcp.json`):
|
|
98
66
|
```json
|
|
99
67
|
{
|
|
100
68
|
"mcpServers": {
|
|
@@ -106,335 +74,262 @@ Add to your agent's MCP config:
|
|
|
106
74
|
}
|
|
107
75
|
```
|
|
108
76
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
</details>
|
|
112
|
-
|
|
113
|
-
### 3. Add to Your Flutter App
|
|
114
|
-
|
|
115
|
-
```yaml
|
|
116
|
-
# pubspec.yaml
|
|
117
|
-
dependencies:
|
|
118
|
-
flutter_skill: ^0.7.4
|
|
119
|
-
```
|
|
77
|
+
**3. Add to your app** (2 lines)
|
|
120
78
|
|
|
121
79
|
```dart
|
|
122
|
-
// main.dart
|
|
123
|
-
import 'package:flutter/foundation.dart';
|
|
124
80
|
import 'package:flutter_skill/flutter_skill.dart';
|
|
125
81
|
|
|
126
82
|
void main() {
|
|
127
|
-
if (kDebugMode)
|
|
128
|
-
FlutterSkillBinding.ensureInitialized();
|
|
129
|
-
}
|
|
83
|
+
if (kDebugMode) FlutterSkillBinding.ensureInitialized();
|
|
130
84
|
runApp(MyApp());
|
|
131
85
|
}
|
|
132
86
|
```
|
|
133
87
|
|
|
134
|
-
|
|
88
|
+
**4. Test** — just talk to your AI:
|
|
135
89
|
|
|
136
|
-
|
|
90
|
+
> *"Launch my app, tap Sign Up, fill the form, and verify the success screen"*
|
|
137
91
|
|
|
138
|
-
|
|
92
|
+
That's it. Zero configuration.
|
|
139
93
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
94
|
+
<details>
|
|
95
|
+
<summary><strong>📦 More install methods</strong> (Windows, Docker, IDE extensions)</summary>
|
|
96
|
+
|
|
97
|
+
| Method | Command | Platform |
|
|
98
|
+
|--------|---------|----------|
|
|
99
|
+
| npm | `npm install -g flutter-skill` | All |
|
|
100
|
+
| Homebrew | `brew install ai-dashboad/flutter-skill/flutter-skill` | macOS/Linux |
|
|
101
|
+
| Scoop | `scoop install flutter-skill` | Windows |
|
|
102
|
+
| One-click | `curl -fsSL .../install.sh \| bash` | macOS/Linux |
|
|
103
|
+
| Windows | `iwr .../install.ps1 -useb \| iex` | Windows |
|
|
104
|
+
| Docker | `docker pull ghcr.io/ai-dashboad/flutter-skill` | All |
|
|
105
|
+
| pub.dev | `dart pub global activate flutter_skill` | All |
|
|
106
|
+
| VSCode | Extensions → "Flutter Skill" | All |
|
|
107
|
+
| IntelliJ | Plugins → "Flutter Skill" | All |
|
|
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>
|
|
143
114
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
flutter-skill
|
|
147
|
-
flutter-skill
|
|
148
|
-
flutter-skill.tap({ text: "Sign Up" }) // Tap by text
|
|
149
|
-
flutter-skill.enter_text({ key: "email", text: "user@test.com" })
|
|
150
|
-
flutter-skill.screenshot() // Visual verification
|
|
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
|
|
151
119
|
```
|
|
152
120
|
|
|
121
|
+
`init` auto-detects Flutter, iOS, Android, React Native, or Web projects and patches them automatically.
|
|
122
|
+
|
|
123
|
+
</details>
|
|
124
|
+
|
|
153
125
|
---
|
|
154
126
|
|
|
155
|
-
##
|
|
127
|
+
## Platforms
|
|
156
128
|
|
|
157
|
-
|
|
129
|
+
flutter-skill works across **8 platforms** with a unified bridge protocol:
|
|
158
130
|
|
|
159
|
-
| Platform | SDK | Status |
|
|
160
|
-
|
|
161
|
-
| **Flutter**
|
|
162
|
-
| **Web** (
|
|
163
|
-
| **
|
|
164
|
-
| **
|
|
165
|
-
| **
|
|
131
|
+
| Platform | SDK | Tests | Status |
|
|
132
|
+
|----------|-----|-------|--------|
|
|
133
|
+
| **Flutter iOS** | `flutter_skill` (pub.dev) | 21/21 ✅ | Stable |
|
|
134
|
+
| **Flutter Web** | `flutter_skill` (pub.dev) | 20/20 ✅ | Stable |
|
|
135
|
+
| **Electron** | [`sdks/electron`](sdks/electron/) | 24/24 ✅ | Stable |
|
|
136
|
+
| **Android** (Kotlin) | [`sdks/android`](sdks/android/) | 24/24 ✅ | Stable |
|
|
137
|
+
| **KMP Desktop** | [`sdks/kmp`](sdks/kmp/) | 22/22 ✅ | Stable |
|
|
138
|
+
| **Tauri** (Rust) | [`sdks/tauri`](sdks/tauri/) | 23/24 ✅ | Stable |
|
|
139
|
+
| **.NET MAUI** | [`sdks/dotnet-maui`](sdks/dotnet-maui/) | 23/24 ✅ | Stable |
|
|
140
|
+
| **React Native** | [`sdks/react-native`](sdks/react-native/) | 24/24 ✅ | Stable |
|
|
166
141
|
|
|
167
|
-
|
|
142
|
+
> **181/183 tests passing** across all platforms (99% pass rate)
|
|
168
143
|
|
|
144
|
+
Each SDK README has platform-specific setup instructions. The same CLI and MCP tools work for all platforms.
|
|
145
|
+
|
|
146
|
+
<details>
|
|
147
|
+
<summary><strong>Platform setup examples</strong></summary>
|
|
148
|
+
|
|
149
|
+
**Web** — add one script tag:
|
|
169
150
|
```html
|
|
170
151
|
<script src="flutter-skill.js"></script>
|
|
171
|
-
<script>
|
|
172
|
-
FlutterSkill.start({ port: 50000 });
|
|
173
|
-
</script>
|
|
152
|
+
<script>FlutterSkill.start({ port: 50000 });</script>
|
|
174
153
|
```
|
|
175
154
|
|
|
176
|
-
|
|
177
|
-
|
|
155
|
+
**React Native** — npm install:
|
|
178
156
|
```bash
|
|
179
157
|
npm install flutter-skill
|
|
180
158
|
```
|
|
181
|
-
|
|
182
159
|
```js
|
|
183
160
|
import FlutterSkill from 'flutter-skill';
|
|
184
161
|
FlutterSkill.start();
|
|
185
162
|
```
|
|
186
163
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
Add via Swift Package Manager:
|
|
190
|
-
```
|
|
191
|
-
https://github.com/ai-dashboad/flutter-skill (sdks/ios)
|
|
192
|
-
```
|
|
193
|
-
|
|
164
|
+
**iOS (Swift/SwiftUI)** — Swift Package Manager:
|
|
194
165
|
```swift
|
|
195
166
|
import FlutterSkill
|
|
196
|
-
|
|
197
|
-
// Initialize in your app
|
|
198
167
|
FlutterSkillBridge.shared.start()
|
|
199
168
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
.flutterSkillId("greeting")
|
|
203
|
-
|
|
204
|
-
Button("Submit") { submit() }
|
|
205
|
-
.flutterSkillButton("submitBtn")
|
|
206
|
-
|
|
207
|
-
TextField("Email", text: $email)
|
|
208
|
-
.flutterSkillTextField("emailField")
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
### Android (Kotlin)
|
|
212
|
-
|
|
213
|
-
```kotlin
|
|
214
|
-
// build.gradle.kts
|
|
215
|
-
implementation("com.flutterskill:flutter-skill:0.7.3")
|
|
169
|
+
Text("Hello").flutterSkillId("greeting")
|
|
170
|
+
Button("Submit") { submit() }.flutterSkillButton("submitBtn")
|
|
216
171
|
```
|
|
217
172
|
|
|
173
|
+
**Android (Kotlin)** — Gradle:
|
|
218
174
|
```kotlin
|
|
219
|
-
|
|
220
|
-
import com.flutterskill.FlutterSkillBridge
|
|
221
|
-
|
|
175
|
+
implementation("com.flutterskill:flutter-skill:0.7.5")
|
|
222
176
|
FlutterSkillBridge.start(this)
|
|
223
177
|
```
|
|
224
178
|
|
|
225
|
-
|
|
179
|
+
**Electron / Tauri / KMP / .NET** — see each SDK's README for details.
|
|
226
180
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
flutter_skill inspect # See all UI elements
|
|
231
|
-
flutter_skill act tap "login" # Tap a button
|
|
232
|
-
flutter_skill act enter_text "email" "user@test.com"
|
|
233
|
-
flutter_skill act screenshot # Capture the screen
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
All platforms support the same 14 capabilities: inspect, tap, enter_text, scroll, screenshot, get_text, find_element, wait_for_element, and more.
|
|
181
|
+
</details>
|
|
237
182
|
|
|
238
183
|
---
|
|
239
184
|
|
|
240
185
|
## What Can It Do?
|
|
241
186
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
| `get_slider_value` | Read slider value |
|
|
289
|
-
| `get_text_value` | Read text field value |
|
|
290
|
-
|
|
291
|
-
**Debug & Monitor**
|
|
292
|
-
| Tool | What it does |
|
|
293
|
-
|------|-------------|
|
|
294
|
-
| `get_logs` | Read application logs |
|
|
295
|
-
| `get_errors` | Read application errors |
|
|
296
|
-
| `get_performance` | Performance metrics |
|
|
297
|
-
| `get_memory_stats` | Memory usage stats |
|
|
298
|
-
|
|
299
|
-
**Multi-Session**
|
|
300
|
-
| Tool | What it does |
|
|
301
|
-
|------|-------------|
|
|
302
|
-
| `list_sessions` | See all connected apps |
|
|
303
|
-
| `switch_session` | Switch between apps |
|
|
304
|
-
| `close_session` | Disconnect from an app |
|
|
305
|
-
|
|
306
|
-
---
|
|
187
|
+
**40+ MCP tools** organized in 4 categories:
|
|
188
|
+
|
|
189
|
+
<table>
|
|
190
|
+
<tr>
|
|
191
|
+
<td width="50%" valign="top">
|
|
192
|
+
|
|
193
|
+
### 👀 See the Screen
|
|
194
|
+
- `screenshot` — full app screenshot
|
|
195
|
+
- `inspect` — list all interactive elements
|
|
196
|
+
- `get_widget_tree` — full widget hierarchy
|
|
197
|
+
- `find_by_type` — find by widget type
|
|
198
|
+
- `get_text_content` — extract all text
|
|
199
|
+
|
|
200
|
+
</td>
|
|
201
|
+
<td width="50%" valign="top">
|
|
202
|
+
|
|
203
|
+
### 👆 Interact Like a User
|
|
204
|
+
- `tap` / `double_tap` / `long_press`
|
|
205
|
+
- `enter_text` — type into fields
|
|
206
|
+
- `swipe` / `scroll_to` / `drag`
|
|
207
|
+
- `go_back` — navigate back
|
|
208
|
+
- Native: `native_tap`, `native_swipe`
|
|
209
|
+
|
|
210
|
+
</td>
|
|
211
|
+
</tr>
|
|
212
|
+
<tr>
|
|
213
|
+
<td valign="top">
|
|
214
|
+
|
|
215
|
+
### ✅ Verify & Assert
|
|
216
|
+
- `assert_text` / `assert_visible`
|
|
217
|
+
- `wait_for_element` / `wait_for_gone`
|
|
218
|
+
- `get_checkbox_state` / `get_slider_value`
|
|
219
|
+
- `assert_element_count`
|
|
220
|
+
|
|
221
|
+
</td>
|
|
222
|
+
<td valign="top">
|
|
223
|
+
|
|
224
|
+
### 🚀 Launch & Control
|
|
225
|
+
- `launch_app` — launch with flavors/defines
|
|
226
|
+
- `scan_and_connect` — find running apps
|
|
227
|
+
- `hot_reload` / `hot_restart`
|
|
228
|
+
- `list_sessions` / `switch_session`
|
|
229
|
+
|
|
230
|
+
</td>
|
|
231
|
+
</tr>
|
|
232
|
+
</table>
|
|
307
233
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
### Login Flow Test
|
|
311
|
-
```
|
|
312
|
-
You: "Test login with test@example.com / password123, verify it reaches the dashboard"
|
|
313
|
-
```
|
|
314
|
-
The AI agent will:
|
|
315
|
-
1. `launch_app` or `scan_and_connect` to your app
|
|
316
|
-
2. `screenshot` to see the current screen
|
|
317
|
-
3. `enter_text(key: "email_field", text: "test@example.com")`
|
|
318
|
-
4. `enter_text(key: "password_field", text: "password123")`
|
|
319
|
-
5. `tap(text: "Login")`
|
|
320
|
-
6. `wait_for_element(text: "Dashboard")`
|
|
321
|
-
7. `screenshot` to confirm
|
|
322
|
-
|
|
323
|
-
### Form Validation Test
|
|
324
|
-
```
|
|
325
|
-
You: "Submit the registration form empty and check that all validation errors appear"
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
### Navigation Test
|
|
329
|
-
```
|
|
330
|
-
You: "Navigate through all tabs, take a screenshot of each, and verify the back button works"
|
|
331
|
-
```
|
|
234
|
+
<details>
|
|
235
|
+
<summary><strong>Full tool reference (40+ tools)</strong></summary>
|
|
332
236
|
|
|
333
|
-
|
|
334
|
-
```
|
|
335
|
-
You: "Take screenshots of the home, profile, and settings pages - compare them with last time"
|
|
336
|
-
```
|
|
237
|
+
**Launch & Connect:** `launch_app`, `scan_and_connect`, `hot_reload`, `hot_restart`, `list_sessions`, `switch_session`, `close_session`
|
|
337
238
|
|
|
338
|
-
|
|
239
|
+
**Screen:** `screenshot`, `screenshot_region`, `screenshot_element`, `native_screenshot`, `inspect`, `get_widget_tree`, `find_by_type`, `get_text_content`
|
|
339
240
|
|
|
340
|
-
|
|
241
|
+
**Interaction:** `tap`, `double_tap`, `long_press`, `enter_text`, `swipe`, `scroll_to`, `drag`, `go_back`, `native_tap`, `native_input_text`, `native_swipe`
|
|
341
242
|
|
|
342
|
-
|
|
243
|
+
**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`
|
|
343
244
|
|
|
344
|
-
|
|
345
|
-
|------|--------------|-----------------|
|
|
346
|
-
| `native_screenshot` | `xcrun simctl screenshot` | `adb screencap` |
|
|
347
|
-
| `native_tap` | macOS Accessibility API | `adb input tap` |
|
|
348
|
-
| `native_input_text` | Pasteboard + Cmd+V | `adb input text` |
|
|
349
|
-
| `native_swipe` | Accessibility scroll | `adb input swipe` |
|
|
245
|
+
**Debug:** `get_logs`, `get_errors`, `get_performance`, `get_memory_stats`
|
|
350
246
|
|
|
351
|
-
|
|
247
|
+
</details>
|
|
352
248
|
|
|
353
249
|
---
|
|
354
250
|
|
|
355
|
-
##
|
|
356
|
-
|
|
357
|
-
Flutter 3.x defaults to the DTD protocol. Flutter Skill auto-adds `--vm-service-port=50000` to ensure VM Service protocol is available. No manual configuration needed.
|
|
251
|
+
## Example Workflows
|
|
358
252
|
|
|
359
|
-
If you see "no VM Service URI" errors:
|
|
360
|
-
```javascript
|
|
361
|
-
// Explicitly set a port
|
|
362
|
-
flutter-skill.launch_app({
|
|
363
|
-
project_path: ".",
|
|
364
|
-
extra_args: ["--vm-service-port=50000"]
|
|
365
|
-
})
|
|
366
253
|
```
|
|
254
|
+
"Test login with test@example.com / password123, verify it reaches the dashboard"
|
|
367
255
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
## Tool Priority Setup (Claude Code)
|
|
256
|
+
"Submit the registration form empty and check that all validation errors appear"
|
|
371
257
|
|
|
372
|
-
|
|
258
|
+
"Navigate through all tabs, screenshot each one, verify back button works"
|
|
373
259
|
|
|
374
|
-
|
|
375
|
-
flutter_skill setup
|
|
260
|
+
"Take screenshots of home, profile, and settings — compare with last time"
|
|
376
261
|
```
|
|
377
262
|
|
|
378
|
-
|
|
263
|
+
The AI agent figures out the steps. No test code needed.
|
|
379
264
|
|
|
380
265
|
---
|
|
381
266
|
|
|
382
|
-
##
|
|
267
|
+
## Native Platform Support
|
|
268
|
+
|
|
269
|
+
Flutter Skill sees through native dialogs that Flutter can't — permission popups, photo pickers, share sheets:
|
|
383
270
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
271
|
+
| Capability | iOS Simulator | Android Emulator |
|
|
272
|
+
|-----------|--------------|-----------------|
|
|
273
|
+
| Screenshot | `xcrun simctl` | `adb screencap` |
|
|
274
|
+
| Tap | macOS Accessibility | `adb input tap` |
|
|
275
|
+
| Text input | Pasteboard + Cmd+V | `adb input text` |
|
|
276
|
+
| Swipe | Accessibility scroll | `adb input swipe` |
|
|
388
277
|
|
|
389
|
-
|
|
390
|
-
- Same features as VSCode
|
|
391
|
-
- Integrates with IDE notifications
|
|
278
|
+
No external tools needed — uses built-in OS capabilities.
|
|
392
279
|
|
|
393
280
|
---
|
|
394
281
|
|
|
395
282
|
## Troubleshooting
|
|
396
283
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
flutter-skill
|
|
400
|
-
flutter
|
|
401
|
-
|
|
284
|
+
| Problem | Fix |
|
|
285
|
+
|---------|-----|
|
|
286
|
+
| "Not connected" | `flutter-skill scan_and_connect` to auto-find apps |
|
|
287
|
+
| "Unknown method" | `flutter pub add flutter_skill` then restart (not hot reload) |
|
|
288
|
+
| No VM Service URI | Add `--vm-service-port=50000` to launch args |
|
|
289
|
+
| Claude Code priority | Run `flutter_skill setup` for priority rules |
|
|
402
290
|
|
|
403
|
-
|
|
404
|
-
Your app doesn't have the flutter_skill package:
|
|
405
|
-
```bash
|
|
406
|
-
flutter pub add flutter_skill
|
|
407
|
-
```
|
|
408
|
-
Then restart the app (hot reload is not enough for new packages).
|
|
409
|
-
|
|
410
|
-
### More help
|
|
411
|
-
- [Usage Guide](docs/USAGE_GUIDE.md)
|
|
412
|
-
- [Architecture](docs/ARCHITECTURE.md)
|
|
413
|
-
- [Troubleshooting](docs/TROUBLESHOOTING.md)
|
|
414
|
-
- [Flutter 3.x Fix](docs/FLUTTER_3X_FIX.md)
|
|
291
|
+
📖 **Full docs:** [Usage Guide](docs/USAGE_GUIDE.md) · [Architecture](docs/ARCHITECTURE.md) · [Troubleshooting](docs/TROUBLESHOOTING.md) · [Flutter 3.x Fix](docs/FLUTTER_3X_FIX.md)
|
|
415
292
|
|
|
416
293
|
---
|
|
417
294
|
|
|
418
295
|
## Links
|
|
419
296
|
|
|
420
|
-
|
|
297
|
+
<table>
|
|
298
|
+
<tr>
|
|
299
|
+
<td>
|
|
300
|
+
|
|
301
|
+
📦 **Install**
|
|
421
302
|
- [pub.dev](https://pub.dev/packages/flutter_skill)
|
|
422
303
|
- [npm](https://www.npmjs.com/package/flutter-skill)
|
|
304
|
+
- [Homebrew](https://github.com/ai-dashboad/homebrew-flutter-skill)
|
|
305
|
+
|
|
306
|
+
</td>
|
|
307
|
+
<td>
|
|
308
|
+
|
|
309
|
+
🔌 **IDE Extensions**
|
|
423
310
|
- [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=ai-dashboad.flutter-skill)
|
|
424
311
|
- [JetBrains Marketplace](https://plugins.jetbrains.com/plugin/29991-flutter-skill)
|
|
425
|
-
- [Roadmap](docs/ROADMAP.md)
|
|
426
|
-
|
|
427
|
-
## Support This Project
|
|
428
312
|
|
|
429
|
-
|
|
313
|
+
</td>
|
|
314
|
+
<td>
|
|
430
315
|
|
|
431
|
-
|
|
432
|
-
- [
|
|
316
|
+
📖 **Docs**
|
|
317
|
+
- [Roadmap](docs/ROADMAP.md)
|
|
318
|
+
- [Changelog](CHANGELOG.md)
|
|
319
|
+
- [Architecture](docs/ARCHITECTURE.md)
|
|
433
320
|
|
|
434
|
-
|
|
321
|
+
</td>
|
|
322
|
+
</tr>
|
|
323
|
+
</table>
|
|
435
324
|
|
|
436
325
|
---
|
|
437
326
|
|
|
438
|
-
|
|
327
|
+
<p align="center">
|
|
328
|
+
<strong>If flutter-skill saves you time, <a href="https://github.com/ai-dashboad/flutter-skill">⭐ star it on GitHub</a>!</strong>
|
|
329
|
+
</p>
|
|
330
|
+
|
|
331
|
+
<p align="center">
|
|
332
|
+
<a href="https://github.com/sponsors/ai-dashboad">GitHub Sponsors</a> · <a href="https://buymeacoffee.com/ai-dashboad">Buy Me a Coffee</a>
|
|
333
|
+
</p>
|
|
439
334
|
|
|
440
|
-
MIT
|
|
335
|
+
<p align="center">MIT License</p>
|
|
@@ -101,10 +101,7 @@ class FlutterMcpServer {
|
|
|
101
101
|
_sendResult(id, {
|
|
102
102
|
"capabilities": {"tools": {}, "resources": {}},
|
|
103
103
|
"protocolVersion": "2024-11-05",
|
|
104
|
-
"serverInfo": {
|
|
105
|
-
"name": "flutter-skill",
|
|
106
|
-
"version": _currentVersion
|
|
107
|
-
},
|
|
104
|
+
"serverInfo": {"name": "flutter-skill", "version": _currentVersion},
|
|
108
105
|
});
|
|
109
106
|
} else if (method == 'notifications/initialized') {
|
|
110
107
|
// No op
|