fast-ios-device-test@2.2.2
CAUTION· install onlyPublisher claims: "Fast iOS UI-flow verification for AI coding agents: Simulator, physical-iPhone and CarPlay flows, video review, and PR evidence." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Install scripts ran; no agent task scenario for this bundle.- Tested
- install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; install scripts ran; no agent task scenario for this bundle) on 2026-11-14 and scored it 63/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Auto-update or dynamic fetch configuration; Auto-update or dynamic fetch configuration; Auto-update or dynamic fetch configuration. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenariosStatic findings
// npx fast-ios-device-test auto-update on|off|status manage the daily launchd updaterFix: Pin versions and sources; vendor anything fetched at install time.function autoUpdate(action) {Fix: Pin versions and sources; vendor anything fetched at install time.print(f"auto-update: on (daily; turn off: npx {PACKAGE} auto-update off)")Fix: Pin versions and sources; vendor anything fetched at install time.python3 "$SOURCE/scripts/fast_auto_update.py" off || trueFix: Pin versions and sources; vendor anything fetched at install time.<summary>Flow the agent writes</summary> ```json { "version": 1, "name": "device-home", "app": { "project_root": "/absolute/path/to/project", "bundle_id": "com.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.hint = f"run: npx {PACKAGE} update; auto-update: npx {PACKAGE} auto-update on"Fix: Pin versions and sources; vendor anything fetched at install time.default = Path.home() / "Library/Caches" / PACKAGE / "auto-update.json"Fix: Pin versions and sources; vendor anything fetched at install time.python3 "$HERE/scripts/fast_auto_update.py" on "$HERE"Fix: Pin versions and sources; vendor anything fetched at install time.signing, trust, Developer Mode, or profile fix. Do not guess a device when several are present.Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.const commandArgs = [path.join(managerRoot, "scripts", "fast_auto_update.py"), action];Fix: Pin versions and sources; vendor anything fetched at install time.<summary>Flow the agent writes</summary> ```json { "version": 1, "name": "settings-general-smoke", "app": { "project_root": "/absolute/path/to/project", "bundleFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.print("usage: fast_auto_update.py on [root] | off | status | --run", file=sys.stderr)Fix: Pin versions and sources; vendor anything fetched at install time.<summary>Flow the agent writes</summary> ```json { "version": 1, "name": "duo-displays", "app": { "project_root": "/absolute/path/to/project", "bundle_id": "comFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.echo "auto-update: unchanged (--link clone updates with git)"Fix: Pin versions and sources; vendor anything fetched at install time.<summary>Flow the agent writes</summary> ```json { "version": 1, "name": "carplay-home", "app": { "project_root": "/absolute/path/to/project", "bundle_id": "comFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.<summary><strong>Where does Simulator DerivedData go?</strong></summary> `fastSimulatorTest` shares one cache across all worktrees of a repository under `~/LibrFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.python3 "$SOURCE/scripts/fast_auto_update.py" status || trueFix: Pin versions and sources; vendor anything fetched at install time.console.error(`usage: npx ${PACKAGE} auto-update on|off|status`);Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(args, text=True, capture_output=True, env=env, **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(["security", "cms", "-D", "-i", str(path)], capture_output=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.`npx fast-ios-device-test auto-update on|off|status`; `--link` does not enable it automatically.Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run([str(path), "--version"], capture_output=True, text=True, timeout=10, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.console.log("gemini: the extension update failed (output above)");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// npx fast-ios-device-test auto-update on|off|status manage the daily launchd updaterFix: Pin versions and sources; vendor anything fetched at install time.recorder = subprocess.Popen(["screencapture", "-v", "-l", str(info["id"]), str(video)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.inside = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.// npx fast-ios-device-test update-axe|update-baguette update one pinned toolFix: Pin versions and sources; vendor anything fetched at install time.self.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.(derived_data / ".fastui-build.log").write_text(output)Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.chmod +x "$HERE/scripts/fast_ui.py" "$HERE/scripts/fast_ui_report.py" "$HERE/scripts/fast_ui_review.py" "$HERE/scripts/fast_device.py" "$HERE/scripts/fast_carplay.py" \Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.found = subprocess.run(["pgrep", "-f", "test-without-building.*(serve|run)-"], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.listed = json.loads(subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.// npx fast-ios-device-test update-tools pin and install latest AXe + baguette releasesFix: Pin versions and sources; vendor anything fetched at install time.behind = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.console.log("antigravity: the plugin update failed (output above)");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.else { console.log("codex: the plugin update failed (output above)"); failed = 1; }Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.print(f"auto-update: on (daily; turn off: npx {PACKAGE} auto-update off)")Fix: Pin versions and sources; vendor anything fetched at install time.A normal install also enables the daily launchd updater and prints `auto-update: on …`; itFix: Pin versions and sources; vendor anything fetched at install time.subprocess.Popen(["xcrun", "simctl", "keychain", udid, "reset"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.else { console.log("claude: the plugin update failed (output above)"); failed = 1; }Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.with tempfile.NamedTemporaryFile(suffix=".json") as output:Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.signing, trust, Developer Mode, or profile fix. Do not guess a device when several are present.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.return subprocess.run(command, input=input_text, text=True, capture_output=True,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.// npx fast-ios-device-test install, or upgrade (copied to ~/.local/share/fast-ios-device-test)Fix: Pin versions and sources; vendor anything fetched at install time.compiled = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.npx = shutil.which("npx")Fix: Pin versions and sources; vendor anything fetched at install time.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.echo "delete them first with: npx fast-ios-device-test clean [--project <root>] --maps --yes"Fix: Pin versions and sources; vendor anything fetched at install time.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# launchd starts with a bare PATH: keep the folder that holds this shell's npx (nvm, fnm,Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(args, input=data, capture_output=True, text=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.detail = f"major update available {current} -> {latest}; run npx {PACKAGE} update manually"Fix: Pin versions and sources; vendor anything fetched at install time.folders = ([str(Path(npx).parent)] if npx else []) + defaultsFix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.with tempfile.NamedTemporaryFile(suffix=".json") as output:Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.self.process = subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.// npx fast-ios-device-test update upgrade to the latest version, then each agent's pluginFix: Pin versions and sources; vendor anything fetched at install time.with tempfile.NamedTemporaryFile(suffix=".json") as output:Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.result = subprocess.run([command, *args], capture_output=True, text=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.done = subprocess.run(["git", "-C", str(root), *args], capture_output=True, text=True, timeout=10)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.Popen(call, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) for call in callsFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.with tempfile.NamedTemporaryFile(suffix=".json") as output:Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.self.assertIn("auto-update: unchanged (--link clone updates with git)", out)Fix: Pin versions and sources; vendor anything fetched at install time.hint = f"major update; run manually: npx {PACKAGE} update"Fix: Pin versions and sources; vendor anything fetched at install time.out = subprocess.run([sys.executable, str(REPO / "scripts" / "fast_update.py"), "--status", str(root)],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.f"run ./install.sh --link in {clone} or npx fast-ios-device-test",Fix: Pin versions and sources; vendor anything fetched at install time.described = subprocess.run([*info, str(kept)], capture_output=True, text=True, timeout=120)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."auto-update: npx fast-ios-device-test auto-update on)")Fix: Pin versions and sources; vendor anything fetched at install time.self.assertIn("auto-update: on (daily; turn off: npx fast-ios-device-test auto-update off)", out)Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(["bash", str(ROOT / "scripts/setup_repo_rules.sh")], cwd=raw,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.selected = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."auto-update: npx fast-ios-device-test auto-update on)")Fix: Pin versions and sources; vendor anything fetched at install time.made = subprocess.run([*make, str(clip), "1290", "2796", "24"], capture_output=True, text=True, timeout=600)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.`npx fast-ios-device-test auto-update status` and never change its setting unless the user asks.Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run([str(binary), "--version"], capture_output=True, text=True, timeout=15, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.FAST_IOS_AUTO_UPDATE_STATUS=str(self.home / "auto-update.json"),Fix: Pin versions and sources; vendor anything fetched at install time.subprocess.run(["git", "-C", str(root), "-c", "user.name=t", "-c", "[email protected]", *args],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = fast_ui.subprocess.run([str(shim), "lint", "--strict"], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.checks = subprocess.run([str(binary)], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.f"run ./install.sh --link in {clone} or npx {PACKAGE}"Fix: Pin versions and sources; vendor anything fetched at install time.build = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.assertIn("auto-update: on (daily; turn off: npx fast-ios-device-test auto-update off)", out)Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.runs = [subprocess.Popen([sys.executable, "-c", code], cwd=REPO / "scripts", env=env,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.ran = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.ran = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["git", "-C", raw, "remote", "add", "origin",Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.dead = subprocess.Popen(["true"])Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.Popen([sys.executable, str(Path(__file__).resolve()), "--refresh"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.ran = subprocess.run([sys.executable, str(REPO / "scripts" / script), "--help"],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.subprocess.run(["git", "init", "-q", raw], check=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""fast_update (version, once-a-day notice) and `npx fast-ios-device-test update` (npm/install.js).Fix: Pin versions and sources; vendor anything fetched at install time.result = subprocess.run(["bash", str(REPO / "install.sh"), *args], env=self.env,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.out = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.assertEqual(fast_auto_update.enable(self.root), 0)Fix: Pin versions and sources; vendor anything fetched at install time.run = subprocess.Popen([sys.executable, str(REPO / "scripts" / "fast_ui.py"), "--help"], env=env,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.are missing, use the bundled `fast-ios-device-test-setup` skill or run `npx fast-ios-device-test`Fix: Pin versions and sources; vendor anything fetched at install time.sleeper = subprocess.Popen(["sleep", "30"], start_new_session=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.self.assertNotIn("auto-update on", line or "")Fix: Pin versions and sources; vendor anything fetched at install time.line += f" (update: npx {PACKAGE} update)"Fix: Pin versions and sources; vendor anything fetched at install time.hint = f"run: npx {PACKAGE} update; auto-update: npx {PACKAGE} auto-update on"Fix: Pin versions and sources; vendor anything fetched at install time.installed = subprocess.run([str(self.home / "axe" / "axe"), "--version"], capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."(run: npx fast-ios-device-test update; "Fix: Pin versions and sources; vendor anything fetched at install time.self.assertIn("npx fast-ios-device-test update-axe", ran.stdout)Fix: Pin versions and sources; vendor anything fetched at install time.subprocess.run(["git", "-C", raw, "remote", "add", "upstream",Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.path = fast_auto_update.plist(self.root)["EnvironmentVariables"]["PATH"].split(":")Fix: Pin versions and sources; vendor anything fetched at install time.subprocess.run(["xattr", "-dr", "com.apple.quarantine", str(staged)], capture_output=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.ran = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.result = fast_ui.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.`npx fast-ios-device-test auto-update on|off|status`; `--link` does not enable it automatically.Fix: Pin versions and sources; vendor anything fetched at install time.- The device must be unlocked, in Developer Mode, trusting this Mac, withFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Management; chờ Xcode chuẩn bị/copy shared cache; dùng Xcode khớp iOS; đặt passcode nếu DeveloperFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.4. Run `npx fast-ios-device-test --check`. Setup is complete only when the last line isFix: Pin versions and sources; vendor anything fetched at install time.`devicectl`, cache ngắn theo UDID). Nếu máy chưa ghép đôi/tin cậy, mất kết nối, tắt Developer Mode,Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.lists pairing, connection, Developer Mode, the Xcode and signing profile it will use, and theFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.| Developer Mode off / developer disk image unavailable | Enable Settings › Privacy & Security › Developer Mode, restart, then open Xcode once with the unlocked phone connected. |Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.Management; chờ Xcode chuẩn bị/copy shared cache; dùng Xcode khớp iOS; đặt passcode nếu DeveloperFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.connection, Developer Mode, developer disk image, the Xcode and signing profile a run will use,Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.lists pairing, connection, Developer Mode, the Xcode and signing profile it will use, and theFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.- Developer Mode is enabled.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.- Device must be unlocked, in Developer Mode, trusting the Mac; enableFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.- Verify device pairing, Developer Mode and signing: `fastDeviceTest check [--device <name|udid>]`.Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.one `FAIL error=<problem>: <fix>` line when pairing, connection, Developer Mode, the developer diskFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.connection, Developer Mode, developer disk image, the Xcode and signing profile a run will use,Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.`npx fast-ios-device-test update-tools` when the user asks to update dependencies.Fix: Pin versions and sources; vendor anything fetched at install time.2. Run `npx fast-ios-device-test`. This installs or upgrades the engine inFix: Pin versions and sources; vendor anything fetched at install time.- Settings › Privacy & Security › Developer Mode on (the iPhone restarts).Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.- Developer Mode is enabled.Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.- The device must be unlocked, in Developer Mode, trusting this Mac, withFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.skill from the user's own Xcode only when requested with `npx fast-ios-device-test xcode-skills`Fix: Pin versions and sources; vendor anything fetched at install time.- Settings › Privacy & Security › Developer Mode on (the iPhone restarts).Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.- Device must be unlocked, in Developer Mode, trusting the Mac; enableFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.| Developer Mode off / developer disk image unavailable | Enable Settings › Privacy & Security › Developer Mode, restart, then open Xcode once with the unlocked phone connected. |Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.| Developer Mode requires a passcode | Set a device passcode, enable Developer Mode, then retry. |Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.- Verify device pairing, Developer Mode and signing: `fastDeviceTest check [--device <name|udid>]`.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.`devicectl`, cache ngắn theo UDID). Nếu máy chưa ghép đôi/tin cậy, mất kết nối, tắt Developer Mode,Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.requested with `npx fast-ios-device-test update-tools` (or a per-tool update command).Fix: Pin versions and sources; vendor anything fetched at install time.one `FAIL error=<problem>: <fix>` line when pairing, connection, Developer Mode, the developer diskFix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
No advisories in OSV for fast-ios-device-test@2.2.2 as of 6 h ago. This is the package itself, not its dependencies.
What would make this Verified
17 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim dungvc-dev: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- Hidden instructions≈ +6 on the totalRemove HTML comments, zero-width characters and white-on-white text that carry instructions. Everything the agent is meant to read should be visible to the person reading the file.
- Auto-update or dynamic fetch configuration≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- New publisher≈ +3 on the totalTime clears this on its own after 14 and 30 days. Claiming the handle (+50) is the fastest way past it.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.