@swmansion/argent 0.32.0 → 0.32.1-next.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.
Files changed (57) hide show
  1. package/bin/argent-android-devtools-0.3.0.apk +0 -0
  2. package/bin/darwin/ax-service +0 -0
  3. package/bin/darwin/tvos-ax-service +0 -0
  4. package/bin/darwin/tvos-hid-daemon +0 -0
  5. package/bin/network-inspector/network-inspector.jar +0 -0
  6. package/bin/tcp/ax-service +0 -0
  7. package/dist/cli-cmds.mjs +1 -1
  8. package/dist/installer.mjs +7 -7
  9. package/dist/mcp-server.mjs +1 -1
  10. package/dist/tool-args.generated.d.ts +178 -178
  11. package/dist/tool-server.cjs +1281 -1459
  12. package/dylibs/libArgentInjectionBootstrap.dylib +0 -0
  13. package/dylibs/libKeyboardPatch.dylib +0 -0
  14. package/dylibs/libNativeDevtoolsIos.dylib +0 -0
  15. package/dylibs/tcp/libArgentInjectionBootstrap.dylib +0 -0
  16. package/dylibs/tcp/libKeyboardPatch.dylib +0 -0
  17. package/dylibs/tcp/libNativeDevtoolsIos.dylib +0 -0
  18. package/dylibs/tvos/libArgentInjectionBootstrap.dylib +0 -0
  19. package/dylibs/tvos/libKeyboardPatch.dylib +0 -0
  20. package/dylibs/tvos/libNativeDevtoolsIos.dylib +0 -0
  21. package/package.json +1 -1
  22. package/rules/argent.md +19 -183
  23. package/skills/argent-android-emulator-setup/SKILL.md +5 -13
  24. package/skills/argent-create-e2e/SKILL.md +1 -1
  25. package/skills/argent-create-e2e/references/e2e-yaml.md +12 -17
  26. package/skills/argent-create-e2e/references/live-authoring.md +25 -65
  27. package/skills/argent-create-e2e/references/reliability-and-recovery.md +8 -8
  28. package/skills/argent-device-interact/SKILL.md +65 -367
  29. package/skills/argent-device-interact/references/chromium.md +4 -19
  30. package/skills/argent-device-interact/references/foldables.md +8 -0
  31. package/skills/argent-device-interact/references/harmonyos.md +13 -50
  32. package/skills/argent-ios-device-interact/SKILL.md +0 -1
  33. package/skills/argent-ios-device-setup/SKILL.md +1 -1
  34. package/skills/argent-ios-simulator-setup/SKILL.md +3 -9
  35. package/skills/argent-lens/SKILL.md +20 -75
  36. package/skills/argent-metro-debugger/SKILL.md +35 -101
  37. package/skills/argent-native-profiler/SKILL.md +23 -92
  38. package/skills/argent-qa-e2e/SKILL.md +5 -5
  39. package/skills/argent-react-native-app-workflow/SKILL.md +34 -203
  40. package/skills/argent-react-native-optimization/SKILL.md +10 -26
  41. package/skills/argent-react-native-optimization/references/fix-reference.md +11 -11
  42. package/skills/argent-react-native-optimization/references/lint-rules.md +4 -5
  43. package/skills/argent-react-native-optimization/references/semantic-checklist.md +2 -2
  44. package/skills/argent-react-native-profiler/SKILL.md +46 -110
  45. package/skills/argent-screen-recording/SKILL.md +18 -37
  46. package/skills/argent-screenshot-diff/SKILL.md +8 -52
  47. package/skills/argent-settings-permissions/SKILL.md +15 -117
  48. package/skills/argent-test-ui-flow/SKILL.md +20 -90
  49. package/skills/argent-tv-interact/SKILL.md +9 -34
  50. package/skills/argent-tv-interact/references/vega.md +23 -0
  51. package/agents/argent-environment-inspector.md +0 -107
  52. package/agents/references/quality-control-checklist.md +0 -45
  53. package/skills/argent-device-interact/references/gesture-examples.md +0 -114
  54. package/skills/argent-device-interact/references/secrets.md +0 -23
  55. package/skills/argent-metro-debugger/references/failure-scenarios.md +0 -14
  56. package/skills/argent-metro-debugger/references/source-maps.md +0 -27
  57. 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
- ## What this tool is for
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
- Decide with this order. The first matching row wins.
10
+ The first matching row wins.
15
11
 
16
- | Situation | Do this | Why |
17
- | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
18
- | 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`) - do NOT use this tool | It's real user behavior and exercises the flow you're testing. See `argent-device-interact`. |
19
- | The app is **about to ask** (or just asked) and the system **permission dialog is on screen** | **Tap the dialog** (`Allow` / `Don't Allow` / `Allow While Using App`) - do NOT use this tool | The app-triggered prompt is the natural path; answering it is what a user does. `describe` exposes the dialog buttons; fall back to `screenshot` only if it doesn't. |
20
- | You need the permission **already granted/denied before the app runs**, so no dialog interrupts the flow | **Use this tool** (`grant` / `deny`) before `launch-app` | The app can't pre-set its own permission; a real user would do it in Settings. This is the core use case. (`deny` suppresses the prompt on **iOS only** - see Gotchas.) |
21
- | The user **already denied** it and you need it **on** again | **Use this tool** (`grant`) | iOS never re-shows a dialog once denied - the only in-device path is the Settings app. This tool is the shortcut. |
22
- | You need the **first-run dialog to appear again** (test the prompt itself, or reset dirty state) | **Use this tool** (`reset`) | Returns the permission to "not yet asked" so the app prompts on next use. |
23
- | The permission is **not one this tool supports** on the target platform (see the support table) | **Do NOT use this tool** | It will return an "unsupported" error. Use the app dialog if the app triggers one, or navigate the real Settings app. |
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
- - **Changing a permission can terminate a running app** (system behavior on both platforms). Prefer setting permissions **before** `launch-app`; if you change one while the app is running, `restart-app` afterward.
82
- - **Reset is per-app on both platforms** - pass `bundleId`; there is no reliable device-wide reset.
83
- - **A partial Android result is normal.** `applied` lists what actually changed; `skipped` lists mapped permissions the package manager rejected (usually not in the manifest, or gated by API level). Both together tell you what happened.
84
- - **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.
85
- - **`camera` on iOS** may be rejected by a simulator **runtime** that doesn't model the service (it varies by simruntime, not by the installed Xcode - a runtime can accept `camera` even when the platform's own service list omits it). A rejection surfaces as a generic CoreSimulator error, so a `camera` failure (unless it's the shutdown-simulator case, which gets the boot hint instead) is reported with a hint about the runtime's supported services.
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
- ## Platform-agnostic
6
+ ## Before testing
7
7
 
8
- Physical iPhone (`kind: "device"`): read `argent-ios-device-interact` first. `launch-app` before anything; `describe` fails while the app is backgrounded.
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
- | Platform | Setup skill | Find devices with |
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
- All interactions go through argent MCP tools. Ensure the simulator/emulator is ready before starting.
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**: 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.
28
- 2. **Find target**: Before tapping, use a discovery tool to get element coordinates:
29
- - **React Native apps**: use `debugger-component-tree`: it returns component names with (tap: x,y) coordinates. This is the preferred tool for RN apps on either platform. To use it, resolve the `argent-react-native-app-workflow` skill for setup; on Android you must also run `adb -s <serial> reverse tcp:8081 tcp:8081` so Metro is reachable from the device, prefixed as the `list-devices` `hint` shows when it names an adb server.
30
- - **Standard app screens and in-app modals**: use `describe`. On iOS this returns the AX tree (falls back to native-devtools when AX is empty); on Android it returns the uiautomator tree in the same DescribeNode shape.
31
- - **Permission prompts / system modal overlays**: try `describe` first. Fall back to `screenshot` only if the 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 (pre-grant/deny before launch, re-enable a permission the user already denied, or reset it so the dialog reappears), use the `argent-settings-permissions` skill during setup instead of interacting with the dialog.
32
- - **Fallback**: use `screenshot` to estimate where the desired component is, then verify immediately after the action.
33
- 3. **Interact**: Perform the action (`gesture-tap`, `gesture-swipe`, `keyboard`, `button`, ...): you receive a screenshot automatically.
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. Note `debugger-log-registry` returns `{ status: "not_connected", reason, guidance }` with no log file when the debugger is unreachable; that is not evidence about the app; follow its `guidance` to reconnect, then re-verify.
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. Template
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 in `keyboard`, resolved server-side so the value never enters agent context. It comes from the `ARGENT_SECRET_<NAME>` environment variable or an argent secrets file (`.argent/secrets.env` in the project, `~/.argent/secrets.env`, or an `ARGENT_SECRET_`-prefixed key in the project's `.env` / `.env.local`); over a link with `forward-secrets` on, the client's own sources come first. If the name is not defined, the failure lists the available names and every path it checked; ask the user to add it to one of those files (which applies immediately) instead of pasting the secret into the conversation. Never invent credentials or echo secret values into reports or saved files.
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
- - If a screen is mid-transition or loading: block until it settles with `await-ui-element` (wait for the target element to be `visible`, or the spinner/placeholder to be `hidden`) instead of a blind fixed delay, then re-check. Fall back to a fixed wait + `screenshot` only when no element reliably marks the transition.
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
- ## Tips
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
- - **Wait on the UI, don't poll.** When a step needs the screen to change first, gate it with `await-ui-element` (block until an element is `visible`/`hidden` or contains `text`) rather than repeated `screenshot` calls with fixed sleeps. See the `await-ui-element` section of `argent-device-interact`.
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
- - `describe {udid}`: focus view: the focused / `[selected]` element + focusable elements with labels and normalized frames. Call before and after navigating. Empty tree → see the per-platform notes.
23
- - `tv-remote {udid, button}`: D-pad / remote. `button` is one key **or a whole path** (run in one call). Keys: `up`/`down`/`left`/`right`, `select`, `back`, `menu`, `home`, `playPause`, plus media keys `rewind`/`fastForward`/`next`/`previous`/`volumeUp`/`volumeDown`/`mute`. Single: `{button:"down"}`; repeat: `{button:"down", repeat:3}`; path: `{button:["up","right","select"]}`.
24
- - `keyboard {udid, text}`: type into the focused field (focus it with `tv-remote` first). One call carries `text` or `key`, never both; to type and then press a key, send two `keyboard` steps in one `run-sequence`. Named `key` presses (e.g. `{key:"enter"}`) work on Vega; on Apple TV / Android TV move focus with `tv-remote` instead.
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). Give the RN bundle a few seconds to render before the first `describe`.
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
- - **`describe` may report zero focusables on a screen with visible tiles**: many `react-native-tvos` screens use RN's own focus engine, invisible to the OS accessibility tree. `describe` auto-falls-back to the full UI tree (and says so in the hint); `tv-remote` still moves focus, so drive blind + `screenshot` to confirm.
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; start Metro and port-forward yourself (any platform). Metro is fixed on **:8081**.
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:** build/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.
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