@mmerterden/multi-agent-toolkit-mcp 3.7.0 → 3.9.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/CHANGELOG.md +130 -0
- package/README.md +7 -0
- package/README.tr.md +7 -0
- package/index.js +309 -84
- package/package.json +1 -1
- package/tools/design-check/index.js +3 -2
- package/tools/design-check/report.js +15 -5
- package/tools/ios-app-store-audit/index.js +16 -2
- package/tools/ios-testflight/index.js +54 -11
- package/tools/memory/index.js +29 -9
- package/tools/offload/index.js +39 -13
package/CHANGELOG.md
CHANGED
|
@@ -15,6 +15,136 @@ Releases before this file exists are recorded in the git tags and commit history
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
## 3.9.0
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **Inline screenshots are compact.** `ios_screenshot` and `android_screenshot`
|
|
23
|
+
without `path` returned the raw PNG as base64: on a 3x simulator that is
|
|
24
|
+
2.9 MB per capture, 3.86 million characters on the wire, and the model reads
|
|
25
|
+
every one of them. That was the sluggishness people felt in an agent loop,
|
|
26
|
+
not the capture itself (0.5 s). The inline result is now an 800 px JPEG at
|
|
27
|
+
quality 80 (63 KB, 84 K characters), resized through `sips` in 0.1 s; the
|
|
28
|
+
full-resolution PNG still lands on disk and its path is in the text. New
|
|
29
|
+
optional inputs `max_width`, `format` and `quality` are the escape hatch
|
|
30
|
+
(`format: "png"` with `max_width: 0` returns the original bytes). `path`
|
|
31
|
+
behaviour is unchanged: full-resolution PNG, nothing inline, which is what
|
|
32
|
+
design-check and visual diff read.
|
|
33
|
+
- **The UI-tree dumper runs compiled.** `swift ui-tree-dumper.swift` was
|
|
34
|
+
re-interpreted on every call, about a second each. It is now compiled once
|
|
35
|
+
with `swiftc -O` into the user cache, keyed by the source hash and the
|
|
36
|
+
toolchain version, and runs in 55 ms. No `swiftc`, or a failed compile, falls
|
|
37
|
+
back to the interpreted script and stays there for the process lifetime.
|
|
38
|
+
`ios_get_ui_tree`, `ios_accessibility_audit` and `design_ui_geometry` share
|
|
39
|
+
the path.
|
|
40
|
+
|
|
41
|
+
### Note
|
|
42
|
+
|
|
43
|
+
The README gained a Performance section: read the tree before taking a
|
|
44
|
+
picture, batch a scripted sequence through `agent_run_steps`, write bulk
|
|
45
|
+
captures to files and look only at the ones that changed. The pipeline's
|
|
46
|
+
`/multi-agent:test` flow (16.19.0) now does exactly that.
|
|
47
|
+
|
|
48
|
+
## 3.8.0
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- **`ios_swipe` declares `duration_ms`.** The handler had read it since the
|
|
53
|
+
tool existed; the schema never said so, so no host ever offered it.
|
|
54
|
+
- **Gate 9c and gate 14b.** 9c validates every probed tool's structured result
|
|
55
|
+
against its own declared `outputSchema` with ajv. 14b scans every shell
|
|
56
|
+
template for a `${args.x}` interpolation that no sanitizer wraps, the shape
|
|
57
|
+
gate 14 could not see because it only knew the double-quoted form.
|
|
58
|
+
- **The work directory is pruned.** `.xcresult` bundles, build logs, push
|
|
59
|
+
payloads and audit dumps accumulated under the screenshot directory with
|
|
60
|
+
nothing to remove them. It now keeps the newest 200 entries for 7 days, the
|
|
61
|
+
offload directory's own rule, and never removes a path a caller was just
|
|
62
|
+
promised.
|
|
63
|
+
|
|
64
|
+
### Fixed
|
|
65
|
+
|
|
66
|
+
- **`agent_run_steps` skipped schema validation.** Batched steps went straight
|
|
67
|
+
to the handlers, so an enum or type guard that lived only in the schema was
|
|
68
|
+
void inside a batch. Every step is validated now and a failed validation is a
|
|
69
|
+
step error. `ios_get_app_container` also passes its `container` value through
|
|
70
|
+
`token()`, so the enum is not the only thing standing between an argument and
|
|
71
|
+
the shell.
|
|
72
|
+
- **`android_type_text` and `android_open_url` were command injection on the
|
|
73
|
+
device.** `shq()` protected the host shell, and `adb shell` hands the string
|
|
74
|
+
to the device shell unquoted, where it is parsed again. Both are quoted twice
|
|
75
|
+
now; a test evaluates the composed argument through `/bin/sh` and checks the
|
|
76
|
+
original bytes come back.
|
|
77
|
+
- **`android_meminfo mode=diff` always threw.** The snapshot emitted `pss_kb`
|
|
78
|
+
and the diff read `pss`, so the tool's own output was never a valid baseline.
|
|
79
|
+
The diff accepts both shapes.
|
|
80
|
+
- **Three `outputSchema`s contradicted their payloads,** which a conforming
|
|
81
|
+
client rejects: audit findings carry `status: "info"`, `ios_visual_diff`
|
|
82
|
+
returns `diff_image: null` on a clean compare, `android_launch_time` returns
|
|
83
|
+
`cold_start: null` below Android 10. The schemas now allow what the handlers
|
|
84
|
+
emit, and gate 9c keeps them honest.
|
|
85
|
+
- **`ios_app_store_audit` with an unknown rule id reported PASS** after running
|
|
86
|
+
nothing. Unknown ids are an error that lists the valid ones, and an empty
|
|
87
|
+
selection is never a pass.
|
|
88
|
+
- **`ios_accessibility_audit_deep` and `ios_leaks` ran through `execSync`**
|
|
89
|
+
with the default 1 MB buffer, so a normal `xcodebuild test` log killed the
|
|
90
|
+
child and the tool blamed the build; the event loop was blocked for the whole
|
|
91
|
+
run. Both use the async spawn path with a 64 MB cap and a timeout.
|
|
92
|
+
- **`android_apk_audit`'s `aapt2 || aapt` fallback never fired,** because a
|
|
93
|
+
failed `run()` returns a truthy error string; with aapt2 absent the report
|
|
94
|
+
said "Not debuggable - OK" and on Linux `apk_size` was `NaN MB` with status
|
|
95
|
+
pass. Failures are detected, the missing-tool branch is reachable, size comes
|
|
96
|
+
from `statSync`.
|
|
97
|
+
- **Capture tools returned a stale file as a fresh capture.** `ios_screenshot`,
|
|
98
|
+
`android_screenshot` and `android_get_ui_tree` decided success by whether the
|
|
99
|
+
path existed, so a second run against a dropped device returned the previous
|
|
100
|
+
image with the real error replaced by a generic one. The subprocess result is
|
|
101
|
+
checked first and a pre-existing file is discarded before capturing.
|
|
102
|
+
- **`ios_set_locale` reported success unconditionally.** Each of its three
|
|
103
|
+
steps is checked.
|
|
104
|
+
- **`ios_xcodebuild action:"test"` used the generic simulator destination,**
|
|
105
|
+
which xcodebuild refuses for testing. Test defaults to the booted simulator
|
|
106
|
+
or fails with a clear message.
|
|
107
|
+
- **`android_launch_time` and `android_launch_app` disagreed on `activity`.**
|
|
108
|
+
Both build the component the same way and describe the field identically.
|
|
109
|
+
- **Pure-JS iOS tools were refused without Xcode.** `ios_visual_diff`,
|
|
110
|
+
`ios_list_crashes` and `ios_xcresult` need no xcrun and run on a Linux box.
|
|
111
|
+
- **`design_report` leaked a Chromium on a failed PDF render.** The browser is
|
|
112
|
+
closed in `finally`.
|
|
113
|
+
- **`ios_archive_audit` reported an unsigned bundle as signed,** because the
|
|
114
|
+
`codesign` failure text never reached the check; and its size used the
|
|
115
|
+
macOS-only `stat -f`.
|
|
116
|
+
- **Smaller ones.** `ios_leaks` accepts a numeric-string pid and matches the
|
|
117
|
+
bundle id as a whole token instead of a regex prefix; the UI-tree dumper's
|
|
118
|
+
remedy text reaches the caller; `ensureBrowser` closes a half-launched browser
|
|
119
|
+
and honours a changed engine; `exportIpa` picks the export it just made rather
|
|
120
|
+
than the first `.ipa` in the directory, and the export options plist is
|
|
121
|
+
XML-escaped; `agent_run_steps` declares the `result` / `error` fields it
|
|
122
|
+
emits.
|
|
123
|
+
|
|
124
|
+
## 3.7.1
|
|
125
|
+
|
|
126
|
+
### Fixed
|
|
127
|
+
|
|
128
|
+
- **`android_meminfo` never read the swap total on a real device.** The parser
|
|
129
|
+
was written from the documented output, which spells the line
|
|
130
|
+
`TOTAL SWAP (KB):`. An Android 35 Pixel emulator prints `TOTAL SWAP PSS:`, so
|
|
131
|
+
the regex matched nothing and `total_swap_kb` came back null on every real
|
|
132
|
+
run. Both spellings are accepted now, and the fixture is the emulator's own
|
|
133
|
+
output rather than a reconstruction.
|
|
134
|
+
|
|
135
|
+
This is the defect the 3.3.0 note predicted: that parser shipped marked "not
|
|
136
|
+
verified on a device", and the first real device broke it. Worth recording
|
|
137
|
+
plainly, because the note was right and the only thing that found the bug was
|
|
138
|
+
running it.
|
|
139
|
+
|
|
140
|
+
### Note
|
|
141
|
+
|
|
142
|
+
The Android checks are no longer unverified. `android_accessibility_audit` and
|
|
143
|
+
`android_meminfo` were both run against a booted Android 35 emulator: the audit
|
|
144
|
+
read 14 clickable elements off a real launcher, reported the reading order as
|
|
145
|
+
correct with no false positive on the grid, and produced one critical and seven
|
|
146
|
+
warnings; meminfo read the App Summary and, after the fix above, the swap total.
|
|
147
|
+
|
|
18
148
|
## 3.7.0
|
|
19
149
|
|
|
20
150
|
### Added
|
package/README.md
CHANGED
|
@@ -293,6 +293,13 @@ Mock-mode vs Figma design audit. Generic and platform-agnostic - the heavy orche
|
|
|
293
293
|
- **App Store screenshots** - Clean status bar + automated navigation
|
|
294
294
|
- **Regression testing** - Tap through flows, verify behavior
|
|
295
295
|
|
|
296
|
+
### Performance
|
|
297
|
+
|
|
298
|
+
- **Inline captures are small.** `ios_screenshot` / `android_screenshot` without `path` return an 800 px JPEG, about 60 KB instead of the ~3 MB full-resolution PNG a simulator produces (which is ~4 MB as base64 on every capture). `max_width`, `format` and `quality` tune it; `format: "png"` with `max_width: 0` returns the original bytes. The full-resolution PNG stays on disk, and `path` writes it where you say.
|
|
299
|
+
- **The iOS UI-tree dumper is compiled once.** `ui-tree-dumper.swift` is built with `swiftc -O` on first use and cached per source and toolchain, so a call drops from ~1 s to ~0.05 s. Without `swiftc` it runs interpreted as before.
|
|
300
|
+
- **Batch a scripted sequence.** `agent_run_steps` runs tap, type, wait and screenshot steps in one round trip instead of one call per step.
|
|
301
|
+
- **Read the tree when text is enough.** `ios_get_ui_tree` / `android_get_ui_tree` cost a fraction of a screenshot and return tappable coordinates.
|
|
302
|
+
|
|
296
303
|
### How It Works
|
|
297
304
|
|
|
298
305
|
```mermaid
|
package/README.tr.md
CHANGED
|
@@ -292,6 +292,13 @@ Mock-mode vs Figma tasarım denetimi. Jenerik ve platform-bağımsız - ağır o
|
|
|
292
292
|
- **App Store screenshot'ları** - Temiz status bar + otomatik navigasyon
|
|
293
293
|
- **Regresyon testi** - Akışlarda tap'le gez, davranışı doğrula
|
|
294
294
|
|
|
295
|
+
### Performans
|
|
296
|
+
|
|
297
|
+
- **Inline capture'lar küçük.** `path` verilmeyen `ios_screenshot` / `android_screenshot` 800 px JPEG döner: simülatörün ürettiği ~3 MB tam çözünürlüklü PNG (her capture'da base64 olarak ~4 MB) yerine yaklaşık 60 KB. `max_width`, `format` ve `quality` ile ayarlanır; `format: "png"` + `max_width: 0` orijinal byte'ları döner. Tam çözünürlüklü PNG diskte kalır, `path` onu istediğin yere yazar.
|
|
298
|
+
- **iOS UI-tree dumper bir kez derlenir.** `ui-tree-dumper.swift` ilk kullanımda `swiftc -O` ile derlenir, kaynak + toolchain başına önbelleğe alınır; bir çağrı ~1 s'den ~0.05 s'ye iner. `swiftc` yoksa eskisi gibi yorumlanarak çalışır.
|
|
299
|
+
- **Senaryoyu tek çağrıda koş.** `agent_run_steps` tap, type, wait ve screenshot adımlarını adım başına bir çağrı yerine tek round trip'te çalıştırır.
|
|
300
|
+
- **Metin yetiyorsa tree oku.** `ios_get_ui_tree` / `android_get_ui_tree` bir screenshot'ın çok küçük bir maliyetiyle tap'lenebilir koordinatlar döner.
|
|
301
|
+
|
|
295
302
|
### Nasıl Çalışır
|
|
296
303
|
|
|
297
304
|
```mermaid
|