@aarwitz/tapp 0.17.0-rc.11 → 0.17.0-rc.13

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.
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "tapp",
3
+ "description": "The official Tapp plugin: one agent skill and MCP tools for testing iOS, Android, and web apps on real surfaces.",
4
+ "owner": {
5
+ "name": "Aaron Horowitz",
6
+ "url": "https://github.com/aarwitz"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "tapp",
11
+ "source": {
12
+ "source": "npm",
13
+ "package": "@aarwitz/tapp"
14
+ },
15
+ "description": "Test real iOS, Android, and web apps with Tapp. Includes the Tapp agent skill plus MCP hands, eyes, exploration, replayable Flows, and deterministic release evidence.",
16
+ "author": {
17
+ "name": "Aaron Horowitz",
18
+ "url": "https://github.com/aarwitz"
19
+ },
20
+ "homepage": "https://github.com/aarwitz/tapp",
21
+ "license": "MIT",
22
+ "keywords": [
23
+ "ios",
24
+ "simulator",
25
+ "testing",
26
+ "qa",
27
+ "xcuitest",
28
+ "mcp",
29
+ "agent-skill",
30
+ "copilot"
31
+ ]
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "tapp",
3
+ "description": "Test real iOS, Android, and web apps with Tapp. Includes the Tapp agent skill plus MCP hands, eyes, exploration, replayable Flows, and deterministic release evidence.",
4
+ "version": "0.17.0-rc.13",
5
+ "author": {
6
+ "name": "Aaron Horowitz",
7
+ "url": "https://github.com/aarwitz"
8
+ },
9
+ "homepage": "https://github.com/aarwitz/tapp",
10
+ "repository": "https://github.com/aarwitz/tapp",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "ios",
14
+ "simulator",
15
+ "testing",
16
+ "qa",
17
+ "xcuitest",
18
+ "mcp",
19
+ "agent-skill",
20
+ "copilot"
21
+ ],
22
+ "mcpServers": {
23
+ "tapp": {
24
+ "command": "npx",
25
+ "args": [
26
+ "-y",
27
+ "@aarwitz/tapp@0.17.0-rc.13",
28
+ "mcp"
29
+ ],
30
+ "cwd": "${CLAUDE_PROJECT_DIR}"
31
+ }
32
+ }
33
+ }
package/AGENTS.md CHANGED
@@ -11,14 +11,15 @@ the app already on the simulator); it also accepts a repo dir, a `path/to/App.ap
11
11
  bundle id, or (web) an http(s) URL. You never need to know a bundle id up front.
12
12
 
13
13
  ```bash
14
- npx -y @aarwitz/tapp explore [target] # autonomous exploration → findings + evidence (observation, not a gate; ≈ tapp_explore)
15
- npx -y @aarwitz/tapp open [target] # launch + screen summary + screenshot saved to a file (≈ tapp_open_app)
16
- npx -y @aarwitz/tapp tree [target] # accessibility tree, --json for every element (≈ tapp_ui_tree)
17
- npx -y @aarwitz/tapp shot # screenshot the booted sim file path (≈ tapp_screenshot)
18
- npx -y @aarwitz/tapp apps # what's installed on the simulator, with bundle ids
19
- npx -y @aarwitz/tapp build [dir] # build the app in an Xcode repo + install it (≈ tapp_build)
20
- npx -y @aarwitz/tapp explore app.apk --platform android --app-id com.acme.app
21
- npx -y @aarwitz/tapp flow run .tapp/flows/smoke.yml # committed, keyless E2E replay
14
+ npx -y @aarwitz/tapp@latest explore [target] # autonomous exploration → findings + evidence (observation, not a gate; ≈ tapp_explore)
15
+ npx -y @aarwitz/tapp@latest explore https://your-app.example --watch # web: visibly follow the same exploration
16
+ npx -y @aarwitz/tapp@latest open [target] # launch + screen summary + screenshot saved to a file (≈ tapp_open_app)
17
+ npx -y @aarwitz/tapp@latest tree [target] # accessibility tree, --json for every element (≈ tapp_ui_tree)
18
+ npx -y @aarwitz/tapp@latest shot # screenshot the booted sim file path (≈ tapp_screenshot)
19
+ npx -y @aarwitz/tapp@latest apps # what's installed on the simulator, with bundle ids
20
+ npx -y @aarwitz/tapp@latest build [dir] # build the app in an Xcode repo + install it (≈ tapp_build)
21
+ npx -y @aarwitz/tapp@latest explore app.apk --platform android --app-id com.acme.app
22
+ npx -y @aarwitz/tapp@latest flow run .tapp/flows/smoke.yml # committed, keyless E2E replay
22
23
  ```
23
24
 
24
25
  If repository onboarding detects multiple application targets, target detection is deterministic but
@@ -43,7 +44,9 @@ that IS the screen. If you cannot (Cursor, VS Code Copilot), connect the MCP ser
43
44
  instead: its tool results carry the screenshot inline. Screen *recordings* are for the
44
45
  human: on **iOS**, `tapp explore` records the full exploration and embeds it in the report.html
45
46
  evidence page (Android does not currently record video) — tell the user the report path so they can
46
- watch it.
47
+ watch it. On **web**, explicit `--watch` opens the isolated Playwright Chromium window and overlays
48
+ Tapp's current action and pointer; the overlay is omitted from evidence screenshots. It does not
49
+ drive the person's existing/default browser profile.
47
50
 
48
51
  The interactive session/record loop is MCP-only (it needs a long-lived process). Flow replay is
49
52
  also available in the CLI. The rest of this playbook assumes the `tapp_*` MCP tools are connected. With
package/README.md CHANGED
@@ -4,8 +4,10 @@
4
4
  [![npm](https://img.shields.io/npm/v/%40aarwitz%2Ftapp?color=cb3837&label=npm)](https://www.npmjs.com/package/@aarwitz/tapp)
5
5
  [![npm downloads](https://img.shields.io/npm/dw/%40aarwitz%2Ftapp?label=downloads)](https://www.npmjs.com/package/@aarwitz/tapp)
6
6
  [![license](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)
7
- [![Install in Cursor](https://img.shields.io/badge/Cursor-Install_MCP-000000)](cursor://anysphere.cursor-deeplink/mcp/install?name=tapp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBhYXJ3aXR6L3RhcHAiLCJtY3AiXX0=)
8
- [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_MCP-0098FF)](https://insiders.vscode.dev/redirect/mcp/install?name=tapp&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40aarwitz%2Ftapp%22%2C%22mcp%22%5D%7D)
7
+ [![Agent Skill](https://img.shields.io/badge/Agent_Skill-install-6b5cff)](https://skills.sh/aarwitz/tapp)
8
+ [![VS Code extension](https://img.shields.io/badge/VS_Code-extension-0098FF)](https://marketplace.visualstudio.com/items?itemName=lidi-solutions.tapp)
9
+ [![Install in Cursor](https://img.shields.io/badge/Cursor-Install_MCP-000000)](cursor://anysphere.cursor-deeplink/mcp/install?name=tapp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBhYXJ3aXR6L3RhcHBAbGF0ZXN0IiwibWNwIl19)
10
+ [![VS Code MCP](https://img.shields.io/badge/VS_Code-Install_MCP-0098FF)](https://insiders.vscode.dev/redirect/mcp/install?name=tapp&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40aarwitz%2Ftapp%40latest%22%2C%22mcp%22%5D%7D)
9
11
 
10
12
  **Tapp is the release-contract and evidence layer for teams shipping agent-authored applications.**
11
13
  It turns a repository and real product into an observed UI Map, a compact reviewed deterministic
@@ -31,6 +33,47 @@ Three platforms, one observe-and-gate engine:
31
33
  autonomous exploration, the deterministic detectors (uncaught exceptions, failed requests,
32
34
  dead buttons, broken links, placeholder `href="#"` links, error pages), and the same gate.
33
35
 
36
+ ## Give Tapp to your coding agent
37
+
38
+ After setup, the whole user prompt is:
39
+
40
+ > Use Tapp to test this app.
41
+
42
+ The official skill teaches the agent to choose the smallest useful operation, handle repositories
43
+ with multiple app targets, inspect visual evidence, and keep exploration observations separate from
44
+ release judgment.
45
+
46
+ **Claude Code — skill and MCP tools together:**
47
+
48
+ ```bash
49
+ claude plugin marketplace add aarwitz/tapp
50
+ claude plugin install tapp@tapp
51
+ ```
52
+
53
+ Restart Claude Code after installation, open the application repository, and use the short prompt
54
+ above. The plugin installs the `tapp` Agent Skill and launches the matching version of Tapp's stdio
55
+ MCP server through npm; no additional prompt block, MCP configuration, or bundle id is required.
56
+
57
+ **Claude, Codex, Cursor, Copilot, and other Agent Skills clients — skill only:**
58
+
59
+ ```bash
60
+ npx -y skills add aarwitz/tapp --skill tapp
61
+ ```
62
+
63
+ This installs the open Agent Skills version of the same instructions into the current project and
64
+ lets the agent fall back to the npm CLI when MCP is not connected. Add `-g` for a user-wide install,
65
+ or `--agent claude-code`, `--agent codex`, and similar selectors to constrain the clients.
66
+
67
+ **No agent integration:** run the npm package directly from an app repository:
68
+
69
+ ```bash
70
+ npx -y @aarwitz/tapp@latest init . --explore
71
+ ```
72
+
73
+ **VS Code:** install [Tapp from the Marketplace](https://marketplace.visualstudio.com/items?itemName=lidi-solutions.tapp).
74
+ It contributes the same cross-platform Agent Skill to Copilot plus focused iOS simulator tools and a
75
+ live simulator panel. Android and web remain available through the skill's CLI/MCP workflow.
76
+
34
77
  ```
35
78
  you: "Add a logout button to the settings screen"
36
79
  agent: *writes the Swift*
@@ -38,7 +81,7 @@ agent: *tapp: builds, opens the app, navigates to Settings, screenshots it*
38
81
  agent: "Done — and here it is working on the simulator: [screenshot]"
39
82
  ```
40
83
 
41
- ## Quickstart for coding agents
84
+ ## npm CLI quickstart
42
85
 
43
86
  Requirements: **Node ≥ 18**. iOS needs **macOS + Xcode**; Android needs `adb` plus a connected
44
87
  emulator/device; web needs Playwright + Chromium.
@@ -46,8 +89,8 @@ emulator/device; web needs Playwright + Chromium.
46
89
  From the app repository, let the agent see the current screen and then explore it:
47
90
 
48
91
  ```bash
49
- npx -y @aarwitz/tapp open # builds/launches as needed; prints a screenshot path + screen summary
50
- npx -y @aarwitz/tapp explore # explores the real app; prints findings + evidence (an observation, not a gate)
92
+ npx -y @aarwitz/tapp@latest open # builds/launches as needed; prints a screenshot path + screen summary
93
+ npx -y @aarwitz/tapp@latest explore # explores the real app; prints findings + evidence (an observation, not a gate)
51
94
  ```
52
95
 
53
96
  Claude Code can read the saved image with its file-reading tool; Codex can open it with
@@ -62,22 +105,22 @@ To bootstrap maintained release infrastructure, preview the repository model and
62
105
  before Tapp writes anything:
63
106
 
64
107
  ```bash
65
- npx -y @aarwitz/tapp init . --dry-run --json-out /tmp/tapp-init.json
108
+ npx -y @aarwitz/tapp@latest init . --dry-run --json-out /tmp/tapp-init.json
66
109
  # Build/start the detected web target, ground the first UI Map, then stop it.
67
- npx -y @aarwitz/tapp init . --explore --platform web
110
+ npx -y @aarwitz/tapp@latest init . --explore --platform web
68
111
  # Or build/install the detected Xcode target, ground the map, and persist the validated scheme.
69
- npx -y @aarwitz/tapp init . --explore --platform ios --target .
112
+ npx -y @aarwitz/tapp@latest init . --explore --platform ios --target .
70
113
  # Or connect to an already-running owned URL:
71
- npx -y @aarwitz/tapp init . --explore --platform web --url http://127.0.0.1:4173
114
+ npx -y @aarwitz/tapp@latest init . --explore --platform web --url http://127.0.0.1:4173
72
115
  # If the app has roles/accounts, bind names once; values stay in local/CI secrets.
73
- npx -y @aarwitz/tapp actor set alice . --role member --session isolated \
116
+ npx -y @aarwitz/tapp@latest actor set alice . --role member --session isolated \
74
117
  --credential email=ALICE_EMAIL --credential password=ALICE_PASSWORD
75
118
  # Review-only path: tapp init . → tapp plan show → tapp plan review --approve ...
76
119
 
77
120
  # After approved drafts replay and are promoted, establish the selected target's baseline
78
121
  # through the ordinary full gate, then generate the reviewable GitHub workflow.
79
- npx -y @aarwitz/tapp baseline create . --platform web
80
- npx -y @aarwitz/tapp ci install .
122
+ npx -y @aarwitz/tapp@latest baseline create . --platform web
123
+ npx -y @aarwitz/tapp@latest ci install .
81
124
  ```
82
125
 
83
126
  In a repository containing multiple apps (for example, iOS plus web),
@@ -101,40 +144,42 @@ Every verb takes whatever you have: nothing (auto-detects the repo you're in, or
101
144
  already on the simulator), a repo directory, a `path/to/App.app`, or a bundle id:
102
145
 
103
146
  ```bash
104
- npx -y @aarwitz/tapp open [target] # launch the app → screen summary + screenshot file
105
- npx -y @aarwitz/tapp tree [target] # accessibility tree of the current screen
106
- npx -y @aarwitz/tapp shot # screenshot the booted simulator
107
- npx -y @aarwitz/tapp apps # what's installed on the simulator (names + bundle ids)
108
- npx -y @aarwitz/tapp build [dir] # just build + install (scheme auto-detected)
147
+ npx -y @aarwitz/tapp@latest open [target] # launch the app → screen summary + screenshot file
148
+ npx -y @aarwitz/tapp@latest tree [target] # accessibility tree of the current screen
149
+ npx -y @aarwitz/tapp@latest shot # screenshot the booted simulator
150
+ npx -y @aarwitz/tapp@latest apps # what's installed on the simulator (names + bundle ids)
151
+ npx -y @aarwitz/tapp@latest build [dir] # just build + install (scheme auto-detected)
109
152
  ```
110
153
 
111
- Web (beta): `npx -y @aarwitz/tapp explore http://localhost:3000` *(one-time setup:
112
- `npm i -g playwright && npx playwright install chromium`)*
154
+ Web (beta): `npx -y @aarwitz/tapp@latest explore http://localhost:3000` *(one-time setup:
155
+ `npm i -g playwright && npx playwright install chromium`)*. Add `--watch` to open Tapp's controlled,
156
+ isolated Chromium window and follow its clicks with an on-page pointer/action label. Tapp hides that
157
+ watch UI from saved evidence screenshots and does not automate your personal/default browser profile.
113
158
 
114
159
  Focused web inspection waits briefly for loading states to settle. If a consent or location modal
115
160
  blocks the screen, dismiss it and wait for the content you care about in the same package-only call:
116
161
 
117
162
  ```bash
118
- npx -y @aarwitz/tapp open https://example.com --tap "Not now" --wait-for "Dashboard"
119
- npx -y @aarwitz/tapp tree https://example.com --tap "Not now" --wait-for "Dashboard" --json
163
+ npx -y @aarwitz/tapp@latest open https://example.com --tap "Not now" --wait-for "Dashboard"
164
+ npx -y @aarwitz/tapp@latest tree https://example.com --tap "Not now" --wait-for "Dashboard" --json
120
165
  ```
121
166
 
122
167
  Android:
123
168
 
124
169
  ```bash
125
- npx -y @aarwitz/tapp explore path/to/app-debug.apk --platform android --app-id com.acme.app
126
- npx -y @aarwitz/tapp open com.acme.app --platform android
170
+ npx -y @aarwitz/tapp@latest explore path/to/app-debug.apk --platform android --app-id com.acme.app
171
+ npx -y @aarwitz/tapp@latest open com.acme.app --platform android
127
172
  ```
128
173
 
129
174
  Optional but recommended (prebuilds the test harness so the first run is fast):
130
175
  ```bash
131
- npx -y @aarwitz/tapp install # ~2 min, one time
132
- npx -y @aarwitz/tapp doctor # verify Xcode / simulators / toolchain
176
+ npx -y @aarwitz/tapp@latest install # ~2 min, one time
177
+ npx -y @aarwitz/tapp@latest doctor # verify Xcode / simulators / toolchain
133
178
  ```
134
179
 
135
180
  ### Optional browser workspace
136
181
 
137
- `npx -y @aarwitz/tapp app .` opens a local Release Studio for people who want visual repository
182
+ `npx -y @aarwitz/tapp@latest app .` opens a local Release Studio for people who want visual repository
138
183
  onboarding, release-plan review, and CI preparation. It is not required for the coding-agent
139
184
  `open`/`explore` workflow.
140
185
 
@@ -146,14 +191,14 @@ context** (the model literally sees the screen) and the **interactive session lo
146
191
 
147
192
  **Claude Code:**
148
193
  ```bash
149
- claude mcp add tapp -- npx -y @aarwitz/tapp mcp
194
+ claude mcp add tapp -- npx -y @aarwitz/tapp@latest mcp
150
195
  ```
151
196
 
152
197
  **Cursor / VS Code (Copilot)** — add to `~/.cursor/mcp.json` (Cursor) or `.vscode/mcp.json` (VS Code):
153
198
  ```json
154
199
  {
155
200
  "servers": {
156
- "tapp": { "type": "stdio", "command": "npx", "args": ["-y", "@aarwitz/tapp", "mcp"] }
201
+ "tapp": { "type": "stdio", "command": "npx", "args": ["-y", "@aarwitz/tapp@latest", "mcp"] }
157
202
  }
158
203
  }
159
204
  ```
@@ -162,10 +207,10 @@ claude mcp add tapp -- npx -y @aarwitz/tapp mcp
162
207
  ```toml
163
208
  [mcp_servers.tapp]
164
209
  command = "npx"
165
- args = ["-y", "@aarwitz/tapp", "mcp"]
210
+ args = ["-y", "@aarwitz/tapp@latest", "mcp"]
166
211
  ```
167
212
 
168
- **Any other MCP client:** stdio command `npx -y @aarwitz/tapp mcp`.
213
+ **Any other MCP client:** stdio command `npx -y @aarwitz/tapp@latest mcp`.
169
214
 
170
215
  Then ask your agent:
171
216
  > "Explore my app and show me what breaks."
@@ -194,7 +239,9 @@ Then ask your agent:
194
239
  | 📱 | `tapp_list_simulators` / `boot_simulator` / `install_app` | Simulator + app management. |
195
240
  | 🩺 | `tapp_health`, `tapp_capture*`, `tapp_parse_markers` | Diagnostics and capture history. |
196
241
 
197
- Full agent playbook: [AGENTS.md](./AGENTS.md) ships inside the package so agents can read it too.
242
+ Canonical installable skill: [`skills/tapp/SKILL.md`](skills/tapp/SKILL.md). Full low-level tool
243
+ reference: [AGENTS.md](./AGENTS.md). Both ship inside the npm package; installing the Claude plugin
244
+ or Agent Skill is what makes the workflow discoverable without pasting instructions.
198
245
  Application-model and import contract: [`docs/application-model.md`](docs/application-model.md).
199
246
  The desktop Coverage view reads the same `.tapp/application-model.json`,
200
247
  `.tapp/release-plan.json`, and `.tapp/ui-map.json`, including explicit proposal review; it
@@ -306,7 +353,7 @@ accepts that `.app`, detects its bundle id, writes report artifacts, and exits n
306
353
  gate fails:
307
354
 
308
355
  ```bash
309
- npx -y @aarwitz/tapp ci --app path/to/MyApp.app \
356
+ npx -y @aarwitz/tapp@latest ci --app path/to/MyApp.app \
310
357
  --project-dir . --pr-base origin/main --pr-head HEAD \
311
358
  --target-key target_ios_myapp \
312
359
  --pr-plan-out tapp-pr-plan.json \
@@ -354,9 +401,9 @@ your agent proves its UI work instead of claiming it:
354
401
  ```markdown
355
402
  ## Verifying UI changes
356
403
  This repo uses tapp (https://github.com/aarwitz/tapp) to verify UI work on a real app surface
357
- (iOS simulator, Android emulator/device, or a browser for web). After any UI change, run `npx -y @aarwitz/tapp open` from the
404
+ (iOS simulator, Android emulator/device, or a browser for web). After any UI change, run `npx -y @aarwitz/tapp@latest open` from the
358
405
  repo root (it finds and builds the Xcode project itself) and look at the screenshot it saves as
359
- proof. Before declaring a feature done, run `npx -y @aarwitz/tapp explore` (or `explore <url>` for web)
406
+ proof. Before declaring a feature done, run `npx -y @aarwitz/tapp@latest explore` (or `explore <url>` for web)
360
407
  and report the findings + evidence. A change is not "done" until it has been seen working.
361
408
  (If the tapp MCP server is connected, the tapp_* tools do the same with inline screenshots —
362
409
  tapp_build builds + installs the app and returns the bundle id for tapp_explore.)
package/bin/tapp.js CHANGED
@@ -240,8 +240,8 @@ async function resolveTargetOrExit(engine, input) {
240
240
 
241
241
  function safeCommandUsage(verb) {
242
242
  const usage = {
243
- explore: "tapp explore [target] [--platform ios|android|web] [--actions N] [--timeout SEC] [--email VALUE] [--password VALUE] [--baseline FILE] [--json FILE]\n iOS launch configuration: [--launch-arg VALUE ...] [--launch-env '{\"KEY\":\"VALUE\"}']\n Android: [--app-id ID] [--apk FILE] [--serial ID] [--keep-data]",
244
- init: "tapp init [repo] [--explore] [--refresh] [--platform PLATFORM] [--target NAME] [--url URL] [--dry-run]",
243
+ explore: "tapp explore [target] [--platform ios|android|web] [--actions N] [--timeout SEC] [--email VALUE] [--password VALUE] [--baseline FILE] [--json FILE]\n Web: [--watch] opens Tapp's controlled browser and shows its actions\n iOS launch configuration: [--launch-arg VALUE ...] [--launch-env '{\"KEY\":\"VALUE\"}']\n Android: [--app-id ID] [--apk FILE] [--serial ID] [--keep-data]",
244
+ init: "tapp init [repo] [--explore] [--refresh] [--platform PLATFORM] [--target NAME] [--url URL] [--watch] [--dry-run]",
245
245
  open: "tapp open [target] [--platform ios|android|web] [--out FILE] [--tap TEXT] [--wait-for TEXT]",
246
246
  tree: "tapp tree [target] [--platform ios|android|web] [--json] [--tap TEXT] [--wait-for TEXT]",
247
247
  shot: "tapp shot [--out FILE]",
@@ -346,6 +346,7 @@ switch (command) {
346
346
  timeout,
347
347
  testEmail: typeof flags.email === "string" ? flags.email : undefined,
348
348
  testPassword: typeof flags.password === "string" ? flags.password : undefined,
349
+ watch: flags.watch === true,
349
350
  runExploration: engine?.runInitExploration,
350
351
  onProgress: (progress) => {
351
352
  const activePlatform = progress.platform || platform;
@@ -557,6 +558,7 @@ switch (command) {
557
558
  testPassword: flags.password,
558
559
  ...launchOptions,
559
560
  baselineFindings,
561
+ watch: flags.watch === true,
560
562
  surface: "cli",
561
563
  onProgress,
562
564
  onStatus: (t) => console.error(`ℹ️ ${t}`),
@@ -577,6 +579,10 @@ switch (command) {
577
579
  process.exit(2);
578
580
  }
579
581
  if (platform === "ios") requireMacFor("iOS testing");
582
+ if (flags.watch === true && platform !== "web") {
583
+ console.error("❌ --watch is currently available for web exploration only");
584
+ process.exit(2);
585
+ }
580
586
  if (platform !== "ios" && Object.keys(launchOptions).length) {
581
587
  console.error("❌ --launch-arg and --launch-env apply only to iOS targets");
582
588
  process.exit(2);
@@ -598,6 +604,7 @@ switch (command) {
598
604
  testEmail: flags.email,
599
605
  testPassword: flags.password,
600
606
  baselineFindings,
607
+ watch: flags.watch === true,
601
608
  surface: "cli",
602
609
  onProgress,
603
610
  })
@@ -1249,7 +1256,7 @@ switch (command) {
1249
1256
 
1250
1257
  console.log(`\n Home: ${tappHome}`);
1251
1258
  console.log(healthy
1252
- ? "\nReady. Start with:\n npx -y @aarwitz/tapp open [target]\n npx -y @aarwitz/tapp explore [target]"
1259
+ ? "\nReady. Start with:\n npx -y @aarwitz/tapp@latest open [target]\n npx -y @aarwitz/tapp@latest explore [target]"
1253
1260
  : "\nFix the ❌ items above, then re-run: tapp doctor");
1254
1261
  process.exit(healthy ? 0 : 1);
1255
1262
  }
@@ -1569,7 +1576,7 @@ switch (command) {
1569
1576
  Core — explore, prove, gate (agents and humans can just run these — no server, no setup):
1570
1577
  tapp explore [target] Autonomous exploration → findings + evidence (an observation, NOT a
1571
1578
  release decision — run 'tapp ci' to gate a merge)
1572
- (--platform ios|android|web · --app-id ID · --apk FILE · --actions N)
1579
+ (web: --watch · all: --platform ios|android|web · --actions N)
1573
1580
  tapp contract run FILE Replay a business-level release contract — the guarantees that must hold
1574
1581
  tapp ci ... Merge-blocking release gate — explore + suites + baseline → pass/fail/inconclusive
1575
1582
  (see: tapp ci --help)
@@ -1629,10 +1636,15 @@ Setup:
1629
1636
  tapp doctor Check Xcode / simulators / toolchain
1630
1637
  tapp mcp Start the MCP server on stdio (adds inline screenshots + interactive sessions)
1631
1638
 
1639
+ Agent Skill (optional — so a short “Use Tapp to test this app” prompt is enough):
1640
+ Any supported agent: npx -y skills add aarwitz/tapp --skill tapp
1641
+ Claude skill + MCP: claude plugin marketplace add aarwitz/tapp
1642
+ claude plugin install tapp@tapp
1643
+
1632
1644
  MCP hookup (optional — for inline screenshots and the tap/type/inspect session loop):
1633
- Claude Code: claude mcp add tapp -- npx -y @aarwitz/tapp mcp
1645
+ Claude Code: claude mcp add tapp -- npx -y @aarwitz/tapp@latest mcp
1634
1646
  Cursor/VS Code (mcp.json):
1635
- { "servers": { "tapp": { "type": "stdio", "command": "npx", "args": ["-y", "@aarwitz/tapp", "mcp"] } } }
1647
+ { "servers": { "tapp": { "type": "stdio", "command": "npx", "args": ["-y", "@aarwitz/tapp@latest", "mcp"] } } }
1636
1648
 
1637
1649
  Then ask your agent things like:
1638
1650
  "Explore com.mycompany.app and show me what breaks"
@@ -12,7 +12,7 @@ in [`PRODUCT-ENGINE.md`](PRODUCT-ENGINE.md).
12
12
  ## Start locally
13
13
 
14
14
  ```bash
15
- npx -y @aarwitz/tapp app
15
+ npx -y @aarwitz/tapp@latest app
16
16
  ```
17
17
 
18
18
  Tapp prints an authenticated one-time launch URL and opens it in the default browser. Use