@aarwitz/tapp 0.17.0-rc.9 → 0.17.1

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/README.md CHANGED
@@ -1,59 +1,110 @@
1
- # tapp — ship with proof
1
+ # Tapp
2
2
 
3
3
  [![CI](https://github.com/aarwitz/tapp/actions/workflows/ci.yml/badge.svg)](https://github.com/aarwitz/tapp/actions/workflows/ci.yml)
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)
9
-
10
- **Tapp is the release-contract and evidence layer for teams shipping agent-authored applications.**
11
- It turns a repository and real product into an observed UI Map, a compact reviewed deterministic
12
- suite, and an inspectable merge decision.
13
-
14
- Coding agents can write the code, and (with Playwright & friends) they can even drive the app.
15
- What nobody gives them is **proof it works**. tapp explores your app like a user — no test code,
16
- no app changes and surfaces what's broken, with evidence. Then a deterministic gate applies
17
- versioned policy to that evidence the findings and coverage, any selected deterministic suites
18
- (Flows/Scenarios/contracts), and, when available, a target-scoped baseline — and returns a merge
19
- decision your queue can trust: `pass`, `fail`, or `inconclusive`. Exploration **observes**; the gate
20
- **judges** — never a soft "ship-ready" guess.
21
-
22
- Three platforms, one observe-and-gate engine:
23
-
24
- - **iOS** the missing Playwright for iOS. tapp is hands *and* eyes: a generic XCUITest
25
- harness drives any app on the simulator via the accessibility surface. Native — no Appium,
26
- no WebDriverAgent.
27
- - **Android** — black-box native driving through ADB + UIAutomator. Install an APK, target its
28
- application id, and run the same exploration, committed Flows, evidence, and regression gate. The
29
- app does not link a Tapp SDK.
30
- - **Web (beta)** — built *on* Playwright. Your agent already has browser hands; tapp adds the
31
- autonomous exploration, the deterministic detectors (uncaught exceptions, failed requests,
32
- dead buttons, broken links, placeholder `href="#"` links, error pages), and the same gate.
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)
11
+
12
+ **Tapp lets coding agents verify UI changes on real iOS, Android, and web surfaces, then turns
13
+ reviewed proof into deterministic CI checks.** It can inspect and drive screens, explore for
14
+ technical failures, and save important journeys as replayable tests.
15
+
16
+ Exploration reports findings, coverage, evidence, and limits. Only the repository-connected gate
17
+ returns `pass`, `fail`, or `inconclusive`. Tapp does not turn an autonomous crawl into a subjective
18
+ "ship-ready" score.
19
+
20
+ Supported targets:
21
+
22
+ | Target app | Runtime |
23
+ |---|---|
24
+ | iOS | Simulator on macOS with Xcode; driven through XCUITest and accessibility |
25
+ | Android | Connected emulator or device with `adb`; driven through UIAutomator |
26
+ | Web (beta) | Owned browser app in Playwright Chromium |
27
+
28
+ Windows can host Android and web testing when their prerequisites are installed. Windows desktop
29
+ UI applications such as WinForms, WPF, and WinUI are not currently Tapp targets.
30
+
31
+ ## Give Tapp to your coding agent
32
+
33
+ After setup, the whole user prompt is:
34
+
35
+ > Use Tapp to test this app.
36
+
37
+ The official skill teaches the agent to choose the smallest useful operation, handle repositories
38
+ with multiple app targets, inspect visual evidence, and keep exploration observations separate from
39
+ gate decisions.
40
+
41
+ **Claude Code, Codex, Cursor, Copilot, and other Agent Skills clients (recommended):**
42
+
43
+ ```bash
44
+ npx -y skills add aarwitz/tapp --skill tapp
45
+ ```
46
+
47
+ This installs the open Agent Skills workflow into the current project and lets the agent run the npm
48
+ CLI directly. Inspecting, focused evidence, autonomous exploration, deterministic replay, and gating
49
+ need no MCP server, plugin, account, API key, global Tapp install, or pasted prompt block. Add `-g`
50
+ for a user-wide install, or `--agent claude-code`, `--agent codex`, and similar selectors to constrain
51
+ the clients. Start or restart the agent from the application repository and use the short prompt
52
+ above.
53
+
54
+ **Claude Code — optional enhanced skill and MCP tools:**
55
+
56
+ ```bash
57
+ claude plugin marketplace add aarwitz/tapp
58
+ claude plugin install tapp@tapp
59
+ ```
60
+
61
+ The plugin bundles the same `tapp` Agent Skill with the matching npm-backed MCP server. Add it when
62
+ you want inline screenshot results or when the agent must interactively tap, type, and record an
63
+ arbitrary multi-step journey in one persistent session. It is not required for the core
64
+ skill-to-CLI workflow.
65
+
66
+ **No agent integration:** run the npm package directly from an app repository in one line:
67
+
68
+ ```bash
69
+ npx -y @aarwitz/tapp@latest init . --explore
70
+ ```
71
+
72
+ **VS Code:** install [Tapp from the Marketplace](https://marketplace.visualstudio.com/items?itemName=lidi-solutions.tapp).
73
+ It contributes the same cross-platform Agent Skill to Copilot plus focused iOS simulator tools and
74
+ an auto-refreshing screenshot preview. The preview is not an embedded Simulator or video stream.
75
+ Android and web remain available through the skill's CLI/MCP workflow.
33
76
 
34
77
  ```
35
78
  you: "Add a logout button to the settings screen"
36
79
  agent: *writes the Swift*
37
- agent: *tapp: builds, opens the app, navigates to Settings, screenshots it*
80
+ agent: *tapp: finds Settings in source, follows its previously observed route, 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.
45
88
 
46
- From the app repository, let the agent see the current screen and then explore it:
89
+ From the app repository, ground Tapp once, then use the smallest operation for later checks:
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 init . --explore # first run: detect/build, explore, and ground .tapp/ui-map.json
93
+ npx -y @aarwitz/tapp@latest open # one current screen + screenshot
94
+ npx -y @aarwitz/tapp@latest focus "Save storefront settings visible above keyboard" # source + observed-route fast path
95
+ npx -y @aarwitz/tapp@latest explore # later broad exploration (observation, not a gate)
51
96
  ```
52
97
 
98
+ Source tells `focus` where the requested UI likely lives; only a route already observed in
99
+ `.tapp/ui-map.json` authorizes navigation. If a fresh repository has no such route yet, Tapp returns
100
+ the source evidence instead of guessing through the app.
101
+
53
102
  Claude Code can read the saved image with its file-reading tool; Codex can open it with
54
103
  `view_image`. The agent should report what the screenshot proves, relay the exploration findings
55
104
  as-is (an observation, not a merge decision — `tapp ci` gates that), and link the HTML evidence
56
- report. No server, account, config file, test code, API key, or bundle id is required for this loop.
105
+ report. No Tapp server, account, global install, API key, or bundle id is required for this loop.
106
+ The platform runtime still needs to be installed, and repository onboarding can write reviewed
107
+ configuration under `.tapp/`.
57
108
 
58
109
  The product, executable, and package leaf are all Tapp: npm distributes it as
59
110
  `@aarwitz/tapp`, while the installed command remains `tapp`.
@@ -62,24 +113,36 @@ To bootstrap maintained release infrastructure, preview the repository model and
62
113
  before Tapp writes anything:
63
114
 
64
115
  ```bash
65
- npx -y @aarwitz/tapp init . --dry-run --json-out /tmp/tapp-init.json
116
+ npx -y @aarwitz/tapp@latest init . --dry-run --json-out /tmp/tapp-init.json
66
117
  # Build/start the detected web target, ground the first UI Map, then stop it.
67
- npx -y @aarwitz/tapp init . --explore --platform web
118
+ npx -y @aarwitz/tapp@latest init . --explore --platform web
68
119
  # 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 .
120
+ npx -y @aarwitz/tapp@latest init . --explore --platform ios --target .
70
121
  # Or connect to an already-running owned URL:
71
- npx -y @aarwitz/tapp init . --explore --platform web --url http://127.0.0.1:4173
122
+ npx -y @aarwitz/tapp@latest init . --explore --platform web --url http://127.0.0.1:4173
72
123
  # 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 \
124
+ npx -y @aarwitz/tapp@latest actor set alice . --role member --session isolated \
74
125
  --credential email=ALICE_EMAIL --credential password=ALICE_PASSWORD
75
126
  # Review-only path: tapp init . → tapp plan show → tapp plan review --approve ...
76
127
 
77
128
  # After approved drafts replay and are promoted, establish the selected target's baseline
78
129
  # 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 .
130
+ npx -y @aarwitz/tapp@latest baseline create . --platform web
131
+ npx -y @aarwitz/tapp@latest ci install .
81
132
  ```
82
133
 
134
+ Actor setup refuses to overwrite an existing actor. Repeat `actor set` with `--replace` only when
135
+ you intend to replace that actor's reviewed role, session, provisioning, or credential bindings.
136
+
137
+ In a repository containing multiple apps (for example, iOS plus web),
138
+ `tapp init . --explore` without an explicit target does not guess from detection order—even when a
139
+ prior choice is recorded. A human terminal gets a numbered
140
+ selector; a non-interactive CLI prints exact target-selection commands, while MCP also returns
141
+ structured choices. Neither builds or writes before the choice. After you choose one, the model
142
+ retains every detected target and records the choice as the default for the next bare `tapp explore`;
143
+ explicit `init --explore` continues to ask because it is the onboarding/refresh operation. Setup gaps
144
+ belonging only to unselected targets are shown as informational, not as failures of the selected run.
145
+
83
146
  The baseline command writes only after exploration and every selected deterministic suite pass
84
147
  conclusively. It stores `.tapp/baselines/<platform>/<target-id>.json`; the generated workflow
85
148
  uses that exact target identity so two apps on the same platform never share a baseline. `ci
@@ -92,42 +155,50 @@ Every verb takes whatever you have: nothing (auto-detects the repo you're in, or
92
155
  already on the simulator), a repo directory, a `path/to/App.app`, or a bundle id:
93
156
 
94
157
  ```bash
95
- npx -y @aarwitz/tapp open [target] # launch the app → screen summary + screenshot file
96
- npx -y @aarwitz/tapp tree [target] # accessibility tree of the current screen
97
- npx -y @aarwitz/tapp shot # screenshot the booted simulator
98
- npx -y @aarwitz/tapp apps # what's installed on the simulator (names + bundle ids)
99
- npx -y @aarwitz/tapp build [dir] # just build + install (scheme auto-detected)
158
+ npx -y @aarwitz/tapp@latest open [target] # launch the app → screen summary + screenshot file
159
+ npx -y @aarwitz/tapp@latest tree [target] # accessibility tree of the current screen
160
+ npx -y @aarwitz/tapp@latest shot # screenshot the booted simulator
161
+ npx -y @aarwitz/tapp@latest apps # what's installed on the simulator (names + bundle ids)
162
+ npx -y @aarwitz/tapp@latest build [dir] # just build + install (scheme auto-detected)
100
163
  ```
101
164
 
102
- Web (beta): `npx -y @aarwitz/tapp explore http://localhost:3000` *(one-time setup:
103
- `npm i -g playwright && npx playwright install chromium`)*
165
+ Web (beta): `npx -y @aarwitz/tapp@latest explore http://localhost:3000` *(one-time setup:
166
+ `npm i -g playwright && npx playwright install chromium`)*. Add `--watch` to open Tapp's controlled,
167
+ isolated Chromium window and follow its clicks with an on-page pointer/action label. Tapp hides that
168
+ watch UI from saved evidence screenshots and does not automate your personal/default browser profile.
104
169
 
105
170
  Focused web inspection waits briefly for loading states to settle. If a consent or location modal
106
171
  blocks the screen, dismiss it and wait for the content you care about in the same package-only call:
107
172
 
108
173
  ```bash
109
- npx -y @aarwitz/tapp open https://example.com --tap "Not now" --wait-for "Dashboard"
110
- npx -y @aarwitz/tapp tree https://example.com --tap "Not now" --wait-for "Dashboard" --json
174
+ npx -y @aarwitz/tapp@latest open https://example.com --tap "Not now" --wait-for "Dashboard"
175
+ npx -y @aarwitz/tapp@latest tree https://example.com --tap "Not now" --wait-for "Dashboard" --json
111
176
  ```
112
177
 
113
178
  Android:
114
179
 
115
180
  ```bash
116
- npx -y @aarwitz/tapp explore path/to/app-debug.apk --platform android --app-id com.acme.app
117
- npx -y @aarwitz/tapp open com.acme.app --platform android
181
+ npx -y @aarwitz/tapp@latest explore path/to/app-debug.apk --platform android --app-id com.acme.app
182
+ npx -y @aarwitz/tapp@latest open com.acme.app --platform android
118
183
  ```
119
184
 
120
- Optional but recommended (prebuilds the test harness so the first run is fast):
185
+ Turn a driven journey into a deterministic test, or print the complete Flow format before writing
186
+ one by hand:
187
+
121
188
  ```bash
122
- npx -y @aarwitz/tapp install # ~2 min, one time
123
- npx -y @aarwitz/tapp doctor # verify Xcode / simulators / toolchain
189
+ npx -y @aarwitz/tapp@latest flow example
190
+ npx -y @aarwitz/tapp@latest flow validate .tapp/flows/smoke.yml
191
+ npx -y @aarwitz/tapp@latest flow run .tapp/flows/smoke.yml
124
192
  ```
125
193
 
126
- ### Optional browser workspace
194
+ Flows support an atomic `login` step using `$TEST_EMAIL` / `$TEST_PASSWORD`; Tapp's session recorder
195
+ creates that step without writing credential values into the repository.
127
196
 
128
- `npx -y @aarwitz/tapp app .` opens a local Release Studio for people who want visual repository
129
- onboarding, release-plan review, and CI preparation. It is not required for the coding-agent
130
- `open`/`explore` workflow.
197
+ Optional but recommended (prebuilds the test harness so the first run is fast):
198
+ ```bash
199
+ npx -y @aarwitz/tapp@latest install # ~2 min, one time
200
+ npx -y @aarwitz/tapp@latest doctor # verify Xcode / simulators / toolchain
201
+ ```
131
202
 
132
203
  ### MCP hookup (optional)
133
204
 
@@ -137,14 +208,14 @@ context** (the model literally sees the screen) and the **interactive session lo
137
208
 
138
209
  **Claude Code:**
139
210
  ```bash
140
- claude mcp add tapp -- npx -y @aarwitz/tapp mcp
211
+ claude mcp add tapp -- npx -y @aarwitz/tapp@latest mcp
141
212
  ```
142
213
 
143
214
  **Cursor / VS Code (Copilot)** — add to `~/.cursor/mcp.json` (Cursor) or `.vscode/mcp.json` (VS Code):
144
215
  ```json
145
216
  {
146
217
  "servers": {
147
- "tapp": { "type": "stdio", "command": "npx", "args": ["-y", "@aarwitz/tapp", "mcp"] }
218
+ "tapp": { "type": "stdio", "command": "npx", "args": ["-y", "@aarwitz/tapp@latest", "mcp"] }
148
219
  }
149
220
  }
150
221
  ```
@@ -153,10 +224,10 @@ claude mcp add tapp -- npx -y @aarwitz/tapp mcp
153
224
  ```toml
154
225
  [mcp_servers.tapp]
155
226
  command = "npx"
156
- args = ["-y", "@aarwitz/tapp", "mcp"]
227
+ args = ["-y", "@aarwitz/tapp@latest", "mcp"]
157
228
  ```
158
229
 
159
- **Any other MCP client:** stdio command `npx -y @aarwitz/tapp mcp`.
230
+ **Any other MCP client:** stdio command `npx -y @aarwitz/tapp@latest mcp`.
160
231
 
161
232
  Then ask your agent:
162
233
  > "Explore my app and show me what breaks."
@@ -185,7 +256,9 @@ Then ask your agent:
185
256
  | 📱 | `tapp_list_simulators` / `boot_simulator` / `install_app` | Simulator + app management. |
186
257
  | 🩺 | `tapp_health`, `tapp_capture*`, `tapp_parse_markers` | Diagnostics and capture history. |
187
258
 
188
- Full agent playbook: [AGENTS.md](./AGENTS.md) ships inside the package so agents can read it too.
259
+ Canonical installable skill: [`skills/tapp/SKILL.md`](skills/tapp/SKILL.md). Full low-level tool
260
+ reference: [AGENTS.md](./AGENTS.md). Both ship inside the npm package; installing the Claude plugin
261
+ or Agent Skill is what makes the workflow discoverable without pasting instructions.
189
262
  Application-model and import contract: [`docs/application-model.md`](docs/application-model.md).
190
263
  The desktop Coverage view reads the same `.tapp/application-model.json`,
191
264
  `.tapp/release-plan.json`, and `.tapp/ui-map.json`, including explicit proposal review; it
@@ -264,7 +337,7 @@ jobs:
264
337
  timeout-minutes: 45
265
338
  steps:
266
339
  - uses: actions/checkout@v4
267
- - uses: aarwitz/tapp@main # pin to the newest release tag for production
340
+ - uses: aarwitz/tapp@v0.17.1 # or pin the reviewed release commit SHA
268
341
  with:
269
342
  project: MyApp.xcodeproj # or MyApp.xcworkspace
270
343
  scheme: MyApp
@@ -297,7 +370,7 @@ accepts that `.app`, detects its bundle id, writes report artifacts, and exits n
297
370
  gate fails:
298
371
 
299
372
  ```bash
300
- npx -y @aarwitz/tapp ci --app path/to/MyApp.app \
373
+ npx -y @aarwitz/tapp@latest ci --app path/to/MyApp.app \
301
374
  --project-dir . --pr-base origin/main --pr-head HEAD \
302
375
  --target-key target_ios_myapp \
303
376
  --pr-plan-out tapp-pr-plan.json \
@@ -314,7 +387,7 @@ Android CI runs on Linux with an emulator/device already connected. The Action c
314
387
  or accept a prebuilt one:
315
388
 
316
389
  ```yaml
317
- - uses: aarwitz/tapp@main
390
+ - uses: aarwitz/tapp@v0.17.1 # or pin the reviewed release commit SHA
318
391
  with:
319
392
  platform: android
320
393
  android-app-id: com.acme.app
@@ -331,12 +404,6 @@ environment. Add
331
404
  [`docs/scenarios.md`](docs/scenarios.md). Automatic
332
405
  baselines are isolated by platform and target, so two same-platform apps are never compared.
333
406
 
334
- **The hosted service is under development and is not currently offered for customer repositories.**
335
- Do not upload private code or credentials to an old preview. The retained
336
- cloud prototype is not the production SaaS boundary. Use the local Release Studio and the portable
337
- GitHub Action in infrastructure you control until the new account, tenant authorization, private
338
- evidence, and isolated-worker boundary passes security review.
339
-
340
407
  ## Make your repo agent-verified
341
408
 
342
409
  Drop this into your repo's `AGENTS.md` (read by Codex, Cursor, Copilot, Devin, Zed, …) so
@@ -345,9 +412,9 @@ your agent proves its UI work instead of claiming it:
345
412
  ```markdown
346
413
  ## Verifying UI changes
347
414
  This repo uses tapp (https://github.com/aarwitz/tapp) to verify UI work on a real app surface
348
- (iOS simulator, Android emulator/device, or a browser for web). After any UI change, run `npx -y @aarwitz/tapp open` from the
415
+ (iOS simulator, Android emulator/device, or a browser for web). After any UI change, run `npx -y @aarwitz/tapp@latest open` from the
349
416
  repo root (it finds and builds the Xcode project itself) and look at the screenshot it saves as
350
- proof. Before declaring a feature done, run `npx -y @aarwitz/tapp explore` (or `explore <url>` for web)
417
+ proof. Before declaring a feature done, run `npx -y @aarwitz/tapp@latest explore` (or `explore <url>` for web)
351
418
  and report the findings + evidence. A change is not "done" until it has been seen working.
352
419
  (If the tapp MCP server is connected, the tapp_* tools do the same with inline screenshots —
353
420
  tapp_build builds + installs the app and returns the bundle id for tapp_explore.)
@@ -379,13 +446,6 @@ only an optional authoring/enrichment layer (`tapp_flow_generate`, `assert_ai`,
379
446
  The first tool call builds the harness once (~2 min, cached in `~/.tapp`; rebuilt automatically
380
447
  if you switch simulators). All captures land in `~/.tapp/captures/`.
381
448
 
382
- ## Desktop status
383
-
384
- The macOS cockpit is frozen as a supported native interface and parity floor; it still reads the
385
- canonical Application Model, release plan, and UI Map in Coverage. Its older import/build path is
386
- not yet a thin client of the shared product-operation layer, so new product work is converging in
387
- the browser without deleting or reducing the desktop experience.
388
-
389
449
  ## License
390
450
 
391
451
  [MIT](./LICENSE)