@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.
- package/dist/adb/adb-path-resolver.d.ts +6 -0
- package/dist/adb/adb-path-resolver.d.ts.map +1 -0
- package/dist/adb/adb-path-resolver.js +93 -0
- package/dist/adb/adb-path-resolver.js.map +1 -0
- package/dist/adb/adb-shell.d.ts +29 -0
- package/dist/adb/adb-shell.d.ts.map +1 -0
- package/dist/adb/adb-shell.js +128 -0
- package/dist/adb/adb-shell.js.map +1 -0
- package/dist/adb/detector.d.ts +12 -0
- package/dist/adb/detector.d.ts.map +1 -0
- package/dist/adb/detector.js +44 -0
- package/dist/adb/detector.js.map +1 -0
- package/dist/adb/device-tracker.d.ts +23 -0
- package/dist/adb/device-tracker.d.ts.map +1 -0
- package/dist/adb/device-tracker.js +134 -0
- package/dist/adb/device-tracker.js.map +1 -0
- package/dist/adb/emulator-detector.d.ts +11 -0
- package/dist/adb/emulator-detector.d.ts.map +1 -0
- package/dist/adb/emulator-detector.js +54 -0
- package/dist/adb/emulator-detector.js.map +1 -0
- package/dist/appium/health-check.d.ts +6 -0
- package/dist/appium/health-check.d.ts.map +1 -0
- package/dist/appium/health-check.js +61 -0
- package/dist/appium/health-check.js.map +1 -0
- package/dist/appium/session-manager.d.ts +15 -0
- package/dist/appium/session-manager.d.ts.map +1 -0
- package/dist/appium/session-manager.js +82 -0
- package/dist/appium/session-manager.js.map +1 -0
- package/dist/auth/credential-store.d.ts +31 -0
- package/dist/auth/credential-store.d.ts.map +1 -0
- package/dist/auth/credential-store.js +154 -0
- package/dist/auth/credential-store.js.map +1 -0
- package/dist/auth/pairing-auth.d.ts +26 -0
- package/dist/auth/pairing-auth.d.ts.map +1 -0
- package/dist/auth/pairing-auth.js +177 -0
- package/dist/auth/pairing-auth.js.map +1 -0
- package/dist/auth/token-manager.d.ts +20 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +101 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/commands/connect.d.ts +9 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +270 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/devices.d.ts +2 -0
- package/dist/commands/devices.d.ts.map +1 -0
- package/dist/commands/devices.js +52 -0
- package/dist/commands/devices.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +214 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/mirror.d.ts +2 -0
- package/dist/commands/mirror.d.ts.map +1 -0
- package/dist/commands/mirror.js +77 -0
- package/dist/commands/mirror.js.map +1 -0
- package/dist/commands/prompt.d.ts +12 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +174 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/record.d.ts +7 -0
- package/dist/commands/record.d.ts.map +1 -0
- package/dist/commands/record.js +129 -0
- package/dist/commands/record.js.map +1 -0
- package/dist/commands/run.d.ts +16 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +271 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +50 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +32 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/healing/ai-adapter.d.ts +44 -0
- package/dist/healing/ai-adapter.d.ts.map +1 -0
- package/dist/healing/ai-adapter.js +87 -0
- package/dist/healing/ai-adapter.js.map +1 -0
- package/dist/healing/healer.d.ts +109 -0
- package/dist/healing/healer.d.ts.map +1 -0
- package/dist/healing/healer.js +475 -0
- package/dist/healing/healer.js.map +1 -0
- package/dist/healing/similarity.d.ts +63 -0
- package/dist/healing/similarity.d.ts.map +1 -0
- package/dist/healing/similarity.js +172 -0
- package/dist/healing/similarity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.d.ts +6 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.d.ts.map +1 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.js +3 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.js.map +1 -0
- package/dist/recording/capture-strategies/getevent.strategy.d.ts +27 -0
- package/dist/recording/capture-strategies/getevent.strategy.d.ts.map +1 -0
- package/dist/recording/capture-strategies/getevent.strategy.js +163 -0
- package/dist/recording/capture-strategies/getevent.strategy.js.map +1 -0
- package/dist/recording/capture-strategies/key-capture.strategy.d.ts +16 -0
- package/dist/recording/capture-strategies/key-capture.strategy.d.ts.map +1 -0
- package/dist/recording/capture-strategies/key-capture.strategy.js +67 -0
- package/dist/recording/capture-strategies/key-capture.strategy.js.map +1 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts +32 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts.map +1 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.js +176 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.js.map +1 -0
- package/dist/recording/confidence-scorer.d.ts +13 -0
- package/dist/recording/confidence-scorer.d.ts.map +1 -0
- package/dist/recording/confidence-scorer.js +34 -0
- package/dist/recording/confidence-scorer.js.map +1 -0
- package/dist/recording/event-capture.d.ts +40 -0
- package/dist/recording/event-capture.d.ts.map +1 -0
- package/dist/recording/event-capture.js +168 -0
- package/dist/recording/event-capture.js.map +1 -0
- package/dist/recording/recorder.d.ts +32 -0
- package/dist/recording/recorder.d.ts.map +1 -0
- package/dist/recording/recorder.js +107 -0
- package/dist/recording/recorder.js.map +1 -0
- package/dist/runner/adb-executor.d.ts +116 -0
- package/dist/runner/adb-executor.d.ts.map +1 -0
- package/dist/runner/adb-executor.js +323 -0
- package/dist/runner/adb-executor.js.map +1 -0
- package/dist/runner/appium-executor.d.ts +35 -0
- package/dist/runner/appium-executor.d.ts.map +1 -0
- package/dist/runner/appium-executor.js +191 -0
- package/dist/runner/appium-executor.js.map +1 -0
- package/dist/runner/parse-strategies/appium-default.strategy.d.ts +12 -0
- package/dist/runner/parse-strategies/appium-default.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/appium-default.strategy.js +342 -0
- package/dist/runner/parse-strategies/appium-default.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/index.d.ts +7 -0
- package/dist/runner/parse-strategies/index.d.ts.map +1 -0
- package/dist/runner/parse-strategies/index.js +14 -0
- package/dist/runner/parse-strategies/index.js.map +1 -0
- package/dist/runner/parse-strategies/java.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/java.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/java.strategy.js +170 -0
- package/dist/runner/parse-strategies/java.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/maestro.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/maestro.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/maestro.strategy.js +105 -0
- package/dist/runner/parse-strategies/maestro.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/python.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/python.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/python.strategy.js +140 -0
- package/dist/runner/parse-strategies/python.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/robot.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/robot.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/robot.strategy.js +81 -0
- package/dist/runner/parse-strategies/robot.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/types.d.ts +17 -0
- package/dist/runner/parse-strategies/types.d.ts.map +1 -0
- package/dist/runner/parse-strategies/types.js +3 -0
- package/dist/runner/parse-strategies/types.js.map +1 -0
- package/dist/runner/parse-strategies/utils.d.ts +39 -0
- package/dist/runner/parse-strategies/utils.d.ts.map +1 -0
- package/dist/runner/parse-strategies/utils.js +217 -0
- package/dist/runner/parse-strategies/utils.js.map +1 -0
- package/dist/runner/script-parser.d.ts +43 -0
- package/dist/runner/script-parser.d.ts.map +1 -0
- package/dist/runner/script-parser.js +68 -0
- package/dist/runner/script-parser.js.map +1 -0
- package/dist/runner/selector-resolver.d.ts +87 -0
- package/dist/runner/selector-resolver.d.ts.map +1 -0
- package/dist/runner/selector-resolver.js +206 -0
- package/dist/runner/selector-resolver.js.map +1 -0
- package/dist/runner/step-executor.d.ts +112 -0
- package/dist/runner/step-executor.d.ts.map +1 -0
- package/dist/runner/step-executor.js +518 -0
- package/dist/runner/step-executor.js.map +1 -0
- package/dist/runner/test-runner.d.ts +89 -0
- package/dist/runner/test-runner.d.ts.map +1 -0
- package/dist/runner/test-runner.js +320 -0
- package/dist/runner/test-runner.js.map +1 -0
- package/dist/scrcpy/launcher.d.ts +16 -0
- package/dist/scrcpy/launcher.d.ts.map +1 -0
- package/dist/scrcpy/launcher.js +87 -0
- package/dist/scrcpy/launcher.js.map +1 -0
- package/dist/services/device-poller.d.ts +10 -0
- package/dist/services/device-poller.d.ts.map +1 -0
- package/dist/services/device-poller.js +44 -0
- package/dist/services/device-poller.js.map +1 -0
- package/dist/services/execution-manager.d.ts +18 -0
- package/dist/services/execution-manager.d.ts.map +1 -0
- package/dist/services/execution-manager.js +185 -0
- package/dist/services/execution-manager.js.map +1 -0
- package/dist/services/recording-manager.d.ts +13 -0
- package/dist/services/recording-manager.d.ts.map +1 -0
- package/dist/services/recording-manager.js +234 -0
- package/dist/services/recording-manager.js.map +1 -0
- package/dist/setup/adb-installer.d.ts +8 -0
- package/dist/setup/adb-installer.d.ts.map +1 -0
- package/dist/setup/adb-installer.js +115 -0
- package/dist/setup/adb-installer.js.map +1 -0
- package/dist/setup/appium-installer.d.ts +8 -0
- package/dist/setup/appium-installer.d.ts.map +1 -0
- package/dist/setup/appium-installer.js +113 -0
- package/dist/setup/appium-installer.js.map +1 -0
- package/dist/setup/base-installer.d.ts +33 -0
- package/dist/setup/base-installer.d.ts.map +1 -0
- package/dist/setup/base-installer.js +170 -0
- package/dist/setup/base-installer.js.map +1 -0
- package/dist/setup/build-tools-installer.d.ts +8 -0
- package/dist/setup/build-tools-installer.d.ts.map +1 -0
- package/dist/setup/build-tools-installer.js +109 -0
- package/dist/setup/build-tools-installer.js.map +1 -0
- package/dist/setup/java-installer.d.ts +8 -0
- package/dist/setup/java-installer.d.ts.map +1 -0
- package/dist/setup/java-installer.js +132 -0
- package/dist/setup/java-installer.js.map +1 -0
- package/dist/setup/paths.d.ts +12 -0
- package/dist/setup/paths.d.ts.map +1 -0
- package/dist/setup/paths.js +90 -0
- package/dist/setup/paths.js.map +1 -0
- package/dist/setup/scrcpy-installer.d.ts +8 -0
- package/dist/setup/scrcpy-installer.d.ts.map +1 -0
- package/dist/setup/scrcpy-installer.js +143 -0
- package/dist/setup/scrcpy-installer.js.map +1 -0
- package/dist/setup/setup-manager.d.ts +18 -0
- package/dist/setup/setup-manager.d.ts.map +1 -0
- package/dist/setup/setup-manager.js +113 -0
- package/dist/setup/setup-manager.js.map +1 -0
- package/dist/ws/socket.d.ts +38 -0
- package/dist/ws/socket.d.ts.map +1 -0
- package/dist/ws/socket.js +91 -0
- package/dist/ws/socket.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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
|