@bdayadev/flutter-ultra-mcp 1.6.0 → 1.8.0
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/bisect/SKILL.md +91 -121
- package/skills/debug/SKILL.md +98 -99
- package/skills/devtools/SKILL.md +93 -91
- package/skills/drive/SKILL.md +90 -98
- package/skills/scaffold/SKILL.md +132 -126
- package/skills/setup/SKILL.md +89 -92
- package/skills/test/SKILL.md +112 -104
- package/skills/tour/SKILL.md +94 -82
|
@@ -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.8.0",
|
|
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.8.0"
|
|
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.8.0",
|
|
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.8.0",
|
|
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",
|
package/skills/bisect/SKILL.md
CHANGED
|
@@ -1,152 +1,140 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flutter-bisect
|
|
3
|
-
description:
|
|
3
|
+
description: Automates git bisect to find the commit that introduced a bug. Flutter-aware with pub get, build_runner, and flutter_clean between commits. Use when a test passes on an older commit but fails on HEAD and you need to find exactly which commit broke it.
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# Automated Regression Finder
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Use this skill when a test (unit, widget, or patrol E2E) passes on an older commit but fails on HEAD and you need to pinpoint exactly which commit introduced the regression. Do not use for diagnosing a bug you already know the source of — use `flutter-debug` instead.
|
|
12
|
-
|
|
13
|
-
## Prerequisites
|
|
14
|
-
|
|
15
|
-
- The working tree is in a git repository (`git status` returns without error).
|
|
16
|
-
- The user provides (or you can infer) a **known-good** commit reference: a tag (`v1.2.0`), a branch name (`main@{7 days ago}`), or a full SHA.
|
|
17
|
-
- A **test oracle** is specified: a unit/widget test name pattern, a patrol test file, or a Bash-style exit-code command.
|
|
18
|
-
- No uncommitted changes that would interfere — stash them first (see Edge cases).
|
|
9
|
+
Pinpoints the exact commit that broke a passing test via `git bisect`, running Flutter-aware setup at each step. For diagnosing a bug you already know the source of, use `flutter-debug` instead.
|
|
19
10
|
|
|
20
11
|
## Workflow
|
|
21
12
|
|
|
22
|
-
### 1. Confirm inputs
|
|
23
|
-
|
|
24
|
-
Ask (or confirm from context) the following before calling any git command:
|
|
13
|
+
### 1. Confirm inputs
|
|
25
14
|
|
|
26
|
-
- **Good commit**:
|
|
15
|
+
- **Good commit**: last-known-good tag, SHA, or relative ref.
|
|
27
16
|
- **Bad commit**: defaults to `HEAD`.
|
|
28
|
-
- **Oracle type**: `unit`, `widget`, or `patrol`.
|
|
17
|
+
- **Oracle type**: `unit`, `widget`, `golden`, or `patrol`.
|
|
29
18
|
- **Oracle selector**: test name pattern or patrol `testFilePath`.
|
|
30
|
-
- **Project**:
|
|
31
|
-
- **Has build_runner**: check for `build.yaml` in the project root
|
|
19
|
+
- **Project**: `mcp__plugin_flutter_flutter-ultra-build__list_projects` if not known.
|
|
20
|
+
- **Has build_runner**: check for `build.yaml` in the project root.
|
|
32
21
|
|
|
33
22
|
### 2. Stash uncommitted changes
|
|
34
23
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
git -C <project-root> status --porcelain
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
If output is non-empty, stash:
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
git -C <project-root> stash push -m "flutter-bisect-autoStash"
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Record whether a stash was created — you must restore it in step 7.
|
|
24
|
+
Check for dirty working tree via Bash `git status --porcelain`. If non-empty, stash with `git stash push -m "flutter-bisect-autoStash"`.
|
|
48
25
|
|
|
49
26
|
### 3. Start bisect
|
|
50
27
|
|
|
51
28
|
```bash
|
|
52
|
-
git
|
|
29
|
+
git bisect start --first-parent HEAD <good-commit>
|
|
53
30
|
```
|
|
54
31
|
|
|
55
|
-
`--first-parent`
|
|
32
|
+
`--first-parent` keeps the walk on the mainline.
|
|
56
33
|
|
|
57
|
-
### 4. At each bisect step
|
|
58
|
-
|
|
59
|
-
Repeat until git prints `<sha> is the first bad commit`:
|
|
34
|
+
### 4. At each bisect step
|
|
60
35
|
|
|
61
36
|
#### 4a. Get current commit info
|
|
62
37
|
|
|
63
38
|
```bash
|
|
64
|
-
git
|
|
39
|
+
git log -1 --format="%H %s"
|
|
65
40
|
```
|
|
66
41
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
#### 4b. Restore Flutter state for this commit
|
|
70
|
-
|
|
71
|
-
Run these in order — do not skip even if pubspec.yaml looks unchanged (lockfile may differ):
|
|
42
|
+
#### 4b. Restore Flutter state
|
|
72
43
|
|
|
73
|
-
1.
|
|
74
|
-
- If pub get fails (
|
|
75
|
-
2.
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
- If build_runner fails: mark
|
|
44
|
+
1. `mcp__plugin_flutter_flutter-ultra-build__pub_get` — always run even if pubspec.yaml looks unchanged.
|
|
45
|
+
- If pub get fails (dependency conflict): mark **bad** and continue.
|
|
46
|
+
2. If `needs_build_runner`:
|
|
47
|
+
- `mcp__plugin_flutter_flutter-ultra-build__start_build_runner_build`
|
|
48
|
+
- `mcp__plugin_flutter_flutter-ultra-build__poll_build_runner_job`
|
|
49
|
+
- `mcp__plugin_flutter_flutter-ultra-build__get_build_runner_result`
|
|
50
|
+
- If build_runner fails: mark **bad** and continue.
|
|
51
|
+
3. If the commit changes Flutter SDK version (`.tool-versions`, `fvm`): `mcp__plugin_flutter_flutter-ultra-build__flutter_clean` before pub get.
|
|
80
52
|
|
|
81
53
|
#### 4c. Run the oracle
|
|
82
54
|
|
|
83
55
|
**Unit/widget oracle:**
|
|
84
56
|
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
57
|
+
- `mcp__plugin_flutter_flutter-ultra-build__start_run_unit_tests` (or `start_run_widget_tests`) with `testNamePattern`.
|
|
58
|
+
- `mcp__plugin_flutter_flutter-ultra-build__poll_run_unit_tests` (or `poll_run_widget_tests`).
|
|
59
|
+
- `mcp__plugin_flutter_flutter-ultra-build__get_run_unit_tests_result` (or `get_run_widget_tests_result`).
|
|
60
|
+
- All targeted tests pass -> **good**. Any fail -> **bad**.
|
|
61
|
+
|
|
62
|
+
**Golden oracle:**
|
|
63
|
+
|
|
64
|
+
- `mcp__plugin_flutter_flutter-ultra-build__start_run_golden_tests`
|
|
65
|
+
- `mcp__plugin_flutter_flutter-ultra-build__poll_run_golden_tests`
|
|
66
|
+
- `mcp__plugin_flutter_flutter-ultra-build__get_run_golden_tests_result`
|
|
89
67
|
|
|
90
68
|
**Patrol oracle:**
|
|
91
69
|
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
- If all steps pass → **good**. If any fail → **bad**.
|
|
70
|
+
- `mcp__plugin_flutter_flutter-ultra-patrol__start_patrol_test` with `testFilePath` and `device`.
|
|
71
|
+
- `mcp__plugin_flutter_flutter-ultra-patrol__poll_patrol_job`.
|
|
72
|
+
- `mcp__plugin_flutter_flutter-ultra-patrol__get_patrol_result`.
|
|
96
73
|
|
|
97
74
|
#### 4d. Mark the commit
|
|
98
75
|
|
|
99
76
|
```bash
|
|
100
|
-
# if oracle passed
|
|
101
|
-
git
|
|
102
|
-
|
|
103
|
-
# if oracle failed:
|
|
104
|
-
git -C <project-root> bisect bad
|
|
77
|
+
git bisect good # if oracle passed
|
|
78
|
+
git bisect bad # if oracle failed
|
|
105
79
|
```
|
|
106
80
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
### 5. Capture and report the first bad commit
|
|
110
|
-
|
|
111
|
-
When git prints `<sha> is the first bad commit`, capture the full details:
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
git -C <project-root> show --stat <sha>
|
|
115
|
-
git -C <project-root> log -1 --format="%H%n%an <%ae>%n%ad%n%s%n%b" --date=iso <sha>
|
|
116
|
-
```
|
|
81
|
+
Loop back to 4a until git prints `<sha> is the first bad commit`.
|
|
117
82
|
|
|
118
|
-
|
|
83
|
+
### 5. Build verification (optional)
|
|
119
84
|
|
|
120
|
-
|
|
85
|
+
If the regression might be a build failure rather than a test failure, also run the platform build at each step using the build server's `start_build_{platform}` -> `poll_build_{platform}_job` -> `get_build_{platform}_result` pattern. Build failure -> **bad**.
|
|
121
86
|
|
|
122
|
-
|
|
87
|
+
### 6. Report the first bad commit
|
|
123
88
|
|
|
124
89
|
```bash
|
|
125
|
-
git
|
|
90
|
+
git show --stat <sha>
|
|
91
|
+
git log -1 --format="%H%n%an <%ae>%n%ad%n%s%n%b" --date=iso <sha>
|
|
126
92
|
```
|
|
127
93
|
|
|
128
|
-
### 7.
|
|
94
|
+
### 7. Reset and restore
|
|
129
95
|
|
|
130
96
|
```bash
|
|
131
|
-
git
|
|
97
|
+
git bisect reset
|
|
98
|
+
git stash pop # if stash was created
|
|
132
99
|
```
|
|
133
100
|
|
|
134
101
|
## Edge cases
|
|
135
102
|
|
|
136
|
-
| Situation
|
|
137
|
-
|
|
138
|
-
| **Merge commits
|
|
139
|
-
| **Uncommitted changes**
|
|
140
|
-
| **Submodule repo**
|
|
141
|
-
| **Flutter SDK version change**
|
|
142
|
-
| **
|
|
143
|
-
| **
|
|
144
|
-
|
|
103
|
+
| Situation | Handling |
|
|
104
|
+
|-----------|----------|
|
|
105
|
+
| **Merge commits** | `--first-parent` avoids them. Remove the flag only if the user explicitly wants to bisect a merged branch. |
|
|
106
|
+
| **Uncommitted changes** | Auto-stash in step 2; restore in step 7. |
|
|
107
|
+
| **Submodule repo** | Confirm the user wants to bisect the outer aggregate, not the inner submodule. |
|
|
108
|
+
| **Flutter SDK version change** | `mcp__plugin_flutter_flutter-ultra-build__flutter_clean` before pub get. |
|
|
109
|
+
| **Flaky oracle** | Re-run once. If it fails again, mark bad. |
|
|
110
|
+
| **All commits bad** | Stop and ask the user to verify the good commit reference. |
|
|
111
|
+
|
|
112
|
+
## Tool reference
|
|
113
|
+
|
|
114
|
+
| Action | Tool |
|
|
115
|
+
|--------|------|
|
|
116
|
+
| List projects | `mcp__plugin_flutter_flutter-ultra-build__list_projects` |
|
|
117
|
+
| Pub get | `mcp__plugin_flutter_flutter-ultra-build__pub_get` |
|
|
118
|
+
| Flutter clean | `mcp__plugin_flutter_flutter-ultra-build__flutter_clean` |
|
|
119
|
+
| Build runner start | `mcp__plugin_flutter_flutter-ultra-build__start_build_runner_build` |
|
|
120
|
+
| Build runner poll | `mcp__plugin_flutter_flutter-ultra-build__poll_build_runner_job` |
|
|
121
|
+
| Build runner result | `mcp__plugin_flutter_flutter-ultra-build__get_build_runner_result` |
|
|
122
|
+
| Start unit tests | `mcp__plugin_flutter_flutter-ultra-build__start_run_unit_tests` |
|
|
123
|
+
| Poll unit tests | `mcp__plugin_flutter_flutter-ultra-build__poll_run_unit_tests` |
|
|
124
|
+
| Get unit results | `mcp__plugin_flutter_flutter-ultra-build__get_run_unit_tests_result` |
|
|
125
|
+
| Start widget tests | `mcp__plugin_flutter_flutter-ultra-build__start_run_widget_tests` |
|
|
126
|
+
| Poll widget tests | `mcp__plugin_flutter_flutter-ultra-build__poll_run_widget_tests` |
|
|
127
|
+
| Get widget results | `mcp__plugin_flutter_flutter-ultra-build__get_run_widget_tests_result` |
|
|
128
|
+
| Start golden tests | `mcp__plugin_flutter_flutter-ultra-build__start_run_golden_tests` |
|
|
129
|
+
| Poll golden tests | `mcp__plugin_flutter_flutter-ultra-build__poll_run_golden_tests` |
|
|
130
|
+
| Get golden results | `mcp__plugin_flutter_flutter-ultra-build__get_run_golden_tests_result` |
|
|
131
|
+
| Start patrol test | `mcp__plugin_flutter_flutter-ultra-patrol__start_patrol_test` |
|
|
132
|
+
| Poll patrol | `mcp__plugin_flutter_flutter-ultra-patrol__poll_patrol_job` |
|
|
133
|
+
| Get patrol result | `mcp__plugin_flutter_flutter-ultra-patrol__get_patrol_result` |
|
|
134
|
+
| Build (any platform) | `start_build_{platform}` via the build server |
|
|
145
135
|
|
|
146
136
|
## Output format
|
|
147
137
|
|
|
148
|
-
After bisect completes, produce:
|
|
149
|
-
|
|
150
138
|
```
|
|
151
139
|
## Bisect Result
|
|
152
140
|
|
|
@@ -155,48 +143,30 @@ Author: <name> <<email>>
|
|
|
155
143
|
Date: <iso date>
|
|
156
144
|
Message: <subject line>
|
|
157
145
|
|
|
158
|
-
<body if present>
|
|
159
|
-
|
|
160
146
|
Files changed:
|
|
161
147
|
<git show --stat output>
|
|
162
148
|
|
|
163
149
|
Steps taken: <N> commits tested across <M> total candidates.
|
|
164
150
|
```
|
|
165
151
|
|
|
166
|
-
If bisect could not converge (user cancelled, all commits bad, or git error), produce:
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
## Bisect Aborted
|
|
170
|
-
|
|
171
|
-
Reason: <what went wrong>
|
|
172
|
-
Last tested commit: <sha or "none">
|
|
173
|
-
Recommendation: <next debugging step>
|
|
174
|
-
```
|
|
175
|
-
|
|
176
152
|
## Example
|
|
177
153
|
|
|
178
154
|
```
|
|
179
|
-
User: "The InvoiceBloc
|
|
180
|
-
|
|
181
|
-
1. list_projects
|
|
182
|
-
2.
|
|
183
|
-
3. git
|
|
184
|
-
4.
|
|
185
|
-
5. [commit
|
|
186
|
-
6. [commit
|
|
187
|
-
7.
|
|
188
|
-
8.
|
|
189
|
-
9.
|
|
190
|
-
|
|
191
|
-
11. git: "pqr678 is the first bad commit"
|
|
192
|
-
12. git show --stat pqr678 → "refactor(billing): collapse invoice state machine"
|
|
193
|
-
13. git bisect reset
|
|
194
|
-
→ Report: first bad commit pqr678, author, date, changed files
|
|
155
|
+
User: "/flutter:bisect The InvoiceBloc test was green on v1.3.0 but fails on HEAD."
|
|
156
|
+
|
|
157
|
+
1. list_projects -> "my-app", build.yaml present -> needs_build_runner=true
|
|
158
|
+
2. git status -> clean, no stash needed
|
|
159
|
+
3. git bisect start --first-parent HEAD v1.3.0 -> "~6 steps"
|
|
160
|
+
4. [commit abc123] pub_get -> ok; build_runner -> ok; run_unit_tests("InvoiceBloc") -> FAIL -> bad
|
|
161
|
+
5. [commit def456] pub_get -> ok; build_runner -> ok; run_unit_tests -> FAIL -> bad
|
|
162
|
+
6. [commit ghi789] pub_get -> ok; build_runner -> ok; run_unit_tests -> PASS -> good
|
|
163
|
+
7. ... (3 more steps)
|
|
164
|
+
8. git: "pqr678 is the first bad commit" -> "refactor(billing): collapse invoice state machine"
|
|
165
|
+
9. git bisect reset
|
|
166
|
+
-> Report with commit details and changed files
|
|
195
167
|
```
|
|
196
168
|
|
|
197
169
|
## See also
|
|
198
170
|
|
|
199
171
|
- `flutter-test` — run the full test suite without bisecting
|
|
200
|
-
- `flutter-debug` — inspect live runtime state after
|
|
201
|
-
- `mcp__plugin_flutter_flutter-ultra-build__start_build_runner_build` — build_runner reference
|
|
202
|
-
- `mcp__plugin_flutter_flutter-ultra-patrol__start_patrol_test` — patrol oracle reference
|
|
172
|
+
- `flutter-debug` — inspect live runtime state after identifying the suspect commit
|
package/skills/debug/SKILL.md
CHANGED
|
@@ -1,156 +1,155 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flutter-debug
|
|
3
|
-
description:
|
|
3
|
+
description: Attaches to a running Flutter app and triages an error from the stack trace, widget tree, render tree, network traffic, and screenshots. Use when the user reports a runtime exception, layout overflow, blank screen, unexpected behaviour, performance jank, or network failure and you need to inspect live state.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Attach, Inspect, and Triage
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Use this skill when the user reports a runtime exception, a layout overflow, a blank screen, unexpected navigation, or any "it's broken" situation in a running Flutter app. The goal is to collect enough live evidence to diagnose the root cause without guessing. Propose code fixes only after inspecting live state — never before.
|
|
11
|
-
|
|
12
|
-
## Prerequisites
|
|
13
|
-
|
|
14
|
-
- A Flutter app is running in debug mode (VM Service available).
|
|
15
|
-
- The user has described the symptom: exception message, screen name, reproduction steps, or "just broke".
|
|
16
|
-
- Do **not** modify any source files during this skill unless the user explicitly asks for a fix.
|
|
8
|
+
Collect live evidence before diagnosing. Propose code fixes only after inspecting live state.
|
|
17
9
|
|
|
18
10
|
## Workflow
|
|
19
11
|
|
|
20
|
-
Follow the triage ladder in order — stop at the level where the root cause becomes clear.
|
|
21
|
-
|
|
22
12
|
### 1. Attach to the session
|
|
23
13
|
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
- Call `mcp__plugin_flutter_flutter-ultra-runtime__attach` with `sessionId`.
|
|
27
|
-
|
|
28
|
-
### 2. Capture initial state
|
|
14
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions` to find active sessions.
|
|
15
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__attach` with the matching session.
|
|
29
16
|
|
|
30
|
-
|
|
17
|
+
### 2. Capture initial state (run together)
|
|
31
18
|
|
|
32
|
-
- `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` — visual snapshot
|
|
33
|
-
- `mcp__plugin_flutter_flutter-ultra-runtime__get_runtime_errors` —
|
|
34
|
-
- `mcp__plugin_flutter_flutter-ultra-runtime__get_logs` — recent
|
|
19
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` — visual snapshot.
|
|
20
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__get_runtime_errors` — unhandled exceptions.
|
|
21
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__get_logs` — recent framework/app log output.
|
|
22
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__log_buffer_stats` — check if logs were truncated.
|
|
35
23
|
|
|
36
24
|
### 3. Triage by error type
|
|
37
25
|
|
|
38
26
|
#### 3a. Runtime exception (stack trace present)
|
|
39
27
|
|
|
40
|
-
1. Read the stack trace from `
|
|
41
|
-
2.
|
|
28
|
+
1. Read the stack trace from `mcp__plugin_flutter_flutter-ultra-runtime__get_runtime_errors`.
|
|
29
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__evaluate` to inspect the problematic object:
|
|
42
30
|
```dart
|
|
43
|
-
// Example: check if a value is null
|
|
44
31
|
MyWidget.of(context)?.someField?.toString() ?? 'NULL'
|
|
45
32
|
```
|
|
46
|
-
3.
|
|
47
|
-
4.
|
|
33
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_tree` around the error location.
|
|
34
|
+
4. `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_details` on a specific widget for full properties.
|
|
48
35
|
|
|
49
|
-
#### 3b. Layout overflow (RenderFlex / RenderBox
|
|
36
|
+
#### 3b. Layout overflow (RenderFlex / RenderBox)
|
|
50
37
|
|
|
51
|
-
1.
|
|
52
|
-
2.
|
|
53
|
-
3.
|
|
54
|
-
4.
|
|
38
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__dump_render_tree` — search for `OVERFLOWED`.
|
|
39
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__toggle_debug_paint` to enable visual overlays.
|
|
40
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` — capture the debug paint view.
|
|
41
|
+
4. Trace the overflowing render object back to its widget via `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_tree`.
|
|
55
42
|
|
|
56
43
|
#### 3c. Blank screen / wrong route
|
|
57
44
|
|
|
58
|
-
1.
|
|
45
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__evaluate`:
|
|
59
46
|
```dart
|
|
60
47
|
GoRouter.of(context).routerDelegate.currentConfiguration.fullPath
|
|
61
48
|
```
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
3. Check `get_logs` for GoRouter redirect events or `debugPrint` from route guards.
|
|
49
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_tree` — look for `ErrorWidget` or empty `SizedBox`.
|
|
50
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__get_logs` for redirect events.
|
|
65
51
|
|
|
66
|
-
#### 3d. State / data issue
|
|
52
|
+
#### 3d. State / data issue
|
|
67
53
|
|
|
68
|
-
1.
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
// or for Riverpod:
|
|
72
|
-
ProviderScope.containerOf(context).read(myProvider).toString()
|
|
73
|
-
```
|
|
74
|
-
2. Compare against expected values from the user's description.
|
|
75
|
-
3. Call `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_tree` to verify the widget rebuilds are reaching the right subtree.
|
|
54
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__evaluate` to read BLoC/Riverpod/Provider state.
|
|
55
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_tree` to verify rebuild propagation.
|
|
56
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__find_widget` to locate specific widgets showing wrong data.
|
|
76
57
|
|
|
77
|
-
#### 3e.
|
|
58
|
+
#### 3e. Network / API failure
|
|
78
59
|
|
|
79
|
-
1.
|
|
80
|
-
2.
|
|
60
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__start_http_capture` to begin recording.
|
|
61
|
+
2. Reproduce the action that triggers the API call.
|
|
62
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__get_http_events` to inspect requests/responses.
|
|
63
|
+
4. `mcp__plugin_flutter_flutter-ultra-runtime__decode_grpc_message` for gRPC payloads.
|
|
64
|
+
5. `mcp__plugin_flutter_flutter-ultra-runtime__stop_http_capture` when done.
|
|
65
|
+
6. For web targets, also check `mcp__plugin_flutter_flutter-ultra-browser__console_logs` and `mcp__plugin_flutter_flutter-ultra-browser__network_requests` for CORS or fetch errors.
|
|
81
66
|
|
|
82
|
-
|
|
67
|
+
#### 3f. Performance jank
|
|
83
68
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
69
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__toggle_perf_overlay` to enable the performance overlay.
|
|
70
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` to capture the overlay.
|
|
71
|
+
3. `mcp__plugin_flutter_flutter-ultra-runtime__start_frame_tracking` to begin frame timing capture.
|
|
72
|
+
4. Reproduce the janky interaction.
|
|
73
|
+
5. `mcp__plugin_flutter_flutter-ultra-runtime__get_frame_timing` to read build/raster times.
|
|
74
|
+
6. `mcp__plugin_flutter_flutter-ultra-runtime__stop_frame_tracking`.
|
|
75
|
+
7. `mcp__plugin_flutter_flutter-ultra-runtime__start_rebuild_tracking` to find excessive rebuilds.
|
|
76
|
+
8. `mcp__plugin_flutter_flutter-ultra-runtime__get_rebuild_stats` to identify hot widgets.
|
|
77
|
+
9. `mcp__plugin_flutter_flutter-ultra-runtime__stop_rebuild_tracking`.
|
|
78
|
+
10. `mcp__plugin_flutter_flutter-ultra-runtime__get_memory_usage` and `mcp__plugin_flutter_flutter-ultra-runtime__get_allocation_profile` for memory pressure issues.
|
|
87
79
|
|
|
88
|
-
|
|
80
|
+
#### 3g. Accessibility / semantics issue
|
|
89
81
|
|
|
90
|
-
|
|
82
|
+
1. `mcp__plugin_flutter_flutter-ultra-runtime__dump_semantics_tree` — check for missing labels or roles.
|
|
83
|
+
2. For mobile, `mcp__plugin_flutter_flutter-ultra-native-mobile__dump_a11y_tree` for the OS-level accessibility tree.
|
|
91
84
|
|
|
92
|
-
|
|
93
|
-
- Call `mcp__plugin_flutter_flutter-ultra-runtime__dump_layer_tree` for compositing and repaint boundary issues (useful for performance jank or incorrect clipping).
|
|
85
|
+
#### 3h. Mobile-specific issues
|
|
94
86
|
|
|
95
|
-
|
|
87
|
+
1. `mcp__plugin_flutter_flutter-ultra-native-mobile__start_device_logs` to capture platform-level logs.
|
|
88
|
+
2. `mcp__plugin_flutter_flutter-ultra-native-mobile__poll_device_logs` to read logcat/syslog.
|
|
89
|
+
3. `mcp__plugin_flutter_flutter-ultra-native-mobile__stop_device_logs` when done.
|
|
96
90
|
|
|
97
|
-
|
|
91
|
+
### 4. Deeper inspection
|
|
98
92
|
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
93
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__dump_render_tree` — sizes, constraints, positions.
|
|
94
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__dump_layer_tree` — compositing, repaint boundaries.
|
|
95
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__find_widget` to locate a specific widget by key or text.
|
|
96
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__count_widget_tree_nodes` to gauge tree complexity.
|
|
97
|
+
- `mcp__plugin_flutter_flutter-ultra-runtime__start_tail_logs` + `mcp__plugin_flutter_flutter-ultra-runtime__poll_tail_logs` for live log streaming during reproduction.
|
|
102
98
|
|
|
103
|
-
###
|
|
99
|
+
### 5. Evaluate in-app expressions
|
|
104
100
|
|
|
105
|
-
|
|
101
|
+
`mcp__plugin_flutter_flutter-ultra-runtime__evaluate` freely to inspect live objects:
|
|
106
102
|
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
- If hot reload is not sufficient (e.g. `initState` changed), call `mcp__plugin_flutter_flutter-ultra-runtime__hot_restart`.
|
|
103
|
+
- `myCompleter.isCompleted`
|
|
104
|
+
- `context.read<MyBloc>().state.toString()`
|
|
105
|
+
- `ProviderScope.containerOf(context).read(myProvider).toString()`
|
|
111
106
|
|
|
112
|
-
|
|
107
|
+
### 6. Test the fix
|
|
113
108
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
| Blank white screen | `get_widget_tree` + `evaluate` (route) | `ErrorWidget` at root; redirect loop; unhandled exception in build |
|
|
119
|
-
| `setState called after dispose` | `get_runtime_errors` + `get_logs` | Async callback holding stale `BuildContext`; missing `mounted` check |
|
|
120
|
-
| Navigation not working | `evaluate` (GoRouter path) + `get_logs` | Route guard redirecting; wrong named route; deep link not registered |
|
|
121
|
-
| Infinite loading spinner | `evaluate` (state) + `get_logs` | Future never completing; stream not emitting; provider not notifying |
|
|
122
|
-
| Wrong data displayed | `evaluate` (BLoC/provider state) | Stale state; `context.watch` vs `context.read` misuse |
|
|
109
|
+
1. Apply the code change.
|
|
110
|
+
2. `mcp__plugin_flutter_flutter-ultra-runtime__hot_reload` (or `mcp__plugin_flutter_flutter-ultra-runtime__hot_restart` if `initState` changed).
|
|
111
|
+
3. Re-run the appropriate triage step to confirm the error is gone.
|
|
112
|
+
4. `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` for before/after comparison.
|
|
123
113
|
|
|
124
|
-
##
|
|
114
|
+
## Common patterns
|
|
125
115
|
|
|
126
|
-
|
|
116
|
+
| Symptom | First tool | What to look for |
|
|
117
|
+
|---------|-----------|-----------------|
|
|
118
|
+
| `Null check operator used on null value` | `get_runtime_errors` + `evaluate` | Null state before async load completes |
|
|
119
|
+
| `RenderFlex overflowed by N pixels` | `dump_render_tree` + `toggle_debug_paint` | Missing `Expanded`/`Flexible` |
|
|
120
|
+
| Blank white screen | `get_widget_tree` + `evaluate` (route) | `ErrorWidget` at root; redirect loop |
|
|
121
|
+
| `setState called after dispose` | `get_runtime_errors` + `get_logs` | Async callback with stale `BuildContext` |
|
|
122
|
+
| Navigation not working | `evaluate` (GoRouter path) + `get_logs` | Route guard redirecting |
|
|
123
|
+
| Infinite loading spinner | `evaluate` (state) + `get_logs` | Future never completing |
|
|
124
|
+
| Wrong data displayed | `evaluate` (BLoC/provider state) | Stale state; `watch` vs `read` misuse |
|
|
125
|
+
| API returning errors | `start_http_capture` + `get_http_events` | 401/403/500 responses; CORS blocks |
|
|
126
|
+
| UI jank during scrolling | `start_frame_tracking` + `get_frame_timing` | Frames exceeding 16ms budget |
|
|
127
|
+
| Memory growing unbounded | `get_memory_usage` + `get_allocation_profile` | Leaked listeners or controllers |
|
|
128
|
+
|
|
129
|
+
## Output format
|
|
127
130
|
|
|
128
131
|
1. **Root cause**: one sentence identifying the exact problem.
|
|
129
|
-
2. **Evidence**: which tool output revealed it
|
|
130
|
-
3. **Proposed fix**: specific code change with file
|
|
131
|
-
4. **Screenshots**: before
|
|
132
|
+
2. **Evidence**: which tool output revealed it.
|
|
133
|
+
3. **Proposed fix**: specific code change with file:line reference (do not edit unless asked).
|
|
134
|
+
4. **Screenshots**: before/after paths.
|
|
132
135
|
|
|
133
136
|
## Example
|
|
134
137
|
|
|
135
138
|
```
|
|
136
|
-
User: "The invoices list
|
|
137
|
-
|
|
138
|
-
1. discover_sessions
|
|
139
|
-
2. screenshot
|
|
140
|
-
3. get_runtime_errors
|
|
141
|
-
4. evaluate: context.read<InvoiceListBloc>().state
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
invoice_list_bloc.dart:47.
|
|
148
|
-
8. hot_reload → screenshot → list loads correctly.
|
|
139
|
+
User: "The invoices list shows a blank white screen after merging the filter PR."
|
|
140
|
+
|
|
141
|
+
1. discover_sessions -> attach(sessionId: "flutter-1")
|
|
142
|
+
2. screenshot -> blank screen confirmed
|
|
143
|
+
3. get_runtime_errors -> "Null check operator on null value at invoice_list_bloc.dart:47"
|
|
144
|
+
4. evaluate: context.read<InvoiceListBloc>().state -> "InvoiceListInitial"
|
|
145
|
+
5. get_widget_tree -> root is ErrorWidget wrapping the list scaffold
|
|
146
|
+
6. start_http_capture -> get_http_events -> GET /api/invoices returned 200 with empty filter
|
|
147
|
+
7. Root cause: line 47 calls `event.filter!` but filter is null on first load
|
|
148
|
+
8. Proposed fix: `event.filter ?? const InvoiceFilter()` at line 47
|
|
149
|
+
9. hot_reload -> screenshot -> list loads correctly
|
|
149
150
|
```
|
|
150
151
|
|
|
151
152
|
## See also
|
|
152
153
|
|
|
153
|
-
-
|
|
154
|
-
- `
|
|
155
|
-
- `mcp__plugin_flutter_flutter-ultra-runtime__dump_render_tree` — full render object tree with constraints
|
|
156
|
-
- `mcp__plugin_flutter_flutter-ultra-runtime__evaluate` — arbitrary Dart expression in live app context
|
|
154
|
+
- `flutter-drive` — drive interactive flows to reproduce the bug
|
|
155
|
+
- `flutter-test` — run the test suite after applying a fix
|