@panicgit/android-test-pilot 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.claude/skills/atp/analyze-app/SKILL.md +86 -0
  2. package/.claude/skills/atp/app-map/SKILL.md +36 -0
  3. package/.claude/skills/atp/check-logs/SKILL.md +77 -0
  4. package/.claude/skills/atp/run-test/SKILL.md +92 -0
  5. package/README.ko.md +241 -0
  6. package/README.md +241 -0
  7. package/lib/android.d.ts +96 -0
  8. package/lib/android.js +740 -0
  9. package/lib/android.js.map +1 -0
  10. package/lib/image-utils.d.ts +28 -0
  11. package/lib/image-utils.js +156 -0
  12. package/lib/image-utils.js.map +1 -0
  13. package/lib/index.d.ts +2 -0
  14. package/lib/index.js +90 -0
  15. package/lib/index.js.map +1 -0
  16. package/lib/ios.d.ts +54 -0
  17. package/lib/ios.js +241 -0
  18. package/lib/ios.js.map +1 -0
  19. package/lib/iphone-simulator.d.ts +34 -0
  20. package/lib/iphone-simulator.js +227 -0
  21. package/lib/iphone-simulator.js.map +1 -0
  22. package/lib/logger.d.ts +2 -0
  23. package/lib/logger.js +23 -0
  24. package/lib/logger.js.map +1 -0
  25. package/lib/mobile-device.d.ts +25 -0
  26. package/lib/mobile-device.js +141 -0
  27. package/lib/mobile-device.js.map +1 -0
  28. package/lib/mobilecli.d.ts +32 -0
  29. package/lib/mobilecli.js +113 -0
  30. package/lib/mobilecli.js.map +1 -0
  31. package/lib/png.d.ts +9 -0
  32. package/lib/png.js +20 -0
  33. package/lib/png.js.map +1 -0
  34. package/lib/robot.d.ts +116 -0
  35. package/lib/robot.js +10 -0
  36. package/lib/robot.js.map +1 -0
  37. package/lib/server.d.ts +3 -0
  38. package/lib/server.js +692 -0
  39. package/lib/server.js.map +1 -0
  40. package/lib/tiers/abstract-tier.d.ts +48 -0
  41. package/lib/tiers/abstract-tier.js +35 -0
  42. package/lib/tiers/abstract-tier.js.map +1 -0
  43. package/lib/tiers/screenshot-tier.d.ts +19 -0
  44. package/lib/tiers/screenshot-tier.js +53 -0
  45. package/lib/tiers/screenshot-tier.js.map +1 -0
  46. package/lib/tiers/text-tier.d.ts +20 -0
  47. package/lib/tiers/text-tier.js +138 -0
  48. package/lib/tiers/text-tier.js.map +1 -0
  49. package/lib/tiers/tier-runner.d.ts +27 -0
  50. package/lib/tiers/tier-runner.js +91 -0
  51. package/lib/tiers/tier-runner.js.map +1 -0
  52. package/lib/tiers/types.d.ts +100 -0
  53. package/lib/tiers/types.js +12 -0
  54. package/lib/tiers/types.js.map +1 -0
  55. package/lib/tiers/uiautomator-tier.d.ts +16 -0
  56. package/lib/tiers/uiautomator-tier.js +91 -0
  57. package/lib/tiers/uiautomator-tier.js.map +1 -0
  58. package/lib/utils.d.ts +4 -0
  59. package/lib/utils.js +81 -0
  60. package/lib/utils.js.map +1 -0
  61. package/lib/webdriver-agent.d.ts +45 -0
  62. package/lib/webdriver-agent.js +400 -0
  63. package/lib/webdriver-agent.js.map +1 -0
  64. package/package.json +50 -0
  65. package/templates/scenario.md +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobilecli.js","sourceRoot":"","sources":["../src/mobilecli.ts"],"names":[],"mappings":"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"}
package/lib/png.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export interface PngDimensions {
2
+ width: number;
3
+ height: number;
4
+ }
5
+ export declare class PNG {
6
+ private readonly buffer;
7
+ constructor(buffer: Buffer);
8
+ getDimensions(): PngDimensions;
9
+ }
package/lib/png.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PNG = void 0;
4
+ class PNG {
5
+ buffer;
6
+ constructor(buffer) {
7
+ this.buffer = buffer;
8
+ }
9
+ getDimensions() {
10
+ const pngSignature = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
11
+ if (!this.buffer.subarray(0, 8).equals(pngSignature)) {
12
+ throw new Error("Not a valid PNG file");
13
+ }
14
+ const width = this.buffer.readUInt32BE(16);
15
+ const height = this.buffer.readUInt32BE(20);
16
+ return { width, height };
17
+ }
18
+ }
19
+ exports.PNG = PNG;
20
+ //# sourceMappingURL=png.js.map
package/lib/png.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../src/png.ts"],"names":[],"mappings":";;;AAKA,MAAa,GAAG;IACqB;IAApC,YAAoC,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAClD,CAAC;IAEM,aAAa;QACnB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;CACD;AAdD,kBAcC"}
package/lib/robot.d.ts ADDED
@@ -0,0 +1,116 @@
1
+ export interface Dimensions {
2
+ width: number;
3
+ height: number;
4
+ }
5
+ export interface ScreenSize extends Dimensions {
6
+ scale: number;
7
+ }
8
+ export interface InstalledApp {
9
+ packageName: string;
10
+ appName: string;
11
+ }
12
+ export type SwipeDirection = "up" | "down" | "left" | "right";
13
+ export type Button = "HOME" | "BACK" | "VOLUME_UP" | "VOLUME_DOWN" | "ENTER" | "DPAD_CENTER" | "DPAD_UP" | "DPAD_DOWN" | "DPAD_LEFT" | "DPAD_RIGHT";
14
+ export interface ScreenElementRect {
15
+ x: number;
16
+ y: number;
17
+ width: number;
18
+ height: number;
19
+ }
20
+ export interface ScreenElement {
21
+ type: string;
22
+ label?: string;
23
+ text?: string;
24
+ name?: string;
25
+ value?: string;
26
+ identifier?: string;
27
+ rect: ScreenElementRect;
28
+ focused?: boolean;
29
+ }
30
+ export declare class ActionableError extends Error {
31
+ constructor(message: string);
32
+ }
33
+ export type Orientation = "portrait" | "landscape";
34
+ export interface Robot {
35
+ /**
36
+ * Get the screen size of the device in pixels.
37
+ */
38
+ getScreenSize(): Promise<ScreenSize>;
39
+ /**
40
+ * Swipe in a direction.
41
+ */
42
+ swipe(direction: SwipeDirection): Promise<void>;
43
+ /**
44
+ * Swipe from a specific coordinate in a direction.
45
+ */
46
+ swipeFromCoordinate(x: number, y: number, direction: SwipeDirection, distance?: number): Promise<void>;
47
+ /**
48
+ * Get a screenshot of the screen. Returns a Buffer that contains
49
+ * a PNG image of the screen. Will be same dimensions as getScreenSize().
50
+ */
51
+ getScreenshot(): Promise<Buffer>;
52
+ /**
53
+ * List all installed apps on the device. Returns an array of package names (or
54
+ * bundle identifiers in iOS) for all installed apps.
55
+ */
56
+ listApps(): Promise<InstalledApp[]>;
57
+ /**
58
+ * Launch an app.
59
+ */
60
+ launchApp(packageName: string, locale?: string): Promise<void>;
61
+ /**
62
+ * Terminate an app. If app was already terminated (or non existent) then this
63
+ * is a no-op.
64
+ */
65
+ terminateApp(packageName: string): Promise<void>;
66
+ /**
67
+ * Install an app on the device from a file path.
68
+ */
69
+ installApp(path: string): Promise<void>;
70
+ /**
71
+ * Uninstall an app from the device.
72
+ */
73
+ uninstallApp(bundleId: string): Promise<void>;
74
+ /**
75
+ * Open a URL in the device's web browser. Can be an https:// url, or a
76
+ * custom scheme (e.g. "myapp://").
77
+ */
78
+ openUrl(url: string): Promise<void>;
79
+ /**
80
+ * Send keys to the device, simulating keyboard input.
81
+ */
82
+ sendKeys(text: string): Promise<void>;
83
+ /**
84
+ * Press a button on the device, simulating a physical button press.
85
+ */
86
+ pressButton(button: Button): Promise<void>;
87
+ /**
88
+ * Tap on a specific coordinate on the screen.
89
+ */
90
+ tap(x: number, y: number): Promise<void>;
91
+ /**
92
+ * Tap on a specific coordinate on the screen.
93
+ */
94
+ doubleTap(x: number, y: number): Promise<void>;
95
+ /**
96
+ * Long press on a specific coordinate on the screen.
97
+ * @param x - The x coordinate to long press
98
+ * @param y - The y coordinate to long press
99
+ * @param duration - Duration of the long press in milliseconds
100
+ */
101
+ longPress(x: number, y: number, duration: number): Promise<void>;
102
+ /**
103
+ * Get all elements on the screen. Works only on native apps (not webviews). Will
104
+ * return a filtered list of elements that make sense to interact with.
105
+ */
106
+ getElementsOnScreen(): Promise<ScreenElement[]>;
107
+ /**
108
+ * Change the screen orientation of the device.
109
+ * @param orientation The desired orientation ("portrait" or "landscape")
110
+ */
111
+ setOrientation(orientation: Orientation): Promise<void>;
112
+ /**
113
+ * Get the current screen orientation.
114
+ */
115
+ getOrientation(): Promise<Orientation>;
116
+ }
package/lib/robot.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ActionableError = void 0;
4
+ class ActionableError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ }
8
+ }
9
+ exports.ActionableError = ActionableError;
10
+ //# sourceMappingURL=robot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robot.js","sourceRoot":"","sources":["../src/robot.ts"],"names":[],"mappings":";;;AAsCA,MAAa,eAAgB,SAAQ,KAAK;IACzC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;IAChB,CAAC;CACD;AAJD,0CAIC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare const getAgentVersion: () => string;
3
+ export declare const createMcpServer: () => McpServer;