flutter-skill 0.7.6 → 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 CHANGED
@@ -1,39 +1,68 @@
1
- # Flutter Skill
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
- > **Give your AI Agent eyes and hands inside your Flutter app.**
29
+ ---
4
30
 
5
- ![Version](https://img.shields.io/pub/v/flutter_skill.svg)
6
- ![npm](https://img.shields.io/npm/v/flutter-skill.svg)
7
- ![License](https://img.shields.io/badge/license-MIT-blue.svg)
8
- ![Platform](https://img.shields.io/badge/Platform-Flutter-02569B)
31
+ <p align="center">
32
+ <strong>🎬 AI tests a full TikTok clone — 28 actions, zero test code</strong>
33
+ </p>
9
34
 
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.
35
+ https://github.com/user-attachments/assets/d4617c73-043f-424c-9a9a-1a61d4c2d3c6
11
36
 
12
- ## Quick Start
37
+ ```
38
+ You: "Test the login flow — enter test@example.com and password123, tap Login, verify Dashboard"
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
+ ```
13
48
 
14
- ### 1. Install (choose one)
49
+ **No test code. No selectors. Just tell the AI what to test.**
15
50
 
16
- ```bash
17
- # npm (recommended - includes native binary for instant startup)
18
- npm install -g flutter-skill
51
+ ---
19
52
 
20
- # Homebrew (macOS/Linux)
21
- brew tap ai-dashboad/flutter-skill
22
- brew install flutter-skill
53
+ ## Quick Start
23
54
 
24
- # Dart
25
- dart pub global activate flutter_skill
55
+ **1. Install**
26
56
 
27
- # IDE Extensions
28
- # - VSCode: Search "Flutter Skill" in Extensions
29
- # - IntelliJ/Android Studio: Search "Flutter Skill" in Plugins
57
+ ```bash
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.)
30
62
  ```
31
63
 
32
- ### 2. Configure AI Agent
64
+ **2. Add to your MCP config** (Claude Code / Cursor / Windsurf)
33
65
 
34
- Add to your AI agent's MCP config:
35
-
36
- **Claude Code** (`~/.claude/settings.json`):
37
66
  ```json
38
67
  {
39
68
  "mcpServers": {
@@ -45,277 +74,262 @@ Add to your AI agent's MCP config:
45
74
  }
46
75
  ```
47
76
 
48
- **Cursor** (`~/.cursor/mcp.json`):
49
- ```json
50
- {
51
- "mcpServers": {
52
- "flutter-skill": {
53
- "command": "flutter-skill",
54
- "args": ["server"]
55
- }
56
- }
77
+ **3. Add to your app** (2 lines)
78
+
79
+ ```dart
80
+ import 'package:flutter_skill/flutter_skill.dart';
81
+
82
+ void main() {
83
+ if (kDebugMode) FlutterSkillBinding.ensureInitialized();
84
+ runApp(MyApp());
57
85
  }
58
86
  ```
59
87
 
60
- ### 3. Use
88
+ **4. Test** — just talk to your AI:
89
+
90
+ > *"Launch my app, tap Sign Up, fill the form, and verify the success screen"*
91
+
92
+ That's it. Zero configuration.
61
93
 
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
- })
94
+ <details>
95
+ <summary><strong>📦 More install methods</strong> (Windows, Docker, IDE extensions)</summary>
69
96
 
70
- // Option 2: Connect to already running app (auto-detect)
71
- flutter-skill.scan_and_connect()
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) |
72
109
 
73
- // Now use any tool
74
- flutter-skill.screenshot()
75
- flutter-skill.tap({ text: "Login" })
76
- flutter-skill.inspect()
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
77
119
  ```
78
120
 
79
- ---
121
+ `init` auto-detects Flutter, iOS, Android, React Native, or Web projects and patches them automatically.
80
122
 
81
- ## Features
82
-
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 |
115
-
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 |
130
-
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 |
137
-
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 |
145
-
146
- ### Utilities
147
- | Tool | Description |
148
- |------|-------------|
149
- | `pub_search` | Search Flutter packages on pub.dev |
123
+ </details>
150
124
 
151
125
  ---
152
126
 
153
- ## Installation Methods
127
+ ## Platforms
154
128
 
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 |
129
+ flutter-skill works across **8 platforms** with a unified bridge protocol:
162
130
 
163
- ### Native Binary Performance
164
- | Version | Startup Time |
165
- |---------|--------------|
166
- | Dart JIT | ~1 second |
167
- | Native Binary | ~0.01 second |
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 |
168
141
 
169
- Native binaries are automatically downloaded on first use for supported platforms:
170
- - macOS (Apple Silicon & Intel)
171
- - Linux (x64)
172
- - Windows (x64)
142
+ > **181/183 tests passing** across all platforms (99% pass rate)
173
143
 
174
- ---
144
+ Each SDK README has platform-specific setup instructions. The same CLI and MCP tools work for all platforms.
175
145
 
176
- ## Flutter App Setup
146
+ <details>
147
+ <summary><strong>Platform setup examples</strong></summary>
177
148
 
178
- For the MCP tools to work, your Flutter app needs the `flutter_skill` package:
149
+ **Web** add one script tag:
150
+ ```html
151
+ <script src="flutter-skill.js"></script>
152
+ <script>FlutterSkill.start({ port: 50000 });</script>
153
+ ```
179
154
 
180
- ### Automatic Setup (Recommended)
155
+ **React Native** npm install:
181
156
  ```bash
182
- flutter-skill launch /path/to/project
183
- # Automatically adds dependency and initializes
157
+ npm install flutter-skill
184
158
  ```
185
-
186
- ### Manual Setup
187
- 1. Add dependency:
188
- ```yaml
189
- dependencies:
190
- flutter_skill: ^0.2.13
159
+ ```js
160
+ import FlutterSkill from 'flutter-skill';
161
+ FlutterSkill.start();
191
162
  ```
192
163
 
193
- 2. Initialize in main.dart:
194
- ```dart
195
- import 'package:flutter_skill/flutter_skill.dart';
164
+ **iOS (Swift/SwiftUI)** Swift Package Manager:
165
+ ```swift
166
+ import FlutterSkill
167
+ FlutterSkillBridge.shared.start()
196
168
 
197
- void main() {
198
- FlutterSkillBinding.ensureInitialized();
199
- runApp(MyApp());
200
- }
169
+ Text("Hello").flutterSkillId("greeting")
170
+ Button("Submit") { submit() }.flutterSkillButton("submitBtn")
201
171
  ```
202
172
 
173
+ **Android (Kotlin)** — Gradle:
174
+ ```kotlin
175
+ implementation("com.flutterskill:flutter-skill:0.7.5")
176
+ FlutterSkillBridge.start(this)
177
+ ```
178
+
179
+ **Electron / Tauri / KMP / .NET** — see each SDK's README for details.
180
+
181
+ </details>
182
+
203
183
  ---
204
184
 
205
- ## Example Workflows
185
+ ## What Can It Do?
206
186
 
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
- })
216
-
217
- // Wait for app to load
218
- flutter-skill.wait_for_element({ text: "Welcome" })
219
-
220
- // Take screenshot
221
- flutter-skill.screenshot()
222
-
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" })
228
-
229
- // Verify success
230
- flutter-skill.wait_for_element({ text: "Dashboard" })
231
- ```
187
+ **40+ MCP tools** organized in 4 categories:
232
188
 
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 }
189
+ <table>
190
+ <tr>
191
+ <td width="50%" valign="top">
238
192
 
239
- // Auto-connect to first one
240
- flutter-skill.scan_and_connect()
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
241
199
 
242
- // Or connect to specific one
243
- flutter-skill.connect_app({ uri: "ws://127.0.0.1:50123/ws" })
244
- ```
200
+ </td>
201
+ <td width="50%" valign="top">
245
202
 
246
- ### Debug a UI Issue
247
- ```javascript
248
- // Get widget tree
249
- flutter-skill.get_widget_tree({ max_depth: 5 })
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`
250
209
 
251
- // Find specific widgets
252
- flutter-skill.find_by_type({ type: "ElevatedButton" })
210
+ </td>
211
+ </tr>
212
+ <tr>
213
+ <td valign="top">
253
214
 
254
- // Inspect interactive elements
255
- flutter-skill.inspect()
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`
256
220
 
257
- // Check if element is visible
258
- flutter-skill.wait_for_element({ key: "submit_button", timeout: 3000 })
259
- ```
221
+ </td>
222
+ <td valign="top">
260
223
 
261
- ---
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`
262
229
 
263
- ## IDE Extensions
230
+ </td>
231
+ </tr>
232
+ </table>
264
233
 
265
- ### VSCode Extension
266
- - Auto-detects Flutter projects
267
- - Prompts to add `flutter_skill` dependency
268
- - Auto-downloads native binary
269
- - Status bar shows connection state
270
- - Commands: Launch, Inspect, Screenshot
234
+ <details>
235
+ <summary><strong>Full tool reference (40+ tools)</strong></summary>
271
236
 
272
- ### IntelliJ/Android Studio Plugin
273
- - Same features as VSCode
274
- - Integrates with IDE notifications
275
- - Tool window for status
237
+ **Launch & Connect:** `launch_app`, `scan_and_connect`, `hot_reload`, `hot_restart`, `list_sessions`, `switch_session`, `close_session`
276
238
 
277
- ---
239
+ **Screen:** `screenshot`, `screenshot_region`, `screenshot_element`, `native_screenshot`, `inspect`, `get_widget_tree`, `find_by_type`, `get_text_content`
278
240
 
279
- ## Troubleshooting
241
+ **Interaction:** `tap`, `double_tap`, `long_press`, `enter_text`, `swipe`, `scroll_to`, `drag`, `go_back`, `native_tap`, `native_input_text`, `native_swipe`
280
242
 
281
- ### "Not connected to Flutter app"
282
- ```javascript
283
- // Check status and get suggestions
284
- flutter-skill.get_connection_status()
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`
285
244
 
286
- // This returns:
287
- // - Current connection state
288
- // - List of available apps
289
- // - Actionable suggestions
290
- ```
245
+ **Debug:** `get_logs`, `get_errors`, `get_performance`, `get_memory_stats`
246
+
247
+ </details>
248
+
249
+ ---
250
+
251
+ ## Example Workflows
291
252
 
292
- ### "Unknown method ext.flutter.flutter_skill.xxx"
293
- Your Flutter app doesn't have the `flutter_skill` package. Add it:
294
- ```bash
295
- flutter pub add flutter_skill
296
253
  ```
297
- Then restart the app (hot reload is not enough).
254
+ "Test login with test@example.com / password123, verify it reaches the dashboard"
298
255
 
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
256
+ "Submit the registration form empty and check that all validation errors appear"
257
+
258
+ "Navigate through all tabs, screenshot each one, verify back button works"
304
259
 
305
- # For Homebrew
306
- brew upgrade flutter-skill
260
+ "Take screenshots of home, profile, and settings — compare with last time"
307
261
  ```
308
262
 
263
+ The AI agent figures out the steps. No test code needed.
264
+
265
+ ---
266
+
267
+ ## Native Platform Support
268
+
269
+ Flutter Skill sees through native dialogs that Flutter can't — permission popups, photo pickers, share sheets:
270
+
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` |
277
+
278
+ No external tools needed — uses built-in OS capabilities.
279
+
280
+ ---
281
+
282
+ ## Troubleshooting
283
+
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 |
290
+
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)
292
+
309
293
  ---
310
294
 
311
295
  ## Links
312
296
 
313
- - [GitHub](https://github.com/ai-dashboad/flutter-skill)
297
+ <table>
298
+ <tr>
299
+ <td>
300
+
301
+ 📦 **Install**
314
302
  - [pub.dev](https://pub.dev/packages/flutter_skill)
315
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**
316
310
  - [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=ai-dashboad.flutter-skill)
317
- - [JetBrains Marketplace](https://plugins.jetbrains.com/plugin/PLUGIN_ID)
311
+ - [JetBrains Marketplace](https://plugins.jetbrains.com/plugin/29991-flutter-skill)
312
+
313
+ </td>
314
+ <td>
315
+
316
+ 📖 **Docs**
317
+ - [Roadmap](docs/ROADMAP.md)
318
+ - [Changelog](CHANGELOG.md)
319
+ - [Architecture](docs/ARCHITECTURE.md)
320
+
321
+ </td>
322
+ </tr>
323
+ </table>
324
+
325
+ ---
326
+
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>
318
330
 
319
- ## License
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>
320
334
 
321
- MIT
335
+ <p align="center">MIT License</p>
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "flutter-skill",
3
- "version": "0.7.6",
4
- "mcpName": "io.github.telsav/flutter-skill",
3
+ "version": "0.7.7",
5
4
  "description": "MCP Server for app automation - Give your AI Agent eyes and hands inside any app (Flutter, React, Web, Native)",
6
5
  "main": "index.js",
7
6
  "bin": {
@@ -1,31 +0,0 @@
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.
@@ -1 +0,0 @@
1
- {"version":2,"entries":[{"package":"flutter_skill","rootUri":"../","packageUri":"lib/"}]}
@@ -1 +0,0 @@
1
- {"version":2,"entries":[{"package":"flutter_skill","rootUri":"../","packageUri":"lib/"}]}
@@ -1,196 +0,0 @@
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
- }
@@ -1,258 +0,0 @@
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
- }
@@ -1 +0,0 @@
1
- 3.41.0-0.1.pre
package/dart/pubspec.lock DELETED
@@ -1,237 +0,0 @@
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"