@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/.claude-plugin/marketplace.json +34 -0
- package/.claude-plugin/plugin.json +33 -0
- package/AGENTS.md +44 -15
- package/Harness/OCQAHarnessUITests/ExplorerTests.swift +65 -7
- package/README.md +141 -81
- package/bin/tapp.js +253 -64
- package/docs/BROWSER-PRODUCT.md +1 -1
- package/docs/application-model.md +12 -3
- package/docs/scenarios.md +1 -1
- package/mcp-server/src/android-driver.js +13 -2
- package/mcp-server/src/android-explorer.js +3 -1
- package/mcp-server/src/android-flow.js +18 -1
- package/mcp-server/src/application-model.js +83 -13
- package/mcp-server/src/ci-report.js +2 -2
- package/mcp-server/src/ci-setup.js +4 -4
- package/mcp-server/src/environment-preflight.js +43 -0
- package/mcp-server/src/focused-navigation.js +271 -0
- package/mcp-server/src/html-report.js +3 -2
- package/mcp-server/src/index.js +565 -134
- package/mcp-server/src/pr-selection.js +2 -2
- package/mcp-server/src/product-operations.js +111 -6
- package/mcp-server/src/report.js +17 -4
- package/mcp-server/src/ui-map.js +2 -2
- package/mcp-server/src/web-explorer.js +123 -10
- package/mcp-server/src/web-flow.js +17 -1
- package/package.json +6 -4
- package/scripts/ci-gate.sh +42 -0
- package/scripts/flow_lib.py +1 -1
- package/scripts/quick-capture.sh +44 -13
- package/scripts/run-flow.sh +12 -1
- package/skills/tapp/SKILL.md +95 -0
- package/skills/tapp/agents/openai.yaml +4 -0
- package/skills/tapp/references/commands.md +105 -0
package/README.md
CHANGED
|
@@ -1,59 +1,110 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Tapp
|
|
2
2
|
|
|
3
3
|
[](https://github.com/aarwitz/tapp/actions/workflows/ci.yml)
|
|
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)
|
|
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:
|
|
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
|
-
##
|
|
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,
|
|
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
|
|
50
|
-
npx -y @aarwitz/tapp
|
|
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,
|
|
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
|
-
|
|
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
|
|
123
|
-
npx -y @aarwitz/tapp
|
|
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
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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@
|
|
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@
|
|
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)
|