@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.
Files changed (61) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/LICENSE +21 -0
  3. package/README.md +143 -0
  4. package/bin/farmslot-adapter-rn.mjs +10 -0
  5. package/dist/agent-device-ui-transport.d.ts +88 -0
  6. package/dist/agent-device-ui-transport.d.ts.map +1 -0
  7. package/dist/agent-device-ui-transport.js +1148 -0
  8. package/dist/agent-device-ui-transport.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +169 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/constants.d.ts +6 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +6 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/doctor.d.ts +17 -0
  18. package/dist/doctor.d.ts.map +1 -0
  19. package/dist/doctor.js +125 -0
  20. package/dist/doctor.js.map +1 -0
  21. package/dist/index.d.ts +8 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +8 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/json.d.ts +2 -0
  26. package/dist/json.d.ts.map +1 -0
  27. package/dist/json.js +5 -0
  28. package/dist/json.js.map +1 -0
  29. package/dist/metro-recipe-bridge-transport.d.ts +12 -0
  30. package/dist/metro-recipe-bridge-transport.d.ts.map +1 -0
  31. package/dist/metro-recipe-bridge-transport.js +63 -0
  32. package/dist/metro-recipe-bridge-transport.js.map +1 -0
  33. package/dist/redaction.d.ts +3 -0
  34. package/dist/redaction.d.ts.map +1 -0
  35. package/dist/redaction.js +57 -0
  36. package/dist/redaction.js.map +1 -0
  37. package/dist/runner.d.ts +20 -0
  38. package/dist/runner.d.ts.map +1 -0
  39. package/dist/runner.js +270 -0
  40. package/dist/runner.js.map +1 -0
  41. package/dist/scaffold.d.ts +14 -0
  42. package/dist/scaffold.d.ts.map +1 -0
  43. package/dist/scaffold.js +82 -0
  44. package/dist/scaffold.js.map +1 -0
  45. package/dist/simctl-video-recorder.d.ts +6 -0
  46. package/dist/simctl-video-recorder.d.ts.map +1 -0
  47. package/dist/simctl-video-recorder.js +160 -0
  48. package/dist/simctl-video-recorder.js.map +1 -0
  49. package/dist/version.d.ts +3 -0
  50. package/dist/version.d.ts.map +1 -0
  51. package/dist/version.js +11 -0
  52. package/dist/version.js.map +1 -0
  53. package/package.json +81 -0
  54. package/templates/scripts/agentic/recipe/README.md +15 -0
  55. package/templates/scripts/agentic/recipe/action-manifest.json +547 -0
  56. package/templates/scripts/agentic/recipe/action-manifest.with-bridge.json +599 -0
  57. package/templates/scripts/agentic/recipe/recipes/expo.config.recipe.json +37 -0
  58. package/templates/scripts/agentic/validate-recipe.sh +64 -0
  59. package/templates/src/farmslot/RecipeBridgeProvider.tsx +127 -0
  60. package/templates/src/farmslot/RecipeHud.tsx +138 -0
  61. 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
+ }