@farmslot/adapter-rn 0.15.0
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/CHANGELOG.md +117 -0
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/bin/farmslot-adapter-rn.mjs +10 -0
- package/dist/agent-device-ui-transport.d.ts +88 -0
- package/dist/agent-device-ui-transport.d.ts.map +1 -0
- package/dist/agent-device-ui-transport.js +1148 -0
- package/dist/agent-device-ui-transport.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +169 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/doctor.d.ts +17 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +125 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +2 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +5 -0
- package/dist/json.js.map +1 -0
- package/dist/metro-recipe-bridge-transport.d.ts +12 -0
- package/dist/metro-recipe-bridge-transport.d.ts.map +1 -0
- package/dist/metro-recipe-bridge-transport.js +63 -0
- package/dist/metro-recipe-bridge-transport.js.map +1 -0
- package/dist/redaction.d.ts +3 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +57 -0
- package/dist/redaction.js.map +1 -0
- package/dist/runner.d.ts +20 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +270 -0
- package/dist/runner.js.map +1 -0
- package/dist/scaffold.d.ts +14 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +82 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/simctl-video-recorder.d.ts +6 -0
- package/dist/simctl-video-recorder.d.ts.map +1 -0
- package/dist/simctl-video-recorder.js +160 -0
- package/dist/simctl-video-recorder.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +81 -0
- package/templates/scripts/agentic/recipe/README.md +15 -0
- package/templates/scripts/agentic/recipe/action-manifest.json +547 -0
- package/templates/scripts/agentic/recipe/action-manifest.with-bridge.json +599 -0
- package/templates/scripts/agentic/recipe/recipes/expo.config.recipe.json +37 -0
- package/templates/scripts/agentic/validate-recipe.sh +64 -0
- package/templates/src/farmslot/RecipeBridgeProvider.tsx +127 -0
- package/templates/src/farmslot/RecipeHud.tsx +138 -0
- package/templates/src/farmslot/index.ts +11 -0
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://farmslot.io/schemas/action-manifest-v1.schema.json",
|
|
3
|
+
"actions": {
|
|
4
|
+
"command": {
|
|
5
|
+
"description": "Run a project-local command during setup, diagnostics, or headless proof. Prefer UI actions only when the recipe must prove visible interaction.",
|
|
6
|
+
"schema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"cmd": {
|
|
10
|
+
"type": "string"
|
|
11
|
+
},
|
|
12
|
+
"timeout_ms": {
|
|
13
|
+
"type": "integer"
|
|
14
|
+
},
|
|
15
|
+
"cwd": {
|
|
16
|
+
"type": "string"
|
|
17
|
+
},
|
|
18
|
+
"allow_failure": {
|
|
19
|
+
"type": "boolean"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"required": ["cmd"],
|
|
23
|
+
"additionalProperties": false
|
|
24
|
+
},
|
|
25
|
+
"examples": [
|
|
26
|
+
{
|
|
27
|
+
"action": "command",
|
|
28
|
+
"intent": "Prepare the project state needed for this proof.",
|
|
29
|
+
"cmd": "true",
|
|
30
|
+
"next": "done"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"assert_output": {
|
|
35
|
+
"description": "Assert stdout or stderr from a previous command node.",
|
|
36
|
+
"schema": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"properties": {
|
|
39
|
+
"source": {
|
|
40
|
+
"type": "string"
|
|
41
|
+
},
|
|
42
|
+
"stream": {
|
|
43
|
+
"type": "string"
|
|
44
|
+
},
|
|
45
|
+
"contains": {
|
|
46
|
+
"type": "string"
|
|
47
|
+
},
|
|
48
|
+
"match": {
|
|
49
|
+
"type": "string"
|
|
50
|
+
},
|
|
51
|
+
"assert": {
|
|
52
|
+
"type": "object",
|
|
53
|
+
"additionalProperties": true
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"required": ["source"],
|
|
57
|
+
"additionalProperties": false
|
|
58
|
+
},
|
|
59
|
+
"examples": [
|
|
60
|
+
{
|
|
61
|
+
"action": "assert_output",
|
|
62
|
+
"intent": "Confirm the recorded output satisfies the requested condition.",
|
|
63
|
+
"source": "command",
|
|
64
|
+
"contains": "ready",
|
|
65
|
+
"next": "done"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"wait": {
|
|
70
|
+
"description": "Pause briefly for asynchronous setup work. Keep waits short and prefer deterministic assertions.",
|
|
71
|
+
"schema": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"properties": {
|
|
74
|
+
"duration_ms": {
|
|
75
|
+
"type": "integer"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"required": ["duration_ms"],
|
|
79
|
+
"additionalProperties": false
|
|
80
|
+
},
|
|
81
|
+
"examples": [
|
|
82
|
+
{
|
|
83
|
+
"action": "wait",
|
|
84
|
+
"intent": "Allow the requested asynchronous state to settle.",
|
|
85
|
+
"duration_ms": 1,
|
|
86
|
+
"next": "done"
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
"ui.press": {
|
|
91
|
+
"description": "Press a native accessibility target on the assigned simulator or device.",
|
|
92
|
+
"schema": {
|
|
93
|
+
"type": "object",
|
|
94
|
+
"properties": {
|
|
95
|
+
"test_id": {
|
|
96
|
+
"type": "string"
|
|
97
|
+
},
|
|
98
|
+
"text": {
|
|
99
|
+
"type": "string"
|
|
100
|
+
},
|
|
101
|
+
"selector": {
|
|
102
|
+
"type": "string"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"additionalProperties": false
|
|
106
|
+
},
|
|
107
|
+
"examples": [
|
|
108
|
+
{
|
|
109
|
+
"action": "ui.press",
|
|
110
|
+
"intent": "Activate the requested visible control.",
|
|
111
|
+
"test_id": "example-control",
|
|
112
|
+
"next": "done"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
"ui.key_press": {
|
|
117
|
+
"description": "Send Back through native navigation, or Escape, Enter, or Return to the visible native keyboard, then wait for the resulting UI transition. Keyboard actions fail when no visible keyboard accepts them.",
|
|
118
|
+
"adapters": ["android", "ios"],
|
|
119
|
+
"schema": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"properties": {
|
|
122
|
+
"key": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"enum": ["Back", "Escape", "Enter", "Return"]
|
|
125
|
+
},
|
|
126
|
+
"settle": {
|
|
127
|
+
"type": "boolean"
|
|
128
|
+
},
|
|
129
|
+
"timeout_ms": {
|
|
130
|
+
"type": "integer",
|
|
131
|
+
"minimum": 1
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"required": ["key"],
|
|
135
|
+
"additionalProperties": false
|
|
136
|
+
},
|
|
137
|
+
"examples": [
|
|
138
|
+
{
|
|
139
|
+
"action": "ui.key_press",
|
|
140
|
+
"intent": "Continue the requested keyboard interaction.",
|
|
141
|
+
"key": "Enter",
|
|
142
|
+
"next": "done"
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
"ui.set_input": {
|
|
147
|
+
"description": "Set text on a native input. Android recipes must provide test_id so the replacement can be verified from the native snapshot. Values remain part of retained recipe artifacts, so recipes must not contain secrets.",
|
|
148
|
+
"schema": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"properties": {
|
|
151
|
+
"test_id": {
|
|
152
|
+
"type": "string"
|
|
153
|
+
},
|
|
154
|
+
"value": {
|
|
155
|
+
"type": "string"
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"additionalProperties": false
|
|
159
|
+
},
|
|
160
|
+
"examples": [
|
|
161
|
+
{
|
|
162
|
+
"action": "ui.set_input",
|
|
163
|
+
"intent": "Provide the requested value in the visible form.",
|
|
164
|
+
"test_id": "example-input",
|
|
165
|
+
"value": "example",
|
|
166
|
+
"next": "done"
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
"ui.scroll": {
|
|
171
|
+
"description": "Scroll the assigned native simulator or device and wait for stability.",
|
|
172
|
+
"schema": {
|
|
173
|
+
"type": "object",
|
|
174
|
+
"additionalProperties": false
|
|
175
|
+
},
|
|
176
|
+
"examples": [
|
|
177
|
+
{
|
|
178
|
+
"action": "ui.scroll",
|
|
179
|
+
"intent": "Expose the requested content for visible review.",
|
|
180
|
+
"next": "done"
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
"ui.swipe": {
|
|
185
|
+
"description": "Swipe from a test-id target or explicit screen coordinates in one cardinal direction.",
|
|
186
|
+
"adapters": ["android", "ios"],
|
|
187
|
+
"schema": {
|
|
188
|
+
"type": "object",
|
|
189
|
+
"properties": {
|
|
190
|
+
"target": {
|
|
191
|
+
"type": ["string", "object"],
|
|
192
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
193
|
+
"required": ["x", "y"],
|
|
194
|
+
"additionalProperties": false
|
|
195
|
+
},
|
|
196
|
+
"direction": { "type": "string", "enum": ["up", "down", "left", "right"] },
|
|
197
|
+
"distance": { "type": "number", "minimum": 1 },
|
|
198
|
+
"duration_ms": { "type": "integer", "minimum": 1 },
|
|
199
|
+
"timeout_ms": { "type": "integer", "minimum": 1 },
|
|
200
|
+
"settle": { "type": "boolean" }
|
|
201
|
+
},
|
|
202
|
+
"required": ["target", "direction", "distance", "duration_ms"],
|
|
203
|
+
"additionalProperties": false
|
|
204
|
+
},
|
|
205
|
+
"examples": [
|
|
206
|
+
{
|
|
207
|
+
"action": "ui.swipe",
|
|
208
|
+
"intent": "Swipe the requested visible surface.",
|
|
209
|
+
"target": "example-scrollable",
|
|
210
|
+
"direction": "up",
|
|
211
|
+
"distance": 240,
|
|
212
|
+
"duration_ms": 300,
|
|
213
|
+
"next": "done"
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
},
|
|
217
|
+
"ui.pan": {
|
|
218
|
+
"description": "Stream a continuous pointer path from a test-id target or explicit screen coordinates. Native adapters accept one path point or delta.",
|
|
219
|
+
"adapters": ["android", "ios"],
|
|
220
|
+
"schema": {
|
|
221
|
+
"type": "object",
|
|
222
|
+
"properties": {
|
|
223
|
+
"target": {
|
|
224
|
+
"type": ["string", "object"],
|
|
225
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
226
|
+
"required": ["x", "y"],
|
|
227
|
+
"additionalProperties": false
|
|
228
|
+
},
|
|
229
|
+
"path": {
|
|
230
|
+
"type": "array",
|
|
231
|
+
"minItems": 1,
|
|
232
|
+
"items": {
|
|
233
|
+
"type": "object",
|
|
234
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
235
|
+
"required": ["x", "y"],
|
|
236
|
+
"additionalProperties": false
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
"delta": {
|
|
240
|
+
"type": "object",
|
|
241
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
242
|
+
"required": ["x", "y"],
|
|
243
|
+
"additionalProperties": false
|
|
244
|
+
},
|
|
245
|
+
"duration_ms": { "type": "integer", "minimum": 1 },
|
|
246
|
+
"timeout_ms": { "type": "integer", "minimum": 1 },
|
|
247
|
+
"settle": { "type": "boolean" }
|
|
248
|
+
},
|
|
249
|
+
"required": ["target", "duration_ms"],
|
|
250
|
+
"additionalProperties": false
|
|
251
|
+
},
|
|
252
|
+
"adapter_schemas": {
|
|
253
|
+
"android": {
|
|
254
|
+
"type": "object",
|
|
255
|
+
"properties": {
|
|
256
|
+
"path": {
|
|
257
|
+
"type": "array",
|
|
258
|
+
"maxItems": 1,
|
|
259
|
+
"items": { "type": "object", "additionalProperties": true }
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
"additionalProperties": true
|
|
263
|
+
},
|
|
264
|
+
"ios": {
|
|
265
|
+
"type": "object",
|
|
266
|
+
"properties": {
|
|
267
|
+
"path": {
|
|
268
|
+
"type": "array",
|
|
269
|
+
"maxItems": 1,
|
|
270
|
+
"items": { "type": "object", "additionalProperties": true }
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"additionalProperties": true
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
"examples": [
|
|
277
|
+
{
|
|
278
|
+
"action": "ui.pan",
|
|
279
|
+
"intent": "Pan through the requested pointer path.",
|
|
280
|
+
"target": "example-surface",
|
|
281
|
+
"path": [{ "x": 80, "y": 20 }],
|
|
282
|
+
"duration_ms": 400,
|
|
283
|
+
"next": "done"
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
},
|
|
287
|
+
"ui.drag": {
|
|
288
|
+
"description": "Drag a grabbable test-id target or explicit screen coordinate. Native adapters accept one path point or delta.",
|
|
289
|
+
"adapters": ["android", "ios"],
|
|
290
|
+
"schema": {
|
|
291
|
+
"type": "object",
|
|
292
|
+
"properties": {
|
|
293
|
+
"target": {
|
|
294
|
+
"type": ["string", "object"],
|
|
295
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
296
|
+
"required": ["x", "y"],
|
|
297
|
+
"additionalProperties": false
|
|
298
|
+
},
|
|
299
|
+
"path": {
|
|
300
|
+
"type": "array",
|
|
301
|
+
"minItems": 1,
|
|
302
|
+
"items": {
|
|
303
|
+
"type": "object",
|
|
304
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
305
|
+
"required": ["x", "y"],
|
|
306
|
+
"additionalProperties": false
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
"delta": {
|
|
310
|
+
"type": "object",
|
|
311
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
312
|
+
"required": ["x", "y"],
|
|
313
|
+
"additionalProperties": false
|
|
314
|
+
},
|
|
315
|
+
"duration_ms": { "type": "integer", "minimum": 1 },
|
|
316
|
+
"timeout_ms": { "type": "integer", "minimum": 1 },
|
|
317
|
+
"settle": { "type": "boolean" }
|
|
318
|
+
},
|
|
319
|
+
"required": ["target", "duration_ms"],
|
|
320
|
+
"additionalProperties": false
|
|
321
|
+
},
|
|
322
|
+
"adapter_schemas": {
|
|
323
|
+
"android": {
|
|
324
|
+
"type": "object",
|
|
325
|
+
"properties": {
|
|
326
|
+
"path": {
|
|
327
|
+
"type": "array",
|
|
328
|
+
"maxItems": 1,
|
|
329
|
+
"items": { "type": "object", "additionalProperties": true }
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
"additionalProperties": true
|
|
333
|
+
},
|
|
334
|
+
"ios": {
|
|
335
|
+
"type": "object",
|
|
336
|
+
"properties": {
|
|
337
|
+
"path": {
|
|
338
|
+
"type": "array",
|
|
339
|
+
"maxItems": 1,
|
|
340
|
+
"items": { "type": "object", "additionalProperties": true }
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"additionalProperties": true
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
"examples": [
|
|
347
|
+
{
|
|
348
|
+
"action": "ui.drag",
|
|
349
|
+
"intent": "Drag the requested control to a new value.",
|
|
350
|
+
"target": "example-slider",
|
|
351
|
+
"delta": { "x": 120, "y": 0 },
|
|
352
|
+
"duration_ms": 500,
|
|
353
|
+
"next": "done"
|
|
354
|
+
}
|
|
355
|
+
]
|
|
356
|
+
},
|
|
357
|
+
"ui.long_press": {
|
|
358
|
+
"description": "Hold a test-id target or explicit screen coordinate for a bounded duration.",
|
|
359
|
+
"adapters": ["android", "ios"],
|
|
360
|
+
"schema": {
|
|
361
|
+
"type": "object",
|
|
362
|
+
"properties": {
|
|
363
|
+
"target": {
|
|
364
|
+
"type": ["string", "object"],
|
|
365
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } },
|
|
366
|
+
"required": ["x", "y"],
|
|
367
|
+
"additionalProperties": false
|
|
368
|
+
},
|
|
369
|
+
"hold_ms": { "type": "integer", "minimum": 1 },
|
|
370
|
+
"timeout_ms": { "type": "integer", "minimum": 1 },
|
|
371
|
+
"settle": { "type": "boolean" }
|
|
372
|
+
},
|
|
373
|
+
"required": ["target", "hold_ms"],
|
|
374
|
+
"additionalProperties": false
|
|
375
|
+
},
|
|
376
|
+
"examples": [
|
|
377
|
+
{
|
|
378
|
+
"action": "ui.long_press",
|
|
379
|
+
"intent": "Hold the requested visible control.",
|
|
380
|
+
"target": "example-control",
|
|
381
|
+
"hold_ms": 700,
|
|
382
|
+
"next": "done"
|
|
383
|
+
}
|
|
384
|
+
]
|
|
385
|
+
},
|
|
386
|
+
"ui.wait_for": {
|
|
387
|
+
"description": "Wait for native accessibility content and UI stability.",
|
|
388
|
+
"schema": {
|
|
389
|
+
"type": "object",
|
|
390
|
+
"properties": {
|
|
391
|
+
"text_contains": {
|
|
392
|
+
"type": "array",
|
|
393
|
+
"items": {
|
|
394
|
+
"type": "string"
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
"timeout_ms": {
|
|
398
|
+
"type": "integer"
|
|
399
|
+
},
|
|
400
|
+
"text": {
|
|
401
|
+
"type": "string"
|
|
402
|
+
},
|
|
403
|
+
"target": {
|
|
404
|
+
"type": "string"
|
|
405
|
+
},
|
|
406
|
+
"test_id": {
|
|
407
|
+
"type": "string"
|
|
408
|
+
},
|
|
409
|
+
"visible": {
|
|
410
|
+
"type": "boolean"
|
|
411
|
+
},
|
|
412
|
+
"event": {
|
|
413
|
+
"type": "string"
|
|
414
|
+
},
|
|
415
|
+
"selector": {
|
|
416
|
+
"type": "string"
|
|
417
|
+
},
|
|
418
|
+
"expected": {
|
|
419
|
+
"type": "string"
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
"additionalProperties": false
|
|
423
|
+
},
|
|
424
|
+
"examples": [
|
|
425
|
+
{
|
|
426
|
+
"action": "ui.wait_for",
|
|
427
|
+
"intent": "Confirm the requested application state is visible.",
|
|
428
|
+
"test_id": "example-control",
|
|
429
|
+
"visible": true,
|
|
430
|
+
"next": "done"
|
|
431
|
+
}
|
|
432
|
+
]
|
|
433
|
+
},
|
|
434
|
+
"ui.screenshot": {
|
|
435
|
+
"description": "Capture the assigned native simulator or device into the artifact package.",
|
|
436
|
+
"schema": {
|
|
437
|
+
"type": "object",
|
|
438
|
+
"properties": {
|
|
439
|
+
"path": {
|
|
440
|
+
"type": "string"
|
|
441
|
+
},
|
|
442
|
+
"label": {
|
|
443
|
+
"type": "string"
|
|
444
|
+
},
|
|
445
|
+
"claims": {
|
|
446
|
+
"type": "object",
|
|
447
|
+
"properties": {
|
|
448
|
+
"must_show": {
|
|
449
|
+
"type": "array",
|
|
450
|
+
"items": {
|
|
451
|
+
"type": "string"
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
"must_not_show": {
|
|
455
|
+
"type": "array",
|
|
456
|
+
"items": {
|
|
457
|
+
"type": "string"
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
"additionalProperties": false
|
|
462
|
+
},
|
|
463
|
+
"covers": {
|
|
464
|
+
"type": "array",
|
|
465
|
+
"items": {
|
|
466
|
+
"type": "string"
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
"note": {
|
|
470
|
+
"type": "string"
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
"additionalProperties": false
|
|
474
|
+
},
|
|
475
|
+
"examples": [
|
|
476
|
+
{
|
|
477
|
+
"action": "ui.screenshot",
|
|
478
|
+
"intent": "Preserve the visible application state as review evidence.",
|
|
479
|
+
"label": "example-state",
|
|
480
|
+
"next": "done"
|
|
481
|
+
}
|
|
482
|
+
]
|
|
483
|
+
},
|
|
484
|
+
"ui.capture_surface": {
|
|
485
|
+
"description": "Capture the full current scrollable screen as one PNG. This action is opt-in; ui.screenshot remains viewport-only.",
|
|
486
|
+
"schema": {
|
|
487
|
+
"type": "object",
|
|
488
|
+
"properties": {
|
|
489
|
+
"path": { "type": "string" },
|
|
490
|
+
"label": { "type": "string" },
|
|
491
|
+
"surface_test_id": { "type": "string" },
|
|
492
|
+
"until_test_id": { "type": "string" },
|
|
493
|
+
"max_scrolls": { "type": "integer" },
|
|
494
|
+
"restore_position": { "type": "boolean" }
|
|
495
|
+
},
|
|
496
|
+
"additionalProperties": false
|
|
497
|
+
},
|
|
498
|
+
"examples": [
|
|
499
|
+
{
|
|
500
|
+
"action": "ui.capture_surface",
|
|
501
|
+
"intent": "Preserve the complete scrollable context for human review.",
|
|
502
|
+
"path": "screenshots/full-screen.png",
|
|
503
|
+
"surface_test_id": "screen-scroll-surface",
|
|
504
|
+
"until_test_id": "screen-bottom",
|
|
505
|
+
"next": "done"
|
|
506
|
+
}
|
|
507
|
+
]
|
|
508
|
+
},
|
|
509
|
+
"end": {
|
|
510
|
+
"description": "Terminate the recipe graph with pass, fail, or unknown.",
|
|
511
|
+
"examples": [
|
|
512
|
+
{
|
|
513
|
+
"action": "end",
|
|
514
|
+
"status": "pass"
|
|
515
|
+
}
|
|
516
|
+
]
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
"observers": [
|
|
520
|
+
{
|
|
521
|
+
"ref": "ui.screen",
|
|
522
|
+
"default_for": [
|
|
523
|
+
"ui.press",
|
|
524
|
+
"ui.set_input",
|
|
525
|
+
"ui.scroll",
|
|
526
|
+
"ui.swipe",
|
|
527
|
+
"ui.pan",
|
|
528
|
+
"ui.drag",
|
|
529
|
+
"ui.long_press",
|
|
530
|
+
"ui.wait_for"
|
|
531
|
+
]
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
"ref": "ui.visible",
|
|
535
|
+
"default_for": [
|
|
536
|
+
"ui.press",
|
|
537
|
+
"ui.set_input",
|
|
538
|
+
"ui.scroll",
|
|
539
|
+
"ui.swipe",
|
|
540
|
+
"ui.pan",
|
|
541
|
+
"ui.drag",
|
|
542
|
+
"ui.long_press",
|
|
543
|
+
"ui.wait_for"
|
|
544
|
+
]
|
|
545
|
+
}
|
|
546
|
+
]
|
|
547
|
+
}
|