codeloop-mcp-server 0.1.4 → 0.1.5

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 (59) hide show
  1. package/dist/index.js +550 -40
  2. package/dist/index.js.map +1 -1
  3. package/dist/project-discovery.d.ts +17 -0
  4. package/dist/project-discovery.d.ts.map +1 -0
  5. package/dist/project-discovery.js +109 -0
  6. package/dist/project-discovery.js.map +1 -0
  7. package/dist/runners/app_logger.d.ts +31 -0
  8. package/dist/runners/app_logger.d.ts.map +1 -0
  9. package/dist/runners/app_logger.js +203 -0
  10. package/dist/runners/app_logger.js.map +1 -0
  11. package/dist/runners/base.d.ts.map +1 -1
  12. package/dist/runners/base.js +4 -2
  13. package/dist/runners/base.js.map +1 -1
  14. package/dist/runners/flutter.d.ts +1 -0
  15. package/dist/runners/flutter.d.ts.map +1 -1
  16. package/dist/runners/flutter.js +29 -0
  17. package/dist/runners/flutter.js.map +1 -1
  18. package/dist/runners/platform_detect.d.ts +14 -0
  19. package/dist/runners/platform_detect.d.ts.map +1 -0
  20. package/dist/runners/platform_detect.js +102 -0
  21. package/dist/runners/platform_detect.js.map +1 -0
  22. package/dist/runners/screenshot.d.ts +3 -7
  23. package/dist/runners/screenshot.d.ts.map +1 -1
  24. package/dist/runners/screenshot.js +115 -28
  25. package/dist/runners/screenshot.js.map +1 -1
  26. package/dist/runners/video_recorder.d.ts +47 -0
  27. package/dist/runners/video_recorder.d.ts.map +1 -0
  28. package/dist/runners/video_recorder.js +478 -0
  29. package/dist/runners/video_recorder.js.map +1 -0
  30. package/dist/runners/window_manager.d.ts +55 -0
  31. package/dist/runners/window_manager.d.ts.map +1 -0
  32. package/dist/runners/window_manager.js +481 -0
  33. package/dist/runners/window_manager.js.map +1 -0
  34. package/dist/tools/design_compare.d.ts +1 -1
  35. package/dist/tools/design_compare.d.ts.map +1 -1
  36. package/dist/tools/design_compare.js +1 -2
  37. package/dist/tools/design_compare.js.map +1 -1
  38. package/dist/tools/discover_screens.d.ts +3 -3
  39. package/dist/tools/discover_screens.d.ts.map +1 -1
  40. package/dist/tools/discover_screens.js +140 -157
  41. package/dist/tools/discover_screens.js.map +1 -1
  42. package/dist/tools/gate_check.js +13 -1
  43. package/dist/tools/gate_check.js.map +1 -1
  44. package/dist/tools/init-project.d.ts +15 -0
  45. package/dist/tools/init-project.d.ts.map +1 -0
  46. package/dist/tools/init-project.js +273 -0
  47. package/dist/tools/init-project.js.map +1 -0
  48. package/dist/tools/interaction_replay.d.ts +2 -1
  49. package/dist/tools/interaction_replay.d.ts.map +1 -1
  50. package/dist/tools/interaction_replay.js +24 -2
  51. package/dist/tools/interaction_replay.js.map +1 -1
  52. package/dist/tools/verify.d.ts.map +1 -1
  53. package/dist/tools/verify.js +203 -52
  54. package/dist/tools/verify.js.map +1 -1
  55. package/dist/tools/visual_review.d.ts +1 -1
  56. package/dist/tools/visual_review.d.ts.map +1 -1
  57. package/dist/tools/visual_review.js +1 -2
  58. package/dist/tools/visual_review.js.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,481 @@
1
+ import { platform, tmpdir } from "os";
2
+ import { writeFileSync, unlinkSync } from "fs";
3
+ import { join } from "path";
4
+ import { runCommand, checkToolAvailable } from "./base.js";
5
+ /**
6
+ * Cross-platform window ID lookup.
7
+ * macOS: CGWindowListCopyWindowInfo via Swift
8
+ * Linux: xdotool search
9
+ * Windows: not needed (uses process handle)
10
+ */
11
+ export async function findWindowId(appName) {
12
+ const os = platform();
13
+ if (os === "darwin")
14
+ return findMacOSWindowId(appName);
15
+ if (os === "linux")
16
+ return findLinuxWindowId(appName);
17
+ return null;
18
+ }
19
+ async function findMacOSWindowId(appName) {
20
+ const tmpFile = join(tmpdir(), `codeloop_findwindow_${Date.now()}.swift`);
21
+ const swiftCode = [
22
+ 'import Cocoa',
23
+ 'let options: CGWindowListOption = [.optionOnScreenOnly, .excludeDesktopElements]',
24
+ 'guard let windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID) as? [[String: Any]] else { exit(1) }',
25
+ `let search = "${appName}".lowercased()`,
26
+ 'for window in windowList {',
27
+ ' let owner = window[kCGWindowOwnerName as String] as? String ?? ""',
28
+ ' let windowID = window[kCGWindowNumber as String] as? Int ?? 0',
29
+ ' if owner.lowercased().contains(search) && windowID > 0 {',
30
+ ' print(windowID)',
31
+ ' exit(0)',
32
+ ' }',
33
+ '}',
34
+ ].join('\n');
35
+ writeFileSync(tmpFile, swiftCode);
36
+ try {
37
+ const result = await runCommand("swift", [tmpFile], process.cwd());
38
+ if (result.exit_code === 0 && result.stdout.trim()) {
39
+ return result.stdout.trim();
40
+ }
41
+ }
42
+ finally {
43
+ try {
44
+ unlinkSync(tmpFile);
45
+ }
46
+ catch { /* ignore */ }
47
+ }
48
+ return null;
49
+ }
50
+ async function findLinuxWindowId(appName) {
51
+ if (!(await checkToolAvailable("xdotool")))
52
+ return null;
53
+ const result = await runCommand("xdotool", ["search", "--name", appName], process.cwd());
54
+ if (result.exit_code === 0 && result.stdout.trim()) {
55
+ return result.stdout.trim().split("\n")[0];
56
+ }
57
+ return null;
58
+ }
59
+ /**
60
+ * Bring an app to the front, un-minimizing if needed.
61
+ * Returns the name/title of the previously frontmost app for later restoration.
62
+ */
63
+ export async function bringAppToFront(appName) {
64
+ const os = platform();
65
+ if (os === "darwin")
66
+ return bringToFrontMacOS(appName);
67
+ if (os === "win32")
68
+ return bringToFrontWindows(appName);
69
+ return bringToFrontLinux(appName);
70
+ }
71
+ async function bringToFrontMacOS(appName) {
72
+ const prevScript = 'tell application "System Events" to get name of first application process whose frontmost is true';
73
+ const prevResult = await runCommand("osascript", ["-e", prevScript], process.cwd());
74
+ let previousApp = prevResult.exit_code === 0 ? prevResult.stdout.trim() : "";
75
+ // If detection failed or returned the target app itself, find the IDE to restore later
76
+ if (!previousApp || previousApp.toLowerCase().includes(appName.toLowerCase())) {
77
+ previousApp = await detectRunningIDE();
78
+ }
79
+ const activateScript = `
80
+ tell application "System Events"
81
+ try
82
+ set targetProc to first process whose name contains "${appName}"
83
+ set visible of targetProc to true
84
+ end try
85
+ end tell
86
+ tell application "${appName}" to activate
87
+ `;
88
+ await runCommand("osascript", ["-e", activateScript], process.cwd());
89
+ await new Promise((r) => setTimeout(r, 800));
90
+ return previousApp;
91
+ }
92
+ async function detectRunningIDE() {
93
+ const candidates = ["Cursor", "Code", "Visual Studio Code", "Terminal", "iTerm2", "Warp"];
94
+ for (const ide of candidates) {
95
+ const checkScript = `tell application "System Events" to (exists process "${ide}")`;
96
+ const result = await runCommand("osascript", ["-e", checkScript], process.cwd());
97
+ if (result.stdout.trim() === "true")
98
+ return ide;
99
+ }
100
+ return "Cursor";
101
+ }
102
+ async function bringToFrontWindows(appName) {
103
+ const script = `
104
+ Add-Type @"
105
+ using System;
106
+ using System.Runtime.InteropServices;
107
+ public class Win32Focus {
108
+ [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
109
+ [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);
110
+ [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
111
+ [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count);
112
+ }
113
+ "@
114
+ $prev = [Win32Focus]::GetForegroundWindow()
115
+ $sb = New-Object System.Text.StringBuilder 256
116
+ [Win32Focus]::GetWindowText($prev, $sb, 256)
117
+ Write-Output $sb.ToString()
118
+ $proc = Get-Process | Where-Object { $_.MainWindowTitle -match '${appName}' -and $_.MainWindowHandle -ne 0 } | Select-Object -First 1
119
+ if ($proc) {
120
+ [Win32Focus]::ShowWindow($proc.MainWindowHandle, 9)
121
+ [Win32Focus]::SetForegroundWindow($proc.MainWindowHandle)
122
+ }
123
+ `;
124
+ const result = await runCommand("powershell", ["-NoProfile", "-Command", script], process.cwd());
125
+ return result.exit_code === 0 ? result.stdout.trim() : "";
126
+ }
127
+ async function bringToFrontLinux(appName) {
128
+ let previousWindow = "";
129
+ if (await checkToolAvailable("xdotool")) {
130
+ const activeResult = await runCommand("xdotool", ["getactivewindow", "getwindowname"], process.cwd());
131
+ previousWindow = activeResult.exit_code === 0 ? activeResult.stdout.trim() : "";
132
+ const searchResult = await runCommand("xdotool", ["search", "--name", appName], process.cwd());
133
+ if (searchResult.exit_code === 0 && searchResult.stdout.trim()) {
134
+ const windowId = searchResult.stdout.trim().split("\n")[0];
135
+ await runCommand("xdotool", ["windowactivate", windowId], process.cwd());
136
+ await new Promise((r) => setTimeout(r, 500));
137
+ }
138
+ }
139
+ return previousWindow;
140
+ }
141
+ /**
142
+ * Get the window bounds (position + size) for cropping video capture.
143
+ * Returns { x, y, width, height } in screen points.
144
+ */
145
+ export async function getWindowBounds(appName) {
146
+ const os = platform();
147
+ if (os === "darwin")
148
+ return getWindowBoundsMacOS(appName);
149
+ if (os === "win32")
150
+ return getWindowBoundsWindows(appName);
151
+ if (os === "linux")
152
+ return getWindowBoundsLinux(appName);
153
+ return null;
154
+ }
155
+ async function getWindowBoundsMacOS(appName) {
156
+ const tmpFile = join(tmpdir(), `codeloop_winbounds_${Date.now()}.swift`);
157
+ const swiftCode = [
158
+ 'import Cocoa',
159
+ 'let options: CGWindowListOption = [.optionOnScreenOnly, .excludeDesktopElements]',
160
+ 'guard let windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID) as? [[String: Any]] else { exit(1) }',
161
+ `let search = "${appName}".lowercased()`,
162
+ 'for window in windowList {',
163
+ ' let owner = window[kCGWindowOwnerName as String] as? String ?? ""',
164
+ ' if owner.lowercased().contains(search) {',
165
+ ' if let bounds = window[kCGWindowBounds as String] as? [String: Any] {',
166
+ ' let x = bounds["X"] as? Int ?? 0',
167
+ ' let y = bounds["Y"] as? Int ?? 0',
168
+ ' let w = bounds["Width"] as? Int ?? 0',
169
+ ' let h = bounds["Height"] as? Int ?? 0',
170
+ ' if w > 50 && h > 50 {',
171
+ ' print("\\(x),\\(y),\\(w),\\(h)")',
172
+ ' exit(0)',
173
+ ' }',
174
+ ' }',
175
+ ' }',
176
+ '}',
177
+ ].join('\n');
178
+ writeFileSync(tmpFile, swiftCode);
179
+ try {
180
+ const result = await runCommand("swift", [tmpFile], process.cwd());
181
+ if (result.exit_code === 0 && result.stdout.trim()) {
182
+ const parts = result.stdout.trim().split(",").map(Number);
183
+ if (parts.length === 4 && parts.every(n => !isNaN(n))) {
184
+ return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };
185
+ }
186
+ }
187
+ }
188
+ finally {
189
+ try {
190
+ unlinkSync(tmpFile);
191
+ }
192
+ catch { /* ignore */ }
193
+ }
194
+ return null;
195
+ }
196
+ async function getWindowBoundsWindows(appName) {
197
+ const script = `
198
+ Add-Type @"
199
+ using System;
200
+ using System.Runtime.InteropServices;
201
+ public class Win32Bounds {
202
+ [StructLayout(LayoutKind.Sequential)]
203
+ public struct RECT { public int Left; public int Top; public int Right; public int Bottom; }
204
+ [DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
205
+ }
206
+ "@
207
+ $proc = Get-Process | Where-Object { $_.MainWindowTitle -match '${appName}' -and $_.MainWindowHandle -ne 0 } | Select-Object -First 1
208
+ if ($proc) {
209
+ $rect = New-Object Win32Bounds+RECT
210
+ [Win32Bounds]::GetWindowRect($proc.MainWindowHandle, [ref]$rect) | Out-Null
211
+ Write-Output "$($rect.Left),$($rect.Top),$($rect.Right - $rect.Left),$($rect.Bottom - $rect.Top)"
212
+ }
213
+ `;
214
+ const result = await runCommand("powershell", ["-NoProfile", "-Command", script], process.cwd());
215
+ if (result.exit_code === 0 && result.stdout.trim()) {
216
+ const parts = result.stdout.trim().split(",").map(Number);
217
+ if (parts.length === 4 && parts.every(n => !isNaN(n))) {
218
+ return { x: parts[0], y: parts[1], width: parts[2], height: parts[3] };
219
+ }
220
+ }
221
+ return null;
222
+ }
223
+ async function getWindowBoundsLinux(appName) {
224
+ if (!(await checkToolAvailable("xdotool")))
225
+ return null;
226
+ const searchResult = await runCommand("xdotool", ["search", "--name", appName], process.cwd());
227
+ if (searchResult.exit_code !== 0 || !searchResult.stdout.trim())
228
+ return null;
229
+ const windowId = searchResult.stdout.trim().split("\n")[0];
230
+ const geoResult = await runCommand("xdotool", ["getwindowgeometry", "--shell", windowId], process.cwd());
231
+ if (geoResult.exit_code !== 0)
232
+ return null;
233
+ const lines = geoResult.stdout.split("\n");
234
+ let x = 0, y = 0, w = 0, h = 0;
235
+ for (const line of lines) {
236
+ const [key, val] = line.split("=");
237
+ if (key === "X")
238
+ x = parseInt(val, 10);
239
+ else if (key === "Y")
240
+ y = parseInt(val, 10);
241
+ else if (key === "WIDTH")
242
+ w = parseInt(val, 10);
243
+ else if (key === "HEIGHT")
244
+ h = parseInt(val, 10);
245
+ }
246
+ if (w > 0 && h > 0)
247
+ return { x, y, width: w, height: h };
248
+ return null;
249
+ }
250
+ /**
251
+ * Click at screen coordinates using CGEvent (macOS), user32.dll (Windows),
252
+ * or xdotool (Linux). These are low-level HID events that Flutter and all
253
+ * frameworks receive.
254
+ */
255
+ export async function clickAtPosition(x, y) {
256
+ const os = platform();
257
+ if (os === "darwin") {
258
+ const tmpFile = join(tmpdir(), `codeloop_click_${Date.now()}.swift`);
259
+ const swiftCode = [
260
+ 'import CoreGraphics',
261
+ 'import Foundation',
262
+ `let point = CGPoint(x: ${x}, y: ${y})`,
263
+ 'let mouseDown = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)',
264
+ 'let mouseUp = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)',
265
+ 'mouseDown?.post(tap: .cghidEventTap)',
266
+ 'Thread.sleep(forTimeInterval: 0.05)',
267
+ 'mouseUp?.post(tap: .cghidEventTap)',
268
+ ].join('\n');
269
+ writeFileSync(tmpFile, swiftCode);
270
+ try {
271
+ const result = await runCommand("swift", [tmpFile], process.cwd());
272
+ return result.exit_code === 0;
273
+ }
274
+ finally {
275
+ try {
276
+ unlinkSync(tmpFile);
277
+ }
278
+ catch { /* ignore */ }
279
+ }
280
+ }
281
+ else if (os === "win32") {
282
+ const script = `
283
+ Add-Type @"
284
+ using System;
285
+ using System.Runtime.InteropServices;
286
+ public class Win32Click {
287
+ [DllImport("user32.dll")] public static extern bool SetCursorPos(int X, int Y);
288
+ [DllImport("user32.dll")] public static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, UIntPtr dwExtraInfo);
289
+ }
290
+ "@
291
+ [Win32Click]::SetCursorPos(${x}, ${y})
292
+ Start-Sleep -Milliseconds 50
293
+ [Win32Click]::mouse_event(0x0002, 0, 0, 0, [UIntPtr]::Zero)
294
+ Start-Sleep -Milliseconds 50
295
+ [Win32Click]::mouse_event(0x0004, 0, 0, 0, [UIntPtr]::Zero)
296
+ `;
297
+ const result = await runCommand("powershell", ["-NoProfile", "-Command", script], process.cwd());
298
+ return result.exit_code === 0;
299
+ }
300
+ else if (os === "linux") {
301
+ if (await checkToolAvailable("xdotool")) {
302
+ const result = await runCommand("xdotool", ["mousemove", String(x), String(y), "click", "1"], process.cwd());
303
+ return result.exit_code === 0;
304
+ }
305
+ }
306
+ return false;
307
+ }
308
+ /**
309
+ * Send a keystroke using CGEvent (macOS), user32.dll keybd_event (Windows),
310
+ * or xdotool (Linux).
311
+ *
312
+ * keyCode values are platform-specific:
313
+ * - macOS: CGKeyCode (e.g., 36=Return, 53=Escape, 48=Tab)
314
+ * - Windows: Virtual Key code (e.g., 0x0D=Enter, 0x1B=Escape, 0x09=Tab)
315
+ * - Linux: X11 keysym name as string via keyName param, or keyCode ignored
316
+ */
317
+ export async function sendKeystroke(keyCode, keyName) {
318
+ const os = platform();
319
+ if (os === "darwin") {
320
+ const tmpFile = join(tmpdir(), `codeloop_key_${Date.now()}.swift`);
321
+ const swiftCode = [
322
+ 'import CoreGraphics',
323
+ 'import Foundation',
324
+ `let keyDown = CGEvent(keyboardEventSource: nil, virtualKey: CGKeyCode(${keyCode}), keyDown: true)`,
325
+ `let keyUp = CGEvent(keyboardEventSource: nil, virtualKey: CGKeyCode(${keyCode}), keyDown: false)`,
326
+ 'keyDown?.post(tap: .cghidEventTap)',
327
+ 'Thread.sleep(forTimeInterval: 0.05)',
328
+ 'keyUp?.post(tap: .cghidEventTap)',
329
+ ].join('\n');
330
+ writeFileSync(tmpFile, swiftCode);
331
+ try {
332
+ const result = await runCommand("swift", [tmpFile], process.cwd());
333
+ return result.exit_code === 0;
334
+ }
335
+ finally {
336
+ try {
337
+ unlinkSync(tmpFile);
338
+ }
339
+ catch { /* ignore */ }
340
+ }
341
+ }
342
+ else if (os === "win32") {
343
+ const vk = keyCode & 0xFF;
344
+ const script = `
345
+ Add-Type @"
346
+ using System;
347
+ using System.Runtime.InteropServices;
348
+ public class Win32Key {
349
+ [DllImport("user32.dll")] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
350
+ }
351
+ "@
352
+ [Win32Key]::keybd_event(${vk}, 0, 0, [UIntPtr]::Zero)
353
+ Start-Sleep -Milliseconds 50
354
+ [Win32Key]::keybd_event(${vk}, 0, 2, [UIntPtr]::Zero)
355
+ `;
356
+ const result = await runCommand("powershell", ["-NoProfile", "-Command", script], process.cwd());
357
+ return result.exit_code === 0;
358
+ }
359
+ else if (os === "linux") {
360
+ if (await checkToolAvailable("xdotool")) {
361
+ const xKey = keyName || String(keyCode);
362
+ const result = await runCommand("xdotool", ["key", "--clearmodifiers", xKey], process.cwd());
363
+ return result.exit_code === 0;
364
+ }
365
+ }
366
+ return false;
367
+ }
368
+ // ── Mobile Interaction (Android emulator via ADB) ───────────────
369
+ export async function adbTap(x, y) {
370
+ const result = await runCommand("adb", ["shell", "input", "tap", String(Math.round(x)), String(Math.round(y))], process.cwd());
371
+ return result.exit_code === 0;
372
+ }
373
+ export async function adbType(text) {
374
+ const escaped = text.replace(/ /g, "%s").replace(/'/g, "\\'");
375
+ const result = await runCommand("adb", ["shell", "input", "text", escaped], process.cwd());
376
+ return result.exit_code === 0;
377
+ }
378
+ export async function adbKey(keycode) {
379
+ const result = await runCommand("adb", ["shell", "input", "keyevent", keycode], process.cwd());
380
+ return result.exit_code === 0;
381
+ }
382
+ export async function adbSwipe(x1, y1, x2, y2, durationMs = 300) {
383
+ const result = await runCommand("adb", [
384
+ "shell", "input", "swipe",
385
+ String(Math.round(x1)), String(Math.round(y1)),
386
+ String(Math.round(x2)), String(Math.round(y2)),
387
+ String(durationMs),
388
+ ], process.cwd());
389
+ return result.exit_code === 0;
390
+ }
391
+ // ── Mobile Interaction (iOS Simulator via simctl) ───────────────
392
+ export async function simctlLaunch(bundleId) {
393
+ const result = await runCommand("xcrun", ["simctl", "launch", "booted", bundleId], process.cwd());
394
+ return result.exit_code === 0;
395
+ }
396
+ export async function simctlTerminate(bundleId) {
397
+ const result = await runCommand("xcrun", ["simctl", "terminate", "booted", bundleId], process.cwd());
398
+ return result.exit_code === 0;
399
+ }
400
+ const INSTALL_INSTRUCTIONS = {
401
+ ffmpeg: {
402
+ macOS: "brew install ffmpeg",
403
+ windows: "winget install ffmpeg (or: choco install ffmpeg)",
404
+ linux: "sudo apt-get install -y ffmpeg (or: sudo dnf install -y ffmpeg)",
405
+ },
406
+ adb: {
407
+ macOS: "brew install android-platform-tools",
408
+ windows: "winget install Google.PlatformTools (or install via Android Studio)",
409
+ linux: "sudo apt-get install -y android-tools-adb",
410
+ },
411
+ xcrun: {
412
+ macOS: "xcode-select --install",
413
+ windows: "(not available on Windows — iOS development requires macOS)",
414
+ linux: "(not available on Linux — iOS development requires macOS)",
415
+ },
416
+ xdotool: {
417
+ macOS: "(not needed on macOS)",
418
+ windows: "(not needed on Windows)",
419
+ linux: "sudo apt-get install -y xdotool",
420
+ },
421
+ maestro: {
422
+ macOS: 'curl -Ls "https://get.maestro.mobile.dev" | bash',
423
+ windows: 'curl -Ls "https://get.maestro.mobile.dev" | bash',
424
+ linux: 'curl -Ls "https://get.maestro.mobile.dev" | bash',
425
+ },
426
+ };
427
+ /**
428
+ * Check if a required external tool is installed.
429
+ * Returns null if available, or a user-facing error message with install instructions.
430
+ */
431
+ export async function checkDependency(tool, action) {
432
+ const os = platform();
433
+ const whichCmd = os === "win32" ? "where" : "which";
434
+ const result = await runCommand(whichCmd, [tool], process.cwd());
435
+ if (result.exit_code === 0 && result.stdout.trim())
436
+ return null;
437
+ const instructions = INSTALL_INSTRUCTIONS[tool];
438
+ if (!instructions) {
439
+ return `Tool "${tool}" is not installed but is required for ${action}. Please install it and retry.`;
440
+ }
441
+ const platformKey = os === "darwin" ? "macOS" : os === "win32" ? "windows" : "linux";
442
+ const installCmd = instructions[platformKey];
443
+ return `Tool "${tool}" is not installed but is required for ${action}.\n\nInstall it with:\n ${installCmd}\n\nThen retry this operation.`;
444
+ }
445
+ /**
446
+ * Restore the previously frontmost app/window after capture is complete.
447
+ */
448
+ export async function restorePreviousApp(previousApp) {
449
+ const os = platform();
450
+ // If no previous app was captured, try to detect and restore the IDE
451
+ if (!previousApp && os === "darwin") {
452
+ previousApp = await detectRunningIDE();
453
+ }
454
+ if (!previousApp)
455
+ return;
456
+ if (os === "darwin") {
457
+ await runCommand("osascript", ["-e", `tell application "${previousApp}" to activate`], process.cwd());
458
+ }
459
+ else if (os === "win32") {
460
+ const script = `
461
+ $proc = Get-Process | Where-Object { $_.MainWindowTitle -match '${previousApp}' -and $_.MainWindowHandle -ne 0 } | Select-Object -First 1
462
+ if ($proc) {
463
+ Add-Type @"
464
+ using System;using System.Runtime.InteropServices;
465
+ public class Win32R { [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); }
466
+ "@
467
+ [Win32R]::SetForegroundWindow($proc.MainWindowHandle)
468
+ }`;
469
+ await runCommand("powershell", ["-NoProfile", "-Command", script], process.cwd());
470
+ }
471
+ else {
472
+ if (await checkToolAvailable("xdotool")) {
473
+ const searchResult = await runCommand("xdotool", ["search", "--name", previousApp], process.cwd());
474
+ if (searchResult.exit_code === 0 && searchResult.stdout.trim()) {
475
+ const windowId = searchResult.stdout.trim().split("\n")[0];
476
+ await runCommand("xdotool", ["windowactivate", windowId], process.cwd());
477
+ }
478
+ }
479
+ }
480
+ }
481
+ //# sourceMappingURL=window_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window_manager.js","sourceRoot":"","sources":["../../src/runners/window_manager.ts"],"names":[],"mappings":"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"}
@@ -13,5 +13,5 @@ export interface DesignCompareResult {
13
13
  * Runs deterministic pixel-level comparison between reference design and actual
14
14
  * screenshot, and returns image paths for the AI agent to visually compare.
15
15
  */
16
- export declare function runDesignCompare(input: DesignCompareInput, config: CodeLoopConfig): Promise<DesignCompareResult>;
16
+ export declare function runDesignCompare(input: DesignCompareInput, config: CodeLoopConfig, cwd?: string): Promise<DesignCompareResult>;
17
17
  //# sourceMappingURL=design_compare.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"design_compare.d.ts","sourceRoot":"","sources":["../../src/tools/design_compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAc3D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAmG9B"}
1
+ {"version":3,"file":"design_compare.d.ts","sourceRoot":"","sources":["../../src/tools/design_compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAc3D,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAkG9B"}
@@ -13,8 +13,7 @@ function screenFileName(screenName) {
13
13
  * Runs deterministic pixel-level comparison between reference design and actual
14
14
  * screenshot, and returns image paths for the AI agent to visually compare.
15
15
  */
16
- export async function runDesignCompare(input, config) {
17
- const cwd = process.cwd();
16
+ export async function runDesignCompare(input, config, cwd = process.cwd()) {
18
17
  const refPath = resolve(cwd, input.reference_image_path);
19
18
  if (!existsSync(refPath)) {
20
19
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"design_compare.js","sourceRoot":"","sources":["../../src/tools/design_compare.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"design_compare.js","sourceRoot":"","sources":["../../src/tools/design_compare.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpF,SAAS,cAAc,CAAC,UAAkB;IACxC,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAYD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAyB,EACzB,MAAsB,EACtB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,MAAM,EAAE;gBACN,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE;oBACX;wBACE,IAAI,EAAE,WAAW;wBACjB,WAAW,EAAE,8BAA8B,KAAK,CAAC,oBAAoB,EAAE;wBACvE,QAAQ,EAAE,MAAM;wBAChB,QAAQ,EAAE,uCAAuC;qBAClD;iBACF;gBACD,WAAW,EAAE,EAAE;gBACf,cAAc,EAAE,2CAA2C;aAC5D;YACD,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;SAC1C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,SAAS;QAC1B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,aAAa,EAAE,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpF,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE;gBACN,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE;oBACX;wBACE,IAAI,EAAE,YAAY;wBAClB,WAAW,EAAE,SAAS;4BACpB,CAAC,CAAC,4BAA4B,KAAK,CAAC,WAAW,wBAAwB,SAAS,IAAI;4BACpF,CAAC,CAAC,iEAAiE;wBACrE,QAAQ,EAAE,MAAM;wBAChB,QAAQ,EACN,2HAA2H;qBAC9H;iBACF;gBACD,WAAW,EAAE,CAAC,OAAO,CAAC;gBACtB,cAAc,EAAE,qCAAqC;aACtD;YACD,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;SAC/C,CAAC;IACJ,CAAC;IAED,IAAI,QAA4B,CAAC;IACjC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,SAAS;YACxB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC;YAC3C,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACpC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpE,cAAc,GAAG,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,cAAc,GAAG,CAAC,CAAC;QACnB,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,WAA+B,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB;QACpC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,iBAAiB,CAAC;QACvC,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,WAAW,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,sBAAsB,IAAI,GAAG,CAAC;IACvD,MAAM,cAAc,GAClB,cAAc,IAAI,SAAS;QACzB,CAAC,CAAC,yIAAyI;QAC3I,CAAC,CAAC,4GAA4G,CAAC;IAEnH,OAAO;QACL,MAAM,EAAE;YACN,WAAW,EAAE,cAAc;YAC3B,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;YAClC,cAAc;SACf;QACD,UAAU,EAAE;YACV,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SAC9D;QACD,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -2,13 +2,13 @@ export interface DiscoveredScreen {
2
2
  name: string;
3
3
  route: string;
4
4
  source_file: string;
5
- trigger: string;
5
+ navigation_trigger: string;
6
+ confidence: number;
6
7
  }
7
8
  export interface DiscoverScreensOutput {
8
9
  platform: string;
9
10
  screens: DiscoveredScreen[];
10
- route_files: string[];
11
- navigation_patterns_found: number;
11
+ scan_summary: string;
12
12
  }
13
13
  export declare function discoverScreens(cwd: string, platform: string): DiscoverScreensOutput;
14
14
  //# sourceMappingURL=discover_screens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discover_screens.d.ts","sourceRoot":"","sources":["../../src/tools/discover_screens.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,qBAAqB,CAsBvB"}
1
+ {"version":3,"file":"discover_screens.d.ts","sourceRoot":"","sources":["../../src/tools/discover_screens.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AAgKD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAmBpF"}