Metadata-Version: 2.4
Name: simdrive
Version: 1.0.0b8
Summary: SimDrive — reproduce and validate iOS bugs in 60 seconds with Claude. MCP-native iOS automation; 32 vision-first tools; record once, replay free in CI. 14-day trial, then $29/mo Pro.
Author-email: SyncTek LLC <info@synctek.io>
License-Expression: Elastic-2.0
Project-URL: Homepage, https://simdrive.dev
Project-URL: Documentation, https://simdrive.dev
Project-URL: Repository, https://github.com/SyncTek-LLC/simdrive
Project-URL: Source, https://github.com/SyncTek-LLC/simdrive
Project-URL: Issues, https://github.com/SyncTek-LLC/simdrive/issues
Project-URL: Logo, https://simdrive.dev/brand/og-image.png
Keywords: ios,simulator,mcp,claude,testing,qa,agent,anthropic,automation,xcuitest,appium-alternative,ai-testing,sampling,xcode
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Operating System :: MacOS
Classifier: Topic :: Software Development :: Testing
Classifier: Topic :: Software Development :: Quality Assurance
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: NOTICE
Requires-Dist: Pillow>=10.0
Requires-Dist: boto3>=1.20
Requires-Dist: email-validator>=2.0
Requires-Dist: httpx<1.0
Requires-Dist: mcp>=1.0
Requires-Dist: prometheus-client>=0.19
Requires-Dist: pyobjc-framework-Quartz>=10.0
Requires-Dist: pyobjc-framework-Vision>=10.0
Requires-Dist: pydantic>=2.0
Requires-Dist: pynacl>=1.6.2
Requires-Dist: pyyaml>=6.0
Requires-Dist: requests>=2.28
Provides-Extra: ssim
Requires-Dist: scikit-image>=0.22; extra == "ssim"
Provides-Extra: claude
Requires-Dist: anthropic>=0.30; extra == "claude"
Provides-Extra: dev
Requires-Dist: anthropic>=0.30; extra == "dev"
Requires-Dist: fastapi>=0.115; extra == "dev"
Requires-Dist: hypothesis>=6; extra == "dev"
Requires-Dist: httpx>=0.24; extra == "dev"
Requires-Dist: moto[s3]>=5.0; extra == "dev"
Requires-Dist: mypy>=1.0; extra == "dev"
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
Requires-Dist: pytest-benchmark>=4.0; extra == "dev"
Requires-Dist: pytest-cov>=4; extra == "dev"
Requires-Dist: ruff>=0.1.0; extra == "dev"
Requires-Dist: sqlalchemy>=2.0; extra == "dev"
Provides-Extra: cloud
Requires-Dist: boto3>=1.20; extra == "cloud"
Requires-Dist: fastapi>=0.100; extra == "cloud"
Requires-Dist: uvicorn>=0.20; extra == "cloud"
Requires-Dist: sqlalchemy>=2.0; extra == "cloud"
Requires-Dist: pynacl>=1.6.2; extra == "cloud"
Requires-Dist: email-validator>=2.0; extra == "cloud"
Dynamic: license-file

<!-- mcp-name: io.github.SyncTek-LLC/simdrive -->

<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="https://github.com/SyncTek-LLC/simdrive/raw/main/docs/brand/wordmark-dark.svg">
    <img alt="simdrive" src="https://github.com/SyncTek-LLC/simdrive/raw/main/docs/brand/wordmark.svg" width="320">
  </picture>
</p>

<p align="center"><strong>Reproduce and validate iOS bugs in 60 seconds with Claude.</strong></p>


SimDrive is the MCP-native iOS automation toolkit your AI agent already knows
how to drive. Hand it a Linear ticket, watch it walk the steps in the
simulator (or a paired real device), and get back a deterministic recording
that replays free in CI forever.

## 60-second bug repro

```text
You (in Cursor / Claude Code):
  "Use simdrive to reproduce Linear ENG-1247 — sign-in fails on iPhone 17 /
   iOS 26.3 with test@example.com."

Claude:
  → session_start({device: "iPhone 17", os_version: "26.3", bundle_id: "com.acme.app"})
  → observe()                              # screenshot + annotated marks
  → tap({text: "Email"})
  → type_text({text: "test@example.com"})
  → tap({text: "Password"})
  → type_text({text: "pw123"})
  → tap({text: "Sign In"})
  → observe()                              # captures error toast
  → record_stop({name: "ENG-1247-repro"})  # YAML+PNG attached to PR
```

After you ship the fix, the same recording replays free in CI — no AI cost
on every run.

## What you get

- **Bug reproduction + validation (hero)** — agent reads the ticket, drives
  the simulator, captures the failure, saves a deterministic recording.
- **Record → replay** — recordings are YAML + PNG bundles that re-run
  identically on every CI build. Zero AI cost on replay.
- **Autonomous test suites** — `run_journey` reads a YAML journey with goals
  and success criteria; SimDrive drives the agent loop and reports
  pass/fail with evidence.
- **Real iOS device support** — WebDriverAgent-backed; one-command
  `simdrive bootstrap-device <udid>` bring-up.
- **Visual regression detection** — SSIM-based pre/post comparison with
  configurable drift handling.
- **Performance baselines + regression comparison** — capture CPU / RSS /
  thread baselines and diff future runs.

## Install + activate

```bash
pip install simdrive
simdrive trial start --email you@example.com
# 14 days full access, then:
simdrive auth <your-license-key>
```

The trial license is Ed25519-signed and machine-locked — it works offline,
in CI sandboxes, and on developer laptops without network. After 14 days,
paid licenses (`simdrive auth …`) unlock the full tool surface.

Requires: macOS, Xcode 15+, Python 3.10+.

## Wire SimDrive into your MCP client

Add to `.claude/mcp.json` (Claude Code), `claude_desktop_config.json` (Claude
Desktop), or your Cursor MCP config:

```json
{
  "mcpServers": {
    "simdrive": { "command": "simdrive" }
  }
}
```

Restart the client. Your agent now has 32 SimDrive tools available.

## Pricing

| Plan | Price | What you get |
|------|-------|--------------|
| **Trial** | Free, 14 days | All Pro features, machine-locked |
| **Pro** | $29 / mo | One seat, all tools, unlimited CI replays |
| **Team** | $99 / seat / mo | Multi-seat, shared recording cloud |
| **Enterprise** | Contact | Self-hosted licensing, SLA, integrations |

Pricing + ROI calculator: <https://simdrive.dev/pricing>

## Minimum-viable session

```python
session_start(bundle_id="com.example.app")
observe()                                  # see initial screen
tap(label="Sign In")                       # tap a labelled control
observe()                                  # verify state
record_stop(session_id="...", name="signin-smoke")   # save replay
session_end(session_id="...")              # clean up
```

## Maestro-compatible YAML

Migrating from Maestro? SimDrive parses the shorthand natively:

```yaml
replay:
  bundle_id: com.example.app
  steps:
    - tapOn: "Sign In"
    - inputText: "user@example.com"
    - assertVisible: "Dashboard"
    - assertNotVisible: "Loading"
    - waitFor: "Feed"
```

## Tool surface (32 MCP tools)

| Group | Tools |
|-------|-------|
| Lifecycle (3) | `session_start`, `session_end`, `session_status` |
| Observe (1) | `observe` |
| Act (5) | `tap`, `swipe`, `type_text`, `press_key`, `clear_field` |
| Record/Replay (5) | `record_start`, `record_stop`, `replay`, `list_replays`, `validate_replay` |
| Logs (1) | `logs` |
| Performance (4) | `perf`, `perf_baseline`, `perf_compare`, `memory` |
| Diagnostics (5) | `doctor`, `app_state`, `apps`, `crashes`, `list_devices` |
| Robustness (4) | `dismiss_first_launch_alerts`, `pre_grant_permissions`, `set_appearance`, `dismiss_sheet` |
| Recordings (2) | `lint_recordings`, `migrate_recording` |
| Journeys (1) | `load_journey` |
| Version (1) | `version` |

Canonical machine-readable list: `simdrive/src/simdrive/server.py::_TOOLS`.

## Real-device support

Drive a paired iPhone or iPad in addition to the simulator:

```bash
export SIMDRIVE_ALLOW_PHYSICAL_DEVICE=1
simdrive bootstrap-device <device-udid>
```

```python
session_start(bundle_id="com.example.app", udid="<device-udid>", target="device")
```

WDA bootstrap on iOS 26.x has some rough edges; the simulator
(`target="simulator"`, default) is the fully supported path.

## Known limitations

See `docs/LIMITATIONS.md` for: `type_text` first-character drop workaround,
SSIM-vs-structural-check semantics, SwiftUI half-sheet dismissal,
appearance-respring caveats, real-device input scope.

## Support

- **Docs:** <https://docs.simdrive.dev>
- **Bugs / feature requests:** [open an issue](https://github.com/SyncTek-LLC/simdrive/issues/new/choose)
- **Email (private — license, billing, account):** <support@simdrive.dev>
- **Security disclosures:** <security@simdrive.dev>

## License

Elastic License 2.0 — see `LICENSE`. Free for internal use; prohibits
offering SimDrive as a competing managed service.

Built by [SyncTek](https://synctek.io).
