codeloop-mcp-server 0.1.76 → 0.1.77

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 (33) hide show
  1. package/dist/evidence/interaction_evidence.d.ts +46 -0
  2. package/dist/evidence/interaction_evidence.d.ts.map +1 -0
  3. package/dist/evidence/interaction_evidence.js +91 -0
  4. package/dist/evidence/interaction_evidence.js.map +1 -0
  5. package/dist/index.js +28 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/runners/app_launcher.d.ts +6 -0
  8. package/dist/runners/app_launcher.d.ts.map +1 -1
  9. package/dist/runners/app_launcher.js +146 -18
  10. package/dist/runners/app_launcher.js.map +1 -1
  11. package/dist/runners/journey_to_maestro.d.ts +31 -0
  12. package/dist/runners/journey_to_maestro.d.ts.map +1 -0
  13. package/dist/runners/journey_to_maestro.js +101 -0
  14. package/dist/runners/journey_to_maestro.js.map +1 -0
  15. package/dist/runners/maestro_generator.d.ts +5 -1
  16. package/dist/runners/maestro_generator.d.ts.map +1 -1
  17. package/dist/runners/maestro_generator.js +12 -4
  18. package/dist/runners/maestro_generator.js.map +1 -1
  19. package/dist/runners/mobile_app_id.d.ts +7 -0
  20. package/dist/runners/mobile_app_id.d.ts.map +1 -0
  21. package/dist/runners/mobile_app_id.js +100 -0
  22. package/dist/runners/mobile_app_id.js.map +1 -0
  23. package/dist/tools/gate_check.d.ts.map +1 -1
  24. package/dist/tools/gate_check.js +29 -0
  25. package/dist/tools/gate_check.js.map +1 -1
  26. package/dist/tools/run_journey.d.ts +14 -0
  27. package/dist/tools/run_journey.d.ts.map +1 -1
  28. package/dist/tools/run_journey.js +110 -2
  29. package/dist/tools/run_journey.js.map +1 -1
  30. package/dist/tools/verify.d.ts.map +1 -1
  31. package/dist/tools/verify.js +16 -4
  32. package/dist/tools/verify.js.map +1 -1
  33. package/package.json +1 -1
@@ -38,4 +38,10 @@ export interface LaunchAppOptions {
38
38
  * mobile degrades to a directive (launched:false).
39
39
  */
40
40
  export declare function launchApp(opts: LaunchAppOptions): Promise<AppLaunchHandle>;
41
+ /** Does the dir look like a real Gradle/Android project worth building? */
42
+ export declare function hasAndroidGradleProject(cwd: string): boolean;
43
+ /** Prefer an .xcworkspace, else an .xcodeproj, as the xcodebuild container. */
44
+ export declare function buildXcodebuildContainerArgs(cwd: string): string[];
45
+ /** Parse the first scheme name from `xcodebuild -list -json` output. */
46
+ export declare function parseFirstScheme(jsonText: string): string | null;
41
47
  //# sourceMappingURL=app_launcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app_launcher.d.ts","sourceRoot":"","sources":["../../src/runners/app_launcher.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY3F;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAID;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8BhF"}
1
+ {"version":3,"file":"app_launcher.d.ts","sourceRoot":"","sources":["../../src/runners/app_launcher.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY3F;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAID;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAehF;AAKD,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAW5D;AAiGD,+EAA+E;AAC/E,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAYlE;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUhE"}
@@ -19,10 +19,11 @@
19
19
  * Never throws; always returns a handle (with a best-effort stop()).
20
20
  */
21
21
  import { spawn } from "child_process";
22
- import { existsSync } from "fs";
22
+ import { existsSync, readdirSync } from "fs";
23
23
  import { join } from "path";
24
24
  import { platform } from "os";
25
- import { checkToolAvailable } from "./base.js";
25
+ import { checkToolAvailable, runCommand } from "./base.js";
26
+ import { resolveMobileAppId } from "./mobile_app_id.js";
26
27
  /** Output lines that mean the Flutter app finished launching and is live. */
27
28
  const FLUTTER_READY = /(Flutter run key commands|Dart VM Service is listening|VM Service|DevTools|is being served at|Syncing files to device|Application finished|Hot reload|Flutter DevTools|✓ +Built)/i;
28
29
  /** Output lines that mean the Flutter build/launch FAILED (don't keep waiting). */
@@ -62,28 +63,155 @@ export async function launchApp(opts) {
62
63
  if (isFlutterProject(cwd)) {
63
64
  return launchFlutter(opts);
64
65
  }
65
- // Native iOS / Android (no Flutter): building is project-specific. Be honest.
66
- if (target === "ios_simulator") {
67
- return {
68
- launched: false,
69
- method: "native-ios",
70
- reason: "Native iOS app — CodeLoop can't reliably pick the scheme/signing to build+install. " +
71
- "Build & launch it on the booted simulator (xcodebuild -scheme <S> -destination 'platform=iOS Simulator,name=<device>' build, then xcrun simctl install booted <App>.app && xcrun simctl launch booted <bundle-id>), then drive with codeloop_interact.",
72
- };
73
- }
74
- if (target === "android_emulator") {
75
- return {
76
- launched: false,
77
- method: "native-android",
78
- reason: "Native Android app — build & install it on the booted emulator (./gradlew installDebug, then adb shell monkey -p <appId> 1), then drive with codeloop_interact.",
79
- };
80
- }
66
+ // Native iOS / Android (no Flutter): build + install + launch best-effort.
67
+ if (target === "android_emulator")
68
+ return launchNativeAndroid(opts);
69
+ if (target === "ios_simulator")
70
+ return launchNativeIos(opts);
81
71
  return {
82
72
  launched: false,
83
73
  method: "unknown",
84
74
  reason: `No launcher for target "${target}" on a non-Flutter project — launch the app manually, then drive with codeloop_interact.`,
85
75
  };
86
76
  }
77
+ const NATIVE_BUILD_TIMEOUT_MS = 600_000; // native builds can be slow (cold)
78
+ const NATIVE_CMD_TIMEOUT_MS = 90_000;
79
+ /** Does the dir look like a real Gradle/Android project worth building? */
80
+ export function hasAndroidGradleProject(cwd) {
81
+ return [
82
+ "gradlew",
83
+ "gradlew.bat",
84
+ "settings.gradle",
85
+ "settings.gradle.kts",
86
+ "build.gradle",
87
+ "build.gradle.kts",
88
+ join("app", "build.gradle"),
89
+ join("app", "build.gradle.kts"),
90
+ ].some((p) => existsSync(join(cwd, p)));
91
+ }
92
+ /** Native Android: ./gradlew :app:installDebug, then launch via monkey. */
93
+ async function launchNativeAndroid(opts) {
94
+ const { cwd } = opts;
95
+ // Fast degrade before invoking slow Gradle when there's no project here.
96
+ if (!hasAndroidGradleProject(cwd)) {
97
+ return { launched: false, method: "native-android", reason: "No Android Gradle project found — build & install manually (./gradlew installDebug), then drive with codeloop_interact." };
98
+ }
99
+ const hasGradlew = existsSync(join(cwd, "gradlew")) || existsSync(join(cwd, "gradlew.bat"));
100
+ if (!hasGradlew && !(await checkToolAvailable("gradle"))) {
101
+ return { launched: false, method: "native-android", reason: "No gradlew/gradle found — build & install manually (./gradlew installDebug), then drive with codeloop_interact." };
102
+ }
103
+ const appId = resolveMobileAppId(cwd, "android");
104
+ const gradleCmd = hasGradlew ? (platform() === "win32" ? "gradlew.bat" : "./gradlew") : "gradle";
105
+ const install = await runCommand(gradleCmd, [":app:installDebug"], cwd, opts.logPath, undefined, opts.readyTimeoutMs ?? NATIVE_BUILD_TIMEOUT_MS);
106
+ if (install.exit_code !== 0) {
107
+ // Retry the non-scoped task name (some projects don't use :app:).
108
+ const retry = await runCommand(gradleCmd, ["installDebug"], cwd, opts.logPath, undefined, opts.readyTimeoutMs ?? NATIVE_BUILD_TIMEOUT_MS);
109
+ if (retry.exit_code !== 0) {
110
+ return {
111
+ launched: false,
112
+ method: "gradlew installDebug",
113
+ reason: "Android build/install failed — the app does not build on the emulator.",
114
+ error_excerpt: tail(install.stdout + install.stderr + retry.stdout + retry.stderr),
115
+ };
116
+ }
117
+ }
118
+ if (!appId) {
119
+ return { launched: true, method: "gradlew installDebug", device: opts.bootedDevice, reason: "Installed but could not resolve applicationId to auto-launch — open the app from the launcher (then it can be driven)." };
120
+ }
121
+ const serialArgs = opts.bootedDevice ? ["-s", opts.bootedDevice] : [];
122
+ await runCommand("adb", [...serialArgs, "shell", "monkey", "-p", appId, "-c", "android.intent.category.LAUNCHER", "1"], cwd, undefined, undefined, NATIVE_CMD_TIMEOUT_MS);
123
+ await new Promise((r) => setTimeout(r, 2500));
124
+ return { launched: true, method: `gradlew installDebug + launch ${appId}`, device: opts.bootedDevice };
125
+ }
126
+ /** Native iOS (macOS): xcodebuild -> simctl install -> simctl launch. */
127
+ async function launchNativeIos(opts) {
128
+ const { cwd } = opts;
129
+ if (platform() !== "darwin") {
130
+ return { launched: false, method: "native-ios", reason: "iOS builds require macOS." };
131
+ }
132
+ // Fast degrade before invoking slow xcodebuild when there's no project here.
133
+ const listArgs = buildXcodebuildContainerArgs(cwd);
134
+ if (listArgs.length === 0) {
135
+ return { launched: false, method: "native-ios", reason: "No Xcode project/workspace (.xcodeproj/.xcworkspace) found to build with xcodebuild — open it and run once, or build+install manually (xcodebuild build + xcrun simctl install/launch)." };
136
+ }
137
+ if (!(await checkToolAvailable("xcodebuild")) || !(await checkToolAvailable("xcrun"))) {
138
+ return { launched: false, method: "native-ios", reason: "xcodebuild/xcrun not on PATH — install Xcode + command line tools." };
139
+ }
140
+ const udid = opts.bootedDevice;
141
+ if (!udid) {
142
+ return { launched: false, method: "native-ios", reason: "No booted simulator udid to install onto." };
143
+ }
144
+ const bundleId = resolveMobileAppId(cwd, "ios");
145
+ // Resolve a scheme from `xcodebuild -list -json`.
146
+ const list = await runCommand("xcodebuild", [...listArgs, "-list", "-json"], cwd, undefined, undefined, NATIVE_CMD_TIMEOUT_MS);
147
+ const scheme = parseFirstScheme(list.stdout);
148
+ if (!scheme) {
149
+ return { launched: false, method: "native-ios", reason: "Could not resolve an Xcode scheme — open the workspace and build/run once, or set it up, then retry.", error_excerpt: tail(list.stdout + list.stderr) };
150
+ }
151
+ const derived = join(cwd, "build", "codeloop-derived");
152
+ const build = await runCommand("xcodebuild", [...listArgs, "-scheme", scheme, "-configuration", "Debug", "-destination", `platform=iOS Simulator,id=${udid}`, "-derivedDataPath", derived, "build"], cwd, opts.logPath, undefined, opts.readyTimeoutMs ?? NATIVE_BUILD_TIMEOUT_MS);
153
+ if (build.exit_code !== 0) {
154
+ return { launched: false, method: `xcodebuild -scheme ${scheme}`, reason: "iOS build failed — the app does not build for the simulator.", error_excerpt: tail(build.stdout + build.stderr) };
155
+ }
156
+ const appPath = join(derived, "Build", "Products", "Debug-iphonesimulator");
157
+ let appBundle = null;
158
+ try {
159
+ appBundle = readdirSync(appPath).find((f) => f.endsWith(".app")) ?? null;
160
+ }
161
+ catch { /* ignore */ }
162
+ if (!appBundle) {
163
+ return { launched: false, method: "native-ios", reason: `Built but no .app found under ${appPath}.`, error_excerpt: tail(build.stdout) };
164
+ }
165
+ const fullApp = join(appPath, appBundle);
166
+ const installed = await runCommand("xcrun", ["simctl", "install", udid, fullApp], cwd, undefined, undefined, NATIVE_CMD_TIMEOUT_MS);
167
+ if (installed.exit_code !== 0) {
168
+ return { launched: false, method: "simctl install", reason: "simctl install failed.", error_excerpt: tail(installed.stdout + installed.stderr) };
169
+ }
170
+ if (!bundleId) {
171
+ return { launched: true, method: "simctl install", device: udid, reason: "Installed but could not resolve the bundle id to auto-launch — open it in the simulator." };
172
+ }
173
+ await runCommand("xcrun", ["simctl", "launch", udid, bundleId], cwd, undefined, undefined, NATIVE_CMD_TIMEOUT_MS);
174
+ await new Promise((r) => setTimeout(r, 2500));
175
+ return { launched: true, method: `xcodebuild + simctl launch ${bundleId}`, device: udid };
176
+ }
177
+ /** Prefer an .xcworkspace, else an .xcodeproj, as the xcodebuild container. */
178
+ export function buildXcodebuildContainerArgs(cwd) {
179
+ try {
180
+ for (const base of [join(cwd, "ios"), cwd]) {
181
+ let entries = [];
182
+ try {
183
+ entries = readdirSync(base);
184
+ }
185
+ catch {
186
+ continue;
187
+ }
188
+ const ws = entries.find((e) => e.endsWith(".xcworkspace"));
189
+ if (ws)
190
+ return ["-workspace", join(base, ws)];
191
+ const proj = entries.find((e) => e.endsWith(".xcodeproj"));
192
+ if (proj)
193
+ return ["-project", join(base, proj)];
194
+ }
195
+ }
196
+ catch { /* ignore */ }
197
+ return [];
198
+ }
199
+ /** Parse the first scheme name from `xcodebuild -list -json` output. */
200
+ export function parseFirstScheme(jsonText) {
201
+ try {
202
+ const obj = JSON.parse(jsonText);
203
+ const schemes = obj.workspace?.schemes ?? obj.project?.schemes ?? [];
204
+ // Prefer a non-test scheme.
205
+ const pick = schemes.find((s) => !/test/i.test(s)) ?? schemes[0];
206
+ return pick ?? null;
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ function tail(s) {
213
+ return s.split("\n").filter(Boolean).slice(-25).join("\n");
214
+ }
87
215
  async function launchFlutter(opts) {
88
216
  const { cwd, target } = opts;
89
217
  const device = flutterDeviceId(target, opts.bootedDevice);
@@ -1 +1 @@
1
- {"version":3,"file":"app_launcher.js","sourceRoot":"","sources":["../../src/runners/app_launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app_launcher.js","sourceRoot":"","sources":["../../src/runners/app_launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * journey_to_maestro — translate a planned UserJourney into the string-step
3
+ * format that maestro_generator.stepToYaml understands, so codeloop_run_journey
4
+ * can DRIVE a real, label-based interaction suite on a booted iOS simulator /
5
+ * Android emulator (type into named fields, tap buttons by label, submit,
6
+ * assert), instead of degrading every mobile step to a manual follow-up because
7
+ * the coordinate-only engine has no widget targeting.
8
+ *
9
+ * Pure + unit-testable: takes a UserJourneyPlan, returns string steps. The
10
+ * orchestrator feeds those to generateMaestroFlow() and runs them via Maestro.
11
+ *
12
+ * Best-effort by design: Maestro matches by visible text / accessibility label,
13
+ * so a `tap "<label>"` only lands if that text is actually on screen. When a
14
+ * step can't be expressed as a label action it is simply omitted (the journey's
15
+ * coordinate fallback + screenshots still cover it), never invented.
16
+ */
17
+ import type { UserJourneyPlan } from "../tools/plan_user_journey.js";
18
+ export interface JourneyToMaestroOptions {
19
+ /** Cap how many entity arcs to include (keeps flows bounded). Default 3. */
20
+ maxEntities?: number;
21
+ /** Emit a `take screenshot` after each meaningful step. Default true. */
22
+ screenshots?: boolean;
23
+ /** Seconds to wait for an AI reply before screenshotting. Default 5. */
24
+ aiWaitSeconds?: number;
25
+ }
26
+ /**
27
+ * PURE: build the ordered list of Maestro string-steps for a journey plan.
28
+ * Order: a leading screenshot, then top entity CRUD arcs, then AI chatbox arcs.
29
+ */
30
+ export declare function journeyToMaestroSteps(plan: UserJourneyPlan, opts?: JourneyToMaestroOptions): string[];
31
+ //# sourceMappingURL=journey_to_maestro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey_to_maestro.d.ts","sourceRoot":"","sources":["../../src/runners/journey_to_maestro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,+BAA+B,CAAC;AAElF,MAAM,WAAW,uBAAuB;IACtC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2DD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,EACrB,IAAI,GAAE,uBAA4B,GACjC,MAAM,EAAE,CAkCV"}
@@ -0,0 +1,101 @@
1
+ /** A label is usable as a Maestro text matcher only if it's short, visible text. */
2
+ function usableLabel(s) {
3
+ if (!s)
4
+ return null;
5
+ const t = s.trim();
6
+ // Reject empties, very long blobs, CSS/selectors, and pure punctuation.
7
+ if (!t || t.length > 60)
8
+ return null;
9
+ if (/^[#.[]|[{}<>]/.test(t))
10
+ return null; // looks like a CSS/HTML selector
11
+ if (!/[A-Za-z0-9]/.test(t))
12
+ return null;
13
+ return t;
14
+ }
15
+ /** Maestro inputText cannot contain a double-quote unescaped; sanitise. */
16
+ function safeText(s) {
17
+ return s.replace(/"/g, "'").replace(/\s+/g, " ").trim().slice(0, 200);
18
+ }
19
+ function emitEntityStep(step, out, shots) {
20
+ switch (step.step) {
21
+ case "navigate":
22
+ case "create":
23
+ case "commit":
24
+ case "edit":
25
+ case "delete": {
26
+ const label = usableLabel(step.target);
27
+ if (label) {
28
+ out.push(`tap "${label}"`);
29
+ if (shots)
30
+ out.push("take screenshot");
31
+ }
32
+ break;
33
+ }
34
+ case "fill": {
35
+ for (const f of step.fields ?? []) {
36
+ const label = usableLabel(f.label);
37
+ const value = f.example != null ? safeText(String(f.example)) : "";
38
+ if (label && value) {
39
+ // Tap the field by its label, then type — scopes inputText to it.
40
+ out.push(`tap "${label}"`);
41
+ out.push(`type "${value}"`);
42
+ }
43
+ }
44
+ if (shots)
45
+ out.push("take screenshot");
46
+ break;
47
+ }
48
+ case "verify": {
49
+ const label = usableLabel(step.target);
50
+ if (label)
51
+ out.push(`assert visible "${label}" timeout 8000`);
52
+ break;
53
+ }
54
+ case "upload":
55
+ // File upload isn't expressible as a label action — leave to fallback.
56
+ break;
57
+ case "ai_prompt":
58
+ // Handled in the AI arc path.
59
+ break;
60
+ }
61
+ }
62
+ /**
63
+ * PURE: build the ordered list of Maestro string-steps for a journey plan.
64
+ * Order: a leading screenshot, then top entity CRUD arcs, then AI chatbox arcs.
65
+ */
66
+ export function journeyToMaestroSteps(plan, opts = {}) {
67
+ const maxEntities = opts.maxEntities ?? 3;
68
+ const shots = opts.screenshots !== false;
69
+ const aiWait = opts.aiWaitSeconds ?? 5;
70
+ const out = [];
71
+ if (shots)
72
+ out.push("take screenshot");
73
+ // Entity CRUD arcs (highest priority first).
74
+ const entities = [...(plan.entities ?? [])]
75
+ .sort((a, b) => (a.priority ?? 99) - (b.priority ?? 99))
76
+ .slice(0, maxEntities);
77
+ for (const entity of entities) {
78
+ for (const step of entity.arc ?? []) {
79
+ emitEntityStep(step, out, shots);
80
+ }
81
+ }
82
+ // AI chatbox arcs: type a prompt, submit, wait for the model, screenshot.
83
+ for (const ai of plan.ai_journeys ?? []) {
84
+ const arc = ai.arc ?? [];
85
+ const promptStep = arc.find((s) => s.step === "ai_prompt" && s.ai_prompt);
86
+ const prompt = promptStep?.ai_prompt ?? ai.prompt_examples?.[0];
87
+ if (!prompt)
88
+ continue;
89
+ // If the arc names an input target/label, tap it first to focus.
90
+ const navTarget = usableLabel(arc.find((s) => s.step === "navigate")?.target);
91
+ if (navTarget)
92
+ out.push(`tap "${navTarget}"`);
93
+ out.push(`type "${safeText(prompt)}"`);
94
+ out.push("press enter");
95
+ out.push(`wait ${Math.max(1, aiWait) * 1000}`); // Maestro timeout is in ms
96
+ if (shots)
97
+ out.push("take screenshot");
98
+ }
99
+ return out;
100
+ }
101
+ //# sourceMappingURL=journey_to_maestro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey_to_maestro.js","sourceRoot":"","sources":["../../src/runners/journey_to_maestro.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,12 @@
1
- export declare function generateMaestroFlow(steps: string[], cwd: string): Promise<{
1
+ export declare function generateMaestroFlow(steps: string[], cwd: string, opts?: {
2
+ appId?: string;
3
+ outputDir?: string;
4
+ }): Promise<{
2
5
  flowPath: string;
3
6
  } | {
4
7
  error: string;
5
8
  }>;
9
+ export declare function stepToYaml(step: string): string;
6
10
  export declare function runGeneratedFlow(flowPath: string, cwd: string): Promise<{
7
11
  success: boolean;
8
12
  output: string;
@@ -1 +1 @@
1
- {"version":3,"file":"maestro_generator.d.ts","sourceRoot":"","sources":["../../src/runners/maestro_generator.ts"],"names":[],"mappings":"AAIA,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnD;AAgDD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAe/D"}
1
+ {"version":3,"file":"maestro_generator.d.ts","sourceRoot":"","sources":["../../src/runners/maestro_generator.ts"],"names":[],"mappings":"AAIA,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAenD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkD/C;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAe/D"}
@@ -1,10 +1,13 @@
1
1
  import { writeFileSync, mkdirSync, existsSync } from "fs";
2
2
  import { join } from "path";
3
3
  import { checkToolAvailable, runCommand } from "./base.js";
4
- export async function generateMaestroFlow(steps, cwd) {
5
- const maestroDir = join(cwd, ".maestro");
4
+ export async function generateMaestroFlow(steps, cwd, opts = {}) {
5
+ const maestroDir = opts.outputDir ?? join(cwd, ".maestro");
6
6
  mkdirSync(maestroDir, { recursive: true });
7
- const yamlLines = ["appId: ${APP_ID}", "---"];
7
+ // Use the resolved app id when known so the flow installs/launches the RIGHT
8
+ // app; fall back to the ${APP_ID} placeholder otherwise.
9
+ const appId = opts.appId && opts.appId.trim() ? opts.appId.trim() : "${APP_ID}";
10
+ const yamlLines = [`appId: ${appId}`, "---"];
8
11
  for (const step of steps) {
9
12
  yamlLines.push(stepToYaml(step));
10
13
  }
@@ -12,7 +15,7 @@ export async function generateMaestroFlow(steps, cwd) {
12
15
  writeFileSync(flowPath, yamlLines.join("\n") + "\n");
13
16
  return { flowPath };
14
17
  }
15
- function stepToYaml(step) {
18
+ export function stepToYaml(step) {
16
19
  const lower = step.toLowerCase().trim();
17
20
  const tapMatch = lower.match(/^tap\s+(\d+)\s+(\d+)$/);
18
21
  if (tapMatch)
@@ -40,6 +43,11 @@ function stepToYaml(step) {
40
43
  const waitMatch = lower.match(/^wait\s+(\d+)$/);
41
44
  if (waitMatch)
42
45
  return `- waitForAnimationToEnd:\n timeout: ${waitMatch[1]}`;
46
+ // assert visible "<text>" timeout <ms> -> wait up to <ms> for it to appear
47
+ // (used for AI replies / async content that takes a moment to render).
48
+ const assertTimeoutMatch = step.match(/^assert\s+visible\s+"(.+)"\s+timeout\s+(\d+)$/i);
49
+ if (assertTimeoutMatch)
50
+ return `- extendedWaitUntil:\n visible: "${assertTimeoutMatch[1]}"\n timeout: ${assertTimeoutMatch[2]}`;
43
51
  const assertMatch = step.match(/^assert\s+visible\s+"(.+)"$/i);
44
52
  if (assertMatch)
45
53
  return `- assertVisible: "${assertMatch[1]}"`;
@@ -1 +1 @@
1
- {"version":3,"file":"maestro_generator.js","sourceRoot":"","sources":["../../src/runners/maestro_generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maestro_generator.js","sourceRoot":"","sources":["../../src/runners/maestro_generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Android applicationId from common Gradle locations (Flutter + native). */
2
+ export declare function resolveAndroidAppId(cwd: string): string | null;
3
+ /** iOS bundle id (PRODUCT_BUNDLE_IDENTIFIER) from the Xcode pbxproj. */
4
+ export declare function resolveIosAppId(cwd: string): string | null;
5
+ /** Resolve the app id for the given mobile platform. */
6
+ export declare function resolveMobileAppId(cwd: string, platform: "android" | "ios"): string | null;
7
+ //# sourceMappingURL=mobile_app_id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile_app_id.d.ts","sourceRoot":"","sources":["../../src/runners/mobile_app_id.ts"],"names":[],"mappings":"AA0BA,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4B9D;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8B1D;AAED,wDAAwD;AACxD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,SAAS,GAAG,KAAK,GAC1B,MAAM,GAAG,IAAI,CAEf"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * mobile_app_id — resolve the install/launch identifier for a mobile app so a
3
+ * generated Maestro flow (and native launch) targets the RIGHT app:
4
+ * - Android: the Gradle `applicationId` (package id, e.g. com.acme.app)
5
+ * - iOS: the Xcode `PRODUCT_BUNDLE_IDENTIFIER` (bundle id)
6
+ *
7
+ * Works for both Flutter (android/, ios/Runner.xcodeproj) and native
8
+ * (app/build.gradle, *.xcodeproj) layouts. Pure file reads; returns null when
9
+ * it can't determine the id (caller degrades to ${APP_ID} / a directive).
10
+ */
11
+ import { existsSync, readFileSync, readdirSync } from "fs";
12
+ import { join } from "path";
13
+ function firstMatch(text, re) {
14
+ const m = text.match(re);
15
+ return m ? m[1] : null;
16
+ }
17
+ function readIfExists(path) {
18
+ try {
19
+ return existsSync(path) ? readFileSync(path, "utf-8") : null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /** Android applicationId from common Gradle locations (Flutter + native). */
26
+ export function resolveAndroidAppId(cwd) {
27
+ const candidates = [
28
+ join(cwd, "android", "app", "build.gradle"),
29
+ join(cwd, "android", "app", "build.gradle.kts"),
30
+ join(cwd, "app", "build.gradle"),
31
+ join(cwd, "app", "build.gradle.kts"),
32
+ join(cwd, "build.gradle"),
33
+ join(cwd, "build.gradle.kts"),
34
+ ];
35
+ for (const path of candidates) {
36
+ const content = readIfExists(path);
37
+ if (!content)
38
+ continue;
39
+ // applicationId "com.acme.app" / applicationId = "com.acme.app"
40
+ const id = firstMatch(content, /applicationId\s*[=:\s]*["']([^"']+)["']/);
41
+ if (id && !/\$\{/.test(id))
42
+ return id;
43
+ }
44
+ // Fallback: AndroidManifest package attribute (older projects).
45
+ const manifests = [
46
+ join(cwd, "android", "app", "src", "main", "AndroidManifest.xml"),
47
+ join(cwd, "app", "src", "main", "AndroidManifest.xml"),
48
+ ];
49
+ for (const path of manifests) {
50
+ const content = readIfExists(path);
51
+ if (!content)
52
+ continue;
53
+ const pkg = firstMatch(content, /package\s*=\s*"([^"]+)"/);
54
+ if (pkg)
55
+ return pkg;
56
+ }
57
+ return null;
58
+ }
59
+ /** iOS bundle id (PRODUCT_BUNDLE_IDENTIFIER) from the Xcode pbxproj. */
60
+ export function resolveIosAppId(cwd) {
61
+ const pbxprojs = [];
62
+ // Flutter layout.
63
+ const flutterPbx = join(cwd, "ios", "Runner.xcodeproj", "project.pbxproj");
64
+ if (existsSync(flutterPbx))
65
+ pbxprojs.push(flutterPbx);
66
+ // Native layout: first *.xcodeproj at the root (or under ios/).
67
+ for (const base of [cwd, join(cwd, "ios")]) {
68
+ try {
69
+ for (const e of readdirSync(base)) {
70
+ if (e.endsWith(".xcodeproj")) {
71
+ const p = join(base, e, "project.pbxproj");
72
+ if (existsSync(p))
73
+ pbxprojs.push(p);
74
+ }
75
+ }
76
+ }
77
+ catch {
78
+ /* dir may not exist */
79
+ }
80
+ }
81
+ for (const path of [...new Set(pbxprojs)]) {
82
+ const content = readIfExists(path);
83
+ if (!content)
84
+ continue;
85
+ // Pick the first concrete bundle id that isn't a build-var placeholder.
86
+ const re = /PRODUCT_BUNDLE_IDENTIFIER\s*=\s*"?([A-Za-z0-9.\-$()]+)"?\s*;/g;
87
+ let m;
88
+ while ((m = re.exec(content)) !== null) {
89
+ const id = m[1];
90
+ if (id && !/\$\(|\$\{|RunnerTests|\.tests?$/i.test(id))
91
+ return id;
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ /** Resolve the app id for the given mobile platform. */
97
+ export function resolveMobileAppId(cwd, platform) {
98
+ return platform === "android" ? resolveAndroidAppId(cwd) : resolveIosAppId(cwd);
99
+ }
100
+ //# sourceMappingURL=mobile_app_id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile_app_id.js","sourceRoot":"","sources":["../../src/runners/mobile_app_id.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gate_check.d.ts","sourceRoot":"","sources":["../../src/tools/gate_check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,cAAc,EAEf,MAAM,sBAAsB,CAAC;AA6D9B,wBAAsB,YAAY,CAChC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAwG1B;AA2ED,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"gate_check.d.ts","sourceRoot":"","sources":["../../src/tools/gate_check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAkE9B,wBAAsB,YAAY,CAChC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAwG1B;AA6ED,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,CAAC"}