@desplega.ai/qa-use 2.1.7 → 2.2.3

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 (158) hide show
  1. package/dist/lib/api/browser-types.d.ts +175 -0
  2. package/dist/lib/api/browser-types.d.ts.map +1 -0
  3. package/dist/lib/api/browser-types.js +5 -0
  4. package/dist/lib/api/browser-types.js.map +1 -0
  5. package/dist/lib/api/browser.d.ts +66 -0
  6. package/dist/lib/api/browser.d.ts.map +1 -0
  7. package/dist/lib/api/browser.js +223 -0
  8. package/dist/lib/api/browser.js.map +1 -0
  9. package/dist/lib/browser/index.d.ts +10 -0
  10. package/dist/lib/browser/index.d.ts.map +1 -1
  11. package/dist/lib/browser/index.js +29 -0
  12. package/dist/lib/browser/index.js.map +1 -1
  13. package/dist/package.json +2 -1
  14. package/dist/src/cli/commands/browser/back.d.ts +6 -0
  15. package/dist/src/cli/commands/browser/back.d.ts.map +1 -0
  16. package/dist/src/cli/commands/browser/back.js +42 -0
  17. package/dist/src/cli/commands/browser/back.js.map +1 -0
  18. package/dist/src/cli/commands/browser/check.d.ts +6 -0
  19. package/dist/src/cli/commands/browser/check.d.ts.map +1 -0
  20. package/dist/src/cli/commands/browser/check.js +62 -0
  21. package/dist/src/cli/commands/browser/check.js.map +1 -0
  22. package/dist/src/cli/commands/browser/click.d.ts +6 -0
  23. package/dist/src/cli/commands/browser/click.d.ts.map +1 -0
  24. package/dist/src/cli/commands/browser/click.js +63 -0
  25. package/dist/src/cli/commands/browser/click.js.map +1 -0
  26. package/dist/src/cli/commands/browser/close.d.ts +6 -0
  27. package/dist/src/cli/commands/browser/close.d.ts.map +1 -0
  28. package/dist/src/cli/commands/browser/close.js +44 -0
  29. package/dist/src/cli/commands/browser/close.js.map +1 -0
  30. package/dist/src/cli/commands/browser/create.d.ts +6 -0
  31. package/dist/src/cli/commands/browser/create.d.ts.map +1 -0
  32. package/dist/src/cli/commands/browser/create.js +284 -0
  33. package/dist/src/cli/commands/browser/create.js.map +1 -0
  34. package/dist/src/cli/commands/browser/fill.d.ts +6 -0
  35. package/dist/src/cli/commands/browser/fill.d.ts.map +1 -0
  36. package/dist/src/cli/commands/browser/fill.js +83 -0
  37. package/dist/src/cli/commands/browser/fill.js.map +1 -0
  38. package/dist/src/cli/commands/browser/forward.d.ts +6 -0
  39. package/dist/src/cli/commands/browser/forward.d.ts.map +1 -0
  40. package/dist/src/cli/commands/browser/forward.js +42 -0
  41. package/dist/src/cli/commands/browser/forward.js.map +1 -0
  42. package/dist/src/cli/commands/browser/get-blocks.d.ts +6 -0
  43. package/dist/src/cli/commands/browser/get-blocks.d.ts.map +1 -0
  44. package/dist/src/cli/commands/browser/get-blocks.js +35 -0
  45. package/dist/src/cli/commands/browser/get-blocks.js.map +1 -0
  46. package/dist/src/cli/commands/browser/goto.d.ts +6 -0
  47. package/dist/src/cli/commands/browser/goto.d.ts.map +1 -0
  48. package/dist/src/cli/commands/browser/goto.js +53 -0
  49. package/dist/src/cli/commands/browser/goto.js.map +1 -0
  50. package/dist/src/cli/commands/browser/hover.d.ts +6 -0
  51. package/dist/src/cli/commands/browser/hover.d.ts.map +1 -0
  52. package/dist/src/cli/commands/browser/hover.js +63 -0
  53. package/dist/src/cli/commands/browser/hover.js.map +1 -0
  54. package/dist/src/cli/commands/browser/index.d.ts +9 -0
  55. package/dist/src/cli/commands/browser/index.d.ts.map +1 -0
  56. package/dist/src/cli/commands/browser/index.js +71 -0
  57. package/dist/src/cli/commands/browser/index.js.map +1 -0
  58. package/dist/src/cli/commands/browser/list.d.ts +6 -0
  59. package/dist/src/cli/commands/browser/list.d.ts.map +1 -0
  60. package/dist/src/cli/commands/browser/list.js +85 -0
  61. package/dist/src/cli/commands/browser/list.js.map +1 -0
  62. package/dist/src/cli/commands/browser/press.d.ts +6 -0
  63. package/dist/src/cli/commands/browser/press.d.ts.map +1 -0
  64. package/dist/src/cli/commands/browser/press.js +67 -0
  65. package/dist/src/cli/commands/browser/press.js.map +1 -0
  66. package/dist/src/cli/commands/browser/reload.d.ts +6 -0
  67. package/dist/src/cli/commands/browser/reload.d.ts.map +1 -0
  68. package/dist/src/cli/commands/browser/reload.js +42 -0
  69. package/dist/src/cli/commands/browser/reload.js.map +1 -0
  70. package/dist/src/cli/commands/browser/run.d.ts +6 -0
  71. package/dist/src/cli/commands/browser/run.d.ts.map +1 -0
  72. package/dist/src/cli/commands/browser/run.js +618 -0
  73. package/dist/src/cli/commands/browser/run.js.map +1 -0
  74. package/dist/src/cli/commands/browser/screenshot.d.ts +6 -0
  75. package/dist/src/cli/commands/browser/screenshot.d.ts.map +1 -0
  76. package/dist/src/cli/commands/browser/screenshot.js +72 -0
  77. package/dist/src/cli/commands/browser/screenshot.js.map +1 -0
  78. package/dist/src/cli/commands/browser/scroll-into-view.d.ts +6 -0
  79. package/dist/src/cli/commands/browser/scroll-into-view.d.ts.map +1 -0
  80. package/dist/src/cli/commands/browser/scroll-into-view.js +64 -0
  81. package/dist/src/cli/commands/browser/scroll-into-view.js.map +1 -0
  82. package/dist/src/cli/commands/browser/scroll.d.ts +6 -0
  83. package/dist/src/cli/commands/browser/scroll.d.ts.map +1 -0
  84. package/dist/src/cli/commands/browser/scroll.js +63 -0
  85. package/dist/src/cli/commands/browser/scroll.js.map +1 -0
  86. package/dist/src/cli/commands/browser/select.d.ts +6 -0
  87. package/dist/src/cli/commands/browser/select.d.ts.map +1 -0
  88. package/dist/src/cli/commands/browser/select.js +83 -0
  89. package/dist/src/cli/commands/browser/select.js.map +1 -0
  90. package/dist/src/cli/commands/browser/snapshot.d.ts +6 -0
  91. package/dist/src/cli/commands/browser/snapshot.d.ts.map +1 -0
  92. package/dist/src/cli/commands/browser/snapshot.js +72 -0
  93. package/dist/src/cli/commands/browser/snapshot.js.map +1 -0
  94. package/dist/src/cli/commands/browser/status.d.ts +6 -0
  95. package/dist/src/cli/commands/browser/status.d.ts.map +1 -0
  96. package/dist/src/cli/commands/browser/status.js +91 -0
  97. package/dist/src/cli/commands/browser/status.js.map +1 -0
  98. package/dist/src/cli/commands/browser/stream.d.ts +6 -0
  99. package/dist/src/cli/commands/browser/stream.d.ts.map +1 -0
  100. package/dist/src/cli/commands/browser/stream.js +135 -0
  101. package/dist/src/cli/commands/browser/stream.js.map +1 -0
  102. package/dist/src/cli/commands/browser/tunnel.d.ts +13 -0
  103. package/dist/src/cli/commands/browser/tunnel.d.ts.map +1 -0
  104. package/dist/src/cli/commands/browser/tunnel.js +225 -0
  105. package/dist/src/cli/commands/browser/tunnel.js.map +1 -0
  106. package/dist/src/cli/commands/browser/type.d.ts +6 -0
  107. package/dist/src/cli/commands/browser/type.d.ts.map +1 -0
  108. package/dist/src/cli/commands/browser/type.js +61 -0
  109. package/dist/src/cli/commands/browser/type.js.map +1 -0
  110. package/dist/src/cli/commands/browser/uncheck.d.ts +6 -0
  111. package/dist/src/cli/commands/browser/uncheck.d.ts.map +1 -0
  112. package/dist/src/cli/commands/browser/uncheck.js +62 -0
  113. package/dist/src/cli/commands/browser/uncheck.js.map +1 -0
  114. package/dist/src/cli/commands/browser/url.d.ts +6 -0
  115. package/dist/src/cli/commands/browser/url.d.ts.map +1 -0
  116. package/dist/src/cli/commands/browser/url.js +40 -0
  117. package/dist/src/cli/commands/browser/url.js.map +1 -0
  118. package/dist/src/cli/commands/browser/wait-for-load.d.ts +6 -0
  119. package/dist/src/cli/commands/browser/wait-for-load.d.ts.map +1 -0
  120. package/dist/src/cli/commands/browser/wait-for-load.js +50 -0
  121. package/dist/src/cli/commands/browser/wait-for-load.js.map +1 -0
  122. package/dist/src/cli/commands/browser/wait-for-selector.d.ts +6 -0
  123. package/dist/src/cli/commands/browser/wait-for-selector.d.ts.map +1 -0
  124. package/dist/src/cli/commands/browser/wait-for-selector.js +52 -0
  125. package/dist/src/cli/commands/browser/wait-for-selector.js.map +1 -0
  126. package/dist/src/cli/commands/browser/wait.d.ts +6 -0
  127. package/dist/src/cli/commands/browser/wait.d.ts.map +1 -0
  128. package/dist/src/cli/commands/browser/wait.js +60 -0
  129. package/dist/src/cli/commands/browser/wait.js.map +1 -0
  130. package/dist/src/cli/commands/info.d.ts +1 -1
  131. package/dist/src/cli/commands/info.d.ts.map +1 -1
  132. package/dist/src/cli/commands/info.js +178 -15
  133. package/dist/src/cli/commands/info.js.map +1 -1
  134. package/dist/src/cli/commands/install-deps.d.ts +6 -0
  135. package/dist/src/cli/commands/install-deps.d.ts.map +1 -0
  136. package/dist/src/cli/commands/install-deps.js +52 -0
  137. package/dist/src/cli/commands/install-deps.js.map +1 -0
  138. package/dist/src/cli/commands/test/run.d.ts.map +1 -1
  139. package/dist/src/cli/commands/test/run.js +32 -7
  140. package/dist/src/cli/commands/test/run.js.map +1 -1
  141. package/dist/src/cli/index.js +4 -0
  142. package/dist/src/cli/index.js.map +1 -1
  143. package/dist/src/cli/lib/browser-sessions.d.ts +72 -0
  144. package/dist/src/cli/lib/browser-sessions.d.ts.map +1 -0
  145. package/dist/src/cli/lib/browser-sessions.js +184 -0
  146. package/dist/src/cli/lib/browser-sessions.js.map +1 -0
  147. package/dist/src/cli/lib/browser.d.ts +5 -0
  148. package/dist/src/cli/lib/browser.d.ts.map +1 -1
  149. package/dist/src/cli/lib/browser.js +19 -0
  150. package/dist/src/cli/lib/browser.js.map +1 -1
  151. package/dist/src/cli/lib/config.d.ts.map +1 -1
  152. package/dist/src/cli/lib/config.js +3 -0
  153. package/dist/src/cli/lib/config.js.map +1 -1
  154. package/lib/api/browser-types.ts +278 -0
  155. package/lib/api/browser.test.ts +378 -0
  156. package/lib/api/browser.ts +279 -0
  157. package/lib/browser/index.ts +37 -0
  158. package/package.json +2 -1
@@ -0,0 +1,50 @@
1
+ /**
2
+ * qa-use browser wait-for-load - Wait for page load state
3
+ */
4
+ import { Command } from 'commander';
5
+ import { BrowserApiClient } from '../../../../lib/api/browser.js';
6
+ import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
+ import { loadConfig } from '../../lib/config.js';
8
+ import { success, error } from '../../lib/output.js';
9
+ export const waitForLoadCommand = new Command('wait-for-load')
10
+ .description('Wait for page load state')
11
+ .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
12
+ .option('--state <state>', 'Load state to wait for (load|domcontentloaded|networkidle)', 'load')
13
+ .option('--timeout <ms>', 'Timeout in milliseconds', '30000')
14
+ .action(async (options) => {
15
+ try {
16
+ const config = await loadConfig();
17
+ if (!config.api_key) {
18
+ console.log(error('API key not configured. Run `qa-use setup` first.'));
19
+ process.exit(1);
20
+ }
21
+ const client = new BrowserApiClient(config.api_url);
22
+ client.setApiKey(config.api_key);
23
+ const resolved = await resolveSessionId({
24
+ explicitId: options.sessionId,
25
+ client,
26
+ });
27
+ const state = options.state;
28
+ if (!['load', 'domcontentloaded', 'networkidle'].includes(state)) {
29
+ console.log(error('Invalid state. Must be: load, domcontentloaded, or networkidle'));
30
+ process.exit(1);
31
+ }
32
+ const result = await client.executeAction(resolved.id, {
33
+ type: 'wait_for_load',
34
+ state,
35
+ });
36
+ if (result.success) {
37
+ console.log(success(`Page reached ${state} state`));
38
+ await touchSession(resolved.id);
39
+ }
40
+ else {
41
+ console.log(error(result.error || 'Wait for load failed'));
42
+ process.exit(1);
43
+ }
44
+ }
45
+ catch (err) {
46
+ console.log(error(err instanceof Error ? err.message : 'Failed to wait for load'));
47
+ process.exit(1);
48
+ }
49
+ });
50
+ //# sourceMappingURL=wait-for-load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-for-load.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/wait-for-load.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,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC3D,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,iBAAiB,EAAE,4DAA4D,EAAE,MAAM,CAAC;KAC/F,MAAM,CAAC,gBAAgB,EAAE,yBAAyB,EAAE,OAAO,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;IAC5C,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,KAAK,GAAG,OAAO,CAAC,KAAoD,CAAC;QAC3E,IAAI,CAAC,CAAC,MAAM,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE;YACrD,IAAI,EAAE,eAAe;YACrB,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACpD,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC,CAAC;YAC3D,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,yBAAyB,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use browser wait-for-selector - Wait for CSS selector to reach a state
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const waitForSelectorCommand: Command;
6
+ //# sourceMappingURL=wait-for-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-for-selector.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/wait-for-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,sBAAsB,SA6C/B,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * qa-use browser wait-for-selector - Wait for CSS selector to reach a state
3
+ */
4
+ import { Command } from 'commander';
5
+ import { BrowserApiClient } from '../../../../lib/api/browser.js';
6
+ import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
+ import { loadConfig } from '../../lib/config.js';
8
+ import { success, error } from '../../lib/output.js';
9
+ export const waitForSelectorCommand = new Command('wait-for-selector')
10
+ .description('Wait for CSS selector to reach a state')
11
+ .argument('<selector>', 'CSS selector to wait for')
12
+ .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
13
+ .option('--state <state>', 'State to wait for (visible|hidden|attached|detached)', 'visible')
14
+ .option('--timeout <ms>', 'Timeout in milliseconds', '30000')
15
+ .action(async (selector, options) => {
16
+ try {
17
+ const config = await loadConfig();
18
+ if (!config.api_key) {
19
+ console.log(error('API key not configured. Run `qa-use setup` first.'));
20
+ process.exit(1);
21
+ }
22
+ const client = new BrowserApiClient(config.api_url);
23
+ client.setApiKey(config.api_key);
24
+ const resolved = await resolveSessionId({
25
+ explicitId: options.sessionId,
26
+ client,
27
+ });
28
+ const state = options.state;
29
+ if (!['visible', 'hidden', 'attached', 'detached'].includes(state)) {
30
+ console.log(error('Invalid state. Must be: visible, hidden, attached, or detached'));
31
+ process.exit(1);
32
+ }
33
+ const result = await client.executeAction(resolved.id, {
34
+ type: 'wait_for_selector',
35
+ selector,
36
+ state,
37
+ });
38
+ if (result.success) {
39
+ console.log(success(`Selector "${selector}" is ${state}`));
40
+ await touchSession(resolved.id);
41
+ }
42
+ else {
43
+ console.log(error(result.error || 'Wait for selector failed'));
44
+ process.exit(1);
45
+ }
46
+ }
47
+ catch (err) {
48
+ console.log(error(err instanceof Error ? err.message : 'Failed to wait for selector'));
49
+ process.exit(1);
50
+ }
51
+ });
52
+ //# sourceMappingURL=wait-for-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-for-selector.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/wait-for-selector.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,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQrD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC,mBAAmB,CAAC;KACnE,WAAW,CAAC,wCAAwC,CAAC;KACrD,QAAQ,CAAC,YAAY,EAAE,0BAA0B,CAAC;KAClD,MAAM,CAAC,uBAAuB,EAAE,gDAAgD,CAAC;KACjF,MAAM,CAAC,iBAAiB,EAAE,sDAAsD,EAAE,SAAS,CAAC;KAC5F,MAAM,CAAC,gBAAgB,EAAE,yBAAyB,EAAE,OAAO,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAA+B,EAAE,EAAE;IAClE,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,KAAK,GAAG,OAAO,CAAC,KAAuD,CAAC;QAC9E,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE;YACrD,IAAI,EAAE,mBAAmB;YACzB,QAAQ;YACR,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,QAAQ,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,0BAA0B,CAAC,CAAC,CAAC;YAC/D,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,6BAA6B,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use browser wait - Wait for a fixed duration
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const waitCommand: Command;
6
+ //# sourceMappingURL=wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/wait.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,WAAW,SAsDpB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * qa-use browser wait - Wait for a fixed duration
3
+ */
4
+ import { Command } from 'commander';
5
+ import { BrowserApiClient } from '../../../../lib/api/browser.js';
6
+ import { resolveSessionId, touchSession } from '../../lib/browser-sessions.js';
7
+ import { loadConfig } from '../../lib/config.js';
8
+ import { success, error } from '../../lib/output.js';
9
+ export const waitCommand = new Command('wait')
10
+ .description('Wait for a specified duration')
11
+ .argument('<ms>', 'Duration to wait in milliseconds')
12
+ .option('-s, --session-id <id>', 'Session ID (auto-resolved if only one session)')
13
+ .action(async (msStr, options) => {
14
+ try {
15
+ // Load configuration
16
+ const config = await loadConfig();
17
+ if (!config.api_key) {
18
+ console.log(error('API key not configured. Run `qa-use setup` first.'));
19
+ process.exit(1);
20
+ }
21
+ // Parse duration
22
+ const durationMs = parseInt(msStr, 10);
23
+ if (isNaN(durationMs) || durationMs <= 0) {
24
+ console.log(error('Duration must be a positive number in milliseconds'));
25
+ process.exit(1);
26
+ }
27
+ if (durationMs > 60000) {
28
+ console.log(error('Maximum wait duration is 60000ms (1 minute)'));
29
+ process.exit(1);
30
+ }
31
+ // Create client and set API key
32
+ const client = new BrowserApiClient(config.api_url);
33
+ client.setApiKey(config.api_key);
34
+ // Resolve session ID
35
+ const resolved = await resolveSessionId({
36
+ explicitId: options.sessionId,
37
+ client,
38
+ });
39
+ // Execute wait action
40
+ const result = await client.executeAction(resolved.id, {
41
+ type: 'wait',
42
+ duration_ms: durationMs,
43
+ });
44
+ if (result.success) {
45
+ // Format duration for display
46
+ const displayDuration = durationMs >= 1000 ? `${durationMs / 1000}s` : `${durationMs}ms`;
47
+ console.log(success(`Waited ${displayDuration}`));
48
+ await touchSession(resolved.id);
49
+ }
50
+ else {
51
+ console.log(error(result.error || 'Wait failed'));
52
+ process.exit(1);
53
+ }
54
+ }
55
+ catch (err) {
56
+ console.log(error(err instanceof Error ? err.message : 'Failed to wait'));
57
+ process.exit(1);
58
+ }
59
+ });
60
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../../../src/cli/commands/browser/wait.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * qa-use info - Show current configuration
2
+ * qa-use info - Show current configuration and app config details
3
3
  */
4
4
  import { Command } from 'commander';
5
5
  export declare const infoCommand: Command;
@@ -1 +1 @@
1
- {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,WAAW,SAgCpB,CAAC"}
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,eAAO,MAAM,WAAW,SAkLpB,CAAC"}
@@ -1,32 +1,195 @@
1
1
  /**
2
- * qa-use info - Show current configuration
2
+ * qa-use info - Show current configuration and app config details
3
3
  */
4
4
  import { Command } from 'commander';
5
5
  import { loadConfig, configExists } from '../lib/config.js';
6
- import { warning } from '../lib/output.js';
6
+ import { success, error, warning } from '../lib/output.js';
7
+ import { ApiClient } from '../../../lib/api/index.js';
8
+ import { getEnvWithSource } from '../../../lib/env/index.js';
9
+ import { BrowserManager } from '../../../lib/browser/index.js';
10
+ /**
11
+ * Mask a sensitive value (show first 10 chars or asterisks)
12
+ */
13
+ function maskValue(value, showSecrets) {
14
+ if (!value)
15
+ return '(not set)';
16
+ if (showSecrets)
17
+ return value;
18
+ return '**********';
19
+ }
20
+ /**
21
+ * Format a value for display, showing (not set) if empty
22
+ */
23
+ function formatValue(value) {
24
+ if (!value)
25
+ return '(not set)';
26
+ return value;
27
+ }
7
28
  export const infoCommand = new Command('info')
8
29
  .description('Show current configuration and environment')
9
- .action(async () => {
10
- console.log('ℹ️ QA-Use Configuration\n');
11
- const hasConfig = await configExists();
12
- if (!hasConfig) {
13
- console.log(warning('No configuration file found'));
14
- console.log(' Run `qa-use setup` to create one\n');
15
- }
30
+ .option('--show-secrets', 'Show sensitive values like login password')
31
+ .action(async (options) => {
32
+ console.log('QA-Use Configuration\n');
33
+ const hasLocalConfig = await configExists();
16
34
  const config = await loadConfig();
35
+ // Determine API key source
36
+ const apiKeyEnvResult = getEnvWithSource('QA_USE_API_KEY');
37
+ const apiKey = config.api_key || apiKeyEnvResult.value;
38
+ let apiKeySource = '';
39
+ if (apiKey) {
40
+ if (apiKeyEnvResult.value && apiKeyEnvResult.source === 'env') {
41
+ apiKeySource = ' (from environment variable)';
42
+ }
43
+ else if (apiKeyEnvResult.source === 'config') {
44
+ apiKeySource = ' (from ~/.qa-use.json)';
45
+ }
46
+ else if (config.api_key) {
47
+ apiKeySource = ' (from config file)';
48
+ }
49
+ }
50
+ // Show basic configuration
17
51
  console.log('Configuration:');
18
- console.log(` API Key: ${config.api_key ? config.api_key.slice(0, 8) + '...' : '(not set)'}`);
52
+ console.log(` API Key: ${apiKey ? apiKey.slice(0, 12) + '...' : '(not set)'}${apiKeySource}`);
19
53
  console.log(` API URL: ${config.api_url || process.env.QA_USE_API_URL || 'https://api.desplega.ai'}`);
20
54
  console.log(` Test Directory: ${config.test_directory || './qa-tests'}`);
21
- console.log(` Default App Config: ${config.default_app_config_id || '(not set)'}`);
55
+ // Fetch and display app config if API key is available
56
+ let appConfig = null;
57
+ let appConfigSource = '';
58
+ if (apiKey) {
59
+ try {
60
+ const client = new ApiClient(config.api_url);
61
+ client.setApiKey(apiKey);
62
+ const authResponse = await client.validateApiKey();
63
+ if (authResponse.success && authResponse.data) {
64
+ const apiKeyAppConfigId = authResponse.data.api_key?.app_config_id;
65
+ // Determine source of app config
66
+ if (config.default_app_config_id) {
67
+ // User explicitly set default_app_config_id
68
+ const envAppConfigId = process.env.QA_USE_DEFAULT_APP_CONFIG_ID;
69
+ if (envAppConfigId === config.default_app_config_id) {
70
+ appConfigSource = '(from QA_USE_DEFAULT_APP_CONFIG_ID)';
71
+ }
72
+ else {
73
+ appConfigSource = '(from config file)';
74
+ }
75
+ // Check if it differs from API key's config
76
+ if (config.default_app_config_id !== apiKeyAppConfigId) {
77
+ // Fetch the override config
78
+ const configs = await client.listAppConfigs({ limit: 100 });
79
+ const overrideConfig = configs.find((c) => c.id === config.default_app_config_id);
80
+ if (overrideConfig) {
81
+ appConfig = overrideConfig;
82
+ }
83
+ else {
84
+ console.log(`\n${warning(`App config ${config.default_app_config_id} not found, using API key default`)}`);
85
+ appConfig = authResponse.data.app_config || null;
86
+ appConfigSource = '(associated with API key)';
87
+ }
88
+ }
89
+ else {
90
+ // Same as API key's config, but user explicitly set it
91
+ appConfig = authResponse.data.app_config || null;
92
+ }
93
+ }
94
+ else {
95
+ // No explicit default_app_config_id set
96
+ appConfig = authResponse.data.app_config || null;
97
+ appConfigSource = '(associated with API key)';
98
+ }
99
+ }
100
+ }
101
+ catch (err) {
102
+ console.log(`\n${error('Failed to fetch app config')}`);
103
+ if (err instanceof Error) {
104
+ console.log(` ${err.message}`);
105
+ }
106
+ }
107
+ }
108
+ // Display app config details
109
+ console.log(`\nApp Config: ${appConfigSource}`);
110
+ if (appConfig) {
111
+ console.log(` ID: ${appConfig.id}`);
112
+ console.log(` Name: ${appConfig.name}`);
113
+ console.log(` Base URL: ${formatValue(appConfig.base_url)}`);
114
+ console.log(` Login URL: ${formatValue(appConfig.login_url)}`);
115
+ console.log(` Login User: ${formatValue(appConfig.login_username)}`);
116
+ console.log(` Login Pass: ${maskValue(appConfig.login_password, options.showSecrets || false)}${appConfig.login_password && !options.showSecrets ? ' (use --show-secrets to reveal)' : ''}`);
117
+ console.log(` Viewport: ${appConfig.vp_type || 'desktop'}`);
118
+ console.log(` Type: ${appConfig.cfg_type || 'production'}`);
119
+ console.log(` Status: ${appConfig.status}`);
120
+ }
121
+ else if (!apiKey) {
122
+ console.log(' Unable to fetch (no API key)');
123
+ }
124
+ else {
125
+ console.log(' No app config found');
126
+ }
127
+ // Show defaults
22
128
  console.log('\nDefaults:');
23
129
  console.log(` Headless: ${config.defaults?.headless ?? true}`);
24
130
  console.log(` Persist: ${config.defaults?.persist ?? false}`);
25
131
  console.log(` Timeout: ${config.defaults?.timeout ?? 300}s`);
26
132
  console.log(` Allow Fix: ${config.defaults?.allow_fix ?? true}`);
27
- console.log('\nEnvironment Variables:');
28
- console.log(` QA_USE_API_KEY: ${process.env.QA_USE_API_KEY ? 'Set' : 'Not set'}`);
29
- console.log(` QA_USE_API_URL: ${process.env.QA_USE_API_URL || 'Not set'}`);
30
- console.log(` QA_USE_REGION: ${process.env.QA_USE_REGION || 'Not set'}`);
133
+ // Show test variables if app config is available
134
+ if (appConfig) {
135
+ console.log('\nTest Variables:');
136
+ console.log(' These are automatically available in test definitions:');
137
+ console.log(` - {{base_url}} -> ${formatValue(appConfig.base_url)}`);
138
+ console.log(` - {{login_url}} -> ${formatValue(appConfig.login_url)}`);
139
+ console.log(` - {{login_username}} -> ${formatValue(appConfig.login_username)}`);
140
+ console.log(` - {{login_password}} -> ${maskValue(appConfig.login_password, options.showSecrets || false)}`);
141
+ }
142
+ // Show setup status checklist
143
+ console.log('\nSetup Status:');
144
+ // API Key status
145
+ if (apiKey) {
146
+ console.log(success('API Key configured'));
147
+ }
148
+ else {
149
+ console.log(error('API Key not configured - set QA_USE_API_KEY or run `qa-use setup`'));
150
+ }
151
+ // App Config status
152
+ if (appConfig) {
153
+ console.log(success('App Config available'));
154
+ }
155
+ else if (!apiKey) {
156
+ console.log(error('App Config unavailable'));
157
+ }
158
+ else {
159
+ console.log(warning('App Config not found'));
160
+ }
161
+ // Base URL status
162
+ if (appConfig?.base_url) {
163
+ console.log(success('Base URL set (required for CI)'));
164
+ }
165
+ else if (appConfig) {
166
+ console.log(error('Base URL not set (required for CI)'));
167
+ }
168
+ else {
169
+ console.log(error('Base URL unknown'));
170
+ }
171
+ // Login credentials status (optional but recommended)
172
+ if (appConfig?.login_username && appConfig?.login_password) {
173
+ console.log(success('Login credentials configured'));
174
+ }
175
+ else if (appConfig) {
176
+ console.log(warning('Login credentials not configured'));
177
+ }
178
+ // Local config file status
179
+ if (hasLocalConfig) {
180
+ console.log(success('Local config file exists'));
181
+ }
182
+ else {
183
+ console.log(warning('No local config file - run `qa-use setup`'));
184
+ }
185
+ // Playwright browser status
186
+ const browserManager = new BrowserManager();
187
+ const browserStatus = browserManager.checkBrowsersInstalled();
188
+ if (browserStatus.installed) {
189
+ console.log(success('Playwright browsers installed'));
190
+ }
191
+ else {
192
+ console.log(error('Playwright browsers not installed - run `qa-use install-deps`'));
193
+ }
31
194
  });
32
195
  //# sourceMappingURL=info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IAEvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CACT,cAAc,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,yBAAyB,EAAE,CAC1F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,cAAc,IAAI,YAAY,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,qBAAqB,IAAI,WAAW,EAAE,CAAC,CAAC;IAEpF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,GAAG,GAAG,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,SAAS,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../../src/cli/commands/info.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D;;GAEG;AACH,SAAS,SAAS,CAAC,KAAgC,EAAE,WAAoB;IACvE,IAAI,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC;IAC/B,IAAI,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAgC;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,CAAC;KACrE,MAAM,CAAC,KAAK,EAAE,OAAkC,EAAE,EAAE;IACnD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,MAAM,cAAc,GAAG,MAAM,YAAY,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,2BAA2B;IAC3B,MAAM,eAAe,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC;IACvD,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,eAAe,CAAC,KAAK,IAAI,eAAe,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC9D,YAAY,GAAG,8BAA8B,CAAC;QAChD,CAAC;aAAM,IAAI,eAAe,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/C,YAAY,GAAG,wBAAwB,CAAC;QAC1C,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,YAAY,GAAG,qBAAqB,CAAC;QACvC,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,YAAY,EAAE,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CACT,cAAc,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,yBAAyB,EAAE,CAC1F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,cAAc,IAAI,YAAY,EAAE,CAAC,CAAC;IAE1E,uDAAuD;IACvD,IAAI,SAAS,GAAqB,IAAI,CAAC;IACvC,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAEzB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;YAEnD,IAAI,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC9C,MAAM,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;gBAEnE,iCAAiC;gBACjC,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;oBACjC,4CAA4C;oBAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;oBAChE,IAAI,cAAc,KAAK,MAAM,CAAC,qBAAqB,EAAE,CAAC;wBACpD,eAAe,GAAG,qCAAqC,CAAC;oBAC1D,CAAC;yBAAM,CAAC;wBACN,eAAe,GAAG,oBAAoB,CAAC;oBACzC,CAAC;oBAED,4CAA4C;oBAC5C,IAAI,MAAM,CAAC,qBAAqB,KAAK,iBAAiB,EAAE,CAAC;wBACvD,4BAA4B;wBAC5B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;wBAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,qBAAqB,CAAC,CAAC;wBAClF,IAAI,cAAc,EAAE,CAAC;4BACnB,SAAS,GAAG,cAAc,CAAC;wBAC7B,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,cAAc,MAAM,CAAC,qBAAqB,mCAAmC,CAAC,EAAE,CAC9F,CAAC;4BACF,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;4BACjD,eAAe,GAAG,2BAA2B,CAAC;wBAChD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,uDAAuD;wBACvD,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;oBACnD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,wCAAwC;oBACxC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;oBACjD,eAAe,GAAG,2BAA2B,CAAC;gBAChD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,eAAe,EAAE,CAAC,CAAC;IAChD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CACT,iBAAiB,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,GAChF,SAAS,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EACzF,EAAE,CACH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,GAAG,GAAG,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;IAElE,iDAAiD;IACjD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,uBAAuB,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,wBAAwB,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CACT,6BAA6B,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,EAAE,CACjG,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE/B,iBAAiB;IACjB,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,oBAAoB;IACpB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,kBAAkB;IAClB,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,sDAAsD;IACtD,IAAI,SAAS,EAAE,cAAc,IAAI,SAAS,EAAE,cAAc,EAAE,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACvD,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,2BAA2B;IAC3B,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,4BAA4B;IAC5B,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,cAAc,CAAC,sBAAsB,EAAE,CAAC;IAC9D,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use install-deps - Install Playwright browser dependencies
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const installDepsCommand: Command;
6
+ //# sourceMappingURL=install-deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-deps.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/install-deps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,kBAAkB,SA8C3B,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * qa-use install-deps - Install Playwright browser dependencies
3
+ */
4
+ import { Command } from 'commander';
5
+ import { BrowserManager } from '../../../lib/browser/index.js';
6
+ import { success, error, info } from '../lib/output.js';
7
+ export const installDepsCommand = new Command('install-deps')
8
+ .description('Install Playwright browser dependencies (Chromium)')
9
+ .option('--force', 'Force reinstall even if browsers are already installed')
10
+ .action(async (options) => {
11
+ const browser = new BrowserManager();
12
+ // Check current installation status unless --force
13
+ if (!options.force) {
14
+ const status = browser.checkBrowsersInstalled();
15
+ if (status.installed) {
16
+ console.log(success('Playwright browsers are already installed'));
17
+ console.log(` Path: ${status.executablePath}`);
18
+ console.log('');
19
+ console.log(info('Use --force to reinstall'));
20
+ return;
21
+ }
22
+ }
23
+ console.log(info('Installing Playwright Chromium browser...'));
24
+ console.log('');
25
+ try {
26
+ await browser.installPlaywrightBrowsers();
27
+ // Verify installation
28
+ const status = browser.checkBrowsersInstalled();
29
+ if (status.installed) {
30
+ console.log('');
31
+ console.log(success('Playwright browsers installed successfully'));
32
+ console.log(` Path: ${status.executablePath}`);
33
+ }
34
+ else {
35
+ console.log('');
36
+ console.log(error('Installation verification failed'));
37
+ if (status.error) {
38
+ console.log(` ${status.error}`);
39
+ }
40
+ process.exit(1);
41
+ }
42
+ }
43
+ catch (err) {
44
+ console.log('');
45
+ console.log(error('Failed to install Playwright browsers'));
46
+ if (err instanceof Error) {
47
+ console.log(` ${err.message}`);
48
+ }
49
+ process.exit(1);
50
+ }
51
+ });
52
+ //# sourceMappingURL=install-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-deps.js","sourceRoot":"","sources":["../../../../src/cli/commands/install-deps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;KAC1D,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,SAAS,EAAE,wDAAwD,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;IAC7C,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IAErC,mDAAmD;IACnD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;QAChD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,yBAAyB,EAAE,CAAC;QAE1C,sBAAsB;QACtB,MAAM,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;QAChD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC5D,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,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/test/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,eAAO,MAAM,UAAU,SA4JnB,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/test/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,eAAO,MAAM,UAAU,SA0LnB,CAAC"}
@@ -19,7 +19,9 @@ export const runCommand = new Command('run')
19
19
  .option('--id <uuid>', 'Run cloud test by ID instead of local file')
20
20
  .option('--all', 'Run all tests in test directory')
21
21
  .option('--persist', 'Save test to cloud after run')
22
- .option('--headful', 'Show browser window (default: headless)')
22
+ .option('--tunnel', 'Start local browser with tunnel (required for localhost URLs)')
23
+ .option('--headful', 'Show browser window (use with --tunnel)')
24
+ .option('--ws-url <url>', 'Use existing tunneled browser (from `browser create --tunnel`)')
23
25
  .option('--autofix', 'Enable AI self-healing (default: off)')
24
26
  .option('--screenshots', 'Capture screenshots at each step')
25
27
  .option('--download', 'Download all assets (screenshots, recordings, HAR) to /tmp/qa-use/downloads/')
@@ -73,19 +75,41 @@ export const runCommand = new Command('run')
73
75
  applyVariableOverrides(testDefinitions, options.var);
74
76
  console.log(success(`Applied ${Object.keys(options.var).length} variable overrides\n`));
75
77
  }
76
- // If headful, start local browser with tunnel for remote execution
78
+ // Determine ws_url: from --ws-url flag, --tunnel (starts new browser), or none (backend browser)
77
79
  let browserSession = null;
80
+ let wsUrl = options.wsUrl;
78
81
  try {
79
- if (options.headful) {
80
- console.log('Starting local browser with tunnel for headful mode...');
82
+ // Validate flag combinations
83
+ if (options.wsUrl && (options.tunnel || options.headful)) {
84
+ console.log(error('Cannot use --ws-url with --tunnel or --headful'));
85
+ process.exit(1);
86
+ }
87
+ // Check if running in development mode (localhost API)
88
+ const isDevelopment = process.env.NODE_ENV === 'development' ||
89
+ config.api_url?.includes('localhost') ||
90
+ config.api_url?.includes('127.0.0.1');
91
+ // Handle --headful without --tunnel
92
+ if (options.headful && !options.tunnel && !isDevelopment) {
93
+ console.log(error('--headful requires --tunnel flag'));
94
+ console.log(' Use: qa-use test run <name> --tunnel --headful');
95
+ console.log(' Or for headless local browser: qa-use test run <name> --tunnel');
96
+ process.exit(1);
97
+ }
98
+ if (options.tunnel) {
99
+ const headless = !options.headful;
100
+ console.log(`Starting local browser with tunnel (${headless ? 'headless' : 'visible'})...`);
81
101
  console.log('⏳ First run may take a moment while the tunnel establishes connection');
82
102
  browserSession = await startBrowserWithTunnel(undefined, {
83
- headless: false,
103
+ headless,
84
104
  apiKey: config.api_key,
85
105
  sessionIndex: 0,
86
106
  });
107
+ wsUrl = getEffectiveWsUrl(browserSession);
87
108
  console.log(success('Browser ready, running test...'));
88
109
  }
110
+ else if (options.wsUrl) {
111
+ console.log(`Using existing tunneled browser: ${options.wsUrl}`);
112
+ }
89
113
  // Clear any previous screenshots and downloads
90
114
  clearStepScreenshots();
91
115
  clearDownloadedFiles();
@@ -95,10 +119,11 @@ export const runCommand = new Command('run')
95
119
  test_id: options.id,
96
120
  persist: options.persist || config.defaults?.persist || false,
97
121
  // When using ws_url, headless flag is irrelevant (backend uses our browser)
98
- headless: browserSession ? true : (config.defaults?.headless ?? true),
122
+ // When --headful without tunnel (dev mode), tell backend to run visible browser
123
+ headless: wsUrl ? true : options.headful ? false : (config.defaults?.headless ?? true),
99
124
  allow_fix: options.autofix || config.defaults?.allow_fix || false,
100
125
  capture_screenshots: options.screenshots || options.download || false,
101
- ws_url: browserSession ? getEffectiveWsUrl(browserSession) : undefined,
126
+ ws_url: wsUrl,
102
127
  }, {
103
128
  verbose: options.verbose || false,
104
129
  updateLocal: options.updateLocal || false,
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/cli/commands/test/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/cli/commands/test/run.ts"],"names":[],"mappings":"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"}