@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 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