@bdayadev/flutter-ultra-mcp 1.8.0 → 1.9.1
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.
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "flutter",
|
|
12
12
|
"description": "Durable cross-platform Flutter automation via 8 specialized MCP servers, in-app mixin binding, and an optional DevTools panel. Replaces marionette_mcp and the official dart mcp-server for Claude Code.",
|
|
13
|
-
"version": "1.
|
|
13
|
+
"version": "1.9.1",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Bdaya-Dev",
|
|
16
16
|
"url": "https://github.com/Bdaya-Dev"
|
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
"tags": ["flutter", "dart", "mcp", "testing", "automation", "patrol", "cross-platform"]
|
|
24
24
|
}
|
|
25
25
|
],
|
|
26
|
-
"version": "1.
|
|
26
|
+
"version": "1.9.1"
|
|
27
27
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "flutter",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.9.1",
|
|
5
5
|
"description": "Durable cross-platform Flutter automation via 8 specialized MCP servers, in-app mixin binding, and an optional DevTools panel. Replaces marionette_mcp and the official dart mcp-server for Claude Code.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Bdaya-Dev",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bdayadev/flutter-ultra-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"description": "Flutter Ultra MCP plugin monorepo — 8 MCP servers + ultra_flutter Dart packages + skills for Claude Code.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/Bdaya-Dev/flutter-ultra-mcp",
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flutter-design-audit
|
|
3
|
+
description: Audit the live Flutter app for design quality issues across accessibility, layout, and design-system conformance. Runs 10 checks (touch targets, semantics, text overflow, layout overflow, hardcoded colors, hardcoded text styles, inconsistent spacing, nested cards, over-centering, tiny text), extracts theme tokens, and tests at 4 responsive breakpoints. Produces a scored markdown report with per-issue fix suggestions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Flutter Design Audit
|
|
7
|
+
|
|
8
|
+
Collect live design evidence from the running app before writing any recommendations. All tools are read-only and safe to run without side effects.
|
|
9
|
+
|
|
10
|
+
## Workflow
|
|
11
|
+
|
|
12
|
+
### 1. Attach to the session
|
|
13
|
+
|
|
14
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions` — find active sessions.
|
|
15
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__attach` with the matching sessionId.
|
|
16
|
+
|
|
17
|
+
### 2. Capture baseline screenshot
|
|
18
|
+
|
|
19
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` — visual snapshot before audit begins.
|
|
20
|
+
|
|
21
|
+
### 3. Run full design audit
|
|
22
|
+
|
|
23
|
+
Run the three audit tools in sequence. Each tool is independent and can be called separately.
|
|
24
|
+
|
|
25
|
+
#### 3a. Run all design checks
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
mcp__plugin_flutter_flutter-ultra-runtime__audit_design
|
|
29
|
+
sessionId: <id>
|
|
30
|
+
# checks defaults to all 10 — omit for full audit
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Checks performed:
|
|
34
|
+
|
|
35
|
+
| Check | Severity | What it detects |
|
|
36
|
+
| ---------------------- | -------- | --------------------------------------------- |
|
|
37
|
+
| `touch_targets` | error | Tappable widgets < 48×48 dp (WCAG 2.5.5) |
|
|
38
|
+
| `missing_semantics` | warning | Interactive widgets without a Semantics label |
|
|
39
|
+
| `text_overflow` | warning | Text widgets clipping or showing ellipsis |
|
|
40
|
+
| `layout_overflow` | error | RenderFlex / RenderBox overflow |
|
|
41
|
+
| `hardcoded_color` | info | Colors not from colorScheme |
|
|
42
|
+
| `hardcoded_text_style` | info | TextStyle with raw fontSize/color |
|
|
43
|
+
| `inconsistent_spacing` | info | Padding values not on a 4 dp grid |
|
|
44
|
+
| `nested_cards` | warning | Card inside Card (doubled elevation) |
|
|
45
|
+
| `everything_centered` | info | >80% of Text nodes use TextAlign.center |
|
|
46
|
+
| `tiny_text` | warning | Text with fontSize < 12 dp |
|
|
47
|
+
|
|
48
|
+
Scores returned: `accessibility` (0–100), `layout` (0–100), `designSystem` (0–100).
|
|
49
|
+
|
|
50
|
+
#### 3b. Extract design tokens
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
mcp__plugin_flutter_flutter-ultra-runtime__extract_design_tokens
|
|
54
|
+
sessionId: <id>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
|
|
59
|
+
- `colorScheme` — all Material 3 color roles as hex strings.
|
|
60
|
+
- `textTheme` — fontSize for each text style (displayLarge → labelSmall).
|
|
61
|
+
- `brightness` — `light` or `dark`.
|
|
62
|
+
- `violations` — list of token reads that failed (evaluate unavailable).
|
|
63
|
+
|
|
64
|
+
#### 3c. Responsive audit at 4 breakpoints
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
mcp__plugin_flutter_flutter-ultra-runtime__audit_responsive
|
|
68
|
+
sessionId: <id>
|
|
69
|
+
# viewports defaults to compact/medium/expanded/large
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Default viewports:
|
|
73
|
+
|
|
74
|
+
| Label | Size |
|
|
75
|
+
| -------- | -------- |
|
|
76
|
+
| compact | 375×667 |
|
|
77
|
+
| medium | 768×1024 |
|
|
78
|
+
| expanded | 1200×800 |
|
|
79
|
+
| large | 1440×900 |
|
|
80
|
+
|
|
81
|
+
Returns per-viewport issue counts and `crossViewportIssues` identifying regressions across breakpoints.
|
|
82
|
+
|
|
83
|
+
Note: viewport resizing requires a web or desktop debug build. On mobile/release builds, results reflect the current native window size.
|
|
84
|
+
|
|
85
|
+
### 4. Capture per-viewport screenshots (optional)
|
|
86
|
+
|
|
87
|
+
If the responsive audit shows regressions, take a screenshot at each problematic viewport to document the issue:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
mcp__plugin_flutter_flutter-ultra-runtime__screenshot
|
|
91
|
+
sessionId: <id>
|
|
92
|
+
width: 375
|
|
93
|
+
height: 667
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 5. Deeper investigation for specific issues
|
|
97
|
+
|
|
98
|
+
#### Touch target failures
|
|
99
|
+
|
|
100
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__find_widget` with `finder: { type: 'InkWell' }` to locate all tappable areas.
|
|
101
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_details` on the failing widget to confirm its bounds.
|
|
102
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__toggle_debug_paint` to visualise hit-test areas.
|
|
103
|
+
|
|
104
|
+
#### Layout overflow
|
|
105
|
+
|
|
106
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__dump_render_tree` — search for `OVERFLOWED`.
|
|
107
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__toggle_debug_paint` to show overflow markers.
|
|
108
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` — capture the debug paint view.
|
|
109
|
+
|
|
110
|
+
#### Semantics gaps
|
|
111
|
+
|
|
112
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__dump_semantics_tree` — find nodes without labels.
|
|
113
|
+
2. On mobile: `mcp__plugin_flutter_flutter-ultra-native-mobile__dump_a11y_tree` for the OS-level accessibility tree.
|
|
114
|
+
|
|
115
|
+
#### Hardcoded colors / text styles
|
|
116
|
+
|
|
117
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__evaluate` to inspect a specific widget's style:
|
|
118
|
+
```dart
|
|
119
|
+
// Example: read the actual color of a Text widget's style
|
|
120
|
+
(context.findRenderObject() as RenderParagraph).text.style?.color?.value.toRadixString(16)
|
|
121
|
+
```
|
|
122
|
+
2. Compare against `extract_design_tokens` output to identify deviations.
|
|
123
|
+
|
|
124
|
+
## Output format
|
|
125
|
+
|
|
126
|
+
Produce a markdown report with the following sections:
|
|
127
|
+
|
|
128
|
+
### Design Audit Report
|
|
129
|
+
|
|
130
|
+
**App:** `<sessionId>`
|
|
131
|
+
**Date:** `<today>`
|
|
132
|
+
**Scores:** Accessibility: X/100 | Layout: Y/100 | Design System: Z/100
|
|
133
|
+
|
|
134
|
+
#### Issues (N total — E errors, W warnings, I info)
|
|
135
|
+
|
|
136
|
+
| Severity | Rule | Widget | Issue | Suggestion |
|
|
137
|
+
| -------- | ------------- | ---------- | ------------------------------ | ------------------------ |
|
|
138
|
+
| error | touch_targets | IconButton | 32×32 dp — below 48 dp minimum | Wrap in SizedBox(48, 48) |
|
|
139
|
+
| ... | | | | |
|
|
140
|
+
|
|
141
|
+
#### Design Tokens
|
|
142
|
+
|
|
143
|
+
**Color Scheme (brightness: light)**
|
|
144
|
+
|
|
145
|
+
| Role | Hex |
|
|
146
|
+
| ------- | ------- |
|
|
147
|
+
| primary | #006590 |
|
|
148
|
+
| ... | |
|
|
149
|
+
|
|
150
|
+
**Text Theme**
|
|
151
|
+
|
|
152
|
+
| Style | Size |
|
|
153
|
+
| ------------ | ----- |
|
|
154
|
+
| displayLarge | 57 dp |
|
|
155
|
+
| ... | |
|
|
156
|
+
|
|
157
|
+
#### Responsive Analysis
|
|
158
|
+
|
|
159
|
+
| Viewport | Size | Issues |
|
|
160
|
+
| -------- | -------- | ------ |
|
|
161
|
+
| compact | 375×667 | 3 |
|
|
162
|
+
| medium | 768×1024 | 2 |
|
|
163
|
+
| ... | | |
|
|
164
|
+
|
|
165
|
+
**Cross-viewport regressions:** `<crossViewportIssues list or "None">`
|
|
166
|
+
|
|
167
|
+
#### Screenshots
|
|
168
|
+
|
|
169
|
+
- Baseline: `<path>`
|
|
170
|
+
- compact viewport: `<path if captured>`
|
|
171
|
+
|
|
172
|
+
## Common fix patterns
|
|
173
|
+
|
|
174
|
+
| Issue | Fix |
|
|
175
|
+
| ---------------------- | ------------------------------------------------------------------------------------------- |
|
|
176
|
+
| Touch target too small | `SizedBox(width: 48, height: 48, child: icon)` or `IconButton(padding: EdgeInsets.all(12))` |
|
|
177
|
+
| Missing semantics | `Semantics(label: 'Close dialog', child: icon)` |
|
|
178
|
+
| Text overflow | `Text(str, maxLines: 2, overflow: TextOverflow.ellipsis)` inside `Flexible` |
|
|
179
|
+
| Layout overflow | Replace `Row` with `Wrap`, or add `Flexible`/`Expanded` to children |
|
|
180
|
+
| Hardcoded color | Replace `Color(0xFF006590)` with `Theme.of(context).colorScheme.primary` |
|
|
181
|
+
| Hardcoded TextStyle | Replace `TextStyle(fontSize: 16)` with `Theme.of(context).textTheme.bodyLarge` |
|
|
182
|
+
| Nested Cards | Replace inner `Card` with `Container` + `decoration: BoxDecoration(borderRadius: ...)` |
|
|
183
|
+
| Over-centering | Use `TextAlign.start` for body copy; reserve `center` for headings |
|
|
184
|
+
| Tiny text | Increase to ≥ 12 dp, or use `textTheme.labelSmall` (14 dp minimum by M3 spec) |
|
|
185
|
+
| Inconsistent spacing | Use `const EdgeInsets.all(8)` / `16` / `24` — multiples of 4 |
|
|
186
|
+
|
|
187
|
+
## See also
|
|
188
|
+
|
|
189
|
+
- `flutter-debug` — triage runtime exceptions and layout overflows in detail
|
|
190
|
+
- `flutter-tour` — navigate the app to audit each screen systematically
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flutter-design-verify
|
|
3
|
+
description: Compare a running Flutter app against Figma mockups. Captures screenshots at multiple viewports, extracts theme tokens and component inventory, then uses Claude vision to identify design-implementation drift between the live app and Figma frames.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Flutter Design Verify
|
|
7
|
+
|
|
8
|
+
Compare a live Flutter app against Figma designs. Collect evidence from both sources, then produce a side-by-side report identifying drift.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
- Flutter app is running in debug mode (web or desktop for viewport resizing).
|
|
13
|
+
- Figma MCP plugin is installed and authenticated (`mcp__plugin_figma_figma__authenticate`).
|
|
14
|
+
- User has the Figma file URL containing the design frames.
|
|
15
|
+
|
|
16
|
+
## Workflow
|
|
17
|
+
|
|
18
|
+
### 1. Attach to the running Flutter session
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Pick the matching session, then:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
mcp__plugin_flutter_flutter-ultra-runtime__attach
|
|
28
|
+
sessionId: <id>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 2. Capture Flutter screenshots
|
|
32
|
+
|
|
33
|
+
Capture the current screen, then navigate to each route and repeat:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
mcp__plugin_flutter_flutter-ultra-runtime__screenshot
|
|
37
|
+
sessionId: <id>
|
|
38
|
+
width: 375
|
|
39
|
+
height: 667
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Capture at relevant viewports (compact 375×667, medium 768×1024, expanded 1200×800) using `audit_responsive` as a guide for which breakpoints show regressions.
|
|
43
|
+
|
|
44
|
+
### 3. Extract Flutter design tokens
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
mcp__plugin_flutter_flutter-ultra-runtime__extract_design_tokens
|
|
48
|
+
sessionId: <id>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Returns `colorScheme`, `textTheme`, and `brightness`. These become the Flutter side of the token diff.
|
|
52
|
+
|
|
53
|
+
### 4. Extract component inventory
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
mcp__plugin_flutter_flutter-ultra-runtime__extract_component_inventory
|
|
57
|
+
sessionId: <id>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Returns per-type widget counts grouped by category (input / container / display / layout / navigation). Use this to map Flutter components to Figma component usage.
|
|
61
|
+
|
|
62
|
+
### 5. Run design audit (optional but recommended)
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
mcp__plugin_flutter_flutter-ultra-runtime__audit_design
|
|
66
|
+
sessionId: <id>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Pre-flight check — surface existing issues before comparing against Figma.
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
mcp__plugin_flutter_flutter-ultra-runtime__audit_responsive
|
|
73
|
+
sessionId: <id>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Identify which viewports have the most drift so Figma frame selection can match.
|
|
77
|
+
|
|
78
|
+
### 6. Retrieve Figma designs
|
|
79
|
+
|
|
80
|
+
Ask the user for the Figma file URL if not already provided.
|
|
81
|
+
|
|
82
|
+
#### 6a. Get Figma frame screenshots
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
mcp__plugin_figma_figma__get_screenshot
|
|
86
|
+
url: <figma-frame-url>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Capture one screenshot per screen / frame that corresponds to the Flutter routes captured in step 2. Match by route name or frame title.
|
|
90
|
+
|
|
91
|
+
#### 6b. Get Figma design tokens (variables)
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
mcp__plugin_figma_figma__get_variable_defs
|
|
95
|
+
url: <figma-file-url>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Returns color, typography, spacing, and radius variables. These become the Figma side of the token diff.
|
|
99
|
+
|
|
100
|
+
### 7. Vision comparison
|
|
101
|
+
|
|
102
|
+
Present each Flutter screenshot alongside its matching Figma frame to Claude for visual analysis. For each pair, identify:
|
|
103
|
+
|
|
104
|
+
- **Color drift** — buttons, backgrounds, text colors that differ.
|
|
105
|
+
- **Typography drift** — font sizes, weights, line heights that differ.
|
|
106
|
+
- **Spacing drift** — padding, gap, margin inconsistencies.
|
|
107
|
+
- **Missing components** — UI elements present in Figma but absent in Flutter.
|
|
108
|
+
- **Extra components** — UI elements in Flutter not in Figma (scope creep).
|
|
109
|
+
- **Layout drift** — column/row arrangements, alignment, wrapping differences.
|
|
110
|
+
|
|
111
|
+
### 8. Token diff
|
|
112
|
+
|
|
113
|
+
Compare `extract_design_tokens` output against `get_variable_defs` output:
|
|
114
|
+
|
|
115
|
+
| Token | Flutter value | Figma value | Match? |
|
|
116
|
+
| ------------------- | ------------- | ----------- | ------ |
|
|
117
|
+
| primary color | #006590 | #006591 | NO |
|
|
118
|
+
| bodyMedium fontSize | 14 dp | 14 sp | YES |
|
|
119
|
+
| ... | | | |
|
|
120
|
+
|
|
121
|
+
Flag every mismatch as a drift item with severity:
|
|
122
|
+
|
|
123
|
+
- **error** — value differs by more than 10% or is a completely different hue.
|
|
124
|
+
- **warning** — value differs by ≤ 10% (rounding or unit conversion).
|
|
125
|
+
- **info** — token present in Flutter but missing from Figma variables, or vice versa.
|
|
126
|
+
|
|
127
|
+
### 9. Component mapping
|
|
128
|
+
|
|
129
|
+
Cross-reference `extract_component_inventory` output against Figma component usage:
|
|
130
|
+
|
|
131
|
+
- List Flutter components with no Figma counterpart.
|
|
132
|
+
- List Figma components with no Flutter counterpart.
|
|
133
|
+
- Flag count mismatches (e.g., Flutter has 14 ElevatedButton instances, Figma frame shows 2).
|
|
134
|
+
|
|
135
|
+
## Output format
|
|
136
|
+
|
|
137
|
+
Produce a markdown report:
|
|
138
|
+
|
|
139
|
+
### Design Verification Report
|
|
140
|
+
|
|
141
|
+
**Flutter session:** `<sessionId>`
|
|
142
|
+
**Figma file:** `<url>`
|
|
143
|
+
**Date:** `<today>`
|
|
144
|
+
|
|
145
|
+
#### Visual Comparison
|
|
146
|
+
|
|
147
|
+
For each Flutter route ↔ Figma frame pair:
|
|
148
|
+
|
|
149
|
+
| Screen | Flutter screenshot | Figma frame | Drift items |
|
|
150
|
+
| ------ | ------------------ | ----------- | ----------- |
|
|
151
|
+
| /home | (image) | (image) | 3 errors |
|
|
152
|
+
|
|
153
|
+
#### Token Diff Table
|
|
154
|
+
|
|
155
|
+
| Token | Flutter | Figma | Status |
|
|
156
|
+
| ------- | ------- | ------- | ------- |
|
|
157
|
+
| primary | #006590 | #006591 | warning |
|
|
158
|
+
|
|
159
|
+
#### Component Mapping
|
|
160
|
+
|
|
161
|
+
| Type | Flutter count | In Figma? | Notes |
|
|
162
|
+
| -------------- | ------------- | --------- | ----------------------- |
|
|
163
|
+
| ElevatedButton | 14 | yes | Figma shows 2 per frame |
|
|
164
|
+
|
|
165
|
+
#### Summary
|
|
166
|
+
|
|
167
|
+
- Total drift items: N (E errors, W warnings, I info)
|
|
168
|
+
- Token mismatches: N
|
|
169
|
+
- Missing Figma components in Flutter: N
|
|
170
|
+
- Recommendation: list top 3 highest-impact fixes
|
|
171
|
+
|
|
172
|
+
## See also
|
|
173
|
+
|
|
174
|
+
- `flutter-design-audit` — standalone Flutter design quality audit without Figma
|
|
175
|
+
- `flutter-figma-push` — push Flutter web screenshots to Figma as editable frames
|
|
176
|
+
- `flutter-tour` — navigate all routes for comprehensive per-screen capture
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flutter-figma-push
|
|
3
|
+
description: Push Flutter web app UI to Figma as editable layers. Navigates to each route, captures the browser view, and uses the Figma MCP to create editable Figma frames from the live app screenshots.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Flutter Figma Push
|
|
8
|
+
|
|
9
|
+
Push screenshots of a running Flutter web app into Figma as editable frames. Web only — requires a browser-accessible Flutter app.
|
|
10
|
+
|
|
11
|
+
## Prerequisites
|
|
12
|
+
|
|
13
|
+
- Flutter web app is running and accessible via a browser URL.
|
|
14
|
+
- Figma MCP plugin is installed and authenticated.
|
|
15
|
+
- User has an existing Figma file URL to push frames into (or a new file will be created).
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
### 1. Confirm the app is running
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
If no session is found, ask the user for the browser URL of the Flutter web app directly.
|
|
26
|
+
|
|
27
|
+
### 2. Connect the browser
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
mcp__plugin_flutter_flutter-ultra-browser__launch_browser
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then navigate to the Flutter web app URL:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
mcp__plugin_flutter_flutter-ultra-browser__navigate
|
|
37
|
+
url: <flutter-web-app-url>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
If the app is already open in a browser, connect over CDP instead:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
mcp__plugin_flutter_flutter-ultra-browser__connect_over_cdp
|
|
44
|
+
wsEndpoint: <devtools-ws-url>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 3. Collect the route list
|
|
48
|
+
|
|
49
|
+
Ask the user for the list of routes to capture, or infer from the app's navigation structure via:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
mcp__plugin_flutter_flutter-ultra-runtime__find_widget
|
|
53
|
+
sessionId: <id>
|
|
54
|
+
finder: { type: 'Navigator' }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Typical routes to capture: `/`, `/home`, `/profile`, `/settings`, and any primary feature screens.
|
|
58
|
+
|
|
59
|
+
### 4. For each route — capture and push
|
|
60
|
+
|
|
61
|
+
Repeat this sequence for every route:
|
|
62
|
+
|
|
63
|
+
#### 4a. Navigate
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
mcp__plugin_flutter_flutter-ultra-browser__navigate
|
|
67
|
+
url: <flutter-web-app-url>/<route>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### 4b. Wait for Flutter render to settle
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
mcp__plugin_flutter_flutter-ultra-browser__wait_for_url
|
|
74
|
+
url: <expected-url>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Allow 1–2 seconds for animations to complete. Check console for any errors:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
mcp__plugin_flutter_flutter-ultra-browser__console_logs
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### 4c. Take a browser screenshot
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
mcp__plugin_flutter_flutter-ultra-browser__screenshot
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
This captures the full browser viewport as rendered by the Flutter web engine.
|
|
90
|
+
|
|
91
|
+
#### 4d. Push to Figma
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
mcp__plugin_figma_figma__generate_figma_design
|
|
95
|
+
url: <figma-file-url>
|
|
96
|
+
imageData: <screenshot-data>
|
|
97
|
+
frameName: <route-name>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The Figma MCP creates an editable frame from the screenshot. The frame name should match the route (e.g., `Flutter / home`, `Flutter / settings`).
|
|
101
|
+
|
|
102
|
+
### 5. Capture at multiple viewports (optional)
|
|
103
|
+
|
|
104
|
+
For responsive design, repeat step 4 at each breakpoint by resizing the browser viewport via JavaScript:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
mcp__plugin_flutter_flutter-ultra-browser__evaluate_js
|
|
108
|
+
expression: "window.resizeTo(375, 667)"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Then re-navigate and push with a viewport-suffixed frame name (e.g., `Flutter / home / compact`).
|
|
112
|
+
|
|
113
|
+
Standard breakpoints: compact (375×667), medium (768×1024), expanded (1200×800).
|
|
114
|
+
|
|
115
|
+
### 6. Report
|
|
116
|
+
|
|
117
|
+
After all routes are pushed, produce a summary:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
## Figma Push Complete
|
|
121
|
+
|
|
122
|
+
| Route | Viewport | Figma frame | Status |
|
|
123
|
+
| ----- | -------- | ----------- | ------ |
|
|
124
|
+
| /home | 375×667 | Flutter / home / compact | created |
|
|
125
|
+
| /home | 1200×800 | Flutter / home / expanded | created |
|
|
126
|
+
| ... | | | |
|
|
127
|
+
|
|
128
|
+
Figma file: <url>
|
|
129
|
+
Total frames created: N
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Include the Figma file URL so the user can open it directly.
|
|
133
|
+
|
|
134
|
+
## Notes
|
|
135
|
+
|
|
136
|
+
- This skill is web-only. Mobile screenshots require `mcp__plugin_flutter_flutter-ultra-native-mobile__take_device_screenshot` and cannot be pushed directly to Figma via the browser path.
|
|
137
|
+
- CanvasKit (default Flutter web renderer) renders to a `<canvas>` element — the browser screenshot captures the correct visual output.
|
|
138
|
+
- If `generate_figma_design` is unavailable, fall back to `mcp__plugin_figma_figma__use_figma` to upload the screenshot as an image asset.
|
|
139
|
+
|
|
140
|
+
## See also
|
|
141
|
+
|
|
142
|
+
- `flutter-design-verify` — compare Flutter screenshots against existing Figma frames for drift detection
|
|
143
|
+
- `flutter-design-audit` — run design quality checks on the live Flutter app
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: record-demo
|
|
3
|
+
description: Records a video or GIF demo of a Flutter app flow. Detects platform (web browser or native device), starts recording, drives the UI interaction, stops recording, then converts to the requested format (MP4, WebM, or GIF). Use when the user asks to record a demo, capture a flow as video, or produce an animated GIF of app behavior.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Record Demo
|
|
7
|
+
|
|
8
|
+
Orchestrates platform detection → start recording → drive flow → stop recording → convert format.
|
|
9
|
+
|
|
10
|
+
## Workflow
|
|
11
|
+
|
|
12
|
+
### 1. Detect platform
|
|
13
|
+
|
|
14
|
+
Determine recording method based on the running target:
|
|
15
|
+
|
|
16
|
+
- **Web** — use `mcp__plugin_flutter_flutter-ultra-browser__new_context` with `recordVideo.dir` set to a local output directory. Playwright records all pages automatically; video is saved on `mcp__plugin_flutter_flutter-ultra-browser__close_context`.
|
|
17
|
+
- **Android device** — use `mcp__plugin_flutter_flutter-ultra-native-mobile__start_device_recording` with an `outputPath` ending in `.mp4`.
|
|
18
|
+
- **iOS Simulator** — use `mcp__plugin_flutter_flutter-ultra-native-mobile__start_device_recording` with an `outputPath` ending in `.mp4`.
|
|
19
|
+
|
|
20
|
+
Discover running sessions first:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Check `device.kind` in the response: `'web'` → browser path, `'android'` / `'ios-sim'` → native path.
|
|
27
|
+
|
|
28
|
+
### 2. Start recording
|
|
29
|
+
|
|
30
|
+
#### Web (Playwright recordVideo)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
mcp__plugin_flutter_flutter-ultra-browser__new_context
|
|
34
|
+
browserId: <id>
|
|
35
|
+
recordVideo:
|
|
36
|
+
dir: /tmp/flutter-demo-recordings
|
|
37
|
+
size: # optional — omit to use viewport size
|
|
38
|
+
width: 1280
|
|
39
|
+
height: 800
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Returns `contextId` and `recordingDir`. Then open a tab and navigate to the app URL.
|
|
43
|
+
|
|
44
|
+
#### Native device (Android / iOS)
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
mcp__plugin_flutter_flutter-ultra-native-mobile__start_device_recording
|
|
48
|
+
deviceId: <udid>
|
|
49
|
+
outputPath: /tmp/flutter-demo.mp4
|
|
50
|
+
maxDurationSec: 60
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Returns `recordingId`. Keep it for the stop call.
|
|
54
|
+
|
|
55
|
+
### 3. Drive the UI flow
|
|
56
|
+
|
|
57
|
+
Use the appropriate tools to exercise the flow being recorded:
|
|
58
|
+
|
|
59
|
+
- **Runtime** — `mcp__plugin_flutter_flutter-ultra-runtime__hot_reload`, `mcp__plugin_flutter_flutter-ultra-runtime__evaluate`, `mcp__plugin_flutter_flutter-ultra-runtime__find_widget`
|
|
60
|
+
- **Browser** — `mcp__plugin_flutter_flutter-ultra-browser__click`, `mcp__plugin_flutter_flutter-ultra-browser__fill`, `mcp__plugin_flutter_flutter-ultra-browser__navigate`
|
|
61
|
+
- **Native** — `mcp__plugin_flutter_flutter-ultra-native-mobile__native_tap`, `mcp__plugin_flutter_flutter-ultra-native-mobile__native_type`, `mcp__plugin_flutter_flutter-ultra-native-mobile__native_swipe`
|
|
62
|
+
|
|
63
|
+
For responsive demos, resize the viewport between key interactions:
|
|
64
|
+
|
|
65
|
+
- Mobile: 390×844
|
|
66
|
+
- Tablet: 768×1024
|
|
67
|
+
- Desktop: 1440×900
|
|
68
|
+
|
|
69
|
+
Take screenshots at key moments for verification alongside the recording.
|
|
70
|
+
|
|
71
|
+
### 4. Stop recording
|
|
72
|
+
|
|
73
|
+
#### Web
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
mcp__plugin_flutter_flutter-ultra-browser__close_context
|
|
77
|
+
contextId: <id>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Returns `videoPath` — the `.webm` file Playwright wrote to `recordingDir`.
|
|
81
|
+
|
|
82
|
+
#### Native device
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
mcp__plugin_flutter_flutter-ultra-native-mobile__stop_device_recording
|
|
86
|
+
recordingId: <id>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Returns `path` and `durationMs`.
|
|
90
|
+
|
|
91
|
+
### 5. Convert to target format
|
|
92
|
+
|
|
93
|
+
Use `mcp__plugin_flutter_flutter-ultra-build__convert_recording` to convert to the user's desired format:
|
|
94
|
+
|
|
95
|
+
#### High-quality GIF (for sharing in docs / GitHub)
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
mcp__plugin_flutter_flutter-ultra-build__convert_recording
|
|
99
|
+
inputPath: /tmp/flutter-demo.mp4
|
|
100
|
+
outputPath: /tmp/flutter-demo.gif
|
|
101
|
+
outputFormat: gif
|
|
102
|
+
maxWidth: 800
|
|
103
|
+
fps: 12
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### Compressed MP4 (for embedding in web pages)
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
mcp__plugin_flutter_flutter-ultra-build__convert_recording
|
|
110
|
+
inputPath: /tmp/flutter-demo.webm
|
|
111
|
+
outputPath: /tmp/flutter-demo.mp4
|
|
112
|
+
outputFormat: mp4
|
|
113
|
+
maxWidth: 1280
|
|
114
|
+
quality: 23
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### WebM (smallest size, web-native)
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
mcp__plugin_flutter_flutter-ultra-build__convert_recording
|
|
121
|
+
inputPath: /tmp/flutter-demo.mp4
|
|
122
|
+
outputPath: /tmp/flutter-demo.webm
|
|
123
|
+
outputFormat: webm
|
|
124
|
+
quality: 30
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 6. Report result
|
|
128
|
+
|
|
129
|
+
Return the output file path, size in bytes, and format. Suggest next steps:
|
|
130
|
+
|
|
131
|
+
- Embed GIF in README with ``
|
|
132
|
+
- Upload MP4 as a GitHub release asset
|
|
133
|
+
- Use WebM in `<video>` tags on web landing pages
|
|
134
|
+
|
|
135
|
+
## Notes
|
|
136
|
+
|
|
137
|
+
- ffmpeg must be installed for `convert_recording`. If not found, the tool returns a clear installation hint.
|
|
138
|
+
- Android `screenrecord` has a 180-second hard limit. For longer demos, restart recording in segments.
|
|
139
|
+
- iOS Simulator recording requires macOS with Xcode installed.
|
|
140
|
+
- Playwright writes `.webm` by default; pass it directly to `convert_recording` for format changes.
|
|
141
|
+
- For CanvasKit Flutter web, ensure semantics are enabled before driving UI with browser tools.
|