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 CHANGED
@@ -1,83 +1,37 @@
1
1
  # Flutter Skill
2
2
 
3
- > **AI-Powered End-to-End Testing for Flutter Apps**
3
+ > **Give your AI Agent eyes and hands inside your Flutter app.**
4
4
 
5
5
  ![Version](https://img.shields.io/pub/v/flutter_skill.svg)
6
6
  ![npm](https://img.shields.io/npm/v/flutter-skill.svg)
7
7
  ![License](https://img.shields.io/badge/license-MIT-blue.svg)
8
- ![Platform](https://img.shields.io/badge/Platform-Flutter%20%7C%20Web%20%7C%20React%20Native%20%7C%20iOS%20%7C%20Android-02569B)
8
+ ![Platform](https://img.shields.io/badge/Platform-Flutter-02569B)
9
9
 
10
- **Flutter Skill** is an E2E testing bridge that gives AI agents (Claude Code, Cursor, Windsurf, etc.) full control over running apps across **Flutter, Web, React Native, iOS, and Android**. Describe what you want to test in natural language, and the AI sees the screen, taps buttons, fills forms, scrolls, and verifies results - just like a human tester would.
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
- # One-click install (macOS/Linux) - recommended
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
- # Or: Homebrew (macOS/Linux)
55
- brew tap ai-dashboad/flutter-skill && brew install flutter-skill
20
+ # Homebrew (macOS/Linux)
21
+ brew tap ai-dashboad/flutter-skill
22
+ brew install flutter-skill
56
23
 
57
- # Or: Dart
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
- </details>
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 Your AI Agent
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
- Any MCP-compatible agent uses the same config format.
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
- Just tell your AI agent what to test:
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
- "Launch my app on iPhone simulator, tap the Sign Up button, fill in the form, and verify the success screen"
142
- ```
70
+ // Option 2: Connect to already running app (auto-detect)
71
+ flutter-skill.scan_and_connect()
143
72
 
144
- Or use tools directly:
145
- ```javascript
146
- flutter-skill.launch_app({ project_path: "." })
147
- flutter-skill.inspect() // See all interactive elements
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
- ## Multi-Platform Support
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
- ### Web
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
- ```html
170
- <script src="flutter-skill.js"></script>
171
- <script>
172
- FlutterSkill.start({ port: 50000 });
173
- </script>
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
- ### React Native
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
- ```bash
179
- npm install flutter-skill
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
- ```js
183
- import FlutterSkill from 'flutter-skill';
184
- FlutterSkill.start();
185
- ```
146
+ ### Utilities
147
+ | Tool | Description |
148
+ |------|-------------|
149
+ | `pub_search` | Search Flutter packages on pub.dev |
186
150
 
187
- ### iOS (Swift / SwiftUI)
151
+ ---
188
152
 
189
- Add via Swift Package Manager:
190
- ```
191
- https://github.com/ai-dashboad/flutter-skill (sdks/ios)
192
- ```
153
+ ## Installation Methods
193
154
 
194
- ```swift
195
- import FlutterSkill
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
- // Initialize in your app
198
- FlutterSkillBridge.shared.start()
163
+ ### Native Binary Performance
164
+ | Version | Startup Time |
165
+ |---------|--------------|
166
+ | Dart JIT | ~1 second |
167
+ | Native Binary | ~0.01 second |
199
168
 
200
- // Register SwiftUI elements for AI interaction
201
- Text("Hello")
202
- .flutterSkillId("greeting")
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
- Button("Submit") { submit() }
205
- .flutterSkillButton("submitBtn")
174
+ ---
206
175
 
207
- TextField("Email", text: $email)
208
- .flutterSkillTextField("emailField")
209
- ```
176
+ ## Flutter App Setup
210
177
 
211
- ### Android (Kotlin)
178
+ For the MCP tools to work, your Flutter app needs the `flutter_skill` package:
212
179
 
213
- ```kotlin
214
- // build.gradle.kts
215
- implementation("com.flutterskill:flutter-skill:0.7.3")
180
+ ### Automatic Setup (Recommended)
181
+ ```bash
182
+ flutter-skill launch /path/to/project
183
+ # Automatically adds dependency and initializes
216
184
  ```
217
185
 
218
- ```kotlin
219
- // In your Activity
220
- import com.flutterskill.FlutterSkillBridge
221
-
222
- FlutterSkillBridge.start(this)
186
+ ### Manual Setup
187
+ 1. Add dependency:
188
+ ```yaml
189
+ dependencies:
190
+ flutter_skill: ^0.2.13
223
191
  ```
224
192
 
225
- ### Connecting the AI Agent
226
-
227
- Once integrated, **the same CLI and MCP tools work for all platforms**:
193
+ 2. Initialize in main.dart:
194
+ ```dart
195
+ import 'package:flutter_skill/flutter_skill.dart';
228
196
 
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
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
- ### 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
- ```
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
- Flutter Skill can interact with **native dialogs** that Flutter can't see (permission popups, photo pickers, share sheets):
217
+ // Wait for app to load
218
+ flutter-skill.wait_for_element({ text: "Welcome" })
343
219
 
344
- | Tool | iOS Simulator | Android Emulator |
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
- No external tools needed - works with built-in OS capabilities.
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
- ## Flutter 3.x Compatibility
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
- 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.
239
+ // Auto-connect to first one
240
+ flutter-skill.scan_and_connect()
358
241
 
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
- })
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
- ## Tool Priority Setup (Claude Code)
251
+ // Find specific widgets
252
+ flutter-skill.find_by_type({ type: "ElevatedButton" })
371
253
 
372
- For Claude Code users, ensure it always uses Flutter Skill for Flutter testing:
254
+ // Inspect interactive elements
255
+ flutter-skill.inspect()
373
256
 
374
- ```bash
375
- flutter_skill setup
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 / Android Studio Plugin
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
- flutter-skill.get_connection_status() // Shows suggestions
400
- flutter-skill.scan_and_connect() // Auto-find running apps
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 for new packages).
297
+ Then restart the app (hot reload is not enough).
409
298
 
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)
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/29991-flutter-skill)
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.4",
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": {