adb-ready 0.1.2 → 0.2.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 +31 -1
- package/COMPATIBILITY.md +6 -0
- package/README.md +84 -39
- package/dist/cli.js +43066 -5950
- package/dist/cli.js.map +95 -17
- package/docs/agent-integration.md +204 -0
- package/docs/apps-and-evidence.md +157 -0
- package/docs/automation.md +6 -0
- package/docs/threat-model.md +85 -0
- package/docs/ui-automation.md +99 -0
- package/llms.txt +37 -0
- package/package.json +10 -1
- package/schema/agent-tools-v1.json +522 -0
- package/schema/config-v1.schema.json +22 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "ADB Ready agent tool contract",
|
|
3
|
+
"schemaVersion": 1,
|
|
4
|
+
"packageVersion": "0.2.0",
|
|
5
|
+
"protocolVersion": "2025-11-25",
|
|
6
|
+
"transport": "stdio",
|
|
7
|
+
"tools": [
|
|
8
|
+
{
|
|
9
|
+
"name": "capture_screenshot",
|
|
10
|
+
"description": "Capture a verified PNG inside the project without overwriting an existing file.",
|
|
11
|
+
"inputSchema": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
14
|
+
"properties": {
|
|
15
|
+
"out": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"minLength": 1
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"annotations": {
|
|
22
|
+
"readOnlyHint": false,
|
|
23
|
+
"destructiveHint": false,
|
|
24
|
+
"idempotentHint": false,
|
|
25
|
+
"openWorldHint": false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "compile_debug_context",
|
|
30
|
+
"description": "Compile bounded redacted context. Screenshots and UI text are excluded.",
|
|
31
|
+
"inputSchema": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
34
|
+
"properties": {
|
|
35
|
+
"sessionId": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"minLength": 1
|
|
38
|
+
},
|
|
39
|
+
"budget": {
|
|
40
|
+
"type": "integer",
|
|
41
|
+
"minimum": 1000,
|
|
42
|
+
"maximum": 100000
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"annotations": {
|
|
47
|
+
"readOnlyHint": true,
|
|
48
|
+
"destructiveHint": false,
|
|
49
|
+
"idempotentHint": true,
|
|
50
|
+
"openWorldHint": false
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "doctor",
|
|
55
|
+
"description": "Inspect the local runtime, ADB server, capabilities, and visible Android targets.",
|
|
56
|
+
"inputSchema": {
|
|
57
|
+
"type": "object",
|
|
58
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
59
|
+
"properties": {}
|
|
60
|
+
},
|
|
61
|
+
"annotations": {
|
|
62
|
+
"readOnlyHint": true,
|
|
63
|
+
"destructiveHint": false,
|
|
64
|
+
"idempotentHint": true,
|
|
65
|
+
"openWorldHint": false
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "ensure_ready",
|
|
70
|
+
"description": "Select exactly one ready Android target and bind it for this MCP connection.",
|
|
71
|
+
"inputSchema": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
74
|
+
"properties": {
|
|
75
|
+
"device": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"minLength": 1
|
|
78
|
+
},
|
|
79
|
+
"transportId": {
|
|
80
|
+
"type": "string",
|
|
81
|
+
"minLength": 1
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"annotations": {
|
|
86
|
+
"readOnlyHint": true,
|
|
87
|
+
"destructiveHint": false,
|
|
88
|
+
"idempotentHint": true,
|
|
89
|
+
"openWorldHint": false
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "get_session_problems",
|
|
94
|
+
"description": "Read structured problems from one saved local development session.",
|
|
95
|
+
"inputSchema": {
|
|
96
|
+
"type": "object",
|
|
97
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
98
|
+
"properties": {
|
|
99
|
+
"sessionId": {
|
|
100
|
+
"type": "string",
|
|
101
|
+
"minLength": 1
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"annotations": {
|
|
106
|
+
"readOnlyHint": true,
|
|
107
|
+
"destructiveHint": false,
|
|
108
|
+
"idempotentHint": true,
|
|
109
|
+
"openWorldHint": false
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"name": "inspect_app",
|
|
114
|
+
"description": "Return bounded sensitive app, foreground, and classified-log evidence without a screenshot.",
|
|
115
|
+
"inputSchema": {
|
|
116
|
+
"type": "object",
|
|
117
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
118
|
+
"properties": {
|
|
119
|
+
"applicationId": {
|
|
120
|
+
"type": "string",
|
|
121
|
+
"minLength": 3
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"annotations": {
|
|
126
|
+
"readOnlyHint": true,
|
|
127
|
+
"destructiveHint": false,
|
|
128
|
+
"idempotentHint": true,
|
|
129
|
+
"openWorldHint": false
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "inspect_ui",
|
|
134
|
+
"description": "Return a bounded sensitive accessibility snapshot with digest-scoped references.",
|
|
135
|
+
"inputSchema": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
138
|
+
"properties": {
|
|
139
|
+
"interactiveOnly": {
|
|
140
|
+
"type": "boolean"
|
|
141
|
+
},
|
|
142
|
+
"maxDepth": {
|
|
143
|
+
"type": "integer",
|
|
144
|
+
"minimum": 1,
|
|
145
|
+
"maximum": 100
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"annotations": {
|
|
150
|
+
"readOnlyHint": true,
|
|
151
|
+
"destructiveHint": false,
|
|
152
|
+
"idempotentHint": true,
|
|
153
|
+
"openWorldHint": false
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"name": "install_app",
|
|
158
|
+
"description": "Install one project-local APK and verify its package. Downloads and split APKs are rejected.",
|
|
159
|
+
"inputSchema": {
|
|
160
|
+
"type": "object",
|
|
161
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
162
|
+
"properties": {
|
|
163
|
+
"path": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"minLength": 1
|
|
166
|
+
},
|
|
167
|
+
"applicationId": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"minLength": 3
|
|
170
|
+
},
|
|
171
|
+
"replace": {
|
|
172
|
+
"type": "boolean"
|
|
173
|
+
},
|
|
174
|
+
"grantRuntimePermissions": {
|
|
175
|
+
"type": "boolean"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
"required": ["path"]
|
|
179
|
+
},
|
|
180
|
+
"annotations": {
|
|
181
|
+
"readOnlyHint": false,
|
|
182
|
+
"destructiveHint": false,
|
|
183
|
+
"idempotentHint": false,
|
|
184
|
+
"openWorldHint": false
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "launch_app",
|
|
189
|
+
"description": "Launch the resolved app and verify it is foreground.",
|
|
190
|
+
"inputSchema": {
|
|
191
|
+
"type": "object",
|
|
192
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
193
|
+
"properties": {
|
|
194
|
+
"applicationId": {
|
|
195
|
+
"type": "string",
|
|
196
|
+
"minLength": 3
|
|
197
|
+
},
|
|
198
|
+
"activity": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"minLength": 1
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
"annotations": {
|
|
205
|
+
"readOnlyHint": false,
|
|
206
|
+
"destructiveHint": false,
|
|
207
|
+
"idempotentHint": true,
|
|
208
|
+
"openWorldHint": false
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"name": "list_targets",
|
|
213
|
+
"description": "List Android targets without changing the connection's bound target.",
|
|
214
|
+
"inputSchema": {
|
|
215
|
+
"type": "object",
|
|
216
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
217
|
+
"properties": {}
|
|
218
|
+
},
|
|
219
|
+
"annotations": {
|
|
220
|
+
"readOnlyHint": true,
|
|
221
|
+
"destructiveHint": false,
|
|
222
|
+
"idempotentHint": true,
|
|
223
|
+
"openWorldHint": false
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"name": "long_press_ui",
|
|
228
|
+
"description": "Long-press a current digest-scoped UI ref or explicit display coordinate, then compare UI state.",
|
|
229
|
+
"inputSchema": {
|
|
230
|
+
"type": "object",
|
|
231
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
232
|
+
"properties": {
|
|
233
|
+
"target": {
|
|
234
|
+
"anyOf": [
|
|
235
|
+
{
|
|
236
|
+
"type": "object",
|
|
237
|
+
"properties": {
|
|
238
|
+
"ref": {
|
|
239
|
+
"type": "string",
|
|
240
|
+
"pattern": "^ui:[a-f0-9]{12}:\\d+$"
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"required": ["ref"]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"type": "object",
|
|
247
|
+
"properties": {
|
|
248
|
+
"x": {
|
|
249
|
+
"type": "integer",
|
|
250
|
+
"minimum": 0,
|
|
251
|
+
"maximum": 100000
|
|
252
|
+
},
|
|
253
|
+
"y": {
|
|
254
|
+
"type": "integer",
|
|
255
|
+
"minimum": 0,
|
|
256
|
+
"maximum": 100000
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
"required": ["x", "y"]
|
|
260
|
+
}
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
"dryRun": {
|
|
264
|
+
"type": "boolean"
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
"required": ["target"]
|
|
268
|
+
},
|
|
269
|
+
"annotations": {
|
|
270
|
+
"readOnlyHint": false,
|
|
271
|
+
"destructiveHint": false,
|
|
272
|
+
"idempotentHint": false,
|
|
273
|
+
"openWorldHint": false
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"name": "open_url",
|
|
278
|
+
"description": "Open an absolute URL and verify an explicit app handler when provided.",
|
|
279
|
+
"inputSchema": {
|
|
280
|
+
"type": "object",
|
|
281
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
282
|
+
"properties": {
|
|
283
|
+
"url": {
|
|
284
|
+
"type": "string",
|
|
285
|
+
"format": "uri"
|
|
286
|
+
},
|
|
287
|
+
"applicationId": {
|
|
288
|
+
"type": "string",
|
|
289
|
+
"minLength": 3
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
"required": ["url"]
|
|
293
|
+
},
|
|
294
|
+
"annotations": {
|
|
295
|
+
"readOnlyHint": false,
|
|
296
|
+
"destructiveHint": false,
|
|
297
|
+
"idempotentHint": false,
|
|
298
|
+
"openWorldHint": false
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"name": "press_key_ui",
|
|
303
|
+
"description": "Press one allowlisted Android navigation or volume key, then compare UI state.",
|
|
304
|
+
"inputSchema": {
|
|
305
|
+
"type": "object",
|
|
306
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
307
|
+
"properties": {
|
|
308
|
+
"key": {
|
|
309
|
+
"type": "string",
|
|
310
|
+
"enum": ["back", "enter", "home", "menu", "volume-down", "volume-up"]
|
|
311
|
+
},
|
|
312
|
+
"dryRun": {
|
|
313
|
+
"type": "boolean"
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
"required": ["key"]
|
|
317
|
+
},
|
|
318
|
+
"annotations": {
|
|
319
|
+
"readOnlyHint": false,
|
|
320
|
+
"destructiveHint": false,
|
|
321
|
+
"idempotentHint": false,
|
|
322
|
+
"openWorldHint": false
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
"name": "resolve_app",
|
|
327
|
+
"description": "Resolve the Android project application ID with provenance.",
|
|
328
|
+
"inputSchema": {
|
|
329
|
+
"type": "object",
|
|
330
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
331
|
+
"properties": {
|
|
332
|
+
"applicationId": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"minLength": 3
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
"annotations": {
|
|
339
|
+
"readOnlyHint": true,
|
|
340
|
+
"destructiveHint": false,
|
|
341
|
+
"idempotentHint": true,
|
|
342
|
+
"openWorldHint": false
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"name": "restart_app",
|
|
347
|
+
"description": "Restart the resolved app and verify it is foreground.",
|
|
348
|
+
"inputSchema": {
|
|
349
|
+
"type": "object",
|
|
350
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
351
|
+
"properties": {
|
|
352
|
+
"applicationId": {
|
|
353
|
+
"type": "string",
|
|
354
|
+
"minLength": 3
|
|
355
|
+
},
|
|
356
|
+
"activity": {
|
|
357
|
+
"type": "string",
|
|
358
|
+
"minLength": 1
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
"annotations": {
|
|
363
|
+
"readOnlyHint": false,
|
|
364
|
+
"destructiveHint": false,
|
|
365
|
+
"idempotentHint": true,
|
|
366
|
+
"openWorldHint": false
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"name": "swipe_ui",
|
|
371
|
+
"description": "Swipe in a screen-relative direction or between explicit display coordinates, then compare UI state.",
|
|
372
|
+
"inputSchema": {
|
|
373
|
+
"type": "object",
|
|
374
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
375
|
+
"properties": {
|
|
376
|
+
"direction": {
|
|
377
|
+
"type": "string",
|
|
378
|
+
"enum": ["down", "left", "right", "up"]
|
|
379
|
+
},
|
|
380
|
+
"x1": {
|
|
381
|
+
"type": "integer",
|
|
382
|
+
"minimum": 0,
|
|
383
|
+
"maximum": 100000
|
|
384
|
+
},
|
|
385
|
+
"y1": {
|
|
386
|
+
"type": "integer",
|
|
387
|
+
"minimum": 0,
|
|
388
|
+
"maximum": 100000
|
|
389
|
+
},
|
|
390
|
+
"x2": {
|
|
391
|
+
"type": "integer",
|
|
392
|
+
"minimum": 0,
|
|
393
|
+
"maximum": 100000
|
|
394
|
+
},
|
|
395
|
+
"y2": {
|
|
396
|
+
"type": "integer",
|
|
397
|
+
"minimum": 0,
|
|
398
|
+
"maximum": 100000
|
|
399
|
+
},
|
|
400
|
+
"dryRun": {
|
|
401
|
+
"type": "boolean"
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
"annotations": {
|
|
406
|
+
"readOnlyHint": false,
|
|
407
|
+
"destructiveHint": false,
|
|
408
|
+
"idempotentHint": false,
|
|
409
|
+
"openWorldHint": false
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"name": "tap_ui",
|
|
414
|
+
"description": "Tap a current digest-scoped UI ref or explicit display coordinate, then compare UI state.",
|
|
415
|
+
"inputSchema": {
|
|
416
|
+
"type": "object",
|
|
417
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
418
|
+
"properties": {
|
|
419
|
+
"target": {
|
|
420
|
+
"anyOf": [
|
|
421
|
+
{
|
|
422
|
+
"type": "object",
|
|
423
|
+
"properties": {
|
|
424
|
+
"ref": {
|
|
425
|
+
"type": "string",
|
|
426
|
+
"pattern": "^ui:[a-f0-9]{12}:\\d+$"
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
"required": ["ref"]
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"type": "object",
|
|
433
|
+
"properties": {
|
|
434
|
+
"x": {
|
|
435
|
+
"type": "integer",
|
|
436
|
+
"minimum": 0,
|
|
437
|
+
"maximum": 100000
|
|
438
|
+
},
|
|
439
|
+
"y": {
|
|
440
|
+
"type": "integer",
|
|
441
|
+
"minimum": 0,
|
|
442
|
+
"maximum": 100000
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
"required": ["x", "y"]
|
|
446
|
+
}
|
|
447
|
+
]
|
|
448
|
+
},
|
|
449
|
+
"dryRun": {
|
|
450
|
+
"type": "boolean"
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
"required": ["target"]
|
|
454
|
+
},
|
|
455
|
+
"annotations": {
|
|
456
|
+
"readOnlyHint": false,
|
|
457
|
+
"destructiveHint": false,
|
|
458
|
+
"idempotentHint": false,
|
|
459
|
+
"openWorldHint": false
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
"name": "type_text_ui",
|
|
464
|
+
"description": "Type conservative shell-safe text into the focused Android field and optionally press enter.",
|
|
465
|
+
"inputSchema": {
|
|
466
|
+
"type": "object",
|
|
467
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
468
|
+
"properties": {
|
|
469
|
+
"text": {
|
|
470
|
+
"type": "string",
|
|
471
|
+
"minLength": 1,
|
|
472
|
+
"maxLength": 256
|
|
473
|
+
},
|
|
474
|
+
"submit": {
|
|
475
|
+
"type": "boolean"
|
|
476
|
+
},
|
|
477
|
+
"dryRun": {
|
|
478
|
+
"type": "boolean"
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
"required": ["text"]
|
|
482
|
+
},
|
|
483
|
+
"annotations": {
|
|
484
|
+
"readOnlyHint": false,
|
|
485
|
+
"destructiveHint": false,
|
|
486
|
+
"idempotentHint": false,
|
|
487
|
+
"openWorldHint": false
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
"name": "wait_for_ui",
|
|
492
|
+
"description": "Wait a bounded time for an exact id=, text=, desc=, or package= selector to be visible or gone.",
|
|
493
|
+
"inputSchema": {
|
|
494
|
+
"type": "object",
|
|
495
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
496
|
+
"properties": {
|
|
497
|
+
"selector": {
|
|
498
|
+
"type": "string",
|
|
499
|
+
"minLength": 3,
|
|
500
|
+
"maxLength": 264
|
|
501
|
+
},
|
|
502
|
+
"state": {
|
|
503
|
+
"type": "string",
|
|
504
|
+
"enum": ["gone", "visible"]
|
|
505
|
+
},
|
|
506
|
+
"timeoutMs": {
|
|
507
|
+
"type": "integer",
|
|
508
|
+
"minimum": 100,
|
|
509
|
+
"maximum": 120000
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
"required": ["selector"]
|
|
513
|
+
},
|
|
514
|
+
"annotations": {
|
|
515
|
+
"readOnlyHint": true,
|
|
516
|
+
"destructiveHint": false,
|
|
517
|
+
"idempotentHint": true,
|
|
518
|
+
"openWorldHint": false
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
]
|
|
522
|
+
}
|
|
@@ -43,6 +43,9 @@
|
|
|
43
43
|
"targets": {
|
|
44
44
|
"$ref": "#/$defs/targets"
|
|
45
45
|
},
|
|
46
|
+
"app": {
|
|
47
|
+
"$ref": "#/$defs/app"
|
|
48
|
+
},
|
|
46
49
|
"dev": {
|
|
47
50
|
"$ref": "#/$defs/dev"
|
|
48
51
|
}
|
|
@@ -107,6 +110,9 @@
|
|
|
107
110
|
}
|
|
108
111
|
}
|
|
109
112
|
},
|
|
113
|
+
"app": {
|
|
114
|
+
"$ref": "#/$defs/app"
|
|
115
|
+
},
|
|
110
116
|
"dev": {
|
|
111
117
|
"$ref": "#/$defs/dev"
|
|
112
118
|
}
|
|
@@ -144,6 +150,22 @@
|
|
|
144
150
|
}
|
|
145
151
|
}
|
|
146
152
|
},
|
|
153
|
+
"app": {
|
|
154
|
+
"type": "object",
|
|
155
|
+
"additionalProperties": false,
|
|
156
|
+
"properties": {
|
|
157
|
+
"android": {
|
|
158
|
+
"type": "object",
|
|
159
|
+
"additionalProperties": false,
|
|
160
|
+
"properties": {
|
|
161
|
+
"package": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"pattern": "^[A-Za-z][A-Za-z0-9_]*(?:\\.[A-Za-z0-9_]+)+$"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
},
|
|
147
169
|
"dev": {
|
|
148
170
|
"type": "object",
|
|
149
171
|
"additionalProperties": false,
|