@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.
- package/.claude-plugin/marketplace.json +34 -0
- package/.claude-plugin/plugin.json +33 -0
- package/AGENTS.md +12 -9
- package/README.md +81 -34
- package/bin/tapp.js +18 -6
- package/docs/BROWSER-PRODUCT.md +1 -1
- package/mcp-server/src/index.js +165 -77
- package/mcp-server/src/product-operations.js +2 -1
- package/mcp-server/src/web-explorer.js +120 -8
- package/package.json +4 -2
- package/skills/tapp/SKILL.md +74 -0
- package/skills/tapp/agents/openai.yaml +4 -0
- package/skills/tapp/references/commands.md +102 -0
|
@@ -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
|
|
16
|
-
npx -y @aarwitz/tapp
|
|
17
|
-
npx -y @aarwitz/tapp
|
|
18
|
-
npx -y @aarwitz/tapp
|
|
19
|
-
npx -y @aarwitz/tapp
|
|
20
|
-
npx -y @aarwitz/tapp
|
|
21
|
-
npx -y @aarwitz/tapp
|
|
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
|
[](https://www.npmjs.com/package/@aarwitz/tapp)
|
|
5
5
|
[](https://www.npmjs.com/package/@aarwitz/tapp)
|
|
6
6
|
[](./LICENSE)
|
|
7
|
-
[](https://skills.sh/aarwitz/tapp)
|
|
8
|
+
[](https://marketplace.visualstudio.com/items?itemName=lidi-solutions.tapp)
|
|
9
|
+
[](cursor://anysphere.cursor-deeplink/mcp/install?name=tapp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBhYXJ3aXR6L3RhcHBAbGF0ZXN0IiwibWNwIl19)
|
|
10
|
+
[](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
|
-
##
|
|
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
|
-
|
|
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 · --
|
|
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"
|
package/docs/BROWSER-PRODUCT.md
CHANGED