@desplega.ai/qa-use 2.6.1 → 2.7.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 (80) hide show
  1. package/dist/lib/api/browser-types.d.ts +34 -2
  2. package/dist/lib/api/browser-types.d.ts.map +1 -1
  3. package/dist/package.json +1 -1
  4. package/dist/src/cli/commands/browser/back.d.ts.map +1 -1
  5. package/dist/src/cli/commands/browser/back.js +11 -3
  6. package/dist/src/cli/commands/browser/back.js.map +1 -1
  7. package/dist/src/cli/commands/browser/check.d.ts.map +1 -1
  8. package/dist/src/cli/commands/browser/check.js +9 -0
  9. package/dist/src/cli/commands/browser/check.js.map +1 -1
  10. package/dist/src/cli/commands/browser/click.d.ts.map +1 -1
  11. package/dist/src/cli/commands/browser/click.js +11 -0
  12. package/dist/src/cli/commands/browser/click.js.map +1 -1
  13. package/dist/src/cli/commands/browser/drag.d.ts +1 -1
  14. package/dist/src/cli/commands/browser/drag.d.ts.map +1 -1
  15. package/dist/src/cli/commands/browser/drag.js +94 -30
  16. package/dist/src/cli/commands/browser/drag.js.map +1 -1
  17. package/dist/src/cli/commands/browser/evaluate.d.ts +6 -0
  18. package/dist/src/cli/commands/browser/evaluate.d.ts.map +1 -0
  19. package/dist/src/cli/commands/browser/evaluate.js +72 -0
  20. package/dist/src/cli/commands/browser/evaluate.js.map +1 -0
  21. package/dist/src/cli/commands/browser/fill.d.ts.map +1 -1
  22. package/dist/src/cli/commands/browser/fill.js +9 -0
  23. package/dist/src/cli/commands/browser/fill.js.map +1 -1
  24. package/dist/src/cli/commands/browser/forward.d.ts.map +1 -1
  25. package/dist/src/cli/commands/browser/forward.js +11 -3
  26. package/dist/src/cli/commands/browser/forward.js.map +1 -1
  27. package/dist/src/cli/commands/browser/goto.d.ts.map +1 -1
  28. package/dist/src/cli/commands/browser/goto.js +12 -2
  29. package/dist/src/cli/commands/browser/goto.js.map +1 -1
  30. package/dist/src/cli/commands/browser/hover.d.ts.map +1 -1
  31. package/dist/src/cli/commands/browser/hover.js +9 -0
  32. package/dist/src/cli/commands/browser/hover.js.map +1 -1
  33. package/dist/src/cli/commands/browser/index.d.ts.map +1 -1
  34. package/dist/src/cli/commands/browser/index.js +2 -0
  35. package/dist/src/cli/commands/browser/index.js.map +1 -1
  36. package/dist/src/cli/commands/browser/mfa-totp.d.ts.map +1 -1
  37. package/dist/src/cli/commands/browser/mfa-totp.js +9 -0
  38. package/dist/src/cli/commands/browser/mfa-totp.js.map +1 -1
  39. package/dist/src/cli/commands/browser/press.d.ts.map +1 -1
  40. package/dist/src/cli/commands/browser/press.js +12 -2
  41. package/dist/src/cli/commands/browser/press.js.map +1 -1
  42. package/dist/src/cli/commands/browser/reload.d.ts.map +1 -1
  43. package/dist/src/cli/commands/browser/reload.js +11 -3
  44. package/dist/src/cli/commands/browser/reload.js.map +1 -1
  45. package/dist/src/cli/commands/browser/run.d.ts.map +1 -1
  46. package/dist/src/cli/commands/browser/run.js +147 -23
  47. package/dist/src/cli/commands/browser/run.js.map +1 -1
  48. package/dist/src/cli/commands/browser/scroll-into-view.d.ts.map +1 -1
  49. package/dist/src/cli/commands/browser/scroll-into-view.js +9 -0
  50. package/dist/src/cli/commands/browser/scroll-into-view.js.map +1 -1
  51. package/dist/src/cli/commands/browser/scroll.d.ts.map +1 -1
  52. package/dist/src/cli/commands/browser/scroll.js +12 -2
  53. package/dist/src/cli/commands/browser/scroll.js.map +1 -1
  54. package/dist/src/cli/commands/browser/select.d.ts.map +1 -1
  55. package/dist/src/cli/commands/browser/select.js +9 -0
  56. package/dist/src/cli/commands/browser/select.js.map +1 -1
  57. package/dist/src/cli/commands/browser/type.d.ts.map +1 -1
  58. package/dist/src/cli/commands/browser/type.js +12 -2
  59. package/dist/src/cli/commands/browser/type.js.map +1 -1
  60. package/dist/src/cli/commands/browser/uncheck.d.ts.map +1 -1
  61. package/dist/src/cli/commands/browser/uncheck.js +9 -0
  62. package/dist/src/cli/commands/browser/uncheck.js.map +1 -1
  63. package/dist/src/cli/commands/browser/upload.d.ts.map +1 -1
  64. package/dist/src/cli/commands/browser/upload.js +9 -0
  65. package/dist/src/cli/commands/browser/upload.js.map +1 -1
  66. package/dist/src/cli/commands/browser/wait-for-load.d.ts.map +1 -1
  67. package/dist/src/cli/commands/browser/wait-for-load.js +12 -2
  68. package/dist/src/cli/commands/browser/wait-for-load.js.map +1 -1
  69. package/dist/src/cli/commands/browser/wait-for-selector.d.ts.map +1 -1
  70. package/dist/src/cli/commands/browser/wait-for-selector.js +12 -2
  71. package/dist/src/cli/commands/browser/wait-for-selector.js.map +1 -1
  72. package/dist/src/cli/commands/browser/wait.d.ts.map +1 -1
  73. package/dist/src/cli/commands/browser/wait.js +12 -2
  74. package/dist/src/cli/commands/browser/wait.js.map +1 -1
  75. package/dist/src/cli/lib/snapshot-diff.d.ts +6 -0
  76. package/dist/src/cli/lib/snapshot-diff.d.ts.map +1 -0
  77. package/dist/src/cli/lib/snapshot-diff.js +58 -0
  78. package/dist/src/cli/lib/snapshot-diff.js.map +1 -0
  79. package/lib/api/browser-types.ts +43 -2
  80. package/package.json +1 -1
@@ -6,9 +6,11 @@ import { BrowserApiClient } from '../../../../lib/api/browser.js';
6
6
  import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
7
  import { loadConfig } from '../../lib/config.js';
8
8
  import { error, success } from '../../lib/output.js';
9
+ import { formatSnapshotDiff } from '../../lib/snapshot-diff.js';
9
10
  export const forwardCommand = new Command('forward')
10
11
  .description('Navigate forward in browser history')
11
12
  .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
13
+ .option('--no-diff', 'Disable snapshot diff output')
12
14
  .action(async (options) => {
13
15
  try {
14
16
  const config = await loadConfig();
@@ -22,11 +24,17 @@ export const forwardCommand = new Command('forward')
22
24
  explicitId: options.sessionId,
23
25
  client,
24
26
  });
25
- const result = await client.executeAction(resolved.id, {
26
- type: 'forward',
27
- });
27
+ const action = { type: 'forward' };
28
+ if (options.diff !== false) {
29
+ action.include_snapshot_diff = true;
30
+ }
31
+ const result = await client.executeAction(resolved.id, action);
28
32
  if (result.success) {
29
33
  console.log(success('Navigated forward'));
34
+ if (result.snapshot_diff) {
35
+ console.log('');
36
+ console.log(formatSnapshotDiff(result.snapshot_diff));
37
+ }
30
38
  await touchSession(resolved.id);
31
39
  }
32
40
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"forward.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/forward.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMrD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE;YACrD,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC1C,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"forward.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/forward.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAOhE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,MAAM,GAGR,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAE1C,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"goto.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/goto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,WAAW,SA+CpB,CAAC"}
1
+ {"version":3,"file":"goto.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/goto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,WAAW,SA+DpB,CAAC"}
@@ -6,10 +6,12 @@ import { BrowserApiClient } from '../../../../lib/api/browser.js';
6
6
  import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
7
  import { loadConfig } from '../../lib/config.js';
8
8
  import { error, success } from '../../lib/output.js';
9
+ import { formatSnapshotDiff } from '../../lib/snapshot-diff.js';
9
10
  export const gotoCommand = new Command('goto')
10
11
  .description('Navigate to a URL')
11
12
  .argument('<url>', 'URL to navigate to')
12
13
  .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
14
+ .option('--no-diff', 'Disable snapshot diff output')
13
15
  .action(async (url, options) => {
14
16
  try {
15
17
  // Load configuration
@@ -32,12 +34,20 @@ export const gotoCommand = new Command('goto')
32
34
  client,
33
35
  });
34
36
  // Execute goto action
35
- const result = await client.executeAction(resolved.id, {
37
+ const action = {
36
38
  type: 'goto',
37
39
  url,
38
- });
40
+ };
41
+ if (options.diff !== false) {
42
+ action.include_snapshot_diff = true;
43
+ }
44
+ const result = await client.executeAction(resolved.id, action);
39
45
  if (result.success) {
40
46
  console.log(success(`Navigated to ${url}`));
47
+ if (result.snapshot_diff) {
48
+ console.log('');
49
+ console.log(formatSnapshotDiff(result.snapshot_diff));
50
+ }
41
51
  // Update session timestamp
42
52
  await touchSession(resolved.id);
43
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"goto.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/goto.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMrD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,mBAAmB,CAAC;KAChC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;KACvC,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAAoB,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,qFAAqF;QACrF,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/E,GAAG,GAAG,WAAW,GAAG,EAAE,CAAC;QACzB,CAAC;QAED,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,qBAAqB;QACrB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE;YACrD,IAAI,EAAE,MAAM;YACZ,GAAG;SACJ,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5C,2BAA2B;YAC3B,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"goto.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/goto.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/hover.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,YAAY,SAkDrB,CAAC"}
1
+ {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/hover.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,YAAY,SAiErB,CAAC"}
@@ -7,11 +7,13 @@ import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
7
  import { normalizeRef } from '../../lib/browser-utils.js';
8
8
  import { loadConfig } from '../../lib/config.js';
9
9
  import { error, success } from '../../lib/output.js';
10
+ import { formatSnapshotDiff } from '../../lib/snapshot-diff.js';
10
11
  export const hoverCommand = new Command('hover')
11
12
  .description('Hover over an element by ref or semantic description')
12
13
  .argument('[ref]', 'Element ref from snapshot (e.g., "e3" or "@e3")')
13
14
  .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
14
15
  .option('-t, --text <description>', 'Semantic element description (AI-based, slower)')
16
+ .option('--no-diff', 'Disable snapshot diff output')
15
17
  .action(async (ref, options) => {
16
18
  try {
17
19
  // Validate that either ref or --text is provided
@@ -38,10 +40,17 @@ export const hoverCommand = new Command('hover')
38
40
  else if (options.text) {
39
41
  action.text = options.text;
40
42
  }
43
+ if (options.diff !== false) {
44
+ action.include_snapshot_diff = true;
45
+ }
41
46
  const result = await client.executeAction(resolved.id, action);
42
47
  if (result.success) {
43
48
  const target = ref ? `element ${normalizeRef(ref)}` : `"${options.text}"`;
44
49
  console.log(success(`Hovering over ${target}`));
50
+ if (result.snapshot_diff) {
51
+ console.log('');
52
+ console.log(formatSnapshotDiff(result.snapshot_diff));
53
+ }
45
54
  await touchSession(resolved.id);
46
55
  }
47
56
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"hover.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/hover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hover.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/hover.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC,eAAO,MAAM,cAAc,SAAgE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCpC,eAAO,MAAM,cAAc,SAAgE,CAAC"}
@@ -12,6 +12,7 @@ import { closeCommand } from './close.js';
12
12
  // Session management commands
13
13
  import { createCommand } from './create.js';
14
14
  import { dragCommand } from './drag.js';
15
+ import { evaluateCommand } from './evaluate.js';
15
16
  import { fillCommand } from './fill.js';
16
17
  import { forwardCommand } from './forward.js';
17
18
  import { generateTestCommand } from './generate-test.js';
@@ -75,6 +76,7 @@ browserCommand.addCommand(urlCommand);
75
76
  browserCommand.addCommand(getBlocksCommand);
76
77
  browserCommand.addCommand(logsCommand);
77
78
  browserCommand.addCommand(generateTestCommand);
79
+ browserCommand.addCommand(evaluateCommand);
78
80
  // Register advanced commands
79
81
  browserCommand.addCommand(streamCommand);
80
82
  browserCommand.addCommand(runCommand);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mfa-totp.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/mfa-totp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,cAAc,SA0GvB,CAAC"}
1
+ {"version":3,"file":"mfa-totp.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/mfa-totp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,eAAO,MAAM,cAAc,SAqHvB,CAAC"}
@@ -7,6 +7,7 @@ import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
7
  import { normalizeRef } from '../../lib/browser-utils.js';
8
8
  import { loadConfig } from '../../lib/config.js';
9
9
  import { error, info, success } from '../../lib/output.js';
10
+ import { formatSnapshotDiff } from '../../lib/snapshot-diff.js';
10
11
  /**
11
12
  * Check if a string looks like a valid TOTP secret (base32 encoded)
12
13
  */
@@ -22,6 +23,7 @@ export const mfaTotpCommand = new Command('mfa-totp')
22
23
  .argument('[secret]', 'TOTP secret (if ref is provided)')
23
24
  .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
24
25
  .option('-t, --text <description>', 'Semantic element description (AI-based)')
26
+ .option('--no-diff', 'Disable snapshot diff output')
25
27
  .action(async (refOrSecret, secret, options) => {
26
28
  try {
27
29
  const config = await loadConfig();
@@ -76,6 +78,9 @@ export const mfaTotpCommand = new Command('mfa-totp')
76
78
  if (text) {
77
79
  action.text = text;
78
80
  }
81
+ if (options.diff !== false) {
82
+ action.include_snapshot_diff = true;
83
+ }
79
84
  const result = await client.executeAction(resolved.id, action);
80
85
  if (result.success) {
81
86
  // The API may return the generated code in the result data
@@ -99,6 +104,10 @@ export const mfaTotpCommand = new Command('mfa-totp')
99
104
  console.log(success('Generated TOTP code'));
100
105
  }
101
106
  }
107
+ if (result.snapshot_diff) {
108
+ console.log('');
109
+ console.log(formatSnapshotDiff(result.snapshot_diff));
110
+ }
102
111
  await touchSession(resolved.id);
103
112
  }
104
113
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"mfa-totp.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/mfa-totp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mfa-totp.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/mfa-totp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAQhE;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,oEAAoE;IACpE,6DAA6D;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAClD,WAAW,CAAC,2DAA2D,CAAC;KACxE,QAAQ,CAAC,iBAAiB,EAAE,kEAAkE,CAAC;KAC/F,QAAQ,CAAC,UAAU,EAAE,kCAAkC,CAAC;KACxD,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,0BAA0B,EAAE,yCAAyC,CAAC;KAC7E,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,MAA0B,EAAE,OAAuB,EAAE,EAAE;IACzF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,4DAA4D;QAC5D,SAAS;QACT,mEAAmE;QACnE,2CAA2C;QAC3C,4EAA4E;QAC5E,IAAI,YAAoB,CAAC;QACzB,IAAI,GAAuB,CAAC;QAC5B,MAAM,IAAI,GAAuB,OAAO,CAAC,IAAI,CAAC;QAE9C,IAAI,MAAM,EAAE,CAAC;YACX,uBAAuB;YACvB,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YAChC,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,yDAAyD;YACzD,YAAY,GAAG,WAAW,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,iEAAiE;YACjE,8DAA8D;YAC9D,gDAAgD;YAChD,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnC,wBAAwB;gBACxB,YAAY,GAAG,WAAW,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,KAAK,CACH,2FAA2F,CAC5F,CACF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAMR;YACF,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,YAAY;SACrB,CAAC;QAEF,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,2DAA2D;YAC3D,MAAM,IAAI,GACR,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI;gBACrE,CAAC,CAAE,MAAM,CAAC,IAAyB,CAAC,IAAI;gBACxC,CAAC,CAAC,SAAS,CAAC;YAEhB,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;gBACpD,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,IAAI,oBAAoB,MAAM,EAAE,CAAC,CAAC,CAAC;gBAChF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,iBAAiB,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"press.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/press.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,eAAO,MAAM,YAAY,SA0CrB,CAAC"}
1
+ {"version":3,"file":"press.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/press.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,eAAO,MAAM,YAAY,SA0DrB,CAAC"}
@@ -6,6 +6,7 @@ import { BrowserApiClient } from '../../../../lib/api/browser.js';
6
6
  import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
7
  import { loadConfig } from '../../lib/config.js';
8
8
  import { error, success } from '../../lib/output.js';
9
+ import { formatSnapshotDiff } from '../../lib/snapshot-diff.js';
9
10
  // Common key names for reference
10
11
  const COMMON_KEYS = [
11
12
  'Enter',
@@ -27,6 +28,7 @@ export const pressCommand = new Command('press')
27
28
  .description('Press a keyboard key')
28
29
  .argument('<key>', `Key to press (e.g., "Enter", "Tab", "Escape")`)
29
30
  .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
31
+ .option('--no-diff', 'Disable snapshot diff output')
30
32
  .action(async (key, options) => {
31
33
  try {
32
34
  // Load configuration
@@ -44,12 +46,20 @@ export const pressCommand = new Command('press')
44
46
  client,
45
47
  });
46
48
  // Execute press action
47
- const result = await client.executeAction(resolved.id, {
49
+ const action = {
48
50
  type: 'press',
49
51
  key,
50
- });
52
+ };
53
+ if (options.diff !== false) {
54
+ action.include_snapshot_diff = true;
55
+ }
56
+ const result = await client.executeAction(resolved.id, action);
51
57
  if (result.success) {
52
58
  console.log(success(`Pressed key: ${key}`));
59
+ if (result.snapshot_diff) {
60
+ console.log('');
61
+ console.log(formatSnapshotDiff(result.snapshot_diff));
62
+ }
53
63
  await touchSession(resolved.id);
54
64
  }
55
65
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"press.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/press.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMrD,iCAAiC;AACjC,MAAM,WAAW,GAAG;IAClB,OAAO;IACP,KAAK;IACL,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,SAAS;IACT,WAAW;IACX,WAAW;IACX,YAAY;IACZ,MAAM;IACN,KAAK;IACL,QAAQ;IACR,UAAU;IACV,OAAO;CACR,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,sBAAsB,CAAC;KACnC,QAAQ,CAAC,OAAO,EAAE,+CAA+C,CAAC;KAClE,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAAqB,EAAE,EAAE;IACnD,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,qBAAqB;QACrB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE;YACrD,IAAI,EAAE,OAAO;YACb,GAAG;SACJ,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5C,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,kBAAkB,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"press.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/press.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reload.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/reload.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,aAAa,SAkCtB,CAAC"}
1
+ {"version":3,"file":"reload.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/reload.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,aAAa,SA+CtB,CAAC"}
@@ -6,9 +6,11 @@ import { BrowserApiClient } from '../../../../lib/api/browser.js';
6
6
  import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
7
  import { loadConfig } from '../../lib/config.js';
8
8
  import { error, success } from '../../lib/output.js';
9
+ import { formatSnapshotDiff } from '../../lib/snapshot-diff.js';
9
10
  export const reloadCommand = new Command('reload')
10
11
  .description('Reload current page')
11
12
  .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
13
+ .option('--no-diff', 'Disable snapshot diff output')
12
14
  .action(async (options) => {
13
15
  try {
14
16
  const config = await loadConfig();
@@ -22,11 +24,17 @@ export const reloadCommand = new Command('reload')
22
24
  explicitId: options.sessionId,
23
25
  client,
24
26
  });
25
- const result = await client.executeAction(resolved.id, {
26
- type: 'reload',
27
- });
27
+ const action = { type: 'reload' };
28
+ if (options.diff !== false) {
29
+ action.include_snapshot_diff = true;
30
+ }
31
+ const result = await client.executeAction(resolved.id, action);
28
32
  if (result.success) {
29
33
  console.log(success('Page reloaded'));
34
+ if (result.snapshot_diff) {
35
+ console.log('');
36
+ console.log(formatSnapshotDiff(result.snapshot_diff));
37
+ }
30
38
  await touchSession(resolved.id);
31
39
  }
32
40
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"reload.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/reload.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMrD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE;YACrD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YACtC,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"reload.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/reload.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAOhE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;KACnD,MAAM,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,MAAM,GAGR,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAEtC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqCpC,eAAO,MAAM,UAAU,SA0wBnB,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC,eAAO,MAAM,UAAU,SA45BnB,CAAC"}
@@ -8,6 +8,7 @@ import { createStoredSession, removeStoredSession, resolveSessionId, storeSessio
8
8
  import { normalizeRef } from '../../lib/browser-utils.js';
9
9
  import { loadConfig } from '../../lib/config.js';
10
10
  import { error, info, success } from '../../lib/output.js';
11
+ import { formatSnapshotDiff } from '../../lib/snapshot-diff.js';
11
12
  function collectVars(value, previous) {
12
13
  const [key, val] = value.split('=');
13
14
  return { ...previous, [key]: val };
@@ -187,15 +188,22 @@ export const runCommand = new Command('run')
187
188
  }
188
189
  },
189
190
  click: async (args, client, sessionId) => {
190
- // Check for --force/-f flag
191
+ // Check for --force/-f flag and --no-diff flag
191
192
  const forceIdx = args.findIndex((a) => a === '-f' || a === '--force');
193
+ const noDiffIdx = args.indexOf('--no-diff');
192
194
  const force = forceIdx !== -1;
193
- const filteredArgs = force
194
- ? [...args.slice(0, forceIdx), ...args.slice(forceIdx + 1)]
195
- : args;
195
+ const disableDiff = noDiffIdx !== -1;
196
+ // Filter out flags
197
+ let filteredArgs = [...args];
198
+ if (forceIdx !== -1) {
199
+ filteredArgs = filteredArgs.filter((_, i) => i !== forceIdx);
200
+ }
201
+ if (noDiffIdx !== -1) {
202
+ filteredArgs = filteredArgs.filter((a) => a !== '--no-diff');
203
+ }
196
204
  const parsed = parseTextOption(filteredArgs);
197
205
  if (!parsed.ref && !parsed.text) {
198
- console.log(error('Usage: click <ref> or click -t "description" [--force]'));
206
+ console.log(error('Usage: click <ref> or click -t "description" [--force] [--no-diff]'));
199
207
  return;
200
208
  }
201
209
  const action = {
@@ -207,10 +215,16 @@ export const runCommand = new Command('run')
207
215
  action.text = parsed.text;
208
216
  if (force)
209
217
  action.force = true;
218
+ if (!disableDiff)
219
+ action.include_snapshot_diff = true;
210
220
  const result = await client.executeAction(sessionId, action);
211
221
  if (result.success) {
212
222
  const target = parsed.ref ? normalizeRef(parsed.ref) : `"${parsed.text}"`;
213
223
  console.log(success(`Clicked ${target}`));
224
+ if (result.snapshot_diff) {
225
+ console.log('');
226
+ console.log(formatSnapshotDiff(result.snapshot_diff));
227
+ }
214
228
  }
215
229
  else {
216
230
  console.log(error(result.error || 'Click failed'));
@@ -491,6 +505,59 @@ export const runCommand = new Command('run')
491
505
  const url = await client.getUrl(sessionId);
492
506
  console.log(url);
493
507
  },
508
+ evaluate: async (args, client, sessionId) => {
509
+ if (args.length === 0) {
510
+ console.log(error('Usage: evaluate <expression> [-r <ref>] [-t "description"]'));
511
+ return;
512
+ }
513
+ // Parse options
514
+ const refIdx = args.findIndex((a) => a === '-r' || a === '--ref');
515
+ const textIdx = args.findIndex((a) => a === '-t' || a === '--text');
516
+ let ref;
517
+ let text;
518
+ let expressionParts = [...args];
519
+ if (refIdx !== -1 && args[refIdx + 1]) {
520
+ ref = normalizeRef(args[refIdx + 1]);
521
+ expressionParts = [...args.slice(0, refIdx), ...args.slice(refIdx + 2)];
522
+ }
523
+ if (textIdx !== -1 && args[textIdx + 1]) {
524
+ text = args[textIdx + 1];
525
+ const adjustedTextIdx = expressionParts.findIndex((a) => a === '-t' || a === '--text');
526
+ if (adjustedTextIdx !== -1) {
527
+ expressionParts = [
528
+ ...expressionParts.slice(0, adjustedTextIdx),
529
+ ...expressionParts.slice(adjustedTextIdx + 2),
530
+ ];
531
+ }
532
+ }
533
+ const expression = expressionParts.join(' ');
534
+ if (!expression) {
535
+ console.log(error('Expression is required'));
536
+ return;
537
+ }
538
+ const action = { type: 'evaluate', expression };
539
+ if (ref)
540
+ action.ref = ref;
541
+ if (text)
542
+ action.text = text;
543
+ const result = await client.executeAction(sessionId, action);
544
+ if (result.success) {
545
+ const data = result.data;
546
+ const value = data.result;
547
+ if (typeof value === 'string') {
548
+ console.log(value);
549
+ }
550
+ else if (value === null || value === undefined) {
551
+ console.log(String(value));
552
+ }
553
+ else {
554
+ console.log(JSON.stringify(value, null, 2));
555
+ }
556
+ }
557
+ else {
558
+ console.log(error(result.error || 'Evaluation failed'));
559
+ }
560
+ },
494
561
  'get-blocks': async (_args, client, sessionId) => {
495
562
  const blocks = await client.getBlocks(sessionId);
496
563
  console.log(JSON.stringify(blocks, null, 2));
@@ -564,17 +631,55 @@ export const runCommand = new Command('run')
564
631
  },
565
632
  drag: async (args, client, sessionId) => {
566
633
  // Parse: drag <ref> --target <target-ref> or --target-selector <sel>
634
+ // Also support: drag <ref> --delta-x <px> --delta-y <px>
567
635
  // Also support: drag -t "text" --target <ref>
568
- const parsed = parseTextOption(args);
636
+ const noDiffIdx = args.indexOf('--no-diff');
637
+ const disableDiff = noDiffIdx !== -1;
638
+ const filteredArgs = disableDiff ? args.filter((a) => a !== '--no-diff') : args;
639
+ const parsed = parseTextOption(filteredArgs);
569
640
  if (!parsed.ref && !parsed.text) {
570
- console.log(error('Usage: drag <ref> --target <ref> or drag -t "text" --target <ref>'));
641
+ console.log(error('Usage: drag <ref> --target <ref> OR drag <ref> --delta-x <px> --delta-y <px> [--no-diff]'));
642
+ return;
643
+ }
644
+ // Check for relative drag options
645
+ const deltaXIdx = parsed.remaining.indexOf('--delta-x');
646
+ const deltaYIdx = parsed.remaining.indexOf('--delta-y');
647
+ const isRelativeDrag = deltaXIdx !== -1 || deltaYIdx !== -1;
648
+ if (isRelativeDrag) {
649
+ const deltaX = deltaXIdx !== -1 ? parseInt(parsed.remaining[deltaXIdx + 1], 10) : 0;
650
+ const deltaY = deltaYIdx !== -1 ? parseInt(parsed.remaining[deltaYIdx + 1], 10) : 0;
651
+ const action = {
652
+ type: 'relative_drag_and_drop',
653
+ delta_x: deltaX,
654
+ delta_y: deltaY,
655
+ };
656
+ if (parsed.ref)
657
+ action.ref = normalizeRef(parsed.ref);
658
+ if (parsed.text)
659
+ action.text = parsed.text;
660
+ if (!disableDiff)
661
+ action.include_snapshot_diff = true;
662
+ const result = await client.executeAction(sessionId, action);
663
+ if (result.success) {
664
+ const source = parsed.ref
665
+ ? `element ${normalizeRef(parsed.ref)}`
666
+ : `"${parsed.text}"`;
667
+ console.log(success(`Dragged ${source} by (${deltaX}, ${deltaY}) pixels`));
668
+ if (result.snapshot_diff) {
669
+ console.log('');
670
+ console.log(formatSnapshotDiff(result.snapshot_diff));
671
+ }
672
+ }
673
+ else {
674
+ console.log(error(result.error || 'Relative drag failed'));
675
+ }
571
676
  return;
572
677
  }
573
- // Parse target options from remaining args
678
+ // Standard drag (existing code)
574
679
  const targetIdx = parsed.remaining.indexOf('--target');
575
680
  const targetSelectorIdx = parsed.remaining.indexOf('--target-selector');
576
681
  if (targetIdx === -1 && targetSelectorIdx === -1) {
577
- console.log(error('Either --target <ref> or --target-selector <selector> is required'));
682
+ console.log(error('Either --target <ref>, --target-selector <selector>, or --delta-x/--delta-y is required'));
578
683
  return;
579
684
  }
580
685
  const targetRef = targetIdx !== -1 && parsed.remaining[targetIdx + 1]
@@ -592,11 +697,17 @@ export const runCommand = new Command('run')
592
697
  action.target_ref = targetRef;
593
698
  if (targetSelector)
594
699
  action.target_selector = targetSelector;
700
+ if (!disableDiff)
701
+ action.include_snapshot_diff = true;
595
702
  const result = await client.executeAction(sessionId, action);
596
703
  if (result.success) {
597
704
  const source = parsed.ref ? normalizeRef(parsed.ref) : `"${parsed.text}"`;
598
705
  const target = targetRef ? targetRef : `selector "${targetSelector}"`;
599
706
  console.log(success(`Dragged ${source} to ${target}`));
707
+ if (result.snapshot_diff) {
708
+ console.log('');
709
+ console.log(formatSnapshotDiff(result.snapshot_diff));
710
+ }
600
711
  }
601
712
  else {
602
713
  console.log(error(result.error || 'Drag failed'));
@@ -832,20 +943,31 @@ Available commands:
832
943
  reload Reload current page
833
944
 
834
945
  ${colors.cyan}Actions:${colors.reset}
835
- click <ref> [--force] Click element (--force bypasses actionability checks)
836
- fill <ref> <value> Fill input field
837
- type <ref> <text> Type text with delays
838
- press <key> Press keyboard key
839
- hover <ref> Hover over element
840
- scroll <dir> [amount] Scroll page (up/down/left/right)
841
- scroll-into-view <ref> Scroll element into view
842
- select <ref> <value> Select dropdown option
843
- check <ref> Check checkbox
844
- uncheck <ref> Uncheck checkbox
845
- drag <ref> --target <ref>
946
+ click <ref> [--force] [--no-diff]
947
+ Click element (--force bypasses actionability checks)
948
+ fill <ref> <value> [--no-diff]
949
+ Fill input field
950
+ type <ref> <text> [--no-diff]
951
+ Type text with delays
952
+ press <key> [--no-diff] Press keyboard key
953
+ hover <ref> [--no-diff] Hover over element
954
+ scroll <dir> [amount] [--no-diff]
955
+ Scroll page (up/down/left/right)
956
+ scroll-into-view <ref> [--no-diff]
957
+ Scroll element into view
958
+ select <ref> <value> [--no-diff]
959
+ Select dropdown option
960
+ check <ref> [--no-diff] Check checkbox
961
+ uncheck <ref> [--no-diff]
962
+ Uncheck checkbox
963
+ drag <ref> --target <ref> [--no-diff]
846
964
  Drag element to target (--target-selector for CSS)
847
- mfa-totp [ref] <secret> Generate TOTP code (optionally fill into ref)
848
- upload <ref> <file>... Upload file(s) to input
965
+ drag <ref> --delta-x <px> --delta-y <px> [--no-diff]
966
+ Drag element by pixel offset
967
+ mfa-totp [ref] <secret> [--no-diff]
968
+ Generate TOTP code (optionally fill into ref)
969
+ upload <ref> <file>... [--no-diff]
970
+ Upload file(s) to input
849
971
 
850
972
  ${colors.cyan}Wait Commands:${colors.reset}
851
973
  wait <ms> Wait for duration
@@ -858,6 +980,7 @@ Available commands:
858
980
  screenshot [file] [--url]
859
981
  Save screenshot or return pre-signed URL
860
982
  url Get current URL
983
+ evaluate <expr> Execute JavaScript (use -r <ref> for element scope)
861
984
  get-blocks Get recorded test steps (JSON)
862
985
  status Get session status (includes app_url)
863
986
 
@@ -878,7 +1001,8 @@ Available commands:
878
1001
  fill -t "email input" user@example.com
879
1002
  check -t "Accept terms checkbox"
880
1003
 
881
- ${colors.gray}Refs like "e3" or "@e3" identify elements in the snapshot.${colors.reset}
1004
+ ${colors.gray}Refs like "e3" or "@e3" identify elements in the snapshot.
1005
+ Actions show snapshot diff by default. Use --no-diff for faster execution.${colors.reset}
882
1006
  `);
883
1007
  return Promise.resolve();
884
1008
  }