flutter-skill 0.7.6 → 0.7.8
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 +253 -239
- package/package.json +1 -1
- package/dart/.dart_tool/extension_discovery/README.md +0 -31
- package/dart/.dart_tool/extension_discovery/devtools.json +0 -1
- package/dart/.dart_tool/extension_discovery/vs_code.json +0 -1
- package/dart/.dart_tool/package_config.json +0 -196
- package/dart/.dart_tool/package_graph.json +0 -258
- package/dart/.dart_tool/version +0 -1
- package/dart/pubspec.lock +0 -237
package/README.md
CHANGED
|
@@ -1,39 +1,68 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/social-preview.jpg" alt="flutter-skill" width="640">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">flutter-skill</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>Give your AI eyes and hands inside any app.</strong><br>
|
|
9
|
+
E2E testing bridge for Claude, Cursor, Windsurf — across 8 platforms.
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="https://pub.dev/packages/flutter_skill"><img src="https://img.shields.io/pub/v/flutter_skill.svg" alt="pub.dev"></a>
|
|
14
|
+
<a href="https://www.npmjs.com/package/flutter-skill"><img src="https://img.shields.io/npm/v/flutter-skill.svg" alt="npm"></a>
|
|
15
|
+
<a href="https://github.com/ai-dashboad/flutter-skill/actions"><img src="https://img.shields.io/github/actions/workflow/status/ai-dashboad/flutter-skill/ci.yml?label=tests" alt="CI"></a>
|
|
16
|
+
<a href="https://github.com/ai-dashboad/flutter-skill/stargazers"><img src="https://img.shields.io/github/stars/ai-dashboad/flutter-skill?style=social" alt="Stars"></a>
|
|
17
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License"></a>
|
|
18
|
+
<a href="https://skills.sh/ai-dashboad/flutter-skill/flutter-skill-testing"><img src="https://img.shields.io/badge/skills.sh-agent%20skill-black" alt="Agent Skill"></a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
<p align="center">
|
|
22
|
+
<a href="#quick-start">Quick Start</a> •
|
|
23
|
+
<a href="#platforms">Platforms</a> •
|
|
24
|
+
<a href="#what-can-it-do">Features</a> •
|
|
25
|
+
<a href="#install">Install</a> •
|
|
26
|
+
<a href="docs/USAGE_GUIDE.md">Docs</a>
|
|
27
|
+
</p>
|
|
2
28
|
|
|
3
|
-
|
|
29
|
+
---
|
|
4
30
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-

|
|
31
|
+
<p align="center">
|
|
32
|
+
<strong>🎬 AI tests a full TikTok clone — 28 actions, zero test code</strong>
|
|
33
|
+
</p>
|
|
9
34
|
|
|
10
|
-
|
|
35
|
+
https://github.com/user-attachments/assets/d4617c73-043f-424c-9a9a-1a61d4c2d3c6
|
|
11
36
|
|
|
12
|
-
|
|
37
|
+
```
|
|
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
|
-
|
|
49
|
+
**No test code. No selectors. Just tell the AI what to test.**
|
|
15
50
|
|
|
16
|
-
|
|
17
|
-
# npm (recommended - includes native binary for instant startup)
|
|
18
|
-
npm install -g flutter-skill
|
|
51
|
+
---
|
|
19
52
|
|
|
20
|
-
|
|
21
|
-
brew tap ai-dashboad/flutter-skill
|
|
22
|
-
brew install flutter-skill
|
|
53
|
+
## Quick Start
|
|
23
54
|
|
|
24
|
-
|
|
25
|
-
dart pub global activate flutter_skill
|
|
55
|
+
**1. Install**
|
|
26
56
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
#
|
|
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
|
-
|
|
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
|
-
**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
127
|
+
## Platforms
|
|
154
128
|
|
|
155
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
|
167
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
146
|
+
<details>
|
|
147
|
+
<summary><strong>Platform setup examples</strong></summary>
|
|
177
148
|
|
|
178
|
-
|
|
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
|
-
|
|
155
|
+
**React Native** — npm install:
|
|
181
156
|
```bash
|
|
182
|
-
flutter-skill
|
|
183
|
-
# Automatically adds dependency and initializes
|
|
157
|
+
npm install flutter-skill
|
|
184
158
|
```
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
194
|
-
```
|
|
195
|
-
import
|
|
164
|
+
**iOS (Swift/SwiftUI)** — Swift Package Manager:
|
|
165
|
+
```swift
|
|
166
|
+
import FlutterSkill
|
|
167
|
+
FlutterSkillBridge.shared.start()
|
|
196
168
|
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
##
|
|
185
|
+
## What Can It Do?
|
|
206
186
|
|
|
207
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
240
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
```
|
|
200
|
+
</td>
|
|
201
|
+
<td width="50%" valign="top">
|
|
245
202
|
|
|
246
|
-
###
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
|
|
252
|
-
|
|
210
|
+
</td>
|
|
211
|
+
</tr>
|
|
212
|
+
<tr>
|
|
213
|
+
<td valign="top">
|
|
253
214
|
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
258
|
-
|
|
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
|
-
|
|
230
|
+
</td>
|
|
231
|
+
</tr>
|
|
232
|
+
</table>
|
|
264
233
|
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
254
|
+
"Test login with test@example.com / password123, verify it reaches the dashboard"
|
|
298
255
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
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
|
-
|
|
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,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flutter-skill",
|
|
3
|
-
"version": "0.7.6",
|
|
4
3
|
"mcpName": "io.github.telsav/flutter-skill",
|
|
4
|
+
"version": "0.7.8",
|
|
5
5
|
"description": "MCP Server for app automation - Give your AI Agent eyes and hands inside any app (Flutter, React, Web, Native)",
|
|
6
6
|
"main": "index.js",
|
|
7
7
|
"bin": {
|
|
@@ -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
|
-
}
|
package/dart/.dart_tool/version
DELETED
|
@@ -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"
|