@mmerterden/multi-agent-toolkit-mcp 3.7.1 → 3.11.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 +275 -0
- package/README.md +86 -2
- package/README.tr.md +13 -3
- package/index.js +345 -87
- package/package.json +3 -3
- package/tools/code-intel/index.js +665 -0
- package/tools/code-intel/kotlin.js +159 -0
- package/tools/code-intel/lsp-client.js +422 -0
- package/tools/code-intel/pool.js +273 -0
- package/tools/code-intel/positions.js +195 -0
- package/tools/code-intel/swift.js +249 -0
- 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 +18 -3
- package/tools/offload/index.js +39 -13
- package/tools/pass-kit/index.js +432 -0
- package/tools/pass-kit/sign.js +255 -0
- package/tools/pass-kit/spec.js +317 -0
- package/tools/pass-kit/validate.js +329 -0
package/CHANGELOG.md
CHANGED
|
@@ -15,6 +15,281 @@ Releases before this file exists are recorded in the git tags and commit history
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
## 3.11.0
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **Wallet Passes, four `pass_*` tools** - `pass_validate`, `pass_build`,
|
|
23
|
+
`pass_inspect`, `pass_certificates`. Build, sign, validate and inspect Apple
|
|
24
|
+
Wallet passes; offline, deterministic, and generic by construction. All five
|
|
25
|
+
of Apple's styles are first-class with a per-style image contract, and no
|
|
26
|
+
brand, airline or project appears anywhere in the directory. 95 tools become
|
|
27
|
+
99. Three are read-only; `pass_build` writes the file the caller named.
|
|
28
|
+
|
|
29
|
+
**A literal passphrase is not an accepted input.** The caller names an
|
|
30
|
+
environment variable (`passphrase_env`) or a keychain entry, and the value
|
|
31
|
+
reaches openssl through `-passin env:` rather than as an argument, because an
|
|
32
|
+
argument is world-readable in `ps` for as long as the process runs. It is
|
|
33
|
+
never written to disk, never returned, and scrubbed out of error text. A test
|
|
34
|
+
asserts the tool surface contains no bare `passphrase` property, and another
|
|
35
|
+
asserts the value never reaches a result.
|
|
36
|
+
|
|
37
|
+
**Findings are graded by consequence, and the warning grade is the point.** An
|
|
38
|
+
error is a pass Wallet refuses. A warning is a pass Wallet accepts while
|
|
39
|
+
quietly doing less than intended, and those are the ones nobody finds: one
|
|
40
|
+
unknown `PKPassengerCapability*` value raises nothing anywhere and drops an
|
|
41
|
+
enhanced boarding pass back to the old layout; a tag renamed in iOS 26 is
|
|
42
|
+
ignored rather than rejected, so whatever it drove simply does not appear;
|
|
43
|
+
`footer@1x.png` is not the 1x footer, since Wallet looks for `footer.png`.
|
|
44
|
+
|
|
45
|
+
Run against a real signed production boarding pass, the validator reported
|
|
46
|
+
zero errors and found two genuine defects - the `@1x` file and a set of
|
|
47
|
+
labels that were half localization keys and half literal text. It also
|
|
48
|
+
reported two things wrongly on that same pass, and both were corrected rather
|
|
49
|
+
than explained: `footerFields` is a real bucket, and a dozen semantic tags it
|
|
50
|
+
called unknown are real tags.
|
|
51
|
+
|
|
52
|
+
`pass_build` refuses to build with an expired Pass Type ID certificate. Such a
|
|
53
|
+
pass builds, signs and verifies; Wallet is the first thing that refuses it,
|
|
54
|
+
and it does not say why.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
Six defects found reviewing the two families above before either reached npm.
|
|
59
|
+
Neither 3.10.0 nor 3.11.0 was ever published, so they are recorded here rather
|
|
60
|
+
than as a patch release.
|
|
61
|
+
|
|
62
|
+
- **The server pool started two servers for one root.** `withServer` read its
|
|
63
|
+
lock off a map entry that did not exist yet, so two concurrent calls for a
|
|
64
|
+
cold root each spawned a language server and the second `servers.set`
|
|
65
|
+
orphaned the first - never disposed, never swept, invisible to the idle
|
|
66
|
+
sweeper. The queue now lives in its own map, taken before any state is read.
|
|
67
|
+
`onCrash` mutated a copy, which broke identity for in-flight callers and put
|
|
68
|
+
a dead server back in the map; it mutates in place, and the crash-poison
|
|
69
|
+
window outlives the entry it belonged to.
|
|
70
|
+
|
|
71
|
+
- **`dispose()` dropped an in-flight request instead of settling it.** It
|
|
72
|
+
cleared each pending timer and then the map, discarding the only reference to
|
|
73
|
+
the resolver, so the exit event that would have settled them found nothing and
|
|
74
|
+
the caller awaited forever. Only reachable against a server that ignores
|
|
75
|
+
`shutdown` - which is the case `dispose()` exists for.
|
|
76
|
+
|
|
77
|
+
- **The Swift index report missed the index and guessed at its age.**
|
|
78
|
+
DerivedData folders were matched against the checkout's directory name; Xcode
|
|
79
|
+
names them after the project, and in most checkouts those differ - one
|
|
80
|
+
measured here reported `indexBuilt: false` with an 18,205-unit store on disk,
|
|
81
|
+
and printed a remedy telling the caller to build it. The candidate names now
|
|
82
|
+
come from the `.xcodeproj` / `.xcworkspace` in the root. Separately, "newest
|
|
83
|
+
unit" was sampled from the first 200 entries of a `readdir`, which is hash
|
|
84
|
+
order rather than a timeline; the directory's own mtime answers exactly, for
|
|
85
|
+
one syscall instead of 200.
|
|
86
|
+
|
|
87
|
+
- **The Kotlin probe reported no JVM on a machine running Java 17.**
|
|
88
|
+
`java -version` writes to stderr and exits 0, and the version was read from
|
|
89
|
+
`execFileSync`'s return value, which is stdout. The `catch` that reads
|
|
90
|
+
`e.stderr` never ran, because nothing threw. Latent only because the probe
|
|
91
|
+
short-circuits where `kotlin-lsp` is absent - so it would have fired for
|
|
92
|
+
exactly the users who install it.
|
|
93
|
+
|
|
94
|
+
- **`code_index_status` answered about paths it could not look at.** "Always
|
|
95
|
+
succeeds" is a promise about a missing toolchain, not about bad input, and it
|
|
96
|
+
had been implemented as "never validates": a relative path, a path that does
|
|
97
|
+
not exist, or literally the string `undefined` all resolved to
|
|
98
|
+
`semantic: false` with `buildSettingsSource: "fallback"` - the same answer a
|
|
99
|
+
genuinely unconfigured repo gets - and then printed a remedy telling the
|
|
100
|
+
caller to point `workspace_root` at a project root, sending them after a build
|
|
101
|
+
system that was never the problem. Every other tool in the family refused
|
|
102
|
+
those paths by name. Found by running the tools end to end rather than by
|
|
103
|
+
reading them. A call with no path at all still answers, because there is
|
|
104
|
+
nothing there to be wrong about and that is the "can this machine do anything"
|
|
105
|
+
call.
|
|
106
|
+
|
|
107
|
+
- **The per-root server queue outlived the work it guarded.** The lock map
|
|
108
|
+
gained an entry for every distinct `language:root` ever asked about and
|
|
109
|
+
removed none, so a server running for days accumulated one dead promise chain
|
|
110
|
+
per root. Introduced by the fix above it, which moved the queue out of the
|
|
111
|
+
server entry precisely so it could outlive it.
|
|
112
|
+
|
|
113
|
+
- **`pass_validate` filtered findings by their message text.** Checking a bare
|
|
114
|
+
`pass.json` has no files to look at, so image findings were dropped by
|
|
115
|
+
matching the sentence they were phrased with - improving the wording would
|
|
116
|
+
have silently turned them back on. They carry `kind: "asset"` now.
|
|
117
|
+
|
|
118
|
+
### Changed
|
|
119
|
+
|
|
120
|
+
- Gates 14c and 14d now cover `tools/pass-kit/` as well as `tools/code-intel/`:
|
|
121
|
+
no shell, and no writing to the MCP stdout channel.
|
|
122
|
+
|
|
123
|
+
- **Gate 15 is new: nothing personal or corporate ships to public npm.** Every
|
|
124
|
+
tracked file is scanned for home directories, the author's username, employer
|
|
125
|
+
hostnames and day-job brands. It failed on its first run, on a design-check
|
|
126
|
+
handoff note carrying an employer app name, an internal module path, two real
|
|
127
|
+
Figma file keys and three corporate component names - a file nothing had ever
|
|
128
|
+
scanned, in a package published to the public registry.
|
|
129
|
+
|
|
130
|
+
- **Gate 3b reads `README.tr.md` too, and checks the category count.** It had
|
|
131
|
+
read only `README.md`, so the Turkish page drifted three whole families
|
|
132
|
+
behind while its headline still claimed the right total, and `README.md`
|
|
133
|
+
itself said "9 categories" over ten bullets. The sum was the only number
|
|
134
|
+
anything checked.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 3.10.0
|
|
139
|
+
|
|
140
|
+
### Added
|
|
141
|
+
|
|
142
|
+
- **Code Intelligence, eight `code_*` tools** - compiler-grade answers about
|
|
143
|
+
Swift and Kotlin source, over the language server each platform already
|
|
144
|
+
ships. `code_definition`, `code_references`, `code_hover`,
|
|
145
|
+
`code_document_symbols`, `code_workspace_symbols`, `code_diagnostics`,
|
|
146
|
+
`code_index_status`, `code_server_reset`. Swift needs nothing installed:
|
|
147
|
+
`sourcekit-lsp` comes with Xcode. Seven are read-only; `code_server_reset`
|
|
148
|
+
discards a cache and is marked idempotent.
|
|
149
|
+
|
|
150
|
+
One family rather than two, with the language inferred from the file
|
|
151
|
+
extension. The capability set genuinely is symmetric - both sides are LSP
|
|
152
|
+
servers answering the same methods - and duplicating the surface would double
|
|
153
|
+
the tool count for no new capability. The asymmetry lives in the output:
|
|
154
|
+
every result carries `language`, `semantic` and the resolved build-settings
|
|
155
|
+
source, and Kotlin answers carry `confidence: "alpha"`.
|
|
156
|
+
|
|
157
|
+
**What is measured, and why the tools say what they say.** On Swift 6.3.1,
|
|
158
|
+
`textDocument/references` against a two-file package answered `[]` at 0.7s
|
|
159
|
+
and `[3]` at 5.8s with nothing changed except that the background index had
|
|
160
|
+
finished. `initialize` returns `referencesProvider: true` either way, so the
|
|
161
|
+
server's own capability flag is no guide. These tools therefore wait for the
|
|
162
|
+
index and report `indexReady`, because "0 references" reads as "this symbol
|
|
163
|
+
is unused" and that is the wrong thing to be wrong about. A 658-file package
|
|
164
|
+
with dependencies had still not finished at 70s, so `index_wait_sec` is an
|
|
165
|
+
input rather than a constant. On an `.xcodeproj` root with no
|
|
166
|
+
`buildServer.json`, cross-file answers are impossible and diagnostics are
|
|
167
|
+
actively misleading; both are marked `semantic: false` with the remedy, and
|
|
168
|
+
nothing writes a build config into anyone's repository.
|
|
169
|
+
|
|
170
|
+
Kotlin runs on JetBrains `kotlin-lsp`, which is Alpha, partially closed
|
|
171
|
+
source, and not installed here or in CI. The probe and the absence path are
|
|
172
|
+
covered by tests; **the Kotlin server path is exercised by no gate in this
|
|
173
|
+
repository**, and the README says so rather than letting a green suite imply
|
|
174
|
+
coverage.
|
|
175
|
+
|
|
176
|
+
- **Gate 14c** - `tools/code-intel/` must reach no shell. Gate 14b protects
|
|
177
|
+
shell templates by demanding a sanitizer on every interpolation, so it has
|
|
178
|
+
nothing to inspect in a directory that only spawns argv arrays - and would
|
|
179
|
+
have stayed silent the day one of those spawns became a `run()` template
|
|
180
|
+
taking a caller-supplied path.
|
|
181
|
+
- **Gate 14d** - no code-intel module may touch `process.stdout` or inherit a
|
|
182
|
+
child's stdio. A language server speaks JSON-RPC too, and any of its stream
|
|
183
|
+
reaching fd 1 corrupts the host channel and takes all 95 tools down, not one.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 3.9.0
|
|
188
|
+
|
|
189
|
+
### Changed
|
|
190
|
+
|
|
191
|
+
- **Inline screenshots are compact.** `ios_screenshot` and `android_screenshot`
|
|
192
|
+
without `path` returned the raw PNG as base64: on a 3x simulator that is
|
|
193
|
+
2.9 MB per capture, 3.86 million characters on the wire, and the model reads
|
|
194
|
+
every one of them. That was the sluggishness people felt in an agent loop,
|
|
195
|
+
not the capture itself (0.5 s). The inline result is now an 800 px JPEG at
|
|
196
|
+
quality 80 (63 KB, 84 K characters), resized through `sips` in 0.1 s; the
|
|
197
|
+
full-resolution PNG still lands on disk and its path is in the text. New
|
|
198
|
+
optional inputs `max_width`, `format` and `quality` are the escape hatch
|
|
199
|
+
(`format: "png"` with `max_width: 0` returns the original bytes). `path`
|
|
200
|
+
behaviour is unchanged: full-resolution PNG, nothing inline, which is what
|
|
201
|
+
design-check and visual diff read.
|
|
202
|
+
- **The UI-tree dumper runs compiled.** `swift ui-tree-dumper.swift` was
|
|
203
|
+
re-interpreted on every call, about a second each. It is now compiled once
|
|
204
|
+
with `swiftc -O` into the user cache, keyed by the source hash and the
|
|
205
|
+
toolchain version, and runs in 55 ms. No `swiftc`, or a failed compile, falls
|
|
206
|
+
back to the interpreted script and stays there for the process lifetime.
|
|
207
|
+
`ios_get_ui_tree`, `ios_accessibility_audit` and `design_ui_geometry` share
|
|
208
|
+
the path.
|
|
209
|
+
|
|
210
|
+
### Note
|
|
211
|
+
|
|
212
|
+
The README gained a Performance section: read the tree before taking a
|
|
213
|
+
picture, batch a scripted sequence through `agent_run_steps`, write bulk
|
|
214
|
+
captures to files and look only at the ones that changed. The pipeline's
|
|
215
|
+
`/multi-agent:test` flow (16.19.0) now does exactly that.
|
|
216
|
+
|
|
217
|
+
## 3.8.0
|
|
218
|
+
|
|
219
|
+
### Added
|
|
220
|
+
|
|
221
|
+
- **`ios_swipe` declares `duration_ms`.** The handler had read it since the
|
|
222
|
+
tool existed; the schema never said so, so no host ever offered it.
|
|
223
|
+
- **Gate 9c and gate 14b.** 9c validates every probed tool's structured result
|
|
224
|
+
against its own declared `outputSchema` with ajv. 14b scans every shell
|
|
225
|
+
template for a `${args.x}` interpolation that no sanitizer wraps, the shape
|
|
226
|
+
gate 14 could not see because it only knew the double-quoted form.
|
|
227
|
+
- **The work directory is pruned.** `.xcresult` bundles, build logs, push
|
|
228
|
+
payloads and audit dumps accumulated under the screenshot directory with
|
|
229
|
+
nothing to remove them. It now keeps the newest 200 entries for 7 days, the
|
|
230
|
+
offload directory's own rule, and never removes a path a caller was just
|
|
231
|
+
promised.
|
|
232
|
+
|
|
233
|
+
### Fixed
|
|
234
|
+
|
|
235
|
+
- **`agent_run_steps` skipped schema validation.** Batched steps went straight
|
|
236
|
+
to the handlers, so an enum or type guard that lived only in the schema was
|
|
237
|
+
void inside a batch. Every step is validated now and a failed validation is a
|
|
238
|
+
step error. `ios_get_app_container` also passes its `container` value through
|
|
239
|
+
`token()`, so the enum is not the only thing standing between an argument and
|
|
240
|
+
the shell.
|
|
241
|
+
- **`android_type_text` and `android_open_url` were command injection on the
|
|
242
|
+
device.** `shq()` protected the host shell, and `adb shell` hands the string
|
|
243
|
+
to the device shell unquoted, where it is parsed again. Both are quoted twice
|
|
244
|
+
now; a test evaluates the composed argument through `/bin/sh` and checks the
|
|
245
|
+
original bytes come back.
|
|
246
|
+
- **`android_meminfo mode=diff` always threw.** The snapshot emitted `pss_kb`
|
|
247
|
+
and the diff read `pss`, so the tool's own output was never a valid baseline.
|
|
248
|
+
The diff accepts both shapes.
|
|
249
|
+
- **Three `outputSchema`s contradicted their payloads,** which a conforming
|
|
250
|
+
client rejects: audit findings carry `status: "info"`, `ios_visual_diff`
|
|
251
|
+
returns `diff_image: null` on a clean compare, `android_launch_time` returns
|
|
252
|
+
`cold_start: null` below Android 10. The schemas now allow what the handlers
|
|
253
|
+
emit, and gate 9c keeps them honest.
|
|
254
|
+
- **`ios_app_store_audit` with an unknown rule id reported PASS** after running
|
|
255
|
+
nothing. Unknown ids are an error that lists the valid ones, and an empty
|
|
256
|
+
selection is never a pass.
|
|
257
|
+
- **`ios_accessibility_audit_deep` and `ios_leaks` ran through `execSync`**
|
|
258
|
+
with the default 1 MB buffer, so a normal `xcodebuild test` log killed the
|
|
259
|
+
child and the tool blamed the build; the event loop was blocked for the whole
|
|
260
|
+
run. Both use the async spawn path with a 64 MB cap and a timeout.
|
|
261
|
+
- **`android_apk_audit`'s `aapt2 || aapt` fallback never fired,** because a
|
|
262
|
+
failed `run()` returns a truthy error string; with aapt2 absent the report
|
|
263
|
+
said "Not debuggable - OK" and on Linux `apk_size` was `NaN MB` with status
|
|
264
|
+
pass. Failures are detected, the missing-tool branch is reachable, size comes
|
|
265
|
+
from `statSync`.
|
|
266
|
+
- **Capture tools returned a stale file as a fresh capture.** `ios_screenshot`,
|
|
267
|
+
`android_screenshot` and `android_get_ui_tree` decided success by whether the
|
|
268
|
+
path existed, so a second run against a dropped device returned the previous
|
|
269
|
+
image with the real error replaced by a generic one. The subprocess result is
|
|
270
|
+
checked first and a pre-existing file is discarded before capturing.
|
|
271
|
+
- **`ios_set_locale` reported success unconditionally.** Each of its three
|
|
272
|
+
steps is checked.
|
|
273
|
+
- **`ios_xcodebuild action:"test"` used the generic simulator destination,**
|
|
274
|
+
which xcodebuild refuses for testing. Test defaults to the booted simulator
|
|
275
|
+
or fails with a clear message.
|
|
276
|
+
- **`android_launch_time` and `android_launch_app` disagreed on `activity`.**
|
|
277
|
+
Both build the component the same way and describe the field identically.
|
|
278
|
+
- **Pure-JS iOS tools were refused without Xcode.** `ios_visual_diff`,
|
|
279
|
+
`ios_list_crashes` and `ios_xcresult` need no xcrun and run on a Linux box.
|
|
280
|
+
- **`design_report` leaked a Chromium on a failed PDF render.** The browser is
|
|
281
|
+
closed in `finally`.
|
|
282
|
+
- **`ios_archive_audit` reported an unsigned bundle as signed,** because the
|
|
283
|
+
`codesign` failure text never reached the check; and its size used the
|
|
284
|
+
macOS-only `stat -f`.
|
|
285
|
+
- **Smaller ones.** `ios_leaks` accepts a numeric-string pid and matches the
|
|
286
|
+
bundle id as a whole token instead of a regex prefix; the UI-tree dumper's
|
|
287
|
+
remedy text reaches the caller; `ensureBrowser` closes a half-launched browser
|
|
288
|
+
and honours a changed engine; `exportIpa` picks the export it just made rather
|
|
289
|
+
than the first `.ipa` in the directory, and the export options plist is
|
|
290
|
+
XML-escaped; `agent_run_steps` declares the `result` / `error` fields it
|
|
291
|
+
emits.
|
|
292
|
+
|
|
18
293
|
## 3.7.1
|
|
19
294
|
|
|
20
295
|
### Fixed
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
🇹🇷 Türkçe: [README.tr.md](./README.tr.md)
|
|
9
9
|
|
|
10
|
-
**
|
|
10
|
+
**99 tools** for iOS Simulator, Android Emulator, and headless web control. MCP server that lets your AI coding assistant see, interact with, and audit your mobile apps - plus drive browsers, run an 18-rule App Store compliance audit, and orchestrate multi-step batch flows.
|
|
11
11
|
|
|
12
12
|
Distributed on the **public npm registry** - `npx @mmerterden/multi-agent-toolkit-mcp` resolves with no auth, no token, no `~/.npmrc` setup.
|
|
13
13
|
|
|
@@ -15,7 +15,7 @@ Distributed on the **public npm registry** - `npx @mmerterden/multi-agent-toolki
|
|
|
15
15
|
|
|
16
16
|
That distinction is worth keeping straight. This line once called five hosts "the multi-agent-pipeline's full-orchestration targets", which stopped being true in pipeline v10.7.0 when the Cursor / Antigravity / Codex / Copilot Chat adapters were deleted. Codex CLI returned as a first-class target in pipeline v13.0.0 on capability - it now has skills, parallel sub-agents, hooks and MCP - and it is on the verified list only because a gate exercises it, not because it is supported elsewhere. Claiming hosts nobody exercises is not free either: 2.20.0 and 2.21.0 shipped an illegal `outputSchema` on the first tool, so Claude Code rejected the whole `tools/list` and served zero of the 78 - in the primary host, for two releases, with every gate in this repo green.
|
|
17
17
|
|
|
18
|
-
**
|
|
18
|
+
**10 categories:**
|
|
19
19
|
- **Device Control** (59 tools) - screenshot, tap, swipe, type, navigate, dark mode, locale, orientation, location, permissions, push notifications, real start/stop screen recording
|
|
20
20
|
- **Memory** (2 tools) - `ios_leaks` runs /usr/bin/leaks against a simulator or host process, snapshot or diff against a saved memory graph; `android_meminfo` reads dumpsys meminfo, snapshot or diff. Both report `measurable:false` rather than a clean result when they could not look
|
|
21
21
|
- **Crash Diagnostics** (2 tools) - `ios_list_crashes` reads the host's DiagnosticReports, `android_list_crashes` dumps the adb crash buffer, both tail-bounded
|
|
@@ -23,6 +23,8 @@ That distinction is worth keeping straight. This line once called five hosts "th
|
|
|
23
23
|
- **Store Compliance** (5 tools) - App Store / Play Store readiness; **18-rule deep `ios_app_store_audit`** cross-references Apple ITMS error codes + App Store Review Guidelines (privacy manifest, required-reason API, Info.plist, code signing, entitlements, embedded SDK, IPv6, debug-tool leak, ...)
|
|
24
24
|
- **Web Automation** (8 tools) - Playwright-powered: goto, click (CSS selectors), type, eval JS, wait for selector, extract text, screenshot. Chromium / WebKit / Firefox engines. **Requires `playwright` peer dependency.**
|
|
25
25
|
- **Design Audit** (6 tools) - mock-mode vs Figma conformance: scenario inventory, mock detection, mock launch, live UI geometry, pixel/geometry/typography compare, and the HTML/PDF report with its coverage gate
|
|
26
|
+
- **Code Intelligence** (8 tools) - compiler-grade answers about Swift and Kotlin source, over the language server each platform already ships: definition, references, hover, document and workspace symbols, diagnostics without a full build, plus `code_index_status` for whether this machine can answer at all. Cross-file answers need a background index, so they report whether it had settled instead of returning an empty list that reads as "unused"
|
|
27
|
+
- **Wallet Passes** (4 tools) - build, sign, validate and inspect Apple Wallet passes. All five styles, offline and deterministic, and a literal passphrase is deliberately not an accepted input: the caller names an environment variable or a keychain entry. The validator grades by consequence, because the interesting failures are the silent ones - one unknown `PKPassengerCapability` value raises nothing and quietly drops an enhanced pass back to the old layout
|
|
26
28
|
- **Autonomous Agent DSL** (2 tools) - `agent_run_steps` executes a batch array of {tool, args, continue_on_error?, wait_ms?} steps in one MCP round trip. Ideal for scripted login flows, form fills, multi-step QA paths. `agent_query_output` searches the full output of an earlier call that was too large to return inline, so a follow-up question does not mean re-running an expensive tool.
|
|
27
29
|
|
|
28
30
|
## Quick Start
|
|
@@ -281,6 +283,81 @@ Mock-mode vs Figma design audit. Generic and platform-agnostic - the heavy orche
|
|
|
281
283
|
| `design_visual_compare` | Compare a Figma render vs a live screenshot without failing on size mismatch: normalizes scale, crops chrome, reports perceptual diff %, spacing/size/position (px), color (ΔE), and typography. Writes figma/live/diff/overlay/side-by-side PNGs. |
|
|
282
284
|
| `design_report` | Render a design-audit report object to self-contained HTML (base64 images, CSS-positioned annotations) + optional PDF. Enforces a coverage gate: every target must be audited or skipped with an explicit reason, so a partial audit cannot render as a clean report. Wording comes from a label pack (English default, Turkish built in). |
|
|
283
285
|
|
|
286
|
+
### Code Intelligence Tools (8)
|
|
287
|
+
|
|
288
|
+
Compiler-grade answers about Swift and Kotlin, over the language server each
|
|
289
|
+
platform already ships. Swift needs nothing installed: `sourcekit-lsp` comes
|
|
290
|
+
with Xcode. Kotlin uses JetBrains `kotlin-lsp`, which is Alpha and must be
|
|
291
|
+
installed separately - every Kotlin answer is labelled `confidence: "alpha"`,
|
|
292
|
+
and **no gate in this repository exercises the Kotlin server**, so treat that
|
|
293
|
+
side as written-but-unverified.
|
|
294
|
+
|
|
295
|
+
| Tool | What it does |
|
|
296
|
+
|---|---|
|
|
297
|
+
| `code_definition` | Where a symbol is declared. Takes a 1-based line+column, or a `symbol` name so the caller never has to count columns. |
|
|
298
|
+
| `code_references` | Every reference across the workspace. Index-backed, and reports whether the index had settled. |
|
|
299
|
+
| `code_hover` | Type, signature and doc comment at a position. Works without an index for same-file and standard-library symbols. |
|
|
300
|
+
| `code_document_symbols` | The symbol tree of one file. The only capability that needs no build configuration at all. |
|
|
301
|
+
| `code_workspace_symbols` | Find a symbol by name across the workspace. Index-backed. |
|
|
302
|
+
| `code_diagnostics` | Compiler diagnostics for one file without a full build. Says "did not look" rather than reporting 0 when nothing was published. |
|
|
303
|
+
| `code_index_status` | Per language: is a server installed, which build system was found, is an index on disk, what to do if not. Always succeeds. |
|
|
304
|
+
| `code_server_reset` | Stop the pooled servers. For a server wedged on stale build settings. Discards a cache, never source. |
|
|
305
|
+
|
|
306
|
+
**What these can and cannot answer, by root.** sourcekit-lsp takes its compiler
|
|
307
|
+
arguments from a build system, and which one it finds decides everything. The
|
|
308
|
+
resolved root and how it was found come back in every result, so an answer is
|
|
309
|
+
never separated from what it is worth.
|
|
310
|
+
|
|
311
|
+
| Root | definition | references / workspace symbols | diagnostics |
|
|
312
|
+
|---|---|---|---|
|
|
313
|
+
| `Package.swift` (SwiftPM) | yes | yes, once the background index settles | yes |
|
|
314
|
+
| `buildServer.json` | yes | yes | yes |
|
|
315
|
+
| `.xcodeproj` with no build server | same-file only | **no** - `semantic: false` and a remedy | misleading, and marked non-semantic |
|
|
316
|
+
|
|
317
|
+
Measured on Swift 6.3.1: against a two-file package, `code_references` answered
|
|
318
|
+
0 at 0.7s and 3 at 5.8s, with nothing changed except that the background index
|
|
319
|
+
had finished. That gap is why these tools wait for the index and report
|
|
320
|
+
`indexReady` rather than returning the empty list - "0 references" reads as
|
|
321
|
+
"this symbol is unused", and that is the wrong thing to be wrong about. On a
|
|
322
|
+
658-file package with dependencies the first index had still not finished at
|
|
323
|
+
70s, so budget accordingly with `index_wait_sec`.
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
### Wallet Pass Tools (4)
|
|
327
|
+
|
|
328
|
+
Build, sign, validate and inspect Apple Wallet passes. Offline, deterministic,
|
|
329
|
+
and generic: all five of Apple's styles are first-class and nothing here is tied
|
|
330
|
+
to a brand, an airline or a project.
|
|
331
|
+
|
|
332
|
+
| Tool | What it does |
|
|
333
|
+
|---|---|
|
|
334
|
+
| `pass_validate` | Check a pass.json, a `.pass` directory or a built `.pkpass` against Apple's rules. Grades findings by consequence. |
|
|
335
|
+
| `pass_build` | Assemble, sign (openssl, detached PKCS#7 over a SHA-1 manifest) and archive a `.pkpass`. Validates first and refuses on an error unless told otherwise. |
|
|
336
|
+
| `pass_inspect` | Open a `.pkpass` and report what is in it: style, semantic tags, images and scales, localizations, manifest integrity and the signing chain. Never needs the private key. |
|
|
337
|
+
| `pass_certificates` | Report the signing material: identity, expiry, and whether a passphrase source is configured. Never reads or reports key material. |
|
|
338
|
+
|
|
339
|
+
**Secrets.** A literal passphrase is not an accepted parameter anywhere. The
|
|
340
|
+
caller passes `passphrase_env` (the NAME of an environment variable) or
|
|
341
|
+
`keychain_account`, and the value reaches openssl through `-passin env:` so it
|
|
342
|
+
never appears in `ps`, never lands in a log, and is scrubbed from any error text
|
|
343
|
+
on the way back.
|
|
344
|
+
|
|
345
|
+
**Grading, and why it is the point.** An `error` is a pass Wallet refuses. A
|
|
346
|
+
`warning` is a pass Wallet accepts while quietly doing less than intended, and
|
|
347
|
+
that grade exists because those are the ones nobody finds:
|
|
348
|
+
|
|
349
|
+
- one unknown `PKPassengerCapability*` value raises nothing at all and drops the
|
|
350
|
+
enhanced layout back to the old one
|
|
351
|
+
- a semantic tag renamed in iOS 26 is not rejected, it is ignored, so whatever
|
|
352
|
+
it drove simply does not appear
|
|
353
|
+
- `footer@1x.png` is not the 1x footer - Wallet looks for `footer.png` and never
|
|
354
|
+
finds this file, which is hashed into the manifest for nothing
|
|
355
|
+
- labels that are half localization keys and half literal text localize the keys
|
|
356
|
+
and leave the rest in one language
|
|
357
|
+
|
|
358
|
+
Run against a real signed production boarding pass, the validator reported zero
|
|
359
|
+
errors and found both of the last two.
|
|
360
|
+
|
|
284
361
|
### Use Cases
|
|
285
362
|
|
|
286
363
|
- **Visual bug hunting** - Screenshot every screen, AI analyzes for layout issues
|
|
@@ -293,6 +370,13 @@ Mock-mode vs Figma design audit. Generic and platform-agnostic - the heavy orche
|
|
|
293
370
|
- **App Store screenshots** - Clean status bar + automated navigation
|
|
294
371
|
- **Regression testing** - Tap through flows, verify behavior
|
|
295
372
|
|
|
373
|
+
### Performance
|
|
374
|
+
|
|
375
|
+
- **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.
|
|
376
|
+
- **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.
|
|
377
|
+
- **Batch a scripted sequence.** `agent_run_steps` runs tap, type, wait and screenshot steps in one round trip instead of one call per step.
|
|
378
|
+
- **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.
|
|
379
|
+
|
|
296
380
|
### How It Works
|
|
297
381
|
|
|
298
382
|
```mermaid
|
package/README.tr.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
🇬🇧 English: [README.md](./README.md)
|
|
9
9
|
|
|
10
|
-
iOS Simulator, Android Emulator ve headless web kontrolü için **
|
|
10
|
+
iOS Simulator, Android Emulator ve headless web kontrolü için **99 araç**. AI kodlama asistanının mobil uygulamalarını görmesini, onlarla etkileşime girmesini ve denetlemesini sağlayan bir MCP sunucusu - ayrıca tarayıcıları sürer, 18-kurallık bir App Store uyumluluk denetimi çalıştırır ve çok-adımlı batch akışlarını orkestre eder.
|
|
11
11
|
|
|
12
12
|
**Public npm registry** üzerinden dağıtılır - `npx @mmerterden/multi-agent-toolkit-mcp`, auth'suz, token'sız, `~/.npmrc` ayarı gerekmeden çözülür.
|
|
13
13
|
|
|
@@ -15,13 +15,16 @@ iOS Simulator, Android Emulator ve headless web kontrolü için **87 araç**. AI
|
|
|
15
15
|
|
|
16
16
|
Bu ayrımı net tutmakta fayda var. Bu satır bir zamanlar beş host'u "multi-agent-pipeline'ın tam-orkestrasyon hedefleri" olarak adlandırıyordu, bu da pipeline v10.7.0'da Cursor / Antigravity / Codex / Copilot Chat adaptörleri silindiğinde doğru olmaktan çıktı. Codex CLI, pipeline v13.0.0'da yetenek üzerinden birinci-sınıf bir hedef olarak geri döndü - artık skill'leri, paralel sub-agent'ları, hook'ları ve MCP'si var - ve doğrulanmış listede sadece bir kapı onu çalıştırdığı için yer alıyor, başka bir yerde desteklendiği için değil. Kimsenin çalıştırmadığı host'ları iddia etmek de bedavaya gelmiyor: 2.20.0 ve 2.21.0, ilk araçta yasa dışı bir `outputSchema` gönderdi, bu yüzden Claude Code tüm `tools/list`'i reddetti ve 78'in sıfırını sundu - birincil host'ta, iki release boyunca, bu repo'daki her kapı yeşilken.
|
|
17
17
|
|
|
18
|
-
**
|
|
18
|
+
**10 kategori:**
|
|
19
19
|
- **Device Control** (59 araç) - screenshot, tap, swipe, type, navigate, dark mode, locale, orientation, location, permissions, push notifications, gerçek start/stop ekran kaydı
|
|
20
|
+
- **Memory** (2 araç) - `ios_leaks`, bir simülatör ya da host süreci üzerinde /usr/bin/leaks çalıştırır; anlık görüntü alır ya da kayıtlı bir memory graph ile karşılaştırır. `android_meminfo`, dumpsys meminfo okur, aynı şekilde anlık görüntü ya da fark. İkisi de bakamadıklarında temiz bir sonuç değil `measurable:false` döner
|
|
20
21
|
- **Crash Diagnostics** (2 araç) - `ios_list_crashes` host'un DiagnosticReports dizinini okur, `android_list_crashes` adb crash buffer'ını döker, ikisi de tail-sınırlı
|
|
21
|
-
- **Accessibility Audit** (
|
|
22
|
+
- **Accessibility Audit** (3 araç) - `ios_accessibility_audit` / `android_accessibility_audit` canlı ağacı okur: eksik label, ekran okuyucunun adlandıramadığı kontrol, küçük tap target, eksik identifier ve görsel düzeni izlemeyen okuma sırası. `ios_accessibility_audit_deep` ise ağacın gösteremeyeceği şeyler için Apple'ın kendi XCUIAccessibilityAudit'ini XCUITest'iniz üzerinden çalıştırır: kontrast, Dynamic Type, kırpılmış metin. Üçü de bakamadıklarında temiz bir sonuç değil, gerekçesiyle `measurable:false` döner
|
|
22
23
|
- **Store Compliance** (5 araç) - App Store / Play Store hazırlığı; **18-kurallık derin `ios_app_store_audit`**, Apple ITMS hata kodları + App Store Review Guidelines'a çapraz referans verir (privacy manifest, required-reason API, Info.plist, code signing, entitlements, gömülü SDK, IPv6, debug-tool sızıntısı, ...)
|
|
23
24
|
- **Web Automation** (8 araç) - Playwright-destekli: goto, click (CSS selector'lar), type, JS eval, selector bekleme, metin çıkarma, screenshot. Chromium / WebKit / Firefox motorları. **`playwright` peer dependency'si gerektirir.**
|
|
24
25
|
- **Design Audit** (6 araç) - mock-mode vs Figma uygunluğu: scenario envanteri, mock tespiti, mock launch, canlı UI geometrisi, piksel/geometri/tipografi karşılaştırması, ve coverage kapısıyla birlikte HTML/PDF rapor
|
|
26
|
+
- **Code Intelligence** (8 araç) - Swift ve Kotlin kaynağı hakkında derleyici seviyesinde cevaplar, her platformun zaten getirdiği dil sunucusu üzerinden: tanım, referanslar, hover, dosya ve proje geneli semboller, tam build olmadan tanılamalar, ve bu makinenin soruyu cevaplayıp cevaplayamayacağını söyleyen `code_index_status`. Çapraz dosya cevapları arka plan index'ine bağlı olduğu için, "kullanılmıyor" diye okunan boş bir liste yerine index'in oturup oturmadığını raporlar
|
|
27
|
+
- **Wallet Passes** (4 araç) - Apple Wallet pass'i üret, imzala, doğrula ve incele. Beş stilin hepsi, çevrimdışı ve deterministik; düz metin parola bilerek kabul edilen bir girdi değil: çağıran taraf bir ortam değişkeninin adını ya da bir keychain kaydını verir. Doğrulayıcı bulguları sonucuna göre derecelendirir, çünkü asıl önemli hatalar sessiz olanlar - tanınmayan tek bir `PKPassengerCapability` değeri hiçbir uyarı üretmez ve gelişmiş pass'i sessizce eski düzene düşürür
|
|
25
28
|
- **Autonomous Agent DSL** (2 araç) - `agent_run_steps`, tek bir MCP round trip'inde {tool, args, continue_on_error?, wait_ms?} adımlarından oluşan bir batch dizisini çalıştırır. Scriptlenmiş login akışları, form doldurma, çok-adımlı QA yolları için ideal. `agent_query_output`, satır içi dönemeyecek kadar büyük olan önceki bir çağrının tam çıktısını arar; böylece bir takip sorusu pahalı aracı yeniden koşturmak anlamına gelmez.
|
|
26
29
|
|
|
27
30
|
## Hızlı Başlangıç
|
|
@@ -292,6 +295,13 @@ Mock-mode vs Figma tasarım denetimi. Jenerik ve platform-bağımsız - ağır o
|
|
|
292
295
|
- **App Store screenshot'ları** - Temiz status bar + otomatik navigasyon
|
|
293
296
|
- **Regresyon testi** - Akışlarda tap'le gez, davranışı doğrula
|
|
294
297
|
|
|
298
|
+
### Performans
|
|
299
|
+
|
|
300
|
+
- **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.
|
|
301
|
+
- **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.
|
|
302
|
+
- **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.
|
|
303
|
+
- **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.
|
|
304
|
+
|
|
295
305
|
### Nasıl Çalışır
|
|
296
306
|
|
|
297
307
|
```mermaid
|