@testdroid-ai/cli 0.1.2

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 (229) hide show
  1. package/dist/adb/adb-path-resolver.d.ts +6 -0
  2. package/dist/adb/adb-path-resolver.d.ts.map +1 -0
  3. package/dist/adb/adb-path-resolver.js +93 -0
  4. package/dist/adb/adb-path-resolver.js.map +1 -0
  5. package/dist/adb/adb-shell.d.ts +29 -0
  6. package/dist/adb/adb-shell.d.ts.map +1 -0
  7. package/dist/adb/adb-shell.js +128 -0
  8. package/dist/adb/adb-shell.js.map +1 -0
  9. package/dist/adb/detector.d.ts +12 -0
  10. package/dist/adb/detector.d.ts.map +1 -0
  11. package/dist/adb/detector.js +44 -0
  12. package/dist/adb/detector.js.map +1 -0
  13. package/dist/adb/device-tracker.d.ts +23 -0
  14. package/dist/adb/device-tracker.d.ts.map +1 -0
  15. package/dist/adb/device-tracker.js +134 -0
  16. package/dist/adb/device-tracker.js.map +1 -0
  17. package/dist/adb/emulator-detector.d.ts +11 -0
  18. package/dist/adb/emulator-detector.d.ts.map +1 -0
  19. package/dist/adb/emulator-detector.js +54 -0
  20. package/dist/adb/emulator-detector.js.map +1 -0
  21. package/dist/appium/health-check.d.ts +6 -0
  22. package/dist/appium/health-check.d.ts.map +1 -0
  23. package/dist/appium/health-check.js +61 -0
  24. package/dist/appium/health-check.js.map +1 -0
  25. package/dist/appium/session-manager.d.ts +15 -0
  26. package/dist/appium/session-manager.d.ts.map +1 -0
  27. package/dist/appium/session-manager.js +82 -0
  28. package/dist/appium/session-manager.js.map +1 -0
  29. package/dist/auth/credential-store.d.ts +31 -0
  30. package/dist/auth/credential-store.d.ts.map +1 -0
  31. package/dist/auth/credential-store.js +154 -0
  32. package/dist/auth/credential-store.js.map +1 -0
  33. package/dist/auth/pairing-auth.d.ts +26 -0
  34. package/dist/auth/pairing-auth.d.ts.map +1 -0
  35. package/dist/auth/pairing-auth.js +177 -0
  36. package/dist/auth/pairing-auth.js.map +1 -0
  37. package/dist/auth/token-manager.d.ts +20 -0
  38. package/dist/auth/token-manager.d.ts.map +1 -0
  39. package/dist/auth/token-manager.js +101 -0
  40. package/dist/auth/token-manager.js.map +1 -0
  41. package/dist/commands/connect.d.ts +9 -0
  42. package/dist/commands/connect.d.ts.map +1 -0
  43. package/dist/commands/connect.js +270 -0
  44. package/dist/commands/connect.js.map +1 -0
  45. package/dist/commands/devices.d.ts +2 -0
  46. package/dist/commands/devices.d.ts.map +1 -0
  47. package/dist/commands/devices.js +52 -0
  48. package/dist/commands/devices.js.map +1 -0
  49. package/dist/commands/doctor.d.ts +2 -0
  50. package/dist/commands/doctor.d.ts.map +1 -0
  51. package/dist/commands/doctor.js +214 -0
  52. package/dist/commands/doctor.js.map +1 -0
  53. package/dist/commands/mirror.d.ts +2 -0
  54. package/dist/commands/mirror.d.ts.map +1 -0
  55. package/dist/commands/mirror.js +77 -0
  56. package/dist/commands/mirror.js.map +1 -0
  57. package/dist/commands/prompt.d.ts +12 -0
  58. package/dist/commands/prompt.d.ts.map +1 -0
  59. package/dist/commands/prompt.js +174 -0
  60. package/dist/commands/prompt.js.map +1 -0
  61. package/dist/commands/record.d.ts +7 -0
  62. package/dist/commands/record.d.ts.map +1 -0
  63. package/dist/commands/record.js +129 -0
  64. package/dist/commands/record.js.map +1 -0
  65. package/dist/commands/run.d.ts +16 -0
  66. package/dist/commands/run.d.ts.map +1 -0
  67. package/dist/commands/run.js +271 -0
  68. package/dist/commands/run.js.map +1 -0
  69. package/dist/commands/setup.d.ts +6 -0
  70. package/dist/commands/setup.d.ts.map +1 -0
  71. package/dist/commands/setup.js +50 -0
  72. package/dist/commands/setup.js.map +1 -0
  73. package/dist/commands/status.d.ts +2 -0
  74. package/dist/commands/status.d.ts.map +1 -0
  75. package/dist/commands/status.js +32 -0
  76. package/dist/commands/status.js.map +1 -0
  77. package/dist/healing/ai-adapter.d.ts +44 -0
  78. package/dist/healing/ai-adapter.d.ts.map +1 -0
  79. package/dist/healing/ai-adapter.js +87 -0
  80. package/dist/healing/ai-adapter.js.map +1 -0
  81. package/dist/healing/healer.d.ts +109 -0
  82. package/dist/healing/healer.d.ts.map +1 -0
  83. package/dist/healing/healer.js +475 -0
  84. package/dist/healing/healer.js.map +1 -0
  85. package/dist/healing/similarity.d.ts +63 -0
  86. package/dist/healing/similarity.d.ts.map +1 -0
  87. package/dist/healing/similarity.js +172 -0
  88. package/dist/healing/similarity.js.map +1 -0
  89. package/dist/index.d.ts +3 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +107 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/recording/capture-strategies/capture-strategy.interface.d.ts +6 -0
  94. package/dist/recording/capture-strategies/capture-strategy.interface.d.ts.map +1 -0
  95. package/dist/recording/capture-strategies/capture-strategy.interface.js +3 -0
  96. package/dist/recording/capture-strategies/capture-strategy.interface.js.map +1 -0
  97. package/dist/recording/capture-strategies/getevent.strategy.d.ts +27 -0
  98. package/dist/recording/capture-strategies/getevent.strategy.d.ts.map +1 -0
  99. package/dist/recording/capture-strategies/getevent.strategy.js +163 -0
  100. package/dist/recording/capture-strategies/getevent.strategy.js.map +1 -0
  101. package/dist/recording/capture-strategies/key-capture.strategy.d.ts +16 -0
  102. package/dist/recording/capture-strategies/key-capture.strategy.d.ts.map +1 -0
  103. package/dist/recording/capture-strategies/key-capture.strategy.js +67 -0
  104. package/dist/recording/capture-strategies/key-capture.strategy.js.map +1 -0
  105. package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts +32 -0
  106. package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts.map +1 -0
  107. package/dist/recording/capture-strategies/logcat-capture.strategy.js +176 -0
  108. package/dist/recording/capture-strategies/logcat-capture.strategy.js.map +1 -0
  109. package/dist/recording/confidence-scorer.d.ts +13 -0
  110. package/dist/recording/confidence-scorer.d.ts.map +1 -0
  111. package/dist/recording/confidence-scorer.js +34 -0
  112. package/dist/recording/confidence-scorer.js.map +1 -0
  113. package/dist/recording/event-capture.d.ts +40 -0
  114. package/dist/recording/event-capture.d.ts.map +1 -0
  115. package/dist/recording/event-capture.js +168 -0
  116. package/dist/recording/event-capture.js.map +1 -0
  117. package/dist/recording/recorder.d.ts +32 -0
  118. package/dist/recording/recorder.d.ts.map +1 -0
  119. package/dist/recording/recorder.js +107 -0
  120. package/dist/recording/recorder.js.map +1 -0
  121. package/dist/runner/adb-executor.d.ts +116 -0
  122. package/dist/runner/adb-executor.d.ts.map +1 -0
  123. package/dist/runner/adb-executor.js +323 -0
  124. package/dist/runner/adb-executor.js.map +1 -0
  125. package/dist/runner/appium-executor.d.ts +35 -0
  126. package/dist/runner/appium-executor.d.ts.map +1 -0
  127. package/dist/runner/appium-executor.js +191 -0
  128. package/dist/runner/appium-executor.js.map +1 -0
  129. package/dist/runner/parse-strategies/appium-default.strategy.d.ts +12 -0
  130. package/dist/runner/parse-strategies/appium-default.strategy.d.ts.map +1 -0
  131. package/dist/runner/parse-strategies/appium-default.strategy.js +342 -0
  132. package/dist/runner/parse-strategies/appium-default.strategy.js.map +1 -0
  133. package/dist/runner/parse-strategies/index.d.ts +7 -0
  134. package/dist/runner/parse-strategies/index.d.ts.map +1 -0
  135. package/dist/runner/parse-strategies/index.js +14 -0
  136. package/dist/runner/parse-strategies/index.js.map +1 -0
  137. package/dist/runner/parse-strategies/java.strategy.d.ts +8 -0
  138. package/dist/runner/parse-strategies/java.strategy.d.ts.map +1 -0
  139. package/dist/runner/parse-strategies/java.strategy.js +170 -0
  140. package/dist/runner/parse-strategies/java.strategy.js.map +1 -0
  141. package/dist/runner/parse-strategies/maestro.strategy.d.ts +8 -0
  142. package/dist/runner/parse-strategies/maestro.strategy.d.ts.map +1 -0
  143. package/dist/runner/parse-strategies/maestro.strategy.js +105 -0
  144. package/dist/runner/parse-strategies/maestro.strategy.js.map +1 -0
  145. package/dist/runner/parse-strategies/python.strategy.d.ts +8 -0
  146. package/dist/runner/parse-strategies/python.strategy.d.ts.map +1 -0
  147. package/dist/runner/parse-strategies/python.strategy.js +140 -0
  148. package/dist/runner/parse-strategies/python.strategy.js.map +1 -0
  149. package/dist/runner/parse-strategies/robot.strategy.d.ts +8 -0
  150. package/dist/runner/parse-strategies/robot.strategy.d.ts.map +1 -0
  151. package/dist/runner/parse-strategies/robot.strategy.js +81 -0
  152. package/dist/runner/parse-strategies/robot.strategy.js.map +1 -0
  153. package/dist/runner/parse-strategies/types.d.ts +17 -0
  154. package/dist/runner/parse-strategies/types.d.ts.map +1 -0
  155. package/dist/runner/parse-strategies/types.js +3 -0
  156. package/dist/runner/parse-strategies/types.js.map +1 -0
  157. package/dist/runner/parse-strategies/utils.d.ts +39 -0
  158. package/dist/runner/parse-strategies/utils.d.ts.map +1 -0
  159. package/dist/runner/parse-strategies/utils.js +217 -0
  160. package/dist/runner/parse-strategies/utils.js.map +1 -0
  161. package/dist/runner/script-parser.d.ts +43 -0
  162. package/dist/runner/script-parser.d.ts.map +1 -0
  163. package/dist/runner/script-parser.js +68 -0
  164. package/dist/runner/script-parser.js.map +1 -0
  165. package/dist/runner/selector-resolver.d.ts +87 -0
  166. package/dist/runner/selector-resolver.d.ts.map +1 -0
  167. package/dist/runner/selector-resolver.js +206 -0
  168. package/dist/runner/selector-resolver.js.map +1 -0
  169. package/dist/runner/step-executor.d.ts +112 -0
  170. package/dist/runner/step-executor.d.ts.map +1 -0
  171. package/dist/runner/step-executor.js +518 -0
  172. package/dist/runner/step-executor.js.map +1 -0
  173. package/dist/runner/test-runner.d.ts +89 -0
  174. package/dist/runner/test-runner.d.ts.map +1 -0
  175. package/dist/runner/test-runner.js +320 -0
  176. package/dist/runner/test-runner.js.map +1 -0
  177. package/dist/scrcpy/launcher.d.ts +16 -0
  178. package/dist/scrcpy/launcher.d.ts.map +1 -0
  179. package/dist/scrcpy/launcher.js +87 -0
  180. package/dist/scrcpy/launcher.js.map +1 -0
  181. package/dist/services/device-poller.d.ts +10 -0
  182. package/dist/services/device-poller.d.ts.map +1 -0
  183. package/dist/services/device-poller.js +44 -0
  184. package/dist/services/device-poller.js.map +1 -0
  185. package/dist/services/execution-manager.d.ts +18 -0
  186. package/dist/services/execution-manager.d.ts.map +1 -0
  187. package/dist/services/execution-manager.js +185 -0
  188. package/dist/services/execution-manager.js.map +1 -0
  189. package/dist/services/recording-manager.d.ts +13 -0
  190. package/dist/services/recording-manager.d.ts.map +1 -0
  191. package/dist/services/recording-manager.js +234 -0
  192. package/dist/services/recording-manager.js.map +1 -0
  193. package/dist/setup/adb-installer.d.ts +8 -0
  194. package/dist/setup/adb-installer.d.ts.map +1 -0
  195. package/dist/setup/adb-installer.js +115 -0
  196. package/dist/setup/adb-installer.js.map +1 -0
  197. package/dist/setup/appium-installer.d.ts +8 -0
  198. package/dist/setup/appium-installer.d.ts.map +1 -0
  199. package/dist/setup/appium-installer.js +113 -0
  200. package/dist/setup/appium-installer.js.map +1 -0
  201. package/dist/setup/base-installer.d.ts +33 -0
  202. package/dist/setup/base-installer.d.ts.map +1 -0
  203. package/dist/setup/base-installer.js +170 -0
  204. package/dist/setup/base-installer.js.map +1 -0
  205. package/dist/setup/build-tools-installer.d.ts +8 -0
  206. package/dist/setup/build-tools-installer.d.ts.map +1 -0
  207. package/dist/setup/build-tools-installer.js +109 -0
  208. package/dist/setup/build-tools-installer.js.map +1 -0
  209. package/dist/setup/java-installer.d.ts +8 -0
  210. package/dist/setup/java-installer.d.ts.map +1 -0
  211. package/dist/setup/java-installer.js +132 -0
  212. package/dist/setup/java-installer.js.map +1 -0
  213. package/dist/setup/paths.d.ts +12 -0
  214. package/dist/setup/paths.d.ts.map +1 -0
  215. package/dist/setup/paths.js +90 -0
  216. package/dist/setup/paths.js.map +1 -0
  217. package/dist/setup/scrcpy-installer.d.ts +8 -0
  218. package/dist/setup/scrcpy-installer.d.ts.map +1 -0
  219. package/dist/setup/scrcpy-installer.js +143 -0
  220. package/dist/setup/scrcpy-installer.js.map +1 -0
  221. package/dist/setup/setup-manager.d.ts +18 -0
  222. package/dist/setup/setup-manager.d.ts.map +1 -0
  223. package/dist/setup/setup-manager.js +113 -0
  224. package/dist/setup/setup-manager.js.map +1 -0
  225. package/dist/ws/socket.d.ts +38 -0
  226. package/dist/ws/socket.d.ts.map +1 -0
  227. package/dist/ws/socket.js +91 -0
  228. package/dist/ws/socket.js.map +1 -0
  229. package/package.json +53 -0
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.doctorCommand = doctorCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const fs = __importStar(require("fs"));
42
+ const child_process_1 = require("child_process");
43
+ const adb_path_resolver_1 = require("../adb/adb-path-resolver");
44
+ const adb_shell_1 = require("../adb/adb-shell");
45
+ const credential_store_1 = require("../auth/credential-store");
46
+ const paths_1 = require("../setup/paths");
47
+ function ok(msg) {
48
+ console.log(` ${chalk_1.default.green('[OK]')} ${msg}`);
49
+ }
50
+ function warn(msg) {
51
+ console.log(` ${chalk_1.default.yellow('[WARN]')} ${msg}`);
52
+ }
53
+ function fail(msg) {
54
+ console.log(` ${chalk_1.default.red('[FAIL]')} ${msg}`);
55
+ }
56
+ async function doctorCommand() {
57
+ console.log('');
58
+ console.log(chalk_1.default.bold(' TestDroid Doctor'));
59
+ console.log('');
60
+ // Node.js version
61
+ const [major] = process.versions.node.split('.').map(Number);
62
+ if (major >= 20) {
63
+ ok(`Node.js v${process.versions.node} (>=20 required)`);
64
+ }
65
+ else {
66
+ fail(`Node.js v${process.versions.node} (<20, update required)`);
67
+ }
68
+ // ADB
69
+ try {
70
+ const adbPath = (0, adb_path_resolver_1.resolveAdbPath)();
71
+ const version = (0, child_process_1.execFileSync)(adbPath, ['version'], {
72
+ encoding: 'utf-8',
73
+ stdio: 'pipe',
74
+ });
75
+ const vMatch = version.match(/(\d+\.\d+\.\d+)/);
76
+ ok(`ADB v${vMatch?.[1] || 'unknown'} found at ${adbPath}`);
77
+ // Devices
78
+ const adb = new adb_shell_1.AdbShell(adbPath);
79
+ const devices = adb.listDevices();
80
+ const online = devices.filter((d) => d.state === 'device');
81
+ const unauthorized = devices.filter((d) => d.state === 'unauthorized');
82
+ if (online.length > 0) {
83
+ for (const d of online) {
84
+ ok(`Device: ${d.model || d.serial} (${d.state})`);
85
+ }
86
+ }
87
+ else {
88
+ warn('No online devices detected');
89
+ }
90
+ for (const d of unauthorized) {
91
+ warn(`${d.serial}: unauthorized — tap "Allow" on device screen`);
92
+ }
93
+ }
94
+ catch (err) {
95
+ fail(`ADB: ${err.message}`);
96
+ }
97
+ // Java JDK
98
+ const javaBin = (0, paths_1.getJavaBinPath)();
99
+ if (fs.existsSync(javaBin)) {
100
+ try {
101
+ const javaOut = (0, child_process_1.execFileSync)(javaBin, ['-version'], {
102
+ encoding: 'utf-8',
103
+ stdio: 'pipe',
104
+ }).toString();
105
+ const jMatch = javaOut.match(/(\d+\.\d+\.\d+)/);
106
+ ok(`Java JDK ${jMatch?.[1] || 'unknown'} (${paths_1.TESTDROID_HOME}/java/)`);
107
+ }
108
+ catch (javaErr) {
109
+ const stderr = javaErr.stderr?.toString() || '';
110
+ const jMatch = stderr.match(/(\d+\.\d+\.\d+)/);
111
+ if (jMatch) {
112
+ ok(`Java JDK ${jMatch[1]} (${paths_1.TESTDROID_HOME}/java/)`);
113
+ }
114
+ else {
115
+ fail('Java JDK: installed but cannot determine version');
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ warn('Java JDK not installed (run testdroid setup)');
121
+ }
122
+ // scrcpy
123
+ const scrcpyBin = (0, paths_1.getScrcpyPath)();
124
+ if (fs.existsSync(scrcpyBin)) {
125
+ try {
126
+ const scrcpyOut = (0, child_process_1.execFileSync)(scrcpyBin, ['--version'], {
127
+ encoding: 'utf-8',
128
+ stdio: 'pipe',
129
+ });
130
+ const sMatch = scrcpyOut.match(/(\d+\.\d+\.\d+)/);
131
+ ok(`scrcpy v${sMatch?.[1] || 'unknown'} (${paths_1.TESTDROID_HOME}/scrcpy/)`);
132
+ }
133
+ catch {
134
+ warn('scrcpy: installed but cannot run');
135
+ }
136
+ }
137
+ else {
138
+ warn('scrcpy not installed (run testdroid setup)');
139
+ }
140
+ // Server
141
+ const store = new credential_store_1.CredentialStore();
142
+ const serverUrl = store.resolveServerUrl();
143
+ try {
144
+ const res = await fetch(`${serverUrl}/api/v1/health`, {
145
+ signal: AbortSignal.timeout(5000),
146
+ });
147
+ if (res.ok) {
148
+ ok(`Server: ${serverUrl} reachable`);
149
+ }
150
+ else {
151
+ warn(`Server: ${serverUrl} responded with ${res.status}`);
152
+ }
153
+ }
154
+ catch {
155
+ fail(`Server: ${serverUrl} unreachable`);
156
+ }
157
+ // --- Appium (optional) ---
158
+ console.log('');
159
+ console.log(chalk_1.default.gray(' Appium (opcional — alta precisao)'));
160
+ // 1. Check Appium server
161
+ try {
162
+ const { isAppiumRunning } = await Promise.resolve().then(() => __importStar(require('../appium/health-check')));
163
+ const appiumRunning = await isAppiumRunning();
164
+ if (appiumRunning) {
165
+ ok('Appium server rodando (localhost:4723)');
166
+ // 3. Check UIAutomator2 (only if Appium running)
167
+ try {
168
+ const response = await fetch('http://localhost:4723/status', {
169
+ signal: AbortSignal.timeout(2000),
170
+ });
171
+ const status = await response.json();
172
+ if (JSON.stringify(status).includes('uiautomator2')) {
173
+ ok('UIAutomator2 driver instalado');
174
+ }
175
+ else {
176
+ warn('UIAutomator2 driver nao detectado');
177
+ console.log(chalk_1.default.gray(' appium driver install uiautomator2'));
178
+ }
179
+ }
180
+ catch {
181
+ warn('Nao foi possivel verificar drivers Appium');
182
+ }
183
+ }
184
+ else {
185
+ warn('Appium server nao encontrado');
186
+ console.log(chalk_1.default.gray(' npm install -g appium'));
187
+ console.log(chalk_1.default.gray(' appium driver install uiautomator2'));
188
+ console.log(chalk_1.default.gray(' appium &'));
189
+ }
190
+ }
191
+ catch {
192
+ warn('Modulo health-check nao disponivel');
193
+ }
194
+ // 2. Check webdriverio
195
+ try {
196
+ await Promise.resolve().then(() => __importStar(require('webdriverio')));
197
+ ok('WebDriverIO instalado');
198
+ }
199
+ catch {
200
+ warn('WebDriverIO nao instalado (opcional)');
201
+ console.log(chalk_1.default.gray(' npm install webdriverio'));
202
+ }
203
+ // Session
204
+ const creds = store.load();
205
+ if (creds && creds.expiresAt > Date.now()) {
206
+ const hoursLeft = Math.round((creds.expiresAt - Date.now()) / 3600_000);
207
+ ok(`Session: active (expires in ~${hoursLeft}h)`);
208
+ }
209
+ else {
210
+ warn('Session: not authenticated (run `testdroid connect`)');
211
+ }
212
+ console.log('');
213
+ }
214
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function mirrorCommand(serial?: string): Promise<void>;
2
+ //# sourceMappingURL=mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.d.ts","sourceRoot":"","sources":["../../src/commands/mirror.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ElE"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.mirrorCommand = mirrorCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const adb_shell_1 = require("../adb/adb-shell");
10
+ const detector_1 = require("../adb/detector");
11
+ const launcher_1 = require("../scrcpy/launcher");
12
+ async function mirrorCommand(serial) {
13
+ const adbClient = new adb_shell_1.AdbShell();
14
+ const launcher = new launcher_1.ScrcpyLauncher();
15
+ // Verificar dependencias
16
+ if (!adbClient.hasAdb()) {
17
+ console.log(chalk_1.default.red('Erro: ADB nao encontrado no sistema.'));
18
+ return;
19
+ }
20
+ if (!launcher.hasScrcpy()) {
21
+ console.log(chalk_1.default.red('Erro: scrcpy nao encontrado.'));
22
+ console.log(chalk_1.default.yellow('Execute: testdroid setup'));
23
+ return;
24
+ }
25
+ // Se nenhum serial foi passado, detecta e usa o primeiro dispositivo
26
+ if (!serial) {
27
+ const detector = new detector_1.DeviceDetector(adbClient);
28
+ const devices = detector.detect();
29
+ if (devices.length === 0) {
30
+ console.log(chalk_1.default.yellow('Nenhum dispositivo encontrado.'));
31
+ return;
32
+ }
33
+ if (devices.length === 1) {
34
+ serial = devices[0].serial;
35
+ }
36
+ else {
37
+ console.log(chalk_1.default.yellow('Multiplos dispositivos encontrados. Especifique o serial:'));
38
+ for (const d of devices) {
39
+ console.log(chalk_1.default.gray(` testdroid mirror ${d.serial} # ${d.model}`));
40
+ }
41
+ return;
42
+ }
43
+ }
44
+ const spinner = (0, ora_1.default)(`Iniciando mirror para ${serial}...`).start();
45
+ try {
46
+ const info = adbClient.getDeviceInfo(serial);
47
+ const windowTitle = `TestDroid - ${info.model || serial}`;
48
+ const childProcess = launcher.start(serial, { windowTitle, noAudio: true });
49
+ spinner.succeed(chalk_1.default.green(`Mirror iniciado para ${serial} (${info.model || 'desconhecido'})`));
50
+ console.log(chalk_1.default.gray(' Pressione Ctrl+C para parar\n'));
51
+ // Lidar com encerramento
52
+ const cleanup = () => {
53
+ console.log(chalk_1.default.yellow('\n Encerrando mirror...'));
54
+ launcher.stop();
55
+ process.exit(0);
56
+ };
57
+ childProcess.on('close', (code) => {
58
+ if (code !== 0) {
59
+ console.log(chalk_1.default.red(` scrcpy encerrou com codigo ${code}`));
60
+ }
61
+ else {
62
+ console.log(chalk_1.default.gray(' Mirror encerrado.'));
63
+ }
64
+ });
65
+ childProcess.on('error', (err) => {
66
+ spinner.fail(chalk_1.default.red(`Erro ao iniciar scrcpy: ${err.message}`));
67
+ });
68
+ // Capture Ctrl+C no processo principal
69
+ process.on('SIGINT', cleanup);
70
+ process.on('SIGTERM', cleanup);
71
+ }
72
+ catch (err) {
73
+ const message = err instanceof Error ? err.message : String(err);
74
+ spinner.fail(chalk_1.default.red(`Erro: ${message}`));
75
+ }
76
+ }
77
+ //# sourceMappingURL=mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/commands/mirror.ts"],"names":[],"mappings":";;;;;AAMA,sCA0EC;AAhFD,kDAA0B;AAC1B,8CAAsB;AACtB,gDAA4C;AAC5C,8CAAiD;AACjD,iDAAoD;AAE7C,KAAK,UAAU,aAAa,CAAC,MAAe;IACjD,MAAM,SAAS,GAAG,IAAI,oBAAQ,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,yBAAc,EAAE,CAAC;IAEtC,yBAAyB;IACzB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,qEAAqE;IACrE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,IAAI,yBAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAElC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2DAA2D,CAAC,CAAC,CAAC;YACvF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,yBAAyB,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,eAAe,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;QAE1D,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5E,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,wBAAwB,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAE3D,yBAAyB;QACzB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACtD,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC/B,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Gera codigo de teste a partir de prompt em portugues.
3
+ * Usa a API do backend ou gera localmente com ANTHROPIC_API_KEY.
4
+ */
5
+ export declare function promptCommand(promptText: string, options: {
6
+ package?: string;
7
+ language?: string;
8
+ output?: string;
9
+ url?: string;
10
+ token?: string;
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAmFf"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.promptCommand = promptCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const fs_1 = require("fs");
42
+ const path_1 = require("path");
43
+ /**
44
+ * Gera codigo de teste a partir de prompt em portugues.
45
+ * Usa a API do backend ou gera localmente com ANTHROPIC_API_KEY.
46
+ */
47
+ async function promptCommand(promptText, options) {
48
+ const language = options.language || 'appium-ts';
49
+ const appPackage = options.package || 'com.app';
50
+ console.log();
51
+ console.log(chalk_1.default.bold(' TestDroid - Geracao de Teste por IA'));
52
+ console.log(chalk_1.default.gray(` ${'─'.repeat(50)}`));
53
+ console.log(chalk_1.default.gray(` Prompt: ${promptText}`));
54
+ console.log(chalk_1.default.gray(` Linguagem: ${language}`));
55
+ console.log(chalk_1.default.gray(` Pacote: ${appPackage}`));
56
+ console.log(chalk_1.default.gray(` ${'─'.repeat(50)}`));
57
+ console.log();
58
+ let code;
59
+ // Try backend API first if URL and token are provided
60
+ if (options.url && options.token) {
61
+ console.log(chalk_1.default.cyan(' A gerar codigo via backend...'));
62
+ try {
63
+ code = await generateViaBackend(promptText, language, appPackage, options.url, options.token);
64
+ }
65
+ catch (err) {
66
+ const message = err instanceof Error ? err.message : String(err);
67
+ console.log(chalk_1.default.red(` Erro ao gerar via backend: ${message}`));
68
+ return;
69
+ }
70
+ }
71
+ else if (process.env.ANTHROPIC_API_KEY) {
72
+ // Generate locally with Anthropic API
73
+ console.log(chalk_1.default.cyan(' A gerar codigo localmente com IA...'));
74
+ try {
75
+ code = await generateLocally(promptText, language, appPackage);
76
+ }
77
+ catch (err) {
78
+ const message = err instanceof Error ? err.message : String(err);
79
+ console.log(chalk_1.default.red(` Erro ao gerar codigo: ${message}`));
80
+ return;
81
+ }
82
+ }
83
+ else {
84
+ console.log(chalk_1.default.red(' Erro: Necessario --url/--token (backend) ou ANTHROPIC_API_KEY (local).'));
85
+ console.log(chalk_1.default.gray(' Exemplos:'));
86
+ console.log(chalk_1.default.gray(' testdroid prompt "faz login" --url http://localhost:3001 --token SEU_TOKEN'));
87
+ console.log(chalk_1.default.gray(' ANTHROPIC_API_KEY=sk-... testdroid prompt "faz login"'));
88
+ return;
89
+ }
90
+ console.log();
91
+ console.log(chalk_1.default.green(' Codigo gerado com sucesso!'));
92
+ console.log(chalk_1.default.gray(` ${'─'.repeat(50)}`));
93
+ console.log();
94
+ // Display code with basic highlighting
95
+ const lines = code.split('\n');
96
+ for (const line of lines) {
97
+ if (line.trim().startsWith('//') || line.trim().startsWith('*') || line.trim().startsWith('/*')) {
98
+ console.log(chalk_1.default.gray(` ${line}`));
99
+ }
100
+ else if (line.includes('import ') || line.includes('export ') || line.includes('describe(') || line.includes('it(')) {
101
+ console.log(chalk_1.default.cyan(` ${line}`));
102
+ }
103
+ else {
104
+ console.log(` ${line}`);
105
+ }
106
+ }
107
+ console.log();
108
+ // Save to file if output specified
109
+ if (options.output) {
110
+ const outputPath = (0, path_1.resolve)(options.output);
111
+ (0, fs_1.writeFileSync)(outputPath, code, 'utf-8');
112
+ console.log(chalk_1.default.green(` Arquivo salvo: ${outputPath}`));
113
+ console.log();
114
+ }
115
+ }
116
+ async function generateViaBackend(prompt, language, appPackage, url, token) {
117
+ const apiUrl = `${url.replace(/\/$/, '')}/api/v1/codegen/prompt`;
118
+ const response = await fetch(apiUrl, {
119
+ method: 'POST',
120
+ headers: {
121
+ 'Content-Type': 'application/json',
122
+ Authorization: `Bearer ${token}`,
123
+ },
124
+ body: JSON.stringify({
125
+ prompt,
126
+ projectId: 'cli',
127
+ language,
128
+ appPackage,
129
+ }),
130
+ });
131
+ if (!response.ok) {
132
+ const text = await response.text();
133
+ throw new Error(`HTTP ${response.status}: ${text}`);
134
+ }
135
+ const data = (await response.json());
136
+ return data.code;
137
+ }
138
+ async function generateLocally(prompt, language, appPackage) {
139
+ // Dynamic import to avoid requiring the SDK when not needed
140
+ const { default: Anthropic } = await Promise.resolve().then(() => __importStar(require('@anthropic-ai/sdk')));
141
+ const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
142
+ const systemPrompt = `You are a QA expert generating mobile test automation code.
143
+ The user describes tests in Portuguese (PT-BR).
144
+ Generate clean ${language} test code for Android app ${appPackage}.
145
+ Use describe/it blocks, proper selectors, waits, assertions.
146
+ Output ONLY code, no explanations.`;
147
+ const response = await client.messages.create({
148
+ model: 'claude-sonnet-4-20250514',
149
+ max_tokens: 4096,
150
+ system: systemPrompt,
151
+ messages: [
152
+ {
153
+ role: 'user',
154
+ content: prompt,
155
+ },
156
+ ],
157
+ });
158
+ const textBlock = response.content.find((block) => block.type === 'text');
159
+ if (!textBlock || textBlock.type !== 'text') {
160
+ throw new Error('Sem resposta da IA');
161
+ }
162
+ let code = textBlock.text.trim();
163
+ // Strip markdown code fences if present
164
+ if (code.startsWith('```')) {
165
+ const lines = code.split('\n');
166
+ lines.shift();
167
+ if (lines[lines.length - 1]?.trim() === '```') {
168
+ lines.pop();
169
+ }
170
+ code = lines.join('\n').trim();
171
+ }
172
+ return code;
173
+ }
174
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function recordCommand(serial?: string, options?: {
2
+ output?: string;
3
+ noScreenshots?: boolean;
4
+ appium?: boolean;
5
+ appiumUrl?: string;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/commands/record.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CACjC,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3F,OAAO,CAAC,IAAI,CAAC,CAsIf"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.recordCommand = recordCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_1 = require("fs");
9
+ const adb_shell_1 = require("../adb/adb-shell");
10
+ const detector_1 = require("../adb/detector");
11
+ const recorder_1 = require("../recording/recorder");
12
+ async function recordCommand(serial, options) {
13
+ const adbClient = new adb_shell_1.AdbShell();
14
+ if (!adbClient.hasAdb()) {
15
+ console.log(chalk_1.default.red('Error: ADB not found on the system.'));
16
+ console.log(chalk_1.default.yellow('Install Android SDK Platform Tools and add to PATH.'));
17
+ return;
18
+ }
19
+ // Auto-select device if no serial provided
20
+ if (!serial) {
21
+ const detector = new detector_1.DeviceDetector(adbClient);
22
+ const devices = detector.detect();
23
+ if (devices.length === 0) {
24
+ console.log(chalk_1.default.yellow('No devices found.'));
25
+ console.log(chalk_1.default.gray('Tips:'));
26
+ console.log(chalk_1.default.gray(' - Check USB cable connection'));
27
+ console.log(chalk_1.default.gray(' - Enable USB debugging on the device'));
28
+ return;
29
+ }
30
+ if (devices.length === 1) {
31
+ serial = devices[0].serial;
32
+ }
33
+ else {
34
+ console.log(chalk_1.default.yellow('Multiple devices found. Specify a serial:'));
35
+ for (const d of devices) {
36
+ console.log(chalk_1.default.gray(` testdroid record ${d.serial}`));
37
+ }
38
+ return;
39
+ }
40
+ }
41
+ const includeScreenshots = !options?.noScreenshots;
42
+ const appiumUrl = options?.appiumUrl || 'http://127.0.0.1:4723';
43
+ const outputFile = options?.output || `recording-${Date.now()}.json`;
44
+ // Always use unified Recorder — Appium auto-detected inside EventCapture
45
+ const recorder = new recorder_1.Recorder(serial, {
46
+ includeScreenshots,
47
+ appiumUrl,
48
+ useAppium: options?.appium !== false, // --no-appium sets to false
49
+ });
50
+ console.log(chalk_1.default.bold('\n TestDroid Recording'));
51
+ console.log(chalk_1.default.gray(` Device: ${serial}`));
52
+ console.log(chalk_1.default.gray(` Output: ${outputFile}`));
53
+ console.log();
54
+ console.log(chalk_1.default.cyan(' Recording started. Interact with the device.'));
55
+ console.log(chalk_1.default.gray(' Press Ctrl+C to stop recording.\n'));
56
+ let eventCount = 0;
57
+ const onEvent = (event) => {
58
+ eventCount++;
59
+ const time = (event.timestamp / 1000).toFixed(1);
60
+ let description;
61
+ switch (event.type) {
62
+ case 'tap':
63
+ description = chalk_1.default.green(`TAP`) + chalk_1.default.white(` at (${event.x}, ${event.y})`);
64
+ break;
65
+ case 'long_press':
66
+ description = chalk_1.default.magenta(`LONG_PRESS`) + chalk_1.default.white(` at (${event.x}, ${event.y})`);
67
+ break;
68
+ case 'swipe':
69
+ description =
70
+ chalk_1.default.blue(`SWIPE`) +
71
+ chalk_1.default.white(` from (${event.x}, ${event.y}) to (${event.endX}, ${event.endY})`);
72
+ break;
73
+ case 'pinch':
74
+ description = chalk_1.default.magenta('PINCH') + chalk_1.default.white(` scale=${event.gestureDetails?.scale?.toFixed(2) || '?'}`);
75
+ break;
76
+ case 'zoom':
77
+ description = chalk_1.default.magenta('ZOOM') + chalk_1.default.white(` scale=${event.gestureDetails?.scale?.toFixed(2) || '?'}`);
78
+ break;
79
+ case 'rotate':
80
+ description = chalk_1.default.magenta('ROTATE') + chalk_1.default.white(` ${event.gestureDetails?.angle?.toFixed(0) || '?'}°`);
81
+ break;
82
+ default:
83
+ description = chalk_1.default.yellow(event.type.toUpperCase()) + chalk_1.default.white(` at (${event.x}, ${event.y})`);
84
+ break;
85
+ }
86
+ console.log(chalk_1.default.gray(` [${time}s]`) + ` #${eventCount} ${description}`);
87
+ };
88
+ await recorder.start(onEvent);
89
+ // Show capture mode feedback
90
+ if (recorder.isAppiumActive()) {
91
+ console.log(chalk_1.default.cyan(' Appium detectado — captura de alta precisao ativada'));
92
+ }
93
+ else {
94
+ console.log(chalk_1.default.yellow(' Usando captura padrao (instale Appium para alta precisao)'));
95
+ }
96
+ // Handle Ctrl+C for graceful stop
97
+ const cleanup = () => {
98
+ console.log(chalk_1.default.yellow('\n Stopping recording...'));
99
+ const result = recorder.stop();
100
+ const { screenSize, ...rest } = result;
101
+ const recording = {
102
+ ...rest,
103
+ screenWidth: screenSize?.width,
104
+ screenHeight: screenSize?.height,
105
+ };
106
+ // Write recording to file
107
+ try {
108
+ const json = JSON.stringify(recording, null, 2);
109
+ (0, fs_1.writeFileSync)(outputFile, json, 'utf-8');
110
+ const durationSec = (recording.duration / 1000).toFixed(1);
111
+ console.log();
112
+ console.log(chalk_1.default.bold(' Recording Summary'));
113
+ console.log(chalk_1.default.gray(` ${'─'.repeat(40)}`));
114
+ console.log(chalk_1.default.white(` Events: ${recording.events.length}`));
115
+ console.log(chalk_1.default.white(` Duration: ${durationSec}s`));
116
+ console.log(chalk_1.default.white(` Package: ${recording.appPackage || '(unknown)'}`));
117
+ console.log(chalk_1.default.white(` Saved to: ${outputFile}`));
118
+ console.log();
119
+ }
120
+ catch (err) {
121
+ const message = err instanceof Error ? err.message : String(err);
122
+ console.log(chalk_1.default.red(` Error saving recording: ${message}`));
123
+ }
124
+ process.exit(0);
125
+ };
126
+ process.on('SIGINT', cleanup);
127
+ process.on('SIGTERM', cleanup);
128
+ }
129
+ //# sourceMappingURL=record.js.map