@devicecloud.dev/dcd 4.4.9 → 5.0.0-beta.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 (130) hide show
  1. package/README.md +75 -2
  2. package/dist/commands/artifacts.d.ts +47 -18
  3. package/dist/commands/artifacts.js +69 -64
  4. package/dist/commands/cloud.d.ts +228 -88
  5. package/dist/commands/cloud.js +430 -342
  6. package/dist/commands/list.d.ts +39 -38
  7. package/dist/commands/list.js +124 -131
  8. package/dist/commands/live.d.ts +2 -0
  9. package/dist/commands/live.js +520 -0
  10. package/dist/commands/login.d.ts +17 -0
  11. package/dist/commands/login.js +252 -0
  12. package/dist/commands/logout.d.ts +2 -0
  13. package/dist/commands/logout.js +30 -0
  14. package/dist/commands/status.d.ts +23 -42
  15. package/dist/commands/status.js +170 -179
  16. package/dist/commands/switch-org.d.ts +12 -0
  17. package/dist/commands/switch-org.js +76 -0
  18. package/dist/commands/upgrade.d.ts +2 -0
  19. package/dist/commands/upgrade.js +120 -0
  20. package/dist/commands/upload.d.ts +33 -18
  21. package/dist/commands/upload.js +72 -78
  22. package/dist/commands/whoami.d.ts +2 -0
  23. package/dist/commands/whoami.js +31 -0
  24. package/dist/config/environments.d.ts +31 -0
  25. package/dist/config/environments.js +52 -0
  26. package/dist/config/flags/api.flags.d.ts +10 -2
  27. package/dist/config/flags/api.flags.js +13 -14
  28. package/dist/config/flags/binary.flags.d.ts +17 -4
  29. package/dist/config/flags/binary.flags.js +14 -18
  30. package/dist/config/flags/device.flags.d.ts +49 -11
  31. package/dist/config/flags/device.flags.js +43 -38
  32. package/dist/config/flags/environment.flags.d.ts +27 -6
  33. package/dist/config/flags/environment.flags.js +24 -29
  34. package/dist/config/flags/execution.flags.d.ts +35 -8
  35. package/dist/config/flags/execution.flags.js +31 -41
  36. package/dist/config/flags/github.flags.d.ts +23 -5
  37. package/dist/config/flags/github.flags.js +19 -15
  38. package/dist/config/flags/output.flags.d.ts +57 -13
  39. package/dist/config/flags/output.flags.js +48 -47
  40. package/dist/constants.d.ts +218 -51
  41. package/dist/constants.js +17 -20
  42. package/dist/gateways/api-gateway.d.ts +72 -16
  43. package/dist/gateways/api-gateway.js +298 -104
  44. package/dist/gateways/cli-auth-gateway.d.ts +13 -0
  45. package/dist/gateways/cli-auth-gateway.js +54 -0
  46. package/dist/gateways/realtime-gateway.d.ts +32 -0
  47. package/dist/gateways/realtime-gateway.js +103 -0
  48. package/dist/gateways/supabase-gateway.d.ts +11 -11
  49. package/dist/gateways/supabase-gateway.js +20 -48
  50. package/dist/index.d.ts +2 -1
  51. package/dist/index.js +98 -4
  52. package/dist/mcp/context.d.ts +33 -0
  53. package/dist/mcp/context.js +33 -0
  54. package/dist/mcp/helpers.d.ts +16 -0
  55. package/dist/mcp/helpers.js +34 -0
  56. package/dist/mcp/index.d.ts +2 -0
  57. package/dist/mcp/index.js +24 -0
  58. package/dist/mcp/server.d.ts +7 -0
  59. package/dist/mcp/server.js +27 -0
  60. package/dist/mcp/tools/download-artifacts.d.ts +11 -0
  61. package/dist/mcp/tools/download-artifacts.js +84 -0
  62. package/dist/mcp/tools/get-status.d.ts +7 -0
  63. package/dist/mcp/tools/get-status.js +39 -0
  64. package/dist/mcp/tools/list-devices.d.ts +7 -0
  65. package/dist/mcp/tools/list-devices.js +27 -0
  66. package/dist/mcp/tools/list-runs.d.ts +3 -0
  67. package/dist/mcp/tools/list-runs.js +60 -0
  68. package/dist/mcp/tools/run-cloud-test.d.ts +14 -0
  69. package/dist/mcp/tools/run-cloud-test.js +233 -0
  70. package/dist/methods.d.ts +34 -5
  71. package/dist/methods.js +266 -215
  72. package/dist/services/device-validation.service.d.ts +9 -1
  73. package/dist/services/device-validation.service.js +56 -40
  74. package/dist/services/execution-plan.service.js +40 -31
  75. package/dist/services/execution-plan.utils.d.ts +3 -0
  76. package/dist/services/execution-plan.utils.js +25 -55
  77. package/dist/services/flow-paths.d.ts +17 -0
  78. package/dist/services/flow-paths.js +52 -0
  79. package/dist/services/metadata-extractor.service.d.ts +0 -2
  80. package/dist/services/metadata-extractor.service.js +75 -78
  81. package/dist/services/moropo.service.js +33 -34
  82. package/dist/services/report-download.service.d.ts +12 -1
  83. package/dist/services/report-download.service.js +34 -27
  84. package/dist/services/results-polling.service.d.ts +23 -9
  85. package/dist/services/results-polling.service.js +257 -123
  86. package/dist/services/telemetry.service.d.ts +49 -0
  87. package/dist/services/telemetry.service.js +252 -0
  88. package/dist/services/test-submission.service.d.ts +21 -4
  89. package/dist/services/test-submission.service.js +51 -33
  90. package/dist/services/version.service.d.ts +4 -3
  91. package/dist/services/version.service.js +28 -16
  92. package/dist/types/domain/auth.types.d.ts +20 -0
  93. package/dist/types/domain/auth.types.js +1 -0
  94. package/dist/types/domain/device.types.js +8 -11
  95. package/dist/types/domain/live.types.d.ts +76 -0
  96. package/dist/types/domain/live.types.js +3 -0
  97. package/dist/types/generated/schema.types.js +1 -2
  98. package/dist/types/index.d.ts +2 -2
  99. package/dist/types/index.js +2 -18
  100. package/dist/types.js +1 -2
  101. package/dist/utils/auth.d.ts +13 -0
  102. package/dist/utils/auth.js +141 -0
  103. package/dist/utils/ci.d.ts +12 -0
  104. package/dist/utils/ci.js +39 -0
  105. package/dist/utils/cli.d.ts +35 -0
  106. package/dist/utils/cli.js +118 -0
  107. package/dist/utils/compatibility.d.ts +2 -1
  108. package/dist/utils/compatibility.js +6 -8
  109. package/dist/utils/config-store.d.ts +35 -0
  110. package/dist/utils/config-store.js +115 -0
  111. package/dist/utils/connectivity.js +8 -7
  112. package/dist/utils/expo.js +29 -24
  113. package/dist/utils/orgs.d.ts +11 -0
  114. package/dist/utils/orgs.js +36 -0
  115. package/dist/utils/paths.d.ts +11 -0
  116. package/dist/utils/paths.js +21 -0
  117. package/dist/utils/progress.d.ts +13 -0
  118. package/dist/utils/progress.js +47 -0
  119. package/dist/utils/styling.d.ts +42 -36
  120. package/dist/utils/styling.js +78 -82
  121. package/dist/utils/ui.d.ts +41 -0
  122. package/dist/utils/ui.js +95 -0
  123. package/package.json +36 -45
  124. package/bin/dev.cmd +0 -3
  125. package/bin/dev.js +0 -6
  126. package/bin/run.cmd +0 -3
  127. package/bin/run.js +0 -7
  128. package/dist/types/schema.types.d.ts +0 -2702
  129. package/dist/types/schema.types.js +0 -3
  130. package/oclif.manifest.json +0 -884
@@ -1,4 +1,3 @@
1
- import { Command } from '@oclif/core';
2
1
  /**
3
2
  * Primary CLI command for executing tests on DeviceCloud.
4
3
  * Orchestrates the complete test workflow:
@@ -11,90 +10,231 @@ import { Command } from '@oclif/core';
11
10
  *
12
11
  * Replaces `maestro cloud` with DeviceCloud-specific functionality.
13
12
  */
14
- export default class Cloud extends Command {
15
- static args: {
16
- firstFile: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
17
- secondFile: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
18
- };
19
- static description: string;
20
- static enableJsonFlag: boolean;
21
- static examples: string[];
22
- static flags: {
23
- 'artifacts-path': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
24
- 'junit-path': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
25
- 'allure-path': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
26
- 'html-path': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
27
- async: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
28
- debug: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
29
- 'download-artifacts': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
30
- 'dry-run': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
31
- json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
32
- 'json-file': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
33
- 'json-file-name': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
34
- quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
35
- report: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
36
- branch: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
37
- 'commit-sha': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
38
- 'repo-name': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
39
- 'pr-number': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
40
- 'pr-url': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
41
- config: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
42
- 'exclude-flows': import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
43
- 'exclude-tags': import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
44
- flows: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
45
- 'include-tags': import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
46
- 'maestro-version': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
47
- retry: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
48
- 'runner-type': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
49
- env: import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
50
- metadata: import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
51
- mitmHost: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
52
- mitmPath: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
53
- 'moropo-v1-api-key': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
54
- name: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
55
- 'android-api-level': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
56
- 'android-device': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
57
- 'device-locale': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
58
- 'google-play': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
59
- 'ios-device': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
60
- 'ios-version': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
61
- orientation: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
62
- 'show-crosshairs': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
63
- 'maestro-chrome-onboarding': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
64
- 'android-no-snapshot': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
65
- 'disable-animations': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
66
- 'app-binary-id': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
67
- 'app-file': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
68
- 'app-url': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
69
- 'ignore-sha-check': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
70
- apiKey: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
71
- apiUrl: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
72
- };
73
- /** Service for device/OS compatibility validation */
74
- private deviceValidationService;
75
- /** Service for Moropo test framework integration */
76
- private moropoService;
77
- /** Service for downloading test reports and artifacts */
78
- private reportDownloadService;
79
- /** Service for polling test results with 10-second intervals */
80
- private resultsPollingService;
81
- /** Service for submitting tests to the API */
82
- private testSubmissionService;
83
- /**
84
- * Check for CLI updates and notify user if outdated
85
- * Compares current version with latest npm release
86
- * @returns Promise that resolves when version check is complete
87
- */
88
- private versionCheck;
89
- /** Service for CLI version checking */
90
- private versionService;
91
- /**
92
- * Main command execution entry point
93
- * Orchestrates the complete test submission and monitoring workflow
94
- * @returns Promise that resolves when command execution is complete
95
- * @throws RunFailedError if tests fail
96
- * @throws Error for infrastructure or configuration errors
97
- */
98
- run(): Promise<any>;
99
- protected toErrorJson(err: unknown): unknown;
100
- }
13
+ export declare const cloudCommand: import("citty").CommandDef<{
14
+ readonly firstFile: {
15
+ readonly type: "positional";
16
+ readonly required: false;
17
+ readonly description: "The binary file of the app to run your flow against, e.g. test.apk for android or test.app/.zip for ios";
18
+ };
19
+ readonly secondFile: {
20
+ readonly type: "positional";
21
+ readonly required: false;
22
+ readonly description: "The flow file to run against the app, e.g. test.yaml";
23
+ };
24
+ readonly 'artifacts-path': {
25
+ readonly type: "string";
26
+ readonly description: "Custom file path for downloaded artifacts (default: ./artifacts.zip). Requires --download-artifacts.";
27
+ };
28
+ readonly 'junit-path': {
29
+ readonly type: "string";
30
+ readonly description: "Custom file path for downloaded JUnit report (requires --report junit, default: ./report.xml)";
31
+ };
32
+ readonly 'allure-path': {
33
+ readonly type: "string";
34
+ readonly description: "Custom file path for downloaded Allure report (requires --report allure, default: ./report.html)";
35
+ };
36
+ readonly 'html-path': {
37
+ readonly type: "string";
38
+ readonly description: "Custom file path for downloaded HTML report (requires --report html, default: ./report.html)";
39
+ };
40
+ readonly async: {
41
+ readonly type: "boolean";
42
+ readonly description: "Immediately return (exit code 0) from the command without waiting for the results of the run (useful for saving CI minutes)";
43
+ };
44
+ readonly debug: {
45
+ readonly type: "boolean";
46
+ readonly default: false;
47
+ readonly description: "Enable detailed debug logging for troubleshooting issues";
48
+ };
49
+ readonly 'download-artifacts': {
50
+ readonly type: "string";
51
+ readonly description: "Download a zip containing the logs, screenshots and videos for each result in this run (options: ALL, FAILED)";
52
+ };
53
+ readonly 'dry-run': {
54
+ readonly type: "boolean";
55
+ readonly default: false;
56
+ readonly description: "Simulate the run without actually triggering the upload/test, useful for debugging workflow issues.";
57
+ };
58
+ readonly json: {
59
+ readonly type: "boolean";
60
+ readonly description: "Output results in JSON format. Exit codes: 0 on success, 2 if the test run fails, 1 on CLI/infrastructure errors";
61
+ };
62
+ readonly 'json-file': {
63
+ readonly type: "boolean";
64
+ readonly description: "Write JSON output to a file. File will be called <upload_id>_dcd.json unless you supply the --json-file-name flag - note: exits with code 0 even if the test run fails (CLI/infrastructure errors still exit 1)";
65
+ };
66
+ readonly 'json-file-name': {
67
+ readonly type: "string";
68
+ readonly description: "A custom name for the JSON file (can also include relative path). Requires --json-file.";
69
+ };
70
+ readonly quiet: {
71
+ readonly type: "boolean";
72
+ readonly alias: ["q"];
73
+ readonly default: false;
74
+ readonly description: "Quieter console output that won't provide progress updates";
75
+ };
76
+ readonly report: {
77
+ readonly type: "string";
78
+ readonly alias: ["format"];
79
+ readonly description: "Generate and download test reports in the specified format (options: allure, junit, html, html-detailed). Use \"allure\" for a complete HTML report.";
80
+ };
81
+ readonly branch: {
82
+ readonly type: "string";
83
+ readonly description: "Git branch name for this run (stored as gh_branch metadata)";
84
+ };
85
+ readonly 'commit-sha': {
86
+ readonly type: "string";
87
+ readonly description: "Git commit SHA for this run (stored as gh_sha metadata)";
88
+ };
89
+ readonly 'repo-name': {
90
+ readonly type: "string";
91
+ readonly description: "Repository in owner/repo format (stored as gh_repo metadata, e.g. \"acme/my-app\")";
92
+ };
93
+ readonly 'pr-number': {
94
+ readonly type: "string";
95
+ readonly description: "Pull request number for this run (stored as gh_pr_number metadata)";
96
+ };
97
+ readonly 'pr-url': {
98
+ readonly type: "string";
99
+ readonly description: "Pull request URL for this run (stored as gh_pr_url metadata)";
100
+ };
101
+ readonly config: {
102
+ readonly type: "string";
103
+ readonly description: "Path to custom config.yaml file. If not provided, defaults to config.yaml in root flows folders.";
104
+ readonly valueHint: "path";
105
+ };
106
+ readonly 'exclude-flows': {
107
+ readonly type: "string";
108
+ readonly description: "Sub directories to ignore when building the flow file list (comma-separated, may be repeated)";
109
+ };
110
+ readonly 'exclude-tags': {
111
+ readonly type: "string";
112
+ readonly description: "Flows which have these tags will be excluded from the run (comma-separated, may be repeated)";
113
+ };
114
+ readonly flows: {
115
+ readonly type: "string";
116
+ readonly description: "The path to the flow file or folder containing your flows";
117
+ };
118
+ readonly 'include-tags': {
119
+ readonly type: "string";
120
+ readonly description: "Only flows which have these tags will be included in the run (comma-separated, may be repeated)";
121
+ };
122
+ readonly 'maestro-version': {
123
+ readonly type: "string";
124
+ readonly alias: ["maestroVersion"];
125
+ readonly description: "Maestro version to run your flow against. Use \"latest\" for the most recent version. See https://docs.devicecloud.dev/configuration/maestro-versions for supported versions.";
126
+ };
127
+ readonly retry: {
128
+ readonly type: "string";
129
+ readonly description: "Automatically retry the run up to the number of times specified (same as pressing retry in the UI) - this is free of charge";
130
+ };
131
+ readonly 'runner-type': {
132
+ readonly type: "string";
133
+ readonly default: "default";
134
+ readonly description: "[experimental] The type of runner to use (options: default, m4, m1, gpu1, cpu1) - note: anything other than default or cpu1 will incur premium pricing tiers, see https://docs.devicecloud.dev/configuration/runner-type for more information.";
135
+ };
136
+ readonly env: {
137
+ readonly type: "string";
138
+ readonly alias: ["e"];
139
+ readonly description: "One or more environment variables to inject into your flows (format: KEY=VALUE, may be repeated)";
140
+ readonly valueHint: "KEY=VALUE";
141
+ };
142
+ readonly metadata: {
143
+ readonly type: "string";
144
+ readonly alias: ["m"];
145
+ readonly description: "Arbitrary key-value metadata to include with your test run (format: key=value, may be repeated)";
146
+ };
147
+ readonly mitmHost: {
148
+ readonly type: "string";
149
+ readonly description: "used for mitmproxy support, enterprise only, contact support if interested";
150
+ };
151
+ readonly mitmPath: {
152
+ readonly type: "string";
153
+ readonly description: "used for mitmproxy support, enterprise only, contact support if interested";
154
+ };
155
+ readonly 'moropo-v1-api-key': {
156
+ readonly type: "string";
157
+ readonly description: "API key for Moropo v1 integration";
158
+ };
159
+ readonly name: {
160
+ readonly type: "string";
161
+ readonly description: "A custom name for your upload (useful for tagging commits etc)";
162
+ };
163
+ readonly 'android-api-level': {
164
+ readonly type: "string";
165
+ readonly description: `[Android only] Android API level to run your flow against (options: ${string})`;
166
+ };
167
+ readonly 'android-device': {
168
+ readonly type: "string";
169
+ readonly description: `[Android only] Android device to run your flow against (options: ${string})`;
170
+ };
171
+ readonly 'device-locale': {
172
+ readonly type: "string";
173
+ readonly description: "Locale that will be set to a device, ISO-639-1 code and uppercase ISO-3166-1 code e.g. \"de_DE\" for Germany";
174
+ };
175
+ readonly 'google-play': {
176
+ readonly type: "boolean";
177
+ readonly default: false;
178
+ readonly description: "[Android only] Run your flow against Google Play devices";
179
+ };
180
+ readonly 'ios-device': {
181
+ readonly type: "string";
182
+ readonly description: `[iOS only] iOS device to run your flow against (options: ${string})`;
183
+ };
184
+ readonly 'ios-version': {
185
+ readonly type: "string";
186
+ readonly description: `[iOS only] iOS version to run your flow against (options: ${string})`;
187
+ };
188
+ readonly orientation: {
189
+ readonly type: "string";
190
+ readonly description: "[Android only] The orientation of the device to run your flow against (0 = portrait, 90 = landscape)";
191
+ };
192
+ readonly 'show-crosshairs': {
193
+ readonly type: "boolean";
194
+ readonly default: false;
195
+ readonly description: "[Android only] Display crosshairs for screen interactions during test execution";
196
+ };
197
+ readonly 'maestro-chrome-onboarding': {
198
+ readonly type: "boolean";
199
+ readonly default: false;
200
+ readonly description: "[Android only] Force Maestro-based Chrome onboarding - note: this will slow your tests but can fix browser related crashes. See https://docs.devicecloud.dev/advanced/chrome-onboarding for more information.";
201
+ };
202
+ readonly 'android-no-snapshot': {
203
+ readonly type: "boolean";
204
+ readonly default: false;
205
+ readonly description: "[Android only] Force cold boot instead of using snapshot boot. This is automatically enabled for API 35+ but can be used to force cold boot on older API levels.";
206
+ };
207
+ readonly 'disable-animations': {
208
+ readonly type: "boolean";
209
+ readonly default: false;
210
+ readonly description: "Disable device animations during test execution. On Android, disables system animation scales. On iOS, enables Reduce Motion. Reduces CPU load and may improve test reliability.";
211
+ };
212
+ readonly 'app-binary-id': {
213
+ readonly type: "string";
214
+ readonly description: "The ID of the app binary previously uploaded to devicecloud.dev";
215
+ };
216
+ readonly 'app-file': {
217
+ readonly type: "string";
218
+ readonly description: "App binary to run your flows against";
219
+ readonly valueHint: "path";
220
+ };
221
+ readonly 'app-url': {
222
+ readonly type: "string";
223
+ readonly description: "Signed URL to an Expo iOS build (.tar.gz). The archive is downloaded and extracted automatically. Expo signed URLs expire after ~1 hour.";
224
+ };
225
+ readonly 'ignore-sha-check': {
226
+ readonly type: "boolean";
227
+ readonly description: "Ignore the sha hash check and upload the binary regardless of whether it already exists (not recommended)";
228
+ };
229
+ readonly 'api-key': {
230
+ readonly type: "string";
231
+ readonly alias: ["apiKey"];
232
+ readonly description: "API key for devicecloud.dev (find this in the console UI). You can also set the DEVICE_CLOUD_API_KEY environment variable.";
233
+ };
234
+ readonly 'api-url': {
235
+ readonly type: "string";
236
+ readonly alias: ["apiURL", "apiUrl"];
237
+ readonly description: "API base URL (defaults to the URL stored by `dcd login`, else prod)";
238
+ };
239
+ }>;
240
+ export default cloudCommand;