flutter-skill 0.7.4 → 0.7.6
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 +194 -313
- package/dart/.dart_tool/extension_discovery/README.md +31 -0
- package/dart/.dart_tool/extension_discovery/devtools.json +1 -0
- package/dart/.dart_tool/extension_discovery/vs_code.json +1 -0
- package/dart/.dart_tool/package_config.json +196 -0
- package/dart/.dart_tool/package_graph.json +258 -0
- package/dart/.dart_tool/version +1 -0
- package/dart/lib/src/cli/server.dart +1 -4
- package/dart/pubspec.lock +237 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,83 +1,37 @@
|
|
|
1
1
|
# Flutter Skill
|
|
2
2
|
|
|
3
|
-
> **AI
|
|
3
|
+
> **Give your AI Agent eyes and hands inside your Flutter app.**
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|

|
|
7
7
|

|
|
8
|
-

|
|
9
9
|
|
|
10
|
-
**Flutter Skill** is
|
|
10
|
+
**Flutter Skill** is a bridge that connects AI Agents (like Claude Code, Cursor, Windsurf) directly to running Flutter applications via the MCP (Model Context Protocol). It provides 30+ tools for UI automation, inspection, and testing.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
You: "Test the login flow - enter test@example.com and password123, tap Login, verify Dashboard appears"
|
|
14
|
-
|
|
15
|
-
AI Agent:
|
|
16
|
-
1. screenshot() → sees the login screen
|
|
17
|
-
2. enter_text("email") → types the email
|
|
18
|
-
3. enter_text("password") → types the password
|
|
19
|
-
4. tap("Login") → taps the button
|
|
20
|
-
5. wait_for_element("Dashboard") → confirms navigation
|
|
21
|
-
6. screenshot() → captures the result
|
|
22
|
-
✅ Login flow verified!
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Why Flutter Skill?
|
|
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
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Quick Start (2 minutes)
|
|
12
|
+
## Quick Start
|
|
44
13
|
|
|
45
|
-
### 1. Install
|
|
14
|
+
### 1. Install (choose one)
|
|
46
15
|
|
|
47
16
|
```bash
|
|
48
|
-
#
|
|
49
|
-
curl -fsSL https://raw.githubusercontent.com/ai-dashboad/flutter-skill/main/install.sh | bash
|
|
50
|
-
|
|
51
|
-
# Or: npm (all platforms)
|
|
17
|
+
# npm (recommended - includes native binary for instant startup)
|
|
52
18
|
npm install -g flutter-skill
|
|
53
19
|
|
|
54
|
-
#
|
|
55
|
-
brew tap ai-dashboad/flutter-skill
|
|
20
|
+
# Homebrew (macOS/Linux)
|
|
21
|
+
brew tap ai-dashboad/flutter-skill
|
|
22
|
+
brew install flutter-skill
|
|
56
23
|
|
|
57
|
-
#
|
|
24
|
+
# Dart
|
|
58
25
|
dart pub global activate flutter_skill
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
<details>
|
|
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
26
|
|
|
76
|
-
|
|
27
|
+
# IDE Extensions
|
|
28
|
+
# - VSCode: Search "Flutter Skill" in Extensions
|
|
29
|
+
# - IntelliJ/Android Studio: Search "Flutter Skill" in Plugins
|
|
30
|
+
```
|
|
77
31
|
|
|
78
|
-
### 2. Configure
|
|
32
|
+
### 2. Configure AI Agent
|
|
79
33
|
|
|
80
|
-
Add to your agent's MCP config:
|
|
34
|
+
Add to your AI agent's MCP config:
|
|
81
35
|
|
|
82
36
|
**Claude Code** (`~/.claude/settings.json`):
|
|
83
37
|
```json
|
|
@@ -91,9 +45,6 @@ Add to your agent's MCP config:
|
|
|
91
45
|
}
|
|
92
46
|
```
|
|
93
47
|
|
|
94
|
-
<details>
|
|
95
|
-
<summary>Cursor, Windsurf, and other agents</summary>
|
|
96
|
-
|
|
97
48
|
**Cursor** (`~/.cursor/mcp.json`):
|
|
98
49
|
```json
|
|
99
50
|
{
|
|
@@ -106,289 +57,222 @@ Add to your agent's MCP config:
|
|
|
106
57
|
}
|
|
107
58
|
```
|
|
108
59
|
|
|
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
|
-
```
|
|
120
|
-
|
|
121
|
-
```dart
|
|
122
|
-
// main.dart
|
|
123
|
-
import 'package:flutter/foundation.dart';
|
|
124
|
-
import 'package:flutter_skill/flutter_skill.dart';
|
|
125
|
-
|
|
126
|
-
void main() {
|
|
127
|
-
if (kDebugMode) {
|
|
128
|
-
FlutterSkillBinding.ensureInitialized();
|
|
129
|
-
}
|
|
130
|
-
runApp(MyApp());
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
> **Tip:** `launch_app` can auto-add this for you. The `kDebugMode` guard ensures it's stripped from release builds.
|
|
135
|
-
|
|
136
|
-
### 4. Start Testing
|
|
60
|
+
### 3. Use
|
|
137
61
|
|
|
138
|
-
|
|
62
|
+
```javascript
|
|
63
|
+
// Option 1: Launch app with environment variables
|
|
64
|
+
flutter-skill.launch_app({
|
|
65
|
+
project_path: "/path/to/flutter/project",
|
|
66
|
+
dart_defines: ["ENV=staging", "DEBUG=true"],
|
|
67
|
+
flavor: "staging"
|
|
68
|
+
})
|
|
139
69
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
```
|
|
70
|
+
// Option 2: Connect to already running app (auto-detect)
|
|
71
|
+
flutter-skill.scan_and_connect()
|
|
143
72
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
flutter-skill.
|
|
147
|
-
flutter-skill.inspect()
|
|
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
|
|
73
|
+
// Now use any tool
|
|
74
|
+
flutter-skill.screenshot()
|
|
75
|
+
flutter-skill.tap({ text: "Login" })
|
|
76
|
+
flutter-skill.inspect()
|
|
151
77
|
```
|
|
152
78
|
|
|
153
79
|
---
|
|
154
80
|
|
|
155
|
-
##
|
|
156
|
-
|
|
157
|
-
Flutter Skill isn't just for Flutter — it works with **5 platforms**, giving AI agents control over any app:
|
|
158
|
-
|
|
159
|
-
| Platform | SDK | Status |
|
|
160
|
-
|----------|-----|--------|
|
|
161
|
-
| **Flutter** (Dart) | Core — `flutter_skill` package | ✅ Stable |
|
|
162
|
-
| **Web** (JavaScript) | `sdks/web/flutter-skill.js` | ✅ Stable |
|
|
163
|
-
| **React Native** | `sdks/react-native/` npm package | ✅ Stable |
|
|
164
|
-
| **iOS** (Swift/SwiftUI) | `sdks/ios/` Swift Package | ✅ Stable |
|
|
165
|
-
| **Android** (Kotlin) | `sdks/android/` Gradle dependency | ✅ Stable |
|
|
81
|
+
## Features
|
|
166
82
|
|
|
167
|
-
###
|
|
83
|
+
### App Lifecycle Management
|
|
84
|
+
| Tool | Description |
|
|
85
|
+
|------|-------------|
|
|
86
|
+
| `launch_app` | Launch Flutter app with dart_defines, flavor, target, extra_args |
|
|
87
|
+
| `scan_and_connect` | Auto-scan ports and connect to first running Flutter app |
|
|
88
|
+
| `list_running_apps` | List all running Flutter apps (VM Services) |
|
|
89
|
+
| `connect_app` | Connect to specific VM Service URI |
|
|
90
|
+
| `stop_app` | Stop the currently running app |
|
|
91
|
+
| `disconnect` | Disconnect without stopping the app |
|
|
92
|
+
| `get_connection_status` | Get connection info and suggestions |
|
|
93
|
+
| `hot_reload` | Fast reload (keeps state) |
|
|
94
|
+
| `hot_restart` | Full restart (resets state) |
|
|
95
|
+
|
|
96
|
+
### UI Inspection
|
|
97
|
+
| Tool | Description |
|
|
98
|
+
|------|-------------|
|
|
99
|
+
| `inspect` | Get interactive elements (buttons, text fields, etc.) |
|
|
100
|
+
| `get_widget_tree` | Get widget tree structure with depth control |
|
|
101
|
+
| `get_widget_properties` | Get properties of a widget (size, position, visibility) |
|
|
102
|
+
| `get_text_content` | Extract all visible text from the screen |
|
|
103
|
+
| `find_by_type` | Find widgets by type (e.g., ElevatedButton) |
|
|
104
|
+
|
|
105
|
+
### Interactions
|
|
106
|
+
| Tool | Description |
|
|
107
|
+
|------|-------------|
|
|
108
|
+
| `tap` | Tap a widget by Key or Text |
|
|
109
|
+
| `double_tap` | Double tap a widget |
|
|
110
|
+
| `long_press` | Long press with configurable duration |
|
|
111
|
+
| `swipe` | Swipe gesture (up/down/left/right) |
|
|
112
|
+
| `drag` | Drag from one element to another |
|
|
113
|
+
| `scroll_to` | Scroll to make an element visible |
|
|
114
|
+
| `enter_text` | Enter text into a text field |
|
|
168
115
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
116
|
+
### State & Validation
|
|
117
|
+
| Tool | Description |
|
|
118
|
+
|------|-------------|
|
|
119
|
+
| `get_text_value` | Get current value of a text field |
|
|
120
|
+
| `get_checkbox_state` | Get checked state of a checkbox/switch |
|
|
121
|
+
| `get_slider_value` | Get current value of a slider |
|
|
122
|
+
| `wait_for_element` | Wait for an element to appear (with timeout) |
|
|
123
|
+
| `wait_for_gone` | Wait for an element to disappear |
|
|
124
|
+
|
|
125
|
+
### Screenshots
|
|
126
|
+
| Tool | Description |
|
|
127
|
+
|------|-------------|
|
|
128
|
+
| `screenshot` | Take full app screenshot (returns base64) |
|
|
129
|
+
| `screenshot_element` | Take screenshot of specific element |
|
|
175
130
|
|
|
176
|
-
###
|
|
131
|
+
### Navigation
|
|
132
|
+
| Tool | Description |
|
|
133
|
+
|------|-------------|
|
|
134
|
+
| `get_current_route` | Get the current route name |
|
|
135
|
+
| `go_back` | Navigate back |
|
|
136
|
+
| `get_navigation_stack` | Get the navigation stack |
|
|
177
137
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
138
|
+
### Debug & Logs
|
|
139
|
+
| Tool | Description |
|
|
140
|
+
|------|-------------|
|
|
141
|
+
| `get_logs` | Get application logs |
|
|
142
|
+
| `get_errors` | Get application errors |
|
|
143
|
+
| `clear_logs` | Clear logs and errors |
|
|
144
|
+
| `get_performance` | Get performance metrics |
|
|
181
145
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
146
|
+
### Utilities
|
|
147
|
+
| Tool | Description |
|
|
148
|
+
|------|-------------|
|
|
149
|
+
| `pub_search` | Search Flutter packages on pub.dev |
|
|
186
150
|
|
|
187
|
-
|
|
151
|
+
---
|
|
188
152
|
|
|
189
|
-
|
|
190
|
-
```
|
|
191
|
-
https://github.com/ai-dashboad/flutter-skill (sdks/ios)
|
|
192
|
-
```
|
|
153
|
+
## Installation Methods
|
|
193
154
|
|
|
194
|
-
|
|
195
|
-
|
|
155
|
+
| Method | Command | Auto-Update | Native Binary |
|
|
156
|
+
|--------|---------|-------------|---------------|
|
|
157
|
+
| npm | `npm install -g flutter-skill` | Manual | Auto-download |
|
|
158
|
+
| Homebrew | `brew install ai-dashboad/flutter-skill/flutter-skill` | `brew upgrade` | Pre-compiled |
|
|
159
|
+
| VSCode | Extensions → "Flutter Skill" | Auto | Auto-download |
|
|
160
|
+
| IntelliJ | Plugins → "Flutter Skill" | Auto | Auto-download |
|
|
161
|
+
| pub.dev | `dart pub global activate flutter_skill` | Manual | Dart runtime |
|
|
196
162
|
|
|
197
|
-
|
|
198
|
-
|
|
163
|
+
### Native Binary Performance
|
|
164
|
+
| Version | Startup Time |
|
|
165
|
+
|---------|--------------|
|
|
166
|
+
| Dart JIT | ~1 second |
|
|
167
|
+
| Native Binary | ~0.01 second |
|
|
199
168
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
169
|
+
Native binaries are automatically downloaded on first use for supported platforms:
|
|
170
|
+
- macOS (Apple Silicon & Intel)
|
|
171
|
+
- Linux (x64)
|
|
172
|
+
- Windows (x64)
|
|
203
173
|
|
|
204
|
-
|
|
205
|
-
.flutterSkillButton("submitBtn")
|
|
174
|
+
---
|
|
206
175
|
|
|
207
|
-
|
|
208
|
-
.flutterSkillTextField("emailField")
|
|
209
|
-
```
|
|
176
|
+
## Flutter App Setup
|
|
210
177
|
|
|
211
|
-
|
|
178
|
+
For the MCP tools to work, your Flutter app needs the `flutter_skill` package:
|
|
212
179
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
180
|
+
### Automatic Setup (Recommended)
|
|
181
|
+
```bash
|
|
182
|
+
flutter-skill launch /path/to/project
|
|
183
|
+
# Automatically adds dependency and initializes
|
|
216
184
|
```
|
|
217
185
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
186
|
+
### Manual Setup
|
|
187
|
+
1. Add dependency:
|
|
188
|
+
```yaml
|
|
189
|
+
dependencies:
|
|
190
|
+
flutter_skill: ^0.2.13
|
|
223
191
|
```
|
|
224
192
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
193
|
+
2. Initialize in main.dart:
|
|
194
|
+
```dart
|
|
195
|
+
import 'package:flutter_skill/flutter_skill.dart';
|
|
228
196
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
flutter_skill act screenshot # Capture the screen
|
|
197
|
+
void main() {
|
|
198
|
+
FlutterSkillBinding.ensureInitialized();
|
|
199
|
+
runApp(MyApp());
|
|
200
|
+
}
|
|
234
201
|
```
|
|
235
202
|
|
|
236
|
-
All platforms support the same 14 capabilities: inspect, tap, enter_text, scroll, screenshot, get_text, find_element, wait_for_element, and more.
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
## What Can It Do?
|
|
241
|
-
|
|
242
|
-
### 40+ MCP Tools for Complete App Control
|
|
243
|
-
|
|
244
|
-
**Launch & Connect**
|
|
245
|
-
| Tool | What it does |
|
|
246
|
-
|------|-------------|
|
|
247
|
-
| `launch_app` | Launch app with dart-defines, flavors, custom targets |
|
|
248
|
-
| `scan_and_connect` | Auto-find and connect to any running Flutter app |
|
|
249
|
-
| `hot_reload` / `hot_restart` | Reload code without restarting |
|
|
250
|
-
|
|
251
|
-
**See the Screen**
|
|
252
|
-
| Tool | What it does |
|
|
253
|
-
|------|-------------|
|
|
254
|
-
| `screenshot` | Full app screenshot (configurable quality) |
|
|
255
|
-
| `screenshot_region` | Screenshot a specific area |
|
|
256
|
-
| `screenshot_element` | Screenshot a single widget |
|
|
257
|
-
| `native_screenshot` | OS-level screenshot (native dialogs, permission popups) |
|
|
258
|
-
| `inspect` | List all interactive elements with coordinates |
|
|
259
|
-
| `get_widget_tree` | Full widget tree structure |
|
|
260
|
-
| `find_by_type` | Find widgets by type (e.g., `ElevatedButton`) |
|
|
261
|
-
| `get_text_content` | Extract all visible text |
|
|
262
|
-
|
|
263
|
-
**Interact Like a User**
|
|
264
|
-
| Tool | What it does |
|
|
265
|
-
|------|-------------|
|
|
266
|
-
| `tap` | Tap by Key, text, or coordinates |
|
|
267
|
-
| `double_tap` | Double tap |
|
|
268
|
-
| `long_press` | Long press with configurable duration |
|
|
269
|
-
| `enter_text` | Type into text fields (by key or focused field) |
|
|
270
|
-
| `swipe` | Swipe gestures (up/down/left/right) |
|
|
271
|
-
| `scroll_to` | Scroll until element is visible |
|
|
272
|
-
| `drag` | Drag from one element to another |
|
|
273
|
-
| `go_back` | Navigate back |
|
|
274
|
-
| `native_tap` | Tap native UI (permission dialogs, photo pickers) |
|
|
275
|
-
| `native_input_text` | Type into native text fields |
|
|
276
|
-
| `native_swipe` | Scroll native views |
|
|
277
|
-
|
|
278
|
-
**Verify & Assert**
|
|
279
|
-
| Tool | What it does |
|
|
280
|
-
|------|-------------|
|
|
281
|
-
| `assert_text` | Verify element contains expected text |
|
|
282
|
-
| `assert_visible` | Verify element is visible |
|
|
283
|
-
| `assert_not_visible` | Verify element is gone |
|
|
284
|
-
| `assert_element_count` | Verify number of matching elements |
|
|
285
|
-
| `wait_for_element` | Wait for element to appear (with timeout) |
|
|
286
|
-
| `wait_for_gone` | Wait for element to disappear |
|
|
287
|
-
| `get_checkbox_state` | Read checkbox/switch state |
|
|
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
203
|
---
|
|
307
204
|
|
|
308
205
|
## Example Workflows
|
|
309
206
|
|
|
310
|
-
###
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
```
|
|
332
|
-
|
|
333
|
-
### Visual Regression
|
|
334
|
-
```
|
|
335
|
-
You: "Take screenshots of the home, profile, and settings pages - compare them with last time"
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
---
|
|
339
|
-
|
|
340
|
-
## Native Platform Support
|
|
207
|
+
### E2E Testing with Environment Variables
|
|
208
|
+
```javascript
|
|
209
|
+
// Launch staging environment
|
|
210
|
+
flutter-skill.launch_app({
|
|
211
|
+
project_path: "./",
|
|
212
|
+
dart_defines: ["ENV=staging", "API_URL=https://staging.api.com"],
|
|
213
|
+
flavor: "staging",
|
|
214
|
+
target: "lib/main_staging.dart"
|
|
215
|
+
})
|
|
341
216
|
|
|
342
|
-
|
|
217
|
+
// Wait for app to load
|
|
218
|
+
flutter-skill.wait_for_element({ text: "Welcome" })
|
|
343
219
|
|
|
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` |
|
|
220
|
+
// Take screenshot
|
|
221
|
+
flutter-skill.screenshot()
|
|
350
222
|
|
|
351
|
-
|
|
223
|
+
// Perform login
|
|
224
|
+
flutter-skill.tap({ text: "Login" })
|
|
225
|
+
flutter-skill.enter_text({ key: "email_field", text: "test@example.com" })
|
|
226
|
+
flutter-skill.enter_text({ key: "password_field", text: "password123" })
|
|
227
|
+
flutter-skill.tap({ text: "Submit" })
|
|
352
228
|
|
|
353
|
-
|
|
229
|
+
// Verify success
|
|
230
|
+
flutter-skill.wait_for_element({ text: "Dashboard" })
|
|
231
|
+
```
|
|
354
232
|
|
|
355
|
-
|
|
233
|
+
### Connect to Running App
|
|
234
|
+
```javascript
|
|
235
|
+
// List all running Flutter apps
|
|
236
|
+
flutter-skill.list_running_apps()
|
|
237
|
+
// Returns: { apps: ["ws://127.0.0.1:50123/ws", ...], count: 2 }
|
|
356
238
|
|
|
357
|
-
|
|
239
|
+
// Auto-connect to first one
|
|
240
|
+
flutter-skill.scan_and_connect()
|
|
358
241
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
// Explicitly set a port
|
|
362
|
-
flutter-skill.launch_app({
|
|
363
|
-
project_path: ".",
|
|
364
|
-
extra_args: ["--vm-service-port=50000"]
|
|
365
|
-
})
|
|
242
|
+
// Or connect to specific one
|
|
243
|
+
flutter-skill.connect_app({ uri: "ws://127.0.0.1:50123/ws" })
|
|
366
244
|
```
|
|
367
245
|
|
|
368
|
-
|
|
246
|
+
### Debug a UI Issue
|
|
247
|
+
```javascript
|
|
248
|
+
// Get widget tree
|
|
249
|
+
flutter-skill.get_widget_tree({ max_depth: 5 })
|
|
369
250
|
|
|
370
|
-
|
|
251
|
+
// Find specific widgets
|
|
252
|
+
flutter-skill.find_by_type({ type: "ElevatedButton" })
|
|
371
253
|
|
|
372
|
-
|
|
254
|
+
// Inspect interactive elements
|
|
255
|
+
flutter-skill.inspect()
|
|
373
256
|
|
|
374
|
-
|
|
375
|
-
|
|
257
|
+
// Check if element is visible
|
|
258
|
+
flutter-skill.wait_for_element({ key: "submit_button", timeout: 3000 })
|
|
376
259
|
```
|
|
377
260
|
|
|
378
|
-
This installs priority rules so Claude Code automatically chooses Flutter Skill over Dart MCP, giving you full UI automation (tap, screenshot, swipe) instead of read-only inspection.
|
|
379
|
-
|
|
380
261
|
---
|
|
381
262
|
|
|
382
263
|
## IDE Extensions
|
|
383
264
|
|
|
384
265
|
### VSCode Extension
|
|
385
266
|
- Auto-detects Flutter projects
|
|
267
|
+
- Prompts to add `flutter_skill` dependency
|
|
268
|
+
- Auto-downloads native binary
|
|
386
269
|
- Status bar shows connection state
|
|
387
270
|
- Commands: Launch, Inspect, Screenshot
|
|
388
271
|
|
|
389
|
-
### IntelliJ
|
|
272
|
+
### IntelliJ/Android Studio Plugin
|
|
390
273
|
- Same features as VSCode
|
|
391
274
|
- Integrates with IDE notifications
|
|
275
|
+
- Tool window for status
|
|
392
276
|
|
|
393
277
|
---
|
|
394
278
|
|
|
@@ -396,22 +280,31 @@ This installs priority rules so Claude Code automatically chooses Flutter Skill
|
|
|
396
280
|
|
|
397
281
|
### "Not connected to Flutter app"
|
|
398
282
|
```javascript
|
|
399
|
-
|
|
400
|
-
flutter-skill.
|
|
283
|
+
// Check status and get suggestions
|
|
284
|
+
flutter-skill.get_connection_status()
|
|
285
|
+
|
|
286
|
+
// This returns:
|
|
287
|
+
// - Current connection state
|
|
288
|
+
// - List of available apps
|
|
289
|
+
// - Actionable suggestions
|
|
401
290
|
```
|
|
402
291
|
|
|
403
292
|
### "Unknown method ext.flutter.flutter_skill.xxx"
|
|
404
|
-
Your app doesn't have the flutter_skill package:
|
|
293
|
+
Your Flutter app doesn't have the `flutter_skill` package. Add it:
|
|
405
294
|
```bash
|
|
406
295
|
flutter pub add flutter_skill
|
|
407
296
|
```
|
|
408
|
-
Then restart the app (hot reload is not enough
|
|
297
|
+
Then restart the app (hot reload is not enough).
|
|
409
298
|
|
|
410
|
-
###
|
|
411
|
-
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
299
|
+
### MCP server slow to start
|
|
300
|
+
The native binary should auto-download. If not:
|
|
301
|
+
```bash
|
|
302
|
+
# For npm
|
|
303
|
+
npm update -g flutter-skill
|
|
304
|
+
|
|
305
|
+
# For Homebrew
|
|
306
|
+
brew upgrade flutter-skill
|
|
307
|
+
```
|
|
415
308
|
|
|
416
309
|
---
|
|
417
310
|
|
|
@@ -421,19 +314,7 @@ Then restart the app (hot reload is not enough for new packages).
|
|
|
421
314
|
- [pub.dev](https://pub.dev/packages/flutter_skill)
|
|
422
315
|
- [npm](https://www.npmjs.com/package/flutter-skill)
|
|
423
316
|
- [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=ai-dashboad.flutter-skill)
|
|
424
|
-
- [JetBrains Marketplace](https://plugins.jetbrains.com/plugin/
|
|
425
|
-
- [Roadmap](docs/ROADMAP.md)
|
|
426
|
-
|
|
427
|
-
## Support This Project
|
|
428
|
-
|
|
429
|
-
If Flutter Skill helps you build better Flutter apps, consider supporting its development:
|
|
430
|
-
|
|
431
|
-
- [GitHub Sponsors](https://github.com/sponsors/ai-dashboad)
|
|
432
|
-
- [Buy Me a Coffee](https://buymeacoffee.com/ai-dashboad)
|
|
433
|
-
|
|
434
|
-
Your support helps maintain the project, add new features, and keep it free and open source.
|
|
435
|
-
|
|
436
|
-
---
|
|
317
|
+
- [JetBrains Marketplace](https://plugins.jetbrains.com/plugin/PLUGIN_ID)
|
|
437
318
|
|
|
438
319
|
## License
|
|
439
320
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Extension Discovery Cache
|
|
2
|
+
=========================
|
|
3
|
+
|
|
4
|
+
This folder is used by `package:extension_discovery` to cache lists of
|
|
5
|
+
packages that contains extensions for other packages.
|
|
6
|
+
|
|
7
|
+
DO NOT USE THIS FOLDER
|
|
8
|
+
----------------------
|
|
9
|
+
|
|
10
|
+
* Do not read (or rely) the contents of this folder.
|
|
11
|
+
* Do write to this folder.
|
|
12
|
+
|
|
13
|
+
If you're interested in the lists of extensions stored in this folder use the
|
|
14
|
+
API offered by package `extension_discovery` to get this information.
|
|
15
|
+
|
|
16
|
+
If this package doesn't work for your use-case, then don't try to read the
|
|
17
|
+
contents of this folder. It may change, and will not remain stable.
|
|
18
|
+
|
|
19
|
+
Use package `extension_discovery`
|
|
20
|
+
---------------------------------
|
|
21
|
+
|
|
22
|
+
If you want to access information from this folder.
|
|
23
|
+
|
|
24
|
+
Feel free to delete this folder
|
|
25
|
+
-------------------------------
|
|
26
|
+
|
|
27
|
+
Files in this folder act as a cache, and the cache is discarded if the files
|
|
28
|
+
are older than the modification time of `.dart_tool/package_config.json`.
|
|
29
|
+
|
|
30
|
+
Hence, it should never be necessary to clear this cache manually, if you find a
|
|
31
|
+
need to do please file a bug.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":2,"entries":[{"package":"flutter_skill","rootUri":"../","packageUri":"lib/"}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":2,"entries":[{"package":"flutter_skill","rootUri":"../","packageUri":"lib/"}]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
{
|
|
2
|
+
"configVersion": 2,
|
|
3
|
+
"packages": [
|
|
4
|
+
{
|
|
5
|
+
"name": "async",
|
|
6
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/async-2.13.0",
|
|
7
|
+
"packageUri": "lib/",
|
|
8
|
+
"languageVersion": "3.4"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "boolean_selector",
|
|
12
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2",
|
|
13
|
+
"packageUri": "lib/",
|
|
14
|
+
"languageVersion": "3.1"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "characters",
|
|
18
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/characters-1.4.1",
|
|
19
|
+
"packageUri": "lib/",
|
|
20
|
+
"languageVersion": "3.4"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "clock",
|
|
24
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/clock-1.1.2",
|
|
25
|
+
"packageUri": "lib/",
|
|
26
|
+
"languageVersion": "3.4"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "collection",
|
|
30
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/collection-1.19.1",
|
|
31
|
+
"packageUri": "lib/",
|
|
32
|
+
"languageVersion": "3.4"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "fake_async",
|
|
36
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/fake_async-1.3.3",
|
|
37
|
+
"packageUri": "lib/",
|
|
38
|
+
"languageVersion": "3.3"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "flutter",
|
|
42
|
+
"rootUri": "file:///Users/cw/development/flutter/packages/flutter",
|
|
43
|
+
"packageUri": "lib/",
|
|
44
|
+
"languageVersion": "3.9"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"name": "flutter_test",
|
|
48
|
+
"rootUri": "file:///Users/cw/development/flutter/packages/flutter_test",
|
|
49
|
+
"packageUri": "lib/",
|
|
50
|
+
"languageVersion": "3.9"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "http",
|
|
54
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/http-1.6.0",
|
|
55
|
+
"packageUri": "lib/",
|
|
56
|
+
"languageVersion": "3.4"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "http_parser",
|
|
60
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/http_parser-4.1.2",
|
|
61
|
+
"packageUri": "lib/",
|
|
62
|
+
"languageVersion": "3.4"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "leak_tracker",
|
|
66
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2",
|
|
67
|
+
"packageUri": "lib/",
|
|
68
|
+
"languageVersion": "3.2"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "leak_tracker_flutter_testing",
|
|
72
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10",
|
|
73
|
+
"packageUri": "lib/",
|
|
74
|
+
"languageVersion": "3.2"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "leak_tracker_testing",
|
|
78
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2",
|
|
79
|
+
"packageUri": "lib/",
|
|
80
|
+
"languageVersion": "3.2"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "lints",
|
|
84
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/lints-3.0.0",
|
|
85
|
+
"packageUri": "lib/",
|
|
86
|
+
"languageVersion": "3.0"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "logging",
|
|
90
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/logging-1.3.0",
|
|
91
|
+
"packageUri": "lib/",
|
|
92
|
+
"languageVersion": "3.4"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "matcher",
|
|
96
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/matcher-0.12.18",
|
|
97
|
+
"packageUri": "lib/",
|
|
98
|
+
"languageVersion": "3.7"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"name": "material_color_utilities",
|
|
102
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0",
|
|
103
|
+
"packageUri": "lib/",
|
|
104
|
+
"languageVersion": "3.5"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"name": "meta",
|
|
108
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/meta-1.17.0",
|
|
109
|
+
"packageUri": "lib/",
|
|
110
|
+
"languageVersion": "3.5"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"name": "path",
|
|
114
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/path-1.9.1",
|
|
115
|
+
"packageUri": "lib/",
|
|
116
|
+
"languageVersion": "3.4"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"name": "sky_engine",
|
|
120
|
+
"rootUri": "file:///Users/cw/development/flutter/bin/cache/pkg/sky_engine",
|
|
121
|
+
"packageUri": "lib/",
|
|
122
|
+
"languageVersion": "3.9"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"name": "source_span",
|
|
126
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/source_span-1.10.1",
|
|
127
|
+
"packageUri": "lib/",
|
|
128
|
+
"languageVersion": "3.1"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "stack_trace",
|
|
132
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/stack_trace-1.12.1",
|
|
133
|
+
"packageUri": "lib/",
|
|
134
|
+
"languageVersion": "3.4"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"name": "stream_channel",
|
|
138
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/stream_channel-2.1.4",
|
|
139
|
+
"packageUri": "lib/",
|
|
140
|
+
"languageVersion": "3.3"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"name": "string_scanner",
|
|
144
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/string_scanner-1.4.1",
|
|
145
|
+
"packageUri": "lib/",
|
|
146
|
+
"languageVersion": "3.1"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"name": "term_glyph",
|
|
150
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/term_glyph-1.2.2",
|
|
151
|
+
"packageUri": "lib/",
|
|
152
|
+
"languageVersion": "3.1"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"name": "test_api",
|
|
156
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/test_api-0.7.8",
|
|
157
|
+
"packageUri": "lib/",
|
|
158
|
+
"languageVersion": "3.7"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"name": "typed_data",
|
|
162
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/typed_data-1.4.0",
|
|
163
|
+
"packageUri": "lib/",
|
|
164
|
+
"languageVersion": "3.5"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"name": "vector_math",
|
|
168
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/vector_math-2.2.0",
|
|
169
|
+
"packageUri": "lib/",
|
|
170
|
+
"languageVersion": "3.1"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"name": "vm_service",
|
|
174
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/vm_service-14.3.1",
|
|
175
|
+
"packageUri": "lib/",
|
|
176
|
+
"languageVersion": "3.3"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"name": "web",
|
|
180
|
+
"rootUri": "file:///Users/cw/.pub-cache/hosted/pub.dev/web-1.1.1",
|
|
181
|
+
"packageUri": "lib/",
|
|
182
|
+
"languageVersion": "3.4"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"name": "flutter_skill",
|
|
186
|
+
"rootUri": "../",
|
|
187
|
+
"packageUri": "lib/",
|
|
188
|
+
"languageVersion": "3.0"
|
|
189
|
+
}
|
|
190
|
+
],
|
|
191
|
+
"generator": "pub",
|
|
192
|
+
"generatorVersion": "3.11.0-296.4.beta",
|
|
193
|
+
"flutterRoot": "file:///Users/cw/development/flutter",
|
|
194
|
+
"flutterVersion": "3.41.0-0.1.pre",
|
|
195
|
+
"pubCache": "file:///Users/cw/.pub-cache"
|
|
196
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
{
|
|
2
|
+
"roots": [
|
|
3
|
+
"flutter_skill"
|
|
4
|
+
],
|
|
5
|
+
"packages": [
|
|
6
|
+
{
|
|
7
|
+
"name": "flutter_skill",
|
|
8
|
+
"version": "0.2.0",
|
|
9
|
+
"dependencies": [
|
|
10
|
+
"flutter",
|
|
11
|
+
"http",
|
|
12
|
+
"logging",
|
|
13
|
+
"path",
|
|
14
|
+
"vm_service"
|
|
15
|
+
],
|
|
16
|
+
"devDependencies": [
|
|
17
|
+
"flutter_test",
|
|
18
|
+
"lints"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "lints",
|
|
23
|
+
"version": "3.0.0",
|
|
24
|
+
"dependencies": []
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "flutter_test",
|
|
28
|
+
"version": "0.0.0",
|
|
29
|
+
"dependencies": [
|
|
30
|
+
"clock",
|
|
31
|
+
"collection",
|
|
32
|
+
"fake_async",
|
|
33
|
+
"flutter",
|
|
34
|
+
"leak_tracker_flutter_testing",
|
|
35
|
+
"matcher",
|
|
36
|
+
"meta",
|
|
37
|
+
"path",
|
|
38
|
+
"stack_trace",
|
|
39
|
+
"stream_channel",
|
|
40
|
+
"test_api",
|
|
41
|
+
"vector_math"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "logging",
|
|
46
|
+
"version": "1.3.0",
|
|
47
|
+
"dependencies": []
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "path",
|
|
51
|
+
"version": "1.9.1",
|
|
52
|
+
"dependencies": []
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "http",
|
|
56
|
+
"version": "1.6.0",
|
|
57
|
+
"dependencies": [
|
|
58
|
+
"async",
|
|
59
|
+
"http_parser",
|
|
60
|
+
"meta",
|
|
61
|
+
"web"
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "vm_service",
|
|
66
|
+
"version": "14.3.1",
|
|
67
|
+
"dependencies": []
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "flutter",
|
|
71
|
+
"version": "0.0.0",
|
|
72
|
+
"dependencies": [
|
|
73
|
+
"characters",
|
|
74
|
+
"collection",
|
|
75
|
+
"material_color_utilities",
|
|
76
|
+
"meta",
|
|
77
|
+
"sky_engine",
|
|
78
|
+
"vector_math"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "stream_channel",
|
|
83
|
+
"version": "2.1.4",
|
|
84
|
+
"dependencies": [
|
|
85
|
+
"async"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "meta",
|
|
90
|
+
"version": "1.17.0",
|
|
91
|
+
"dependencies": []
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "collection",
|
|
95
|
+
"version": "1.19.1",
|
|
96
|
+
"dependencies": []
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"name": "leak_tracker_flutter_testing",
|
|
100
|
+
"version": "3.0.10",
|
|
101
|
+
"dependencies": [
|
|
102
|
+
"flutter",
|
|
103
|
+
"leak_tracker",
|
|
104
|
+
"leak_tracker_testing",
|
|
105
|
+
"matcher",
|
|
106
|
+
"meta"
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "vector_math",
|
|
111
|
+
"version": "2.2.0",
|
|
112
|
+
"dependencies": []
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "stack_trace",
|
|
116
|
+
"version": "1.12.1",
|
|
117
|
+
"dependencies": [
|
|
118
|
+
"path"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "clock",
|
|
123
|
+
"version": "1.1.2",
|
|
124
|
+
"dependencies": []
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "fake_async",
|
|
128
|
+
"version": "1.3.3",
|
|
129
|
+
"dependencies": [
|
|
130
|
+
"clock",
|
|
131
|
+
"collection"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"name": "matcher",
|
|
136
|
+
"version": "0.12.18",
|
|
137
|
+
"dependencies": [
|
|
138
|
+
"async",
|
|
139
|
+
"meta",
|
|
140
|
+
"stack_trace",
|
|
141
|
+
"term_glyph",
|
|
142
|
+
"test_api"
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"name": "test_api",
|
|
147
|
+
"version": "0.7.8",
|
|
148
|
+
"dependencies": [
|
|
149
|
+
"async",
|
|
150
|
+
"boolean_selector",
|
|
151
|
+
"collection",
|
|
152
|
+
"meta",
|
|
153
|
+
"source_span",
|
|
154
|
+
"stack_trace",
|
|
155
|
+
"stream_channel",
|
|
156
|
+
"string_scanner",
|
|
157
|
+
"term_glyph"
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"name": "web",
|
|
162
|
+
"version": "1.1.1",
|
|
163
|
+
"dependencies": []
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "http_parser",
|
|
167
|
+
"version": "4.1.2",
|
|
168
|
+
"dependencies": [
|
|
169
|
+
"collection",
|
|
170
|
+
"source_span",
|
|
171
|
+
"string_scanner",
|
|
172
|
+
"typed_data"
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"name": "async",
|
|
177
|
+
"version": "2.13.0",
|
|
178
|
+
"dependencies": [
|
|
179
|
+
"collection",
|
|
180
|
+
"meta"
|
|
181
|
+
]
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"name": "sky_engine",
|
|
185
|
+
"version": "0.0.0",
|
|
186
|
+
"dependencies": []
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"name": "material_color_utilities",
|
|
190
|
+
"version": "0.13.0",
|
|
191
|
+
"dependencies": [
|
|
192
|
+
"collection"
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"name": "characters",
|
|
197
|
+
"version": "1.4.1",
|
|
198
|
+
"dependencies": []
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"name": "leak_tracker_testing",
|
|
202
|
+
"version": "3.0.2",
|
|
203
|
+
"dependencies": [
|
|
204
|
+
"leak_tracker",
|
|
205
|
+
"matcher",
|
|
206
|
+
"meta"
|
|
207
|
+
]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"name": "leak_tracker",
|
|
211
|
+
"version": "11.0.2",
|
|
212
|
+
"dependencies": [
|
|
213
|
+
"clock",
|
|
214
|
+
"collection",
|
|
215
|
+
"meta",
|
|
216
|
+
"path",
|
|
217
|
+
"vm_service"
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"name": "term_glyph",
|
|
222
|
+
"version": "1.2.2",
|
|
223
|
+
"dependencies": []
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"name": "string_scanner",
|
|
227
|
+
"version": "1.4.1",
|
|
228
|
+
"dependencies": [
|
|
229
|
+
"source_span"
|
|
230
|
+
]
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"name": "source_span",
|
|
234
|
+
"version": "1.10.1",
|
|
235
|
+
"dependencies": [
|
|
236
|
+
"collection",
|
|
237
|
+
"path",
|
|
238
|
+
"term_glyph"
|
|
239
|
+
]
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"name": "boolean_selector",
|
|
243
|
+
"version": "2.1.2",
|
|
244
|
+
"dependencies": [
|
|
245
|
+
"source_span",
|
|
246
|
+
"string_scanner"
|
|
247
|
+
]
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"name": "typed_data",
|
|
251
|
+
"version": "1.4.0",
|
|
252
|
+
"dependencies": [
|
|
253
|
+
"collection"
|
|
254
|
+
]
|
|
255
|
+
}
|
|
256
|
+
],
|
|
257
|
+
"configVersion": 1
|
|
258
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.41.0-0.1.pre
|
|
@@ -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
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# Generated by pub
|
|
2
|
+
# See https://dart.dev/tools/pub/glossary#lockfile
|
|
3
|
+
packages:
|
|
4
|
+
async:
|
|
5
|
+
dependency: transitive
|
|
6
|
+
description:
|
|
7
|
+
name: async
|
|
8
|
+
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
|
9
|
+
url: "https://pub.dev"
|
|
10
|
+
source: hosted
|
|
11
|
+
version: "2.13.0"
|
|
12
|
+
boolean_selector:
|
|
13
|
+
dependency: transitive
|
|
14
|
+
description:
|
|
15
|
+
name: boolean_selector
|
|
16
|
+
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
|
17
|
+
url: "https://pub.dev"
|
|
18
|
+
source: hosted
|
|
19
|
+
version: "2.1.2"
|
|
20
|
+
characters:
|
|
21
|
+
dependency: transitive
|
|
22
|
+
description:
|
|
23
|
+
name: characters
|
|
24
|
+
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
|
|
25
|
+
url: "https://pub.dev"
|
|
26
|
+
source: hosted
|
|
27
|
+
version: "1.4.1"
|
|
28
|
+
clock:
|
|
29
|
+
dependency: transitive
|
|
30
|
+
description:
|
|
31
|
+
name: clock
|
|
32
|
+
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
|
33
|
+
url: "https://pub.dev"
|
|
34
|
+
source: hosted
|
|
35
|
+
version: "1.1.2"
|
|
36
|
+
collection:
|
|
37
|
+
dependency: transitive
|
|
38
|
+
description:
|
|
39
|
+
name: collection
|
|
40
|
+
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
|
41
|
+
url: "https://pub.dev"
|
|
42
|
+
source: hosted
|
|
43
|
+
version: "1.19.1"
|
|
44
|
+
fake_async:
|
|
45
|
+
dependency: transitive
|
|
46
|
+
description:
|
|
47
|
+
name: fake_async
|
|
48
|
+
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
|
|
49
|
+
url: "https://pub.dev"
|
|
50
|
+
source: hosted
|
|
51
|
+
version: "1.3.3"
|
|
52
|
+
flutter:
|
|
53
|
+
dependency: "direct main"
|
|
54
|
+
description: flutter
|
|
55
|
+
source: sdk
|
|
56
|
+
version: "0.0.0"
|
|
57
|
+
flutter_test:
|
|
58
|
+
dependency: "direct dev"
|
|
59
|
+
description: flutter
|
|
60
|
+
source: sdk
|
|
61
|
+
version: "0.0.0"
|
|
62
|
+
http:
|
|
63
|
+
dependency: "direct main"
|
|
64
|
+
description:
|
|
65
|
+
name: http
|
|
66
|
+
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
|
|
67
|
+
url: "https://pub.dev"
|
|
68
|
+
source: hosted
|
|
69
|
+
version: "1.6.0"
|
|
70
|
+
http_parser:
|
|
71
|
+
dependency: transitive
|
|
72
|
+
description:
|
|
73
|
+
name: http_parser
|
|
74
|
+
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
|
75
|
+
url: "https://pub.dev"
|
|
76
|
+
source: hosted
|
|
77
|
+
version: "4.1.2"
|
|
78
|
+
leak_tracker:
|
|
79
|
+
dependency: transitive
|
|
80
|
+
description:
|
|
81
|
+
name: leak_tracker
|
|
82
|
+
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
|
|
83
|
+
url: "https://pub.dev"
|
|
84
|
+
source: hosted
|
|
85
|
+
version: "11.0.2"
|
|
86
|
+
leak_tracker_flutter_testing:
|
|
87
|
+
dependency: transitive
|
|
88
|
+
description:
|
|
89
|
+
name: leak_tracker_flutter_testing
|
|
90
|
+
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
|
|
91
|
+
url: "https://pub.dev"
|
|
92
|
+
source: hosted
|
|
93
|
+
version: "3.0.10"
|
|
94
|
+
leak_tracker_testing:
|
|
95
|
+
dependency: transitive
|
|
96
|
+
description:
|
|
97
|
+
name: leak_tracker_testing
|
|
98
|
+
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
|
|
99
|
+
url: "https://pub.dev"
|
|
100
|
+
source: hosted
|
|
101
|
+
version: "3.0.2"
|
|
102
|
+
lints:
|
|
103
|
+
dependency: "direct dev"
|
|
104
|
+
description:
|
|
105
|
+
name: lints
|
|
106
|
+
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
|
|
107
|
+
url: "https://pub.dev"
|
|
108
|
+
source: hosted
|
|
109
|
+
version: "3.0.0"
|
|
110
|
+
logging:
|
|
111
|
+
dependency: "direct main"
|
|
112
|
+
description:
|
|
113
|
+
name: logging
|
|
114
|
+
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
|
|
115
|
+
url: "https://pub.dev"
|
|
116
|
+
source: hosted
|
|
117
|
+
version: "1.3.0"
|
|
118
|
+
matcher:
|
|
119
|
+
dependency: transitive
|
|
120
|
+
description:
|
|
121
|
+
name: matcher
|
|
122
|
+
sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
|
|
123
|
+
url: "https://pub.dev"
|
|
124
|
+
source: hosted
|
|
125
|
+
version: "0.12.18"
|
|
126
|
+
material_color_utilities:
|
|
127
|
+
dependency: transitive
|
|
128
|
+
description:
|
|
129
|
+
name: material_color_utilities
|
|
130
|
+
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
|
|
131
|
+
url: "https://pub.dev"
|
|
132
|
+
source: hosted
|
|
133
|
+
version: "0.13.0"
|
|
134
|
+
meta:
|
|
135
|
+
dependency: transitive
|
|
136
|
+
description:
|
|
137
|
+
name: meta
|
|
138
|
+
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
|
139
|
+
url: "https://pub.dev"
|
|
140
|
+
source: hosted
|
|
141
|
+
version: "1.17.0"
|
|
142
|
+
path:
|
|
143
|
+
dependency: "direct main"
|
|
144
|
+
description:
|
|
145
|
+
name: path
|
|
146
|
+
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
|
147
|
+
url: "https://pub.dev"
|
|
148
|
+
source: hosted
|
|
149
|
+
version: "1.9.1"
|
|
150
|
+
sky_engine:
|
|
151
|
+
dependency: transitive
|
|
152
|
+
description: flutter
|
|
153
|
+
source: sdk
|
|
154
|
+
version: "0.0.0"
|
|
155
|
+
source_span:
|
|
156
|
+
dependency: transitive
|
|
157
|
+
description:
|
|
158
|
+
name: source_span
|
|
159
|
+
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
|
160
|
+
url: "https://pub.dev"
|
|
161
|
+
source: hosted
|
|
162
|
+
version: "1.10.1"
|
|
163
|
+
stack_trace:
|
|
164
|
+
dependency: transitive
|
|
165
|
+
description:
|
|
166
|
+
name: stack_trace
|
|
167
|
+
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
|
168
|
+
url: "https://pub.dev"
|
|
169
|
+
source: hosted
|
|
170
|
+
version: "1.12.1"
|
|
171
|
+
stream_channel:
|
|
172
|
+
dependency: transitive
|
|
173
|
+
description:
|
|
174
|
+
name: stream_channel
|
|
175
|
+
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
|
176
|
+
url: "https://pub.dev"
|
|
177
|
+
source: hosted
|
|
178
|
+
version: "2.1.4"
|
|
179
|
+
string_scanner:
|
|
180
|
+
dependency: transitive
|
|
181
|
+
description:
|
|
182
|
+
name: string_scanner
|
|
183
|
+
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
|
184
|
+
url: "https://pub.dev"
|
|
185
|
+
source: hosted
|
|
186
|
+
version: "1.4.1"
|
|
187
|
+
term_glyph:
|
|
188
|
+
dependency: transitive
|
|
189
|
+
description:
|
|
190
|
+
name: term_glyph
|
|
191
|
+
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
|
192
|
+
url: "https://pub.dev"
|
|
193
|
+
source: hosted
|
|
194
|
+
version: "1.2.2"
|
|
195
|
+
test_api:
|
|
196
|
+
dependency: transitive
|
|
197
|
+
description:
|
|
198
|
+
name: test_api
|
|
199
|
+
sha256: "19a78f63e83d3a61f00826d09bc2f60e191bf3504183c001262be6ac75589fb8"
|
|
200
|
+
url: "https://pub.dev"
|
|
201
|
+
source: hosted
|
|
202
|
+
version: "0.7.8"
|
|
203
|
+
typed_data:
|
|
204
|
+
dependency: transitive
|
|
205
|
+
description:
|
|
206
|
+
name: typed_data
|
|
207
|
+
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
|
208
|
+
url: "https://pub.dev"
|
|
209
|
+
source: hosted
|
|
210
|
+
version: "1.4.0"
|
|
211
|
+
vector_math:
|
|
212
|
+
dependency: transitive
|
|
213
|
+
description:
|
|
214
|
+
name: vector_math
|
|
215
|
+
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
|
|
216
|
+
url: "https://pub.dev"
|
|
217
|
+
source: hosted
|
|
218
|
+
version: "2.2.0"
|
|
219
|
+
vm_service:
|
|
220
|
+
dependency: "direct main"
|
|
221
|
+
description:
|
|
222
|
+
name: vm_service
|
|
223
|
+
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
|
224
|
+
url: "https://pub.dev"
|
|
225
|
+
source: hosted
|
|
226
|
+
version: "14.3.1"
|
|
227
|
+
web:
|
|
228
|
+
dependency: transitive
|
|
229
|
+
description:
|
|
230
|
+
name: web
|
|
231
|
+
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
|
|
232
|
+
url: "https://pub.dev"
|
|
233
|
+
source: hosted
|
|
234
|
+
version: "1.1.1"
|
|
235
|
+
sdks:
|
|
236
|
+
dart: ">=3.9.0-0 <4.0.0"
|
|
237
|
+
flutter: ">=3.18.0-18.0.pre.54"
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flutter-skill",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.6",
|
|
4
|
+
"mcpName": "io.github.telsav/flutter-skill",
|
|
4
5
|
"description": "MCP Server for app automation - Give your AI Agent eyes and hands inside any app (Flutter, React, Web, Native)",
|
|
5
6
|
"main": "index.js",
|
|
6
7
|
"bin": {
|