@swmansion/argent 0.32.1-next.0 → 0.32.1-next.2
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/dist/cli-cmds.mjs +1 -1
- package/dist/installer.mjs +7 -7
- package/dist/mcp-server.mjs +1 -1
- package/dist/tool-args.generated.d.ts +178 -178
- package/dist/tool-server.cjs +1270 -1459
- package/package.json +1 -1
- package/rules/argent.md +19 -183
- package/skills/argent-android-emulator-setup/SKILL.md +5 -13
- package/skills/argent-create-e2e/SKILL.md +1 -1
- package/skills/argent-create-e2e/references/e2e-yaml.md +12 -17
- package/skills/argent-create-e2e/references/live-authoring.md +25 -65
- package/skills/argent-create-e2e/references/reliability-and-recovery.md +8 -8
- package/skills/argent-device-interact/SKILL.md +65 -367
- package/skills/argent-device-interact/references/chromium.md +4 -19
- package/skills/argent-device-interact/references/foldables.md +8 -0
- package/skills/argent-device-interact/references/harmonyos.md +13 -50
- package/skills/argent-ios-device-interact/SKILL.md +0 -1
- package/skills/argent-ios-device-setup/SKILL.md +1 -1
- package/skills/argent-ios-simulator-setup/SKILL.md +3 -9
- package/skills/argent-lens/SKILL.md +20 -75
- package/skills/argent-metro-debugger/SKILL.md +35 -101
- package/skills/argent-native-profiler/SKILL.md +23 -92
- package/skills/argent-qa-e2e/SKILL.md +5 -5
- package/skills/argent-react-native-app-workflow/SKILL.md +34 -203
- package/skills/argent-react-native-optimization/SKILL.md +10 -26
- package/skills/argent-react-native-optimization/references/fix-reference.md +11 -11
- package/skills/argent-react-native-optimization/references/lint-rules.md +4 -5
- package/skills/argent-react-native-optimization/references/semantic-checklist.md +2 -2
- package/skills/argent-react-native-profiler/SKILL.md +46 -110
- package/skills/argent-screen-recording/SKILL.md +18 -37
- package/skills/argent-screenshot-diff/SKILL.md +8 -52
- package/skills/argent-settings-permissions/SKILL.md +15 -117
- package/skills/argent-test-ui-flow/SKILL.md +20 -90
- package/skills/argent-tv-interact/SKILL.md +9 -34
- package/skills/argent-tv-interact/references/vega.md +23 -0
- package/agents/argent-environment-inspector.md +0 -107
- package/agents/references/quality-control-checklist.md +0 -45
- package/skills/argent-device-interact/references/gesture-examples.md +0 -114
- package/skills/argent-device-interact/references/secrets.md +0 -23
- package/skills/argent-metro-debugger/references/failure-scenarios.md +0 -14
- package/skills/argent-metro-debugger/references/source-maps.md +0 -27
- package/skills/argent-react-native-profiler/references/diagnostic-tools.md +0 -101
|
@@ -3,129 +3,27 @@ name: argent-settings-permissions
|
|
|
3
3
|
description: Grant, deny, or reset an app's runtime permissions (camera, microphone, photos, contacts, notifications, calendar, location, location-always, media-library, motion, reminders) on an iOS simulator or Android device using the argent `settings-permissions` tool - without navigating the system Settings UI. Use when the permission cannot be changed through the app itself - and only then, pre-authorize before the app asks, deny up front, re-enable a permission the user already denied, or reset so the prompt reappears. If the app can flip it - via an in-app toggle or the system permission dialog the app triggers - interact with the app instead.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
`settings-permissions` edits the platform's permission store directly - the iOS simulator's TCC database, or Android's package-manager permission flags. It replaces the manual **Settings → Privacy** dance during test setup: pre-authorize a service so the app never has to ask, deny it up front to test the refusal path, or reset it so the first-run dialog appears again on the next launch.
|
|
9
|
-
|
|
10
|
-
It is a **test-setup / out-of-band** tool, not a general permissions toggle. The default way to change a permission is still through the app - this tool is the exception for the cases the app can't reach.
|
|
6
|
+
`settings-permissions` edits the platform's permission store directly (the iOS simulator's TCC database, Android's runtime permissions over adb). It is a **test-setup / out-of-band** tool, not a general permissions toggle: the default way to change a permission is still through the app. The tool's description covers the supported permissions per platform, the parameters, the result (`applied` / `skipped`) and the per-platform requirements.
|
|
11
7
|
|
|
12
8
|
## When to use it - and when NOT to
|
|
13
9
|
|
|
14
|
-
|
|
10
|
+
The first matching row wins.
|
|
15
11
|
|
|
16
|
-
| Situation
|
|
17
|
-
|
|
|
18
|
-
| The app has an **in-app control** for the permission (a toggle in its own settings screen)
|
|
19
|
-
| The app
|
|
20
|
-
|
|
|
21
|
-
| The user **already denied** it and you need it **on** again
|
|
22
|
-
| You need the **first-run dialog to appear again**
|
|
23
|
-
| The permission is
|
|
24
|
-
| The setting isn't one of the **11 runtime permissions** below (e.g. Wi-Fi, cellular data, dark mode, VPN, Focus) | **Do NOT use this tool** | Out of scope - drive the Settings app or the app's own UI instead. |
|
|
12
|
+
| Situation | Do this |
|
|
13
|
+
| ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
14
|
+
| The app has an **in-app control** for the permission (a toggle in its own settings screen) | **Tap it in the app** (`describe` → `gesture-tap`); it exercises the flow you're testing |
|
|
15
|
+
| The app asked and the **system permission dialog is on screen** | **Tap the dialog** (`Allow` / `Don't Allow` / `Allow While Using App`); `describe` exposes its buttons |
|
|
16
|
+
| The permission must be **granted/denied before the app runs**, so no dialog interrupts the flow | **Use this tool** (`grant` / `deny`) before `launch-app` |
|
|
17
|
+
| The user **already denied** it and you need it **on** again | **Use this tool** (`grant`): iOS never re-shows a dialog once denied |
|
|
18
|
+
| You need the **first-run dialog to appear again** | **Use this tool** (`reset`) |
|
|
19
|
+
| The permission is unsupported on the target platform, or it isn't one of the 11 runtime permissions (Wi-Fi, dark mode, VPN, Focus, …) | **Do NOT use this tool**: answer the app's dialog, or drive the Settings app or the app's own UI |
|
|
25
20
|
|
|
26
21
|
**Rule of thumb:** if a human tester could flip it _inside the app_, do that. Reach for `settings-permissions` only for a change a human would otherwise make in the **system Settings app**.
|
|
27
22
|
|
|
28
|
-
## Supported permissions & platform coverage
|
|
29
|
-
|
|
30
|
-
| `permission` | iOS simulator (TCC service) | Android (`android.permission.*`) |
|
|
31
|
-
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------- |
|
|
32
|
-
| `camera` | `camera` - only if the target simulator's **runtime** models it (varies by simruntime, not by the installed Xcode; simulators have no camera hardware) | `CAMERA` |
|
|
33
|
-
| `microphone` | `microphone` | `RECORD_AUDIO` |
|
|
34
|
-
| `photos` | `photos` + `photos-add` (add-only access is a separate TCC service; `photos-add` is best-effort - check `applied` to see whether both changed) | `READ_MEDIA_IMAGES` + `READ_MEDIA_VIDEO` + `READ_MEDIA_VISUAL_USER_SELECTED` + `READ_EXTERNAL_STORAGE` |
|
|
35
|
-
| `contacts` | `contacts` | `READ_CONTACTS` + `WRITE_CONTACTS` |
|
|
36
|
-
| `notifications` | **unsupported** - no iOS equivalent; answer the app's dialog instead | `POST_NOTIFICATIONS` |
|
|
37
|
-
| `calendar` | `calendar` | `READ_CALENDAR` + `WRITE_CALENDAR` |
|
|
38
|
-
| `location` | `location` | `ACCESS_FINE_LOCATION` + `ACCESS_COARSE_LOCATION` |
|
|
39
|
-
| `location-always` | `location-always` | `ACCESS_BACKGROUND_LOCATION` (a **grant** also adds fine + coarse - background alone can't read location) |
|
|
40
|
-
| `media-library` | `media-library` | `READ_MEDIA_AUDIO` + `READ_EXTERNAL_STORAGE` |
|
|
41
|
-
| `motion` | `motion` | `ACTIVITY_RECOGNITION` |
|
|
42
|
-
| `reminders` | `reminders` | **unsupported** - no Android runtime permission |
|
|
43
|
-
|
|
44
|
-
One abstract permission can map to several concrete Android permissions; which ones actually exist depends on the app's manifest and the device's API level (e.g. `READ_MEDIA_*` on API 33+ vs `READ_EXTERNAL_STORAGE` below it).
|
|
45
|
-
|
|
46
|
-
## Actions
|
|
47
|
-
|
|
48
|
-
- **`grant`** - pre-authorize the permission. Requires `bundleId`.
|
|
49
|
-
- **`deny`** - refuse it. Requires `bundleId`. Use to test the app's "permission denied" path.
|
|
50
|
-
- **`reset`** - return to the not-yet-asked state so the dialog reappears on next use. Always per-app (`bundleId` required):
|
|
51
|
-
- iOS: removes that app's TCC row. A device-wide reset (no bundleId) is **not** offered - on recent iOS runtimes it reports success but leaves existing per-app grants untouched, so it would report a change that never happened.
|
|
52
|
-
- Android: revokes the grant, then best-effort clears the user-set/user-fixed flags (flag-clearing first appears in Android 13 / API 33; the revoke is what counts toward success). Below API 33 (i.e. API 23-32, everywhere a user-fixed state can exist) flag-clearing is unavailable, so a `reset` there revokes the grant but cannot clear a "don't ask again" (user-fixed) state - the dialog may stay suppressed on those older devices.
|
|
53
|
-
|
|
54
|
-
## Parameters
|
|
55
|
-
|
|
56
|
-
```json
|
|
57
|
-
{
|
|
58
|
-
"udid": "<UDID-or-serial>",
|
|
59
|
-
"action": "grant",
|
|
60
|
-
"permission": "camera",
|
|
61
|
-
"bundleId": "com.example.app"
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
- `udid` - target from `list-devices` (iOS simulator UDID, or Android serial). See `argent-ios-simulator-setup` / `argent-android-emulator-setup` to get one.
|
|
66
|
-
- `action` - `grant` | `deny` | `reset`.
|
|
67
|
-
- `permission` - one of the 11 names above.
|
|
68
|
-
- `bundleId` - iOS bundle id or Android package name. **Required for every action**.
|
|
69
|
-
|
|
70
|
-
## Platform behavior
|
|
71
|
-
|
|
72
|
-
**iOS simulator only.** Edits the simulator's TCC store - always per-app (`bundleId` required). There is no host-side TCC switch on a physical iPhone, so this tool does not apply to real iOS devices. The simulator must be **booted** first (`boot-device`) - otherwise the tool fails with a "current state: Shutdown" error and surfaces the boot hint.
|
|
73
|
-
|
|
74
|
-
**Android emulator and physical device.** Changes the app's `android.permission.*` runtime permissions over adb (and, for `reset`, best-effort clears the user-set/user-fixed flags - the revoke is what decides success; flag-clearing needs Android 13 / API 33+). Requirements:
|
|
75
|
-
|
|
76
|
-
- The app must be **installed** - the tool probes for the package first and errors clearly if it is missing (a transport/timeout failure surfaces adb's real cause, not a false "not installed").
|
|
77
|
-
- The app must **declare** the permission in its manifest. The package manager rejects any mapped permission the manifest doesn't request; those come back in the result's `skipped` list. The action succeeds if **at least one** mapped permission sticks, and errors only if **all** of them were rejected.
|
|
78
|
-
|
|
79
23
|
## Gotchas
|
|
80
24
|
|
|
81
|
-
- **
|
|
82
|
-
- **
|
|
83
|
-
- **
|
|
84
|
-
- **
|
|
85
|
-
-
|
|
86
|
-
- **`grant location` needs the app installed first (iOS).** Location authorization isn't stored in TCC and isn't applied to a bundle id until the app exists, so a pre-install `grant location` / `grant location-always` records nothing. On a **local** simulator the tool checks install state and errors clearly instead of reporting a false success; on a **remote** simulator it cannot probe install state, so a pre-install grant there reports success while recording nothing - make sure the app is installed before granting location remotely. (TCC-backed services like `camera`/`photos` _can_ be granted before install; they persist and apply on install.)
|
|
87
|
-
|
|
88
|
-
## Result
|
|
89
|
-
|
|
90
|
-
Returns `{ action, permission, bundleId, applied, skipped? }`:
|
|
91
|
-
|
|
92
|
-
- `applied` - the platform-level services/permissions actually changed (the TCC service(s) on iOS; the `android.permission.*` names on Android).
|
|
93
|
-
- `skipped` - Android only, present when some mapped permissions were rejected but others succeeded.
|
|
94
|
-
|
|
95
|
-
The call **fails** when nothing could be applied - read the error; it names the reason: an unsupported permission for the platform (`notifications` on iOS, `reminders` on Android), the app not installed (including a pre-install `grant location` on iOS), a shutdown simulator (iOS), or every mapped permission being rejected (usually a missing manifest entry). A non-shutdown `camera` failure additionally hints about the simulator runtime's supported services (a shutdown-simulator failure gets the boot hint instead).
|
|
96
|
-
|
|
97
|
-
## Examples
|
|
98
|
-
|
|
99
|
-
Pre-grant the camera before launching, so the app never prompts:
|
|
100
|
-
|
|
101
|
-
```json
|
|
102
|
-
{ "udid": "<UDID>", "action": "grant", "permission": "camera", "bundleId": "com.example.app" }
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
Test the denied path - refuse location, then launch and observe the fallback:
|
|
106
|
-
|
|
107
|
-
```json
|
|
108
|
-
{ "udid": "<serial>", "action": "deny", "permission": "location", "bundleId": "com.example.app" }
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Reset notifications on Android so the first-run prompt appears again next launch:
|
|
112
|
-
|
|
113
|
-
```json
|
|
114
|
-
{
|
|
115
|
-
"udid": "<serial>",
|
|
116
|
-
"action": "reset",
|
|
117
|
-
"permission": "notifications",
|
|
118
|
-
"bundleId": "com.example.app"
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
Grant always-on location on Android (fans out to background + foreground automatically):
|
|
123
|
-
|
|
124
|
-
```json
|
|
125
|
-
{
|
|
126
|
-
"udid": "<serial>",
|
|
127
|
-
"action": "grant",
|
|
128
|
-
"permission": "location-always",
|
|
129
|
-
"bundleId": "com.example.app"
|
|
130
|
-
}
|
|
131
|
-
```
|
|
25
|
+
- **iOS simulator only on Apple platforms.** A physical iPhone has no host-side TCC switch, so the tool does not apply there.
|
|
26
|
+
- **A pre-launch `deny` suppresses the prompt on iOS only.** On iOS a TCC denial answers the app's request, so no dialog appears. On Android a `deny` clears the grant but sets no "user-fixed" flag, so the app's next request still shows the system dialog: a pre-launch `deny` there tests the revoked _state_, not a suppressed prompt.
|
|
27
|
+
- **Android `reset` below API 33 can't clear "don't ask again".** It revokes the grant, but clearing the user-fixed flag needs Android 13 / API 33+, so the dialog may stay suppressed on older devices.
|
|
28
|
+
- **Set permissions before `launch-app`.** A change can terminate a running app; if you change one while it runs, `restart-app` afterwards.
|
|
29
|
+
- **Android `location-always`**: a `grant` also adds fine and coarse location, since background alone can't read location.
|
|
@@ -3,59 +3,30 @@ name: argent-test-ui-flow
|
|
|
3
3
|
description: Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing UI flows, verifying login works, testing navigation, running UI test scenarios, manual QA steps, visible UI changes, or visual behavior.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
##
|
|
6
|
+
## Before testing
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
The interaction tool names are identical on iOS and Android (`gesture-tap`, `gesture-swipe`, `describe`, `screenshot`, `launch-app`, etc.) and the tool-server auto-dispatches based on the `udid` you pass (UUID-shape → iOS, adb serial → Android).
|
|
11
|
-
|
|
12
|
-
**Before testing, resolve which device to test on.** Call `list-devices` and follow `<device_selection_rule>`: prefer a running device on any platform;
|
|
13
|
-
|
|
14
|
-
Once a platform is chosen, the per-platform setup skill takes over:
|
|
8
|
+
Resolve the device first: call `list-devices`, use the platform the user named or else prefer a device that is already running, and don't pick a cabled phone without explicit intent. Setup: `argent-ios-simulator-setup` / `argent-android-emulator-setup`. The interaction tool names are identical on iOS and Android.
|
|
15
9
|
|
|
16
|
-
|
|
17
|
-
| -------- | ------------------------------- | ----------------------------------------------------------- |
|
|
18
|
-
| iOS | `argent-ios-simulator-setup` | `list-devices` → `boot-device` with `udid` if none booted |
|
|
19
|
-
| Android | `argent-android-emulator-setup` | `list-devices` → `boot-device` with `avdName` if none ready |
|
|
10
|
+
Physical iPhone (`kind: "device"`): read `argent-ios-device-interact` first. `launch-app` before anything; `describe` fails while the app is backgrounded.
|
|
20
11
|
|
|
21
12
|
## 1. Workflow
|
|
22
13
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
For implementation tasks that modify visible UI, this workflow can also serve as a visual acceptance path.
|
|
14
|
+
For implementation tasks that modify visible UI, this workflow also serves as a visual acceptance path.
|
|
26
15
|
|
|
27
|
-
1. **Baseline screenshot**:
|
|
28
|
-
2. **Find target**:
|
|
29
|
-
- **React Native
|
|
30
|
-
- **
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
4. **Verify**: Check the returned screenshot for expected results. If it shows a loading/transitional state, prefer blocking until it settles with `await-ui-element` (expected element `visible`, or a spinner `hidden`) over a guessed delay, but only with a selector you can trust (`text`/`identifier`/`role`) that the screen is known to have or that you saw in a prior `describe`; a guessed one just times out. Otherwise use a short fixed wait. Pick evidence by what's being asserted:
|
|
35
|
-
- **Visual** (layout, spacing, color, typography, image/icon rendering, clipping, overflow, text rendering): prefer `screenshot-diff` against the baseline captured in step 1: it surfaces pixel-visible changes the auto-screenshot might miss. Fall back to visual inspection of the auto-screenshot only when a stable baseline isn't available.
|
|
16
|
+
1. **Baseline screenshot**: call `screenshot` to see the current UI state. For visual regression comparison or UI change verification, capture the baseline at `scale: 1.0` with `includeImageInContext: false` and keep the returned `path` before editing whenever feasible.
|
|
17
|
+
2. **Find target**: get element coordinates from a discovery tool before tapping:
|
|
18
|
+
- **App screens (React Native included), in-app modals and system dialogs**: `describe`. Fall back to `screenshot` only if an overlay is not exposed reliably. When the app raises its own permission dialog, answer it here; that's the real flow under test. To take a prompt _out_ of the flow, use `argent-settings-permissions` during setup.
|
|
19
|
+
- **Fallback**: use `screenshot` to estimate where the component is, then verify immediately after the action.
|
|
20
|
+
3. **Interact**: perform the action (`gesture-tap`, `gesture-swipe`, `keyboard`, `button`, ...); you receive a screenshot automatically.
|
|
21
|
+
4. **Verify**: check the returned screenshot. If it shows a loading/transitional state, block with `await-ui-element` (expected element `visible`, or a spinner `hidden`) rather than a guessed delay (its result carries the new screenshot and element tree), but only with a selector you can trust (`text`/`identifier`/`role`) that the screen is known to have or that you saw in a prior `describe`; a guessed one just times out. Otherwise use a short fixed wait. Pick evidence by what's being asserted:
|
|
22
|
+
- **Visual** (layout, spacing, color, typography, image/icon rendering, clipping, overflow, text rendering): prefer `screenshot-diff` against the step 1 baseline: it surfaces pixel-visible changes the auto-screenshot might miss. Fall back to inspecting the auto-screenshot only when a stable baseline isn't available.
|
|
36
23
|
- **Structural** (navigation state, element existence, accessibility labels/values, selection, hierarchy, route): verify with `describe`, `debugger-component-tree`, or `native-describe-screen`.
|
|
37
|
-
- **Runtime / log / network** (console errors, API calls, persistence, timing): verify with `view-network-logs`, `debugger-log-registry`, `debugger-evaluate`, or targeted tests.
|
|
24
|
+
- **Runtime / log / network** (console errors, API calls, persistence, timing): verify with `view-network-logs`, `debugger-log-registry`, `debugger-evaluate`, or targeted tests. A `not_connected` result from the debugger tools is not evidence about the app: follow its `guidance`, then re-verify.
|
|
38
25
|
- **Mixed**: collect evidence for each relevant class.
|
|
39
26
|
- Report the combined verdict: expected behavior, observed behavior, evidence used, and any blocker for requested visual diffing.
|
|
40
27
|
5. **Repeat** for each step in the flow.
|
|
41
28
|
|
|
42
|
-
## 2.
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
Goal: Test [feature name]
|
|
46
|
-
|
|
47
|
-
Steps:
|
|
48
|
-
1. Classify expected result: visual / structural / runtime-log-network / mixed → choose evidence
|
|
49
|
-
2. [Navigate / tap / type to reach stable comparable starting point] → verify auto-screenshot
|
|
50
|
-
3. screenshot { scale: 1.0, includeImageInContext: false } → save baseline path when visual or mixed evidence needs diffing
|
|
51
|
-
4. [Perform the action to test] → verify auto-screenshot
|
|
52
|
-
5. Use screenshot-diff when requested or when comparable images add useful visual evidence
|
|
53
|
-
6. Report: pass / fail with combined visual, structural, runtime/log/network evidence as applicable
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## 3. Examples
|
|
57
|
-
|
|
58
|
-
### Login flow
|
|
29
|
+
## 2. Example: login flow
|
|
59
30
|
|
|
60
31
|
```
|
|
61
32
|
1. screenshot → see login screen
|
|
@@ -67,57 +38,16 @@ Steps:
|
|
|
67
38
|
7. screenshot → verify home screen appeared
|
|
68
39
|
```
|
|
69
40
|
|
|
70
|
-
> **Credentials:** never type plaintext credentials; use a `{{secret:<NAME>}}` placeholder
|
|
71
|
-
|
|
72
|
-
### Scroll and navigation
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
1. screenshot → see list at top
|
|
76
|
-
2. gesture-swipe { fromY: 0.7, toY: 0.3 } → scroll down
|
|
77
|
-
3. gesture-tap item at visible position → verify auto-screenshot
|
|
78
|
-
4. screenshot → verify detail view opened
|
|
79
|
-
5. button { button: "back" }
|
|
80
|
-
6. screenshot → verify returned to list
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Visual behavior check
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
1. Classify expected result as visual or mixed.
|
|
87
|
-
2. Navigate to the stable starting state.
|
|
88
|
-
3. screenshot { scale: 1.0, includeImageInContext: false } → save baseline path.
|
|
89
|
-
4. describe / debugger-component-tree → find the control and use its returned tap coordinates.
|
|
90
|
-
5. gesture-tap → perform the visual behavior under test.
|
|
91
|
-
6. screenshot-diff { baselinePath, captureCurrent: true, udid, outputDir } → inspect visible change or stability.
|
|
92
|
-
7. describe / debugger-component-tree → verify selected state, label, route, or attributes if relevant.
|
|
93
|
-
8. Report combined verdict from expected behavior, visual inspection, diff summary, and structural evidence.
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Wait for a loading spinner
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
1. gesture-tap { x: 0.5, y: 0.7 } → trigger an action that fetches data
|
|
100
|
-
2. screenshot → loading spinner is showing
|
|
101
|
-
3. await-ui-element { condition: hidden, selector: { text: "Loading" } } → block until the fetch finishes and the spinner disappears; its result carries the screenshot and element tree, so verify the fetched content rendered from it
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## 4. Recovery Pattern
|
|
41
|
+
> **Credentials:** never type plaintext credentials; use a `{{secret:<NAME>}}` placeholder (`keyboard`'s `text` parameter lists where it is read from and what to do when a name is missing). Never invent credentials or echo secret values into reports or saved files.
|
|
107
42
|
|
|
108
|
-
|
|
109
|
-
- If tap misses target: re-run discovery tool (`describe` / `debugger-component-tree`), retry once with new coordinates.
|
|
110
|
-
- If a permission dialog or modal is visible: re-run `describe` first. Stay in screenshot-driven navigation only when the overlay is not exposed reliably, then switch back to `describe` / `debugger-component-tree` as soon as it is dismissed.
|
|
111
|
-
- If tap fails twice at same coordinates: stop, re-discover, report if element not found.
|
|
112
|
-
- If a **saved e2e test** fails during `e2e-execute` replay (as opposed to live test steps above): follow `argent-create-e2e`'s [Diagnose a replay failure](../argent-create-e2e/references/reliability-and-recovery.md#diagnose-a-replay-failure): classify the failure, inspect the actual screen, repair the smallest justified unit, then replay the full e2e test.
|
|
43
|
+
## 3. Recovery Pattern
|
|
113
44
|
|
|
114
|
-
|
|
45
|
+
- Screen mid-transition or loading: wait with `await-ui-element` as in step 4, then re-check. Fall back to a fixed wait + `screenshot` only when no element reliably marks the transition. Don't poll with repeated screenshots.
|
|
46
|
+
- Tap misses the target: re-run `describe` and retry once with new coordinates. If it fails twice, stop and report that the element was not found.
|
|
47
|
+
- Permission dialog or modal visible: re-run `describe` first. Stay in screenshot-driven navigation only while the overlay is not exposed reliably: tap one visible button at a time, verify with the returned screenshot, and switch back to `describe` as soon as it is dismissed.
|
|
48
|
+
- A **saved e2e test** fails during `e2e-execute` replay (as opposed to the live steps above): follow `argent-create-e2e`'s [Diagnose a replay failure](../argent-create-e2e/references/reliability-and-recovery.md#diagnose-a-replay-failure): classify the failure, inspect the actual screen, repair the smallest justified unit, then replay the full e2e test.
|
|
115
49
|
|
|
116
|
-
|
|
117
|
-
- **Use `gesture-custom` for long-press** context menus (800ms hold).
|
|
118
|
-
- **Report clearly**: state what you expected, what you saw, and the verdict.
|
|
119
|
-
- **Permission modals**: try `describe` first. Use `screenshot` only as fallback, tap one visible button at a time, and verify with the returned screenshot before continuing.
|
|
120
|
-
- **Record for replay**: If a tested flow is likely to be repeated, use the `argent-create-e2e` skill to record it as a `.yaml` script. This lets you replay the entire sequence later with a single `e2e-execute` call instead of re-running each step manually.
|
|
50
|
+
**Record for replay**: if a tested flow is likely to be repeated, use the `argent-create-e2e` skill to record it as a `.yaml` test, so it can be replayed later with a single `e2e-execute` call.
|
|
121
51
|
|
|
122
52
|
## Related Skills
|
|
123
53
|
|
|
@@ -10,6 +10,8 @@ description: Control and inspect TV apps via argent, Apple TV (tvOS), Android TV
|
|
|
10
10
|
- A TV is **focus-driven, not touch-driven.** Drive every interaction with `describe` + `tv-remote` + `keyboard`; never use `gesture-*` / coordinate taps; they don't apply on any TV platform.
|
|
11
11
|
- **Always `describe` before navigating** to find the live cursor and your target; never guess focus from a screenshot. The cursor is the focused element; on **Vega** the toolkit often leaves `focused` false and marks the highlighted item `[selected]`, so treat `[selected]` as the cursor when nothing reports `[focused]`.
|
|
12
12
|
- Pass the `udid` from `list-devices`: an Apple TV simulator UDID or an Android TV / Vega `serial`. Dispatch is automatic from the id; the same tools drive all three.
|
|
13
|
+
- **E2E tests: Vega only.** Apple TV and Android TV have no e2e support (a `tap:` can pass without doing anything): report that limitation.
|
|
14
|
+
- **Fire TV (Vega)** (`platform: "vega"` in `list-devices`): read `references/vega.md` before driving it. It covers booting and stopping the VVD, Fast Refresh, and debugging the JS runtime.
|
|
13
15
|
|
|
14
16
|
## The navigation loop
|
|
15
17
|
|
|
@@ -19,52 +21,25 @@ description: Control and inspect TV apps via argent, Apple TV (tvOS), Android TV
|
|
|
19
21
|
|
|
20
22
|
## Tools
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- `
|
|
25
|
-
- `launch-app` / `restart-app` / `reinstall-app {udid, bundleId}`: `bundleId` from the app manifest. Vega `reinstall-app` takes `appPath` = a `.vpkg`.
|
|
26
|
-
- `screenshot {udid, scale?}`: Apple TV via `xcrun simctl io` (downscaled); Android TV / Vega host-side via `adb` / `screencap`.
|
|
24
|
+
`describe`, `tv-remote` and `keyboard` descriptions cover the TV behaviour (focus view, remote keys and paths, text-only typing). Beyond them:
|
|
25
|
+
|
|
26
|
+
- `launch-app` / `restart-app` / `reinstall-app` take the `bundleId` from the app manifest.
|
|
27
27
|
|
|
28
28
|
## Per-platform
|
|
29
29
|
|
|
30
30
|
### Apple TV (tvOS simulator)
|
|
31
31
|
|
|
32
|
-
- Boot like any iOS sim (`boot-device`); the AX + HID daemons auto-start on the first `describe` / `tv-remote` (first call may take a few seconds).
|
|
33
|
-
- Media-transport / volume keys are **rejected**: the sim's HID stack ignores them (they work on Android TV / Vega).
|
|
32
|
+
- Boot like any iOS sim (`boot-device`); the AX + HID daemons auto-start on the first `describe` / `tv-remote` (first call may take a few seconds).
|
|
34
33
|
- Dev build: `open-url {udid, url:"<scheme>://expo-development-client/?url=http%3A%2F%2F<HOST_IP>%3A8081"}` (`<HOST_IP>` = your Mac's LAN IP, shown on the launcher).
|
|
35
34
|
|
|
36
35
|
### Android TV (leanback emulator)
|
|
37
36
|
|
|
38
37
|
- Boot the leanback AVD like any emulator; see `argent-android-emulator-setup`.
|
|
39
|
-
-
|
|
40
|
-
- Dev build: `adb -s <serial> reverse tcp:8081 tcp:8081`, deep-link `<pkg>://expo-development-client/?url=http%3A%2F%2F10.0.2.2%3A8081`, dismiss the first dev-menu with `adb shell input keyevent KEYCODE_DPAD_CENTER` (not Back: Back exits the app). If `list-devices` returns a `hint` about the adb server, prefix these `adb` commands as the hint shows.
|
|
41
|
-
|
|
42
|
-
### Fire TV (Vega / VVD)
|
|
43
|
-
|
|
44
|
-
- `list-devices` shows a `serial` (use as `udid`) and a `vvdImage`. `boot-device {vvdImage}` (e.g. `"tv"`) starts the single SDK-managed VVD; skip if one already runs.
|
|
45
|
-
- **Stop the VVD** with `vega virtual-device stop` in your shell. The CLI only tracks VVDs it started in the foreground, so it may report "not running" for one started via `boot-device`; to restart that one use `boot-device {vvdImage, force:true}` (stops then re-boots).
|
|
46
|
-
- Empty `describe` tree → `restart-app` (the automation toolkit attaches at launch), then retry. Input ignored → enable developer mode in the VVD: `vsm developer-mode enable`.
|
|
47
|
-
- Editing `node_modules` has no effect on a Release build; only Debug `.vpkg` builds load patchable JS.
|
|
48
|
-
- Profiling / crashes → `amazon-devices-buildertools-mcp` server (`analyze_perfetto_traces`, `get_app_hot_functions`, `symbolicate_acr`); docs via its `search_documentation` tool.
|
|
49
|
-
|
|
50
|
-
## Common gotchas
|
|
51
|
-
|
|
52
|
-
- **Empty focus right after `launch-app` / `restart-app`** is the splash / loading window; `describe` retries internally; wait ~2-3s and retry on a cold start.
|
|
53
|
-
- Passing a phone/tablet (`runtimeKind: "mobile"`) udid to `tv-remote` fails with a clear "tvOS-only" / "Android-TV-only" error; pick a TV target from `list-devices`.
|
|
38
|
+
- Dev build: `open-url` `<scheme>://expo-development-client/?url=http%3A%2F%2F10.0.2.2%3A8081` (`<scheme>`: the app's URL scheme, or its package name if it sets none), then dismiss the first dev menu with `tv-remote` `select` (not `back`: it exits the app).
|
|
54
39
|
|
|
55
40
|
## Fast Refresh (dev builds)
|
|
56
41
|
|
|
57
|
-
Needs a Debug build + Metro running. argent only _connects_ to Metro
|
|
42
|
+
Needs a Debug build + Metro running. argent only _connects_ to Metro: start Metro yourself, and forward the port where the app needs it (Android: `argent-metro-debugger` §1; Vega: `references/vega.md`).
|
|
58
43
|
|
|
59
44
|
- **Apple TV / Android TV:** use the dev-build deep-links above; `npm start` for Metro.
|
|
60
|
-
- **Vega:**
|
|
61
|
-
|
|
62
|
-
## Debugging the JS runtime (Vega)
|
|
63
|
-
|
|
64
|
-
Once that same Debug build + Metro setup is in place, the JS-runtime tools work on a Vega VVD: `debugger-connect`, `debugger-status`, `debugger-evaluate`, `debugger-log-registry` (console logs), `view-network-logs`, and `view-network-request-details`. Verify with `debugger-status`: it returns a status result rather than an error when not connected: `status: "connected"` means the setup works; `status: "not_connected"` carries a `reason` and `guidance` (e.g. `metro_not_running` → Metro itself is not up). Vega-specific: on `no_app_connected`, check `vega device start-port-forwarding` **before** relaunching the app: a down device→host forward is the usual cause, and the generic guidance can't know about it. See the `argent-metro-debugger` skill.
|
|
65
|
-
|
|
66
|
-
Vega's React Native forks RN 0.72 and serves the legacy Hermes inspector, so three things differ from iOS / Android:
|
|
67
|
-
|
|
68
|
-
- `debugger-component-tree`, `debugger-inspect-element`, `debugger-reload-metro` and the `react-profiler-*` / `profiler-*` tools are **not supported**. Component-tree and inspect-element are hard-blocked: they need `Runtime.addBinding`, which this Hermes acknowledges but never installs. The rest are simply unverified on the legacy inspector. Use `describe` for on-screen structure; with both component tools gated off, component `file:line` tracing has no path on Vega.
|
|
69
|
-
- `debugger-status` reports `isNewDebugger: false`.
|
|
70
|
-
- `projectRoot` is empty (RN 0.72's Metro sends no project-root header), so lookups that resolve paths against the project root return no location.
|
|
45
|
+
- **Vega:** see `references/vega.md`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Fire TV (Vega / VVD)
|
|
2
|
+
|
|
3
|
+
Everything in the related SKILL.md still applies; this page covers what is Vega-only.
|
|
4
|
+
|
|
5
|
+
## Device
|
|
6
|
+
|
|
7
|
+
- Use the `serial` from `list-devices` as `udid`; start a stopped VVD with `boot-device {vvdImage}`.
|
|
8
|
+
- **Stop the VVD** with `vega virtual-device stop` in your shell. The CLI only tracks VVDs it started in the foreground, so it may report "not running" for one started via `boot-device`; to restart that one use `boot-device {vvdImage, force:true}` (stops then re-boots).
|
|
9
|
+
- Input ignored → enable developer mode in the VVD: `vsm developer-mode enable`.
|
|
10
|
+
- Editing `node_modules` has no effect on a Release build; only Debug `.vpkg` builds load patchable JS.
|
|
11
|
+
- Profiling / crashes → `amazon-devices-buildertools-mcp` server (`analyze_perfetto_traces`, `get_app_hot_functions`, `symbolicate_acr`); docs via its `search_documentation` tool.
|
|
12
|
+
- `keyboard` named `key` presses (e.g. `{key:"enter"}`) work on Vega, unlike Apple TV / Android TV.
|
|
13
|
+
- `reinstall-app` takes a `.vpkg` as `appPath`.
|
|
14
|
+
|
|
15
|
+
## Fast Refresh
|
|
16
|
+
|
|
17
|
+
Build and install a Debug `.vpkg` (`vega device install-app -p <path>`), `npm start`, `vega device start-port-forwarding --port 8081 --forward false`, then `vega device launch-app -a <appId>`. Confirm `http://localhost:8081/json/list` shows a `Hermes React Native` target; `.tsx` edits then hot-reload.
|
|
18
|
+
|
|
19
|
+
## Debugging the JS runtime
|
|
20
|
+
|
|
21
|
+
Once that same Debug build + Metro setup is in place, the JS-runtime tools work on a Vega VVD: `debugger-connect`, `debugger-status`, `debugger-evaluate`, `debugger-log-registry` (console logs), `view-network-logs`, and `view-network-request-details`. Verify with `debugger-status`. Vega-specific: on `no_app_connected`, check `vega device start-port-forwarding` **before** relaunching the app: a down device→host forward is the usual cause, and the generic guidance can't know about it. See the `argent-metro-debugger` skill.
|
|
22
|
+
|
|
23
|
+
Vega's React Native forks RN 0.72 and serves the legacy Hermes inspector, so `debugger-component-tree`, `debugger-inspect-element`, `debugger-reload-metro` and the `react-profiler-*` / `profiler-*` tools are **not supported**. Component-tree and inspect-element are hard-blocked: they need `Runtime.addBinding`, which this Hermes acknowledges but never installs. The rest are simply unverified on the legacy inspector. Use `describe` for on-screen structure; with both component tools gated off, component `file:line` tracing has no path on Vega. `isNewDebugger: false` and an empty `projectRoot` are expected there.
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: argent-environment-inspector
|
|
3
|
-
description: >
|
|
4
|
-
Inspects a mobile app project's environment and returns structured JSON covering
|
|
5
|
-
project type, platform support, build and startup commands, bundler config, env
|
|
6
|
-
resolution, key packages, QA/feedback-loop tooling, and Argent-specific workflow
|
|
7
|
-
commands. Works on any project: determines whether it is React Native, Expo,
|
|
8
|
-
Flutter, native iOS/Android, or another stack, and provides environment context
|
|
9
|
-
regardless. Has deeper React Native introspection via gather-workspace-data but
|
|
10
|
-
also reports useful information for non-RN projects.
|
|
11
|
-
Use proactively at session start when required to gather the environment information.
|
|
12
|
-
If subagent delegation is not available, run the steps in the main thread instead.
|
|
13
|
-
The main agent is responsible for persisting the result to project memory.
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
You are the **environment-inspector** subagent. Your job is to inspect a mobile app
|
|
17
|
-
project and return a single JSON block describing the project's environment. You do
|
|
18
|
-
not write files; the main agent handles persistence.
|
|
19
|
-
|
|
20
|
-
**Your first task is to determine what kind of project this is.**. The project could be, for example:
|
|
21
|
-
|
|
22
|
-
- React Native (bare CLI or Expo)
|
|
23
|
-
- Flutter / Dart
|
|
24
|
-
- Native iOS (Swift / Objective-C with Xcode)
|
|
25
|
-
- Native Android (Kotlin / Java with Gradle)
|
|
26
|
-
- A web app, a monorepo containing multiple apps, or something else entirely
|
|
27
|
-
|
|
28
|
-
Provide useful environment context regardless of the project type. You have
|
|
29
|
-
deep introspection tools at your disposal - `gather-workspace-data`, which provides heuristical
|
|
30
|
-
context about the workspace structure. If any of the information is not retrieved from the tool,
|
|
31
|
-
but required by the main agent, fill it in by manual inspection of the project.
|
|
32
|
-
|
|
33
|
-
## Execution steps
|
|
34
|
-
|
|
35
|
-
1. **Call `gather-workspace-data`** with the project's workspace path.
|
|
36
|
-
This is always your first action. It returns a structured snapshot of
|
|
37
|
-
`package.json`, metro/babel config text, `app.json`, `eas.json`, `tsconfig`,
|
|
38
|
-
platform directories, lockfile type, `.env` key names, CLI tool versions,
|
|
39
|
-
`scripts/` listing, husky hooks, CI config, Makefile targets, and config
|
|
40
|
-
file existence.
|
|
41
|
-
|
|
42
|
-
2. **Determine the project type.** From the snapshot, classify the project:
|
|
43
|
-
- `react-native` in `package.json` dependencies → React Native project
|
|
44
|
-
- `expo` in dependencies or `app.json` with `expo` key → Expo project
|
|
45
|
-
- `pubspec.yaml` present → Flutter project
|
|
46
|
-
- `ios/*.xcodeproj` or `ios/*.xcworkspace` without `react-native` → native iOS
|
|
47
|
-
- `android/build.gradle` or `android/build.gradle.kts` without `react-native` → native Android
|
|
48
|
-
- None of the above → classify based on what you find (web app, library, etc.)
|
|
49
|
-
|
|
50
|
-
3. **Explore beyond the snapshot.** Use Read, Glob, Grep, and Bash to fill
|
|
51
|
-
gaps the snapshot does not cover:
|
|
52
|
-
- Non-obvious `scripts/` directory contents and what each script does.
|
|
53
|
-
- CI workflow files (`.github/workflows/*.yml`) to understand what "passing" means.
|
|
54
|
-
- Custom Makefile or Fastfile targets.
|
|
55
|
-
- `package.json` scripts beyond `start`/`test`: look for `check`, `verify`,
|
|
56
|
-
`ci`, `precommit`, `prepush`, flavors, and env-specific variants.
|
|
57
|
-
- `.husky/` hook contents to understand pre-commit/pre-push validation.
|
|
58
|
-
- `lint-staged` config to understand what runs on commit.
|
|
59
|
-
- Monorepo indicators: `workspaces` in root `package.json`, `turbo.json`,
|
|
60
|
-
`nx.json`, `lerna.json`.
|
|
61
|
-
- README or CONTRIBUTING docs that describe build/run/test workflows.
|
|
62
|
-
- Storybook config (`.storybook/`), Detox config (`.detoxrc.js`), Maestro
|
|
63
|
-
flows (`.maestro/`).
|
|
64
|
-
- For Flutter: `pubspec.yaml`, `analysis_options.yaml`, `lib/` structure.
|
|
65
|
-
- For native iOS: Xcode project/workspace, schemes, `Podfile`, `Package.swift`.
|
|
66
|
-
- For native Android: `build.gradle` / `build.gradle.kts`, `settings.gradle` / `settings.gradle.kts`, flavor configs.
|
|
67
|
-
|
|
68
|
-
4. **Populate every field** in the output schema below. Use `null` for
|
|
69
|
-
genuinely unknown values or fields that do not apply to this project type.
|
|
70
|
-
Prefer concrete commands over generic ones (e.g. `yarn start:local` over
|
|
71
|
-
`npx react-native start` if the project defines a custom script).
|
|
72
|
-
|
|
73
|
-
5. **Return the JSON block**: no prose, no markdown fences, no
|
|
74
|
-
explanation. The main agent parses your entire response as JSON.
|
|
75
|
-
|
|
76
|
-
## Output schema
|
|
77
|
-
|
|
78
|
-
Return a JSON object with these top-level fields:
|
|
79
|
-
|
|
80
|
-
| Field | Type | Description |
|
|
81
|
-
| ------------------------------------- | ------------ | --------------------------------------------------------------------------------------------- |
|
|
82
|
-
| `project_type` | string | `react-native`, `expo`, `flutter`, `native-ios`, `native-android`, `web`, `monorepo`, `other` |
|
|
83
|
-
| `project_type_details` | string | Short human-readable stack summary |
|
|
84
|
-
| `is_react_native` | bool | `react-native` in deps |
|
|
85
|
-
| `is_ios` / `is_android` | bool | Platform directories exist |
|
|
86
|
-
| `is_expo` / `is_web` / `is_flutter` | bool | Framework detection flags |
|
|
87
|
-
| `is_native_ios` / `is_native_android` | bool | Native without cross-platform framework |
|
|
88
|
-
| `startup_commands` | array | `[{ command, context }]`: concrete dev server start commands |
|
|
89
|
-
| `build_commands` | array | `[{ command, platform, context }]`: build commands per platform |
|
|
90
|
-
| `argent_workflow` | object | `{ start_dev_server, build_ios, build_android, notes }`: exact commands for Argent |
|
|
91
|
-
| `ios_has_podfile` | bool | True when `ios/Podfile` exists |
|
|
92
|
-
| `android_has_gradle` | bool | True when `android/gradlew` exists |
|
|
93
|
-
| `configs` | object | Paths to metro, babel, app, tsconfig, pubspec, xcode, gradle configs (`null` if absent) |
|
|
94
|
-
| `metro_port` | number\|null | From config or default 8081; `null` for non-RN |
|
|
95
|
-
| `env_resolution` | object | `{ env_files, strategy, notes }` |
|
|
96
|
-
| `key_packages` | object | Major dependencies with versions |
|
|
97
|
-
| `package_json` | object | `{ name, version, scripts_summary }` |
|
|
98
|
-
| `bundler` | string\|null | `metro`, `webpack`, etc. |
|
|
99
|
-
| `terminal_tools` | object | `{ package_manager, pod_available, expo_cli, eas_cli }` |
|
|
100
|
-
| `cloud_build` | object | `{ eas, eas_profiles }` or other CI/CD |
|
|
101
|
-
| `quality_control` | object | Linting, formatting, type checking, unit tests, e2e tests, feedback loop tools |
|
|
102
|
-
| `additional_notes` | string | Anything relevant not covered above |
|
|
103
|
-
| `needs_user_input` | bool | True if critical info is missing |
|
|
104
|
-
| `missing_information` | array | List of things you couldn't determine |
|
|
105
|
-
| `inspected_at` | string | ISO 8601 timestamp |
|
|
106
|
-
|
|
107
|
-
For the `quality_control` field structure, see `references/quality-control-checklist.md`.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
## Quality control checklist
|
|
2
|
-
|
|
3
|
-
The `quality_control` field in the output JSON must follow this structure:
|
|
4
|
-
|
|
5
|
-
```json
|
|
6
|
-
{
|
|
7
|
-
"linting": { "eslint": bool, "eslint_config": "path", "run_command": "cmd", "fix_command": "cmd" },
|
|
8
|
-
"formatting": { "prettier": bool, "prettier_config": "path", "run_command": "cmd" },
|
|
9
|
-
"type_checking": { "typescript": bool, "strict_mode": bool, "run_command": "cmd" },
|
|
10
|
-
"unit_tests": { "jest": bool, "jest_config": "path", "run_command": "cmd", "watch_command": "cmd", "coverage_command": "cmd" },
|
|
11
|
-
"e2e_tests": { "detox": bool, "maestro": bool, "xctest": bool, "flutter_integration_test": bool },
|
|
12
|
-
"feedback_loop_tools": { "metro_hot_reload": bool, "flutter_hot_reload": bool, "react_devtools": bool, "flipper": bool, "storybook": bool, "notes": "string" }
|
|
13
|
-
}
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Look for these beyond the obvious lint/test configs, regardless of project type:
|
|
17
|
-
|
|
18
|
-
**Immediate feedback tools (agent can trigger during a task):**
|
|
19
|
-
|
|
20
|
-
- `tsc --noEmit`: instant type error feedback after edits (TypeScript projects)
|
|
21
|
-
- `eslint --fix` / `swiftlint` / `ktlint`: auto-fixable lint errors
|
|
22
|
-
- `jest --testPathPattern <file>`: single test file (JS/TS projects)
|
|
23
|
-
- `dart analyze`: static analysis (Flutter projects)
|
|
24
|
-
- `flutter test <file>`: single test file (Flutter projects)
|
|
25
|
-
- `yarn test --watch` / `flutter test --watch`: reactive test runner
|
|
26
|
-
- Metro hot reload (via `debugger-reload-metro` Argent tool, RN only)
|
|
27
|
-
- Flutter hot reload / hot restart
|
|
28
|
-
|
|
29
|
-
**Slower validation tools (agent runs at end of a task):**
|
|
30
|
-
|
|
31
|
-
- Full test suite run (`jest`, `flutter test`, `xcodebuild test`, `gradle test`)
|
|
32
|
-
- E2E: Detox, Maestro, XCUITest, Espresso, Flutter integration tests
|
|
33
|
-
- `eas build --local` / `flutter build` / `xcodebuild` for native validation
|
|
34
|
-
|
|
35
|
-
**Indicators to check (all project types):**
|
|
36
|
-
|
|
37
|
-
- `scripts/` directory at project root: often contains custom validation scripts
|
|
38
|
-
- `Makefile` / `Fastfile` targets: look for `lint`, `test`, `typecheck`, `check`, `validate`
|
|
39
|
-
- `package.json` scripts named `check`, `verify`, `ci`, `precommit`, `prepush`
|
|
40
|
-
- `.husky/` directory: which hooks run and what they execute
|
|
41
|
-
- `lint-staged` config: what runs on commit
|
|
42
|
-
- CI config files: the CI steps are ground truth for what "passing" means
|
|
43
|
-
- `Podfile` / `Package.swift`: iOS dependency management
|
|
44
|
-
- `build.gradle` / `build.gradle.kts` / `settings.gradle` / `settings.gradle.kts`: Android build config and flavor definitions (Groovy or Kotlin DSL)
|
|
45
|
-
- `pubspec.yaml` / `analysis_options.yaml`: Flutter project config and lint rules
|