@desplega.ai/qa-use 2.0.1

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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1003 -0
  3. package/bin/qa-use.js +7 -0
  4. package/dist/lib/api/index.d.ts +296 -0
  5. package/dist/lib/api/index.d.ts.map +1 -0
  6. package/dist/lib/api/index.js +564 -0
  7. package/dist/lib/api/index.js.map +1 -0
  8. package/dist/lib/api/sse.d.ts +33 -0
  9. package/dist/lib/api/sse.d.ts.map +1 -0
  10. package/dist/lib/api/sse.js +97 -0
  11. package/dist/lib/api/sse.js.map +1 -0
  12. package/dist/lib/browser/index.d.ts +28 -0
  13. package/dist/lib/browser/index.d.ts.map +1 -0
  14. package/dist/lib/browser/index.js +145 -0
  15. package/dist/lib/browser/index.js.map +1 -0
  16. package/dist/lib/env/index.d.ts +41 -0
  17. package/dist/lib/env/index.d.ts.map +1 -0
  18. package/dist/lib/env/index.js +125 -0
  19. package/dist/lib/env/index.js.map +1 -0
  20. package/dist/lib/tunnel/index.d.ts +38 -0
  21. package/dist/lib/tunnel/index.d.ts.map +1 -0
  22. package/dist/lib/tunnel/index.js +154 -0
  23. package/dist/lib/tunnel/index.js.map +1 -0
  24. package/dist/package.json +100 -0
  25. package/dist/src/cli/commands/info.d.ts +6 -0
  26. package/dist/src/cli/commands/info.d.ts.map +1 -0
  27. package/dist/src/cli/commands/info.js +32 -0
  28. package/dist/src/cli/commands/info.js.map +1 -0
  29. package/dist/src/cli/commands/mcp.d.ts +6 -0
  30. package/dist/src/cli/commands/mcp.d.ts.map +1 -0
  31. package/dist/src/cli/commands/mcp.js +45 -0
  32. package/dist/src/cli/commands/mcp.js.map +1 -0
  33. package/dist/src/cli/commands/setup.d.ts +6 -0
  34. package/dist/src/cli/commands/setup.d.ts.map +1 -0
  35. package/dist/src/cli/commands/setup.js +59 -0
  36. package/dist/src/cli/commands/setup.js.map +1 -0
  37. package/dist/src/cli/commands/test/index.d.ts +6 -0
  38. package/dist/src/cli/commands/test/index.d.ts.map +1 -0
  39. package/dist/src/cli/commands/test/index.js +15 -0
  40. package/dist/src/cli/commands/test/index.js.map +1 -0
  41. package/dist/src/cli/commands/test/init.d.ts +6 -0
  42. package/dist/src/cli/commands/test/init.d.ts.map +1 -0
  43. package/dist/src/cli/commands/test/init.js +64 -0
  44. package/dist/src/cli/commands/test/init.js.map +1 -0
  45. package/dist/src/cli/commands/test/list.d.ts +6 -0
  46. package/dist/src/cli/commands/test/list.d.ts.map +1 -0
  47. package/dist/src/cli/commands/test/list.js +70 -0
  48. package/dist/src/cli/commands/test/list.js.map +1 -0
  49. package/dist/src/cli/commands/test/run.d.ts +6 -0
  50. package/dist/src/cli/commands/test/run.d.ts.map +1 -0
  51. package/dist/src/cli/commands/test/run.js +95 -0
  52. package/dist/src/cli/commands/test/run.js.map +1 -0
  53. package/dist/src/cli/commands/test/validate.d.ts +6 -0
  54. package/dist/src/cli/commands/test/validate.d.ts.map +1 -0
  55. package/dist/src/cli/commands/test/validate.js +70 -0
  56. package/dist/src/cli/commands/test/validate.js.map +1 -0
  57. package/dist/src/cli/index.d.ts +6 -0
  58. package/dist/src/cli/index.d.ts.map +1 -0
  59. package/dist/src/cli/index.js +21 -0
  60. package/dist/src/cli/index.js.map +1 -0
  61. package/dist/src/cli/lib/config.d.ts +36 -0
  62. package/dist/src/cli/lib/config.d.ts.map +1 -0
  63. package/dist/src/cli/lib/config.js +89 -0
  64. package/dist/src/cli/lib/config.js.map +1 -0
  65. package/dist/src/cli/lib/loader.d.ts +49 -0
  66. package/dist/src/cli/lib/loader.d.ts.map +1 -0
  67. package/dist/src/cli/lib/loader.js +122 -0
  68. package/dist/src/cli/lib/loader.js.map +1 -0
  69. package/dist/src/cli/lib/output.d.ts +53 -0
  70. package/dist/src/cli/lib/output.d.ts.map +1 -0
  71. package/dist/src/cli/lib/output.js +133 -0
  72. package/dist/src/cli/lib/output.js.map +1 -0
  73. package/dist/src/cli/lib/runner.d.ts +23 -0
  74. package/dist/src/cli/lib/runner.d.ts.map +1 -0
  75. package/dist/src/cli/lib/runner.js +40 -0
  76. package/dist/src/cli/lib/runner.js.map +1 -0
  77. package/dist/src/http-server.d.ts +14 -0
  78. package/dist/src/http-server.d.ts.map +1 -0
  79. package/dist/src/http-server.js +145 -0
  80. package/dist/src/http-server.js.map +1 -0
  81. package/dist/src/index.d.ts +9 -0
  82. package/dist/src/index.d.ts.map +1 -0
  83. package/dist/src/index.js +21 -0
  84. package/dist/src/index.js.map +1 -0
  85. package/dist/src/server.d.ts +58 -0
  86. package/dist/src/server.d.ts.map +1 -0
  87. package/dist/src/server.js +2376 -0
  88. package/dist/src/server.js.map +1 -0
  89. package/dist/src/tunnel-mode.d.ts +13 -0
  90. package/dist/src/tunnel-mode.d.ts.map +1 -0
  91. package/dist/src/tunnel-mode.js +159 -0
  92. package/dist/src/tunnel-mode.js.map +1 -0
  93. package/dist/src/types/test-definition.d.ts +320 -0
  94. package/dist/src/types/test-definition.d.ts.map +1 -0
  95. package/dist/src/types/test-definition.js +11 -0
  96. package/dist/src/types/test-definition.js.map +1 -0
  97. package/dist/src/types.d.ts +209 -0
  98. package/dist/src/types.d.ts.map +1 -0
  99. package/dist/src/types.js +34 -0
  100. package/dist/src/types.js.map +1 -0
  101. package/dist/src/utils/package.d.ts +12 -0
  102. package/dist/src/utils/package.d.ts.map +1 -0
  103. package/dist/src/utils/package.js +36 -0
  104. package/dist/src/utils/package.js.map +1 -0
  105. package/dist/src/utils/summary.d.ts +45 -0
  106. package/dist/src/utils/summary.d.ts.map +1 -0
  107. package/dist/src/utils/summary.js +198 -0
  108. package/dist/src/utils/summary.js.map +1 -0
  109. package/lib/api/index.ts +977 -0
  110. package/lib/api/sse.ts +112 -0
  111. package/lib/browser/index.ts +181 -0
  112. package/lib/env/index.ts +156 -0
  113. package/lib/tunnel/index.test.ts +344 -0
  114. package/lib/tunnel/index.ts +197 -0
  115. package/lib/tunnel/integration.test.ts +98 -0
  116. package/package.json +100 -0
  117. package/server.json +16 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/tunnel/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "@desplega.ai/qa-use",
3
+ "version": "2.0.1",
4
+ "packageManager": "bun@^1.3.4",
5
+ "description": "QA automation tool for browser testing with MCP server support",
6
+ "type": "module",
7
+ "main": "dist/src/index.js",
8
+ "bin": {
9
+ "qa-use": "./bin/qa-use.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "lib",
14
+ "bin",
15
+ "README.md",
16
+ "server.json",
17
+ "LICENSE"
18
+ ],
19
+ "engines": {
20
+ "node": ">=20.0.0"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "cli": "tsx src/cli/index.ts",
25
+ "dev": "tsx src/index.ts",
26
+ "start": "bun run build && node dist/src/index.js",
27
+ "inspector": "bun run build && npx -y @modelcontextprotocol/inspector node dist/src/index.js",
28
+ "inspector:env": "bun run build && npx dotenv-cli -e .env -- npx -y @modelcontextprotocol/inspector node dist/src/index.js",
29
+ "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\" \"lib/**/*.{ts,tsx,js,jsx,json}\"",
30
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json}\" \"lib/**/*.{ts,tsx,js,jsx,json}\"",
31
+ "lint": "eslint \"src/**/*.{ts,tsx,js,jsx}\" \"lib/**/*.{ts,tsx,js,jsx}\"",
32
+ "lint:fix": "eslint \"src/**/*.{ts,tsx,js,jsx}\" \"lib/**/*.{ts,tsx,js,jsx}\" --fix",
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "bun test --preload ./test-setup.ts",
35
+ "test:unit": "node scripts/test-unit.js",
36
+ "test:integration": "node scripts/test-integration.js",
37
+ "test:coverage": "bun test --coverage --preload ./test-setup.ts",
38
+ "generate:readme": "node scripts/generate-readme-tools.js",
39
+ "generate:types": "tsx scripts/generate-types.ts",
40
+ "release": "bun scripts/release.ts",
41
+ "prepublishOnly": "bun run build && bun lint && bun typecheck",
42
+ "cc:validate": "claude plugin validate ."
43
+ },
44
+ "keywords": [
45
+ "mcp",
46
+ "browser-automation",
47
+ "qa-testing",
48
+ "playwright",
49
+ "testing"
50
+ ],
51
+ "author": {
52
+ "name": "tarasyarema",
53
+ "email": "t@desplega.ai",
54
+ "url": "https://github.com/desplega-ai"
55
+ },
56
+ "license": "MIT",
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "https://github.com/desplega-ai/qa-use.git"
60
+ },
61
+ "homepage": "https://github.com/desplega-ai/qa-use",
62
+ "bugs": {
63
+ "url": "https://github.com/desplega-ai/qa-use/issues"
64
+ },
65
+ "publishConfig": {
66
+ "access": "public"
67
+ },
68
+ "devDependencies": {
69
+ "@eslint/js": "^9.36.0",
70
+ "@types/express": "^5.0.0",
71
+ "@types/node": "^24.5.2",
72
+ "@types/react": "^19.1.14",
73
+ "@types/ws": "^8.18.1",
74
+ "@typescript-eslint/eslint-plugin": "^8.44.1",
75
+ "@typescript-eslint/parser": "^8.44.1",
76
+ "@vercel/node": "^3.2.23",
77
+ "dotenv-cli": "^7.4.2",
78
+ "eslint": "^9.36.0",
79
+ "eslint-config-prettier": "^10.1.8",
80
+ "eslint-plugin-prettier": "^5.5.4",
81
+ "ignore": "^7.0.5",
82
+ "json-schema-to-typescript": "^15.0.4",
83
+ "prettier": "^3.6.2",
84
+ "ts-node": "^10.9.2",
85
+ "tsx": "^4.20.6",
86
+ "typescript": "^5.9.2",
87
+ "typescript-eslint": "^8.44.1"
88
+ },
89
+ "dependencies": {
90
+ "@desplega.ai/localtunnel": "^2.1.1",
91
+ "@modelcontextprotocol/sdk": "^1.18.1",
92
+ "axios": "^1.12.2",
93
+ "commander": "^14.0.2",
94
+ "dotenv": "^16.4.5",
95
+ "express": "^4.21.2",
96
+ "glob": "^13.0.0",
97
+ "playwright": "1.55.0",
98
+ "yaml": "^2.8.2"
99
+ }
100
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use info - Show current configuration
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const infoCommand: Command;
6
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * qa-use info - Show current configuration
3
+ */
4
+ import { Command } from 'commander';
5
+ import { loadConfig, configExists } from '../lib/config.js';
6
+ import { warning } from '../lib/output.js';
7
+ export const infoCommand = new Command('info')
8
+ .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
+ }
16
+ const config = await loadConfig();
17
+ console.log('Configuration:');
18
+ console.log(` API Key: ${config.api_key ? config.api_key.slice(0, 8) + '...' : '(not set)'}`);
19
+ console.log(` API URL: ${config.api_url || process.env.QA_USE_API_URL || 'https://api.desplega.ai'}`);
20
+ console.log(` Test Directory: ${config.test_directory || './qa-tests'}`);
21
+ console.log(` Default App Config: ${config.default_app_config_id || '(not set)'}`);
22
+ console.log('\nDefaults:');
23
+ console.log(` Headless: ${config.defaults?.headless ?? true}`);
24
+ console.log(` Persist: ${config.defaults?.persist ?? false}`);
25
+ console.log(` Timeout: ${config.defaults?.timeout ?? 300}s`);
26
+ 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'}`);
31
+ });
32
+ //# sourceMappingURL=info.js.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP Command - Start the MCP server in various modes
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const mcpCommand: Command;
6
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,UAAU,SA2BnB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * MCP Command - Start the MCP server in various modes
3
+ */
4
+ import { Command } from 'commander';
5
+ export const mcpCommand = new Command('mcp')
6
+ .description('Start the MCP server')
7
+ .option('--http, --api', 'Run in HTTP API server mode (default: stdio)')
8
+ .option('-p, --port <port>', 'Port for HTTP server', '3000')
9
+ .action(async (options) => {
10
+ const { logConfigSources } = await import('../../../lib/env/index.js');
11
+ // Log configuration sources (helps users understand where credentials come from)
12
+ logConfigSources();
13
+ const port = parseInt(options.port, 10);
14
+ if (options.http) {
15
+ // HTTP API server mode
16
+ const { QAUseMcpServer } = await import('../../server.js');
17
+ const { HttpMcpServer } = await import('../../http-server.js');
18
+ const mcpServer = new QAUseMcpServer();
19
+ const httpServer = new HttpMcpServer(mcpServer, port);
20
+ await httpServer.start();
21
+ }
22
+ else {
23
+ // Default stdio mode
24
+ const { QAUseMcpServer } = await import('../../server.js');
25
+ const server = new QAUseMcpServer();
26
+ await server.start();
27
+ }
28
+ });
29
+ // Tunnel subcommand
30
+ mcpCommand
31
+ .command('tunnel')
32
+ .description('Run persistent WebSocket tunnel for backend-initiated tasks')
33
+ .option('--visible', 'Show browser window (default: headless)')
34
+ .option('-s, --subdomain <name>', 'Custom subdomain for tunnel')
35
+ .action(async (options) => {
36
+ const { logConfigSources } = await import('../../../lib/env/index.js');
37
+ // Log configuration sources
38
+ logConfigSources();
39
+ const { startTunnelMode } = await import('../../tunnel-mode.js');
40
+ await startTunnelMode({
41
+ headless: !options.visible,
42
+ subdomain: options.subdomain,
43
+ });
44
+ });
45
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;KACvE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,CAAC;KAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAEvE,iFAAiF;IACjF,gBAAgB,EAAE,CAAC;IAEnB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAExC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,uBAAuB;QACvB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAE/D,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEtD,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,oBAAoB;AACpB,UAAU;KACP,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;KAC9D,MAAM,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAEvE,4BAA4B;IAC5B,gBAAgB,EAAE,CAAC;IAEnB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,eAAe,CAAC;QACpB,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use setup - Interactive API key configuration
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const setupCommand: Command;
6
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SA2DrB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * qa-use setup - Interactive API key configuration
3
+ */
4
+ import { Command } from 'commander';
5
+ import { saveConfig, loadConfig } from '../lib/config.js';
6
+ import { ApiClient } from '../../../lib/api/index.js';
7
+ import { success, error } from '../lib/output.js';
8
+ import * as readline from 'readline/promises';
9
+ export const setupCommand = new Command('setup')
10
+ .description('Configure API key and default settings')
11
+ .action(async () => {
12
+ const rl = readline.createInterface({
13
+ input: process.stdin,
14
+ output: process.stdout,
15
+ });
16
+ try {
17
+ console.log('🔧 QA-Use Setup\n');
18
+ // Load existing config
19
+ const config = await loadConfig();
20
+ // Ask for API key
21
+ const apiKey = await rl.question(`API Key${config.api_key ? ` (current: ${config.api_key.slice(0, 8)}...)` : ''}: `);
22
+ if (apiKey.trim()) {
23
+ // Validate API key
24
+ const client = new ApiClient();
25
+ client.setApiKey(apiKey.trim());
26
+ console.log('\n Validating API key...');
27
+ const validation = await client.validateApiKey();
28
+ if (validation.success) {
29
+ config.api_key = apiKey.trim();
30
+ console.log(success('API key validated'));
31
+ // Get default app config if available
32
+ if (validation.data?.app_config?.id) {
33
+ config.default_app_config_id = validation.data.app_config.id;
34
+ console.log(success(`Default app config: ${validation.data.app_config.id}`));
35
+ }
36
+ }
37
+ else {
38
+ console.log(error(`Invalid API key: ${validation.message}`));
39
+ process.exit(1);
40
+ }
41
+ }
42
+ // Ask for test directory
43
+ const testDir = await rl.question(`Test directory (default: ${config.test_directory || './qa-tests'}): `);
44
+ if (testDir.trim()) {
45
+ config.test_directory = testDir.trim();
46
+ }
47
+ // Save configuration
48
+ await saveConfig(config);
49
+ console.log('\n' + success('Configuration saved to .qa-use-tests.json'));
50
+ }
51
+ catch (err) {
52
+ console.log(error(`Setup failed: ${err}`));
53
+ process.exit(1);
54
+ }
55
+ finally {
56
+ rl.close();
57
+ }
58
+ });
59
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use test - Test management command group
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const testCommand: Command;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/test/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SAAqE,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * qa-use test - Test management command group
3
+ */
4
+ import { Command } from 'commander';
5
+ import { runCommand } from './run.js';
6
+ import { listCommand } from './list.js';
7
+ import { validateCommand } from './validate.js';
8
+ import { initCommand } from './init.js';
9
+ export const testCommand = new Command('test').description('Manage and run test definitions');
10
+ // Register subcommands
11
+ testCommand.addCommand(runCommand);
12
+ testCommand.addCommand(listCommand);
13
+ testCommand.addCommand(validateCommand);
14
+ testCommand.addCommand(initCommand);
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/cli/commands/test/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC;AAE9F,uBAAuB;AACvB,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACnC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACpC,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACxC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use test init - Initialize test directory with examples
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const initCommand: Command;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/test/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,eAAO,MAAM,WAAW,SAkCpB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * qa-use test init - Initialize test directory with examples
3
+ */
4
+ import { Command } from 'commander';
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ import { loadConfig } from '../../lib/config.js';
8
+ import { success, error } from '../../lib/output.js';
9
+ const EXAMPLE_TEST = `# Example test definition
10
+ name: Example Test
11
+ app_config: your-app-config-id-here
12
+ variables:
13
+ email: test@example.com
14
+ password: secret123
15
+ steps:
16
+ - action: goto
17
+ url: /
18
+ - action: fill
19
+ target: email input
20
+ value: $email
21
+ - action: fill
22
+ target: password input
23
+ value: $password
24
+ - action: click
25
+ target: login button
26
+ - action: to_be_visible
27
+ target: dashboard
28
+ `;
29
+ export const initCommand = new Command('init')
30
+ .description('Initialize test directory with example files')
31
+ .action(async () => {
32
+ try {
33
+ const config = await loadConfig();
34
+ const testDir = config.test_directory || './qa-tests';
35
+ // Create directory if it doesn't exist
36
+ try {
37
+ await fs.mkdir(testDir, { recursive: true });
38
+ console.log(success(`Created directory: ${testDir}`));
39
+ }
40
+ catch (err) {
41
+ console.log(`Directory ${testDir} already exists`);
42
+ }
43
+ // Create example test file
44
+ const examplePath = path.join(testDir, 'example.yaml');
45
+ try {
46
+ await fs.access(examplePath);
47
+ console.log(`File ${examplePath} already exists, skipping`);
48
+ }
49
+ catch {
50
+ await fs.writeFile(examplePath, EXAMPLE_TEST, 'utf-8');
51
+ console.log(success(`Created: ${examplePath}`));
52
+ }
53
+ console.log('\n✓ Initialization complete!');
54
+ console.log('\nNext steps:');
55
+ console.log(' 1. Edit example.yaml with your app config ID');
56
+ console.log(' 2. Run: qa-use test validate example');
57
+ console.log(' 3. Run: qa-use test run example');
58
+ }
59
+ catch (err) {
60
+ console.log(error(`Initialization failed: ${err}`));
61
+ process.exit(1);
62
+ }
63
+ });
64
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../src/cli/commands/test/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;CAmBpB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,IAAI,YAAY,CAAC;QAEtD,uCAAuC;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,iBAAiB,CAAC,CAAC;QACrD,CAAC;QAED,2BAA2B;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,QAAQ,WAAW,2BAA2B,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use test list - List test definitions
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const listCommand: Command;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/test/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SAgEpB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * qa-use test list - List test definitions
3
+ */
4
+ import { Command } from 'commander';
5
+ import * as path from 'path';
6
+ import { loadConfig } from '../../lib/config.js';
7
+ import { discoverTests, loadTestDefinition } from '../../lib/loader.js';
8
+ import { printTestList, error } from '../../lib/output.js';
9
+ import { ApiClient } from '../../../../lib/api/index.js';
10
+ export const listCommand = new Command('list')
11
+ .description('List test definitions')
12
+ .option('--cloud', 'List tests from cloud instead of local files')
13
+ .option('--limit <number>', 'Maximum number of tests to list', '20')
14
+ .action(async (options) => {
15
+ try {
16
+ const config = await loadConfig();
17
+ if (options.cloud) {
18
+ // List cloud tests
19
+ if (!config.api_key) {
20
+ console.log(error('API key not configured'));
21
+ console.log(' Run `qa-use setup` to configure');
22
+ process.exit(1);
23
+ }
24
+ const client = new ApiClient(config.api_url);
25
+ client.setApiKey(config.api_key);
26
+ console.log('Fetching tests from cloud...\n');
27
+ const tests = await client.listTests({ limit: parseInt(options.limit) });
28
+ const formatted = tests.map((t) => ({
29
+ name: `${t.name} (${t.id})`,
30
+ steps: undefined,
31
+ deps: t.dependency_test_ids?.join(', '),
32
+ }));
33
+ printTestList(formatted);
34
+ }
35
+ else {
36
+ // List local tests
37
+ const testDir = config.test_directory || './qa-tests';
38
+ const files = await discoverTests(testDir);
39
+ if (files.length === 0) {
40
+ console.log(error(`No tests found in ${testDir}`));
41
+ console.log(' Run `qa-use test init` to create example tests');
42
+ return;
43
+ }
44
+ const tests = [];
45
+ const resolvedTestDir = path.resolve(testDir);
46
+ for (const file of files) {
47
+ try {
48
+ const def = await loadTestDefinition(file);
49
+ const relativePath = path
50
+ .relative(resolvedTestDir, file)
51
+ .replace(/\.(yaml|yml|json)$/, '');
52
+ tests.push({
53
+ name: relativePath,
54
+ steps: def.steps?.length,
55
+ deps: def.depends_on || undefined,
56
+ });
57
+ }
58
+ catch (err) {
59
+ console.log(error(`Failed to load ${file}: ${err}`));
60
+ }
61
+ }
62
+ printTestList(tests);
63
+ }
64
+ }
65
+ catch (err) {
66
+ console.log(error(`Failed to list tests: ${err}`));
67
+ process.exit(1);
68
+ }
69
+ });
70
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../../src/cli/commands/test/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use test run - Run test definitions
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const runCommand: Command;
6
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +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;AAYpC,eAAO,MAAM,UAAU,SAoFnB,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * qa-use test run - Run test definitions
3
+ */
4
+ import { Command } from 'commander';
5
+ import { loadConfig } from '../../lib/config.js';
6
+ import { loadTestWithDeps, loadAllTests, applyVariableOverrides } from '../../lib/loader.js';
7
+ import { runTest } from '../../lib/runner.js';
8
+ import { error, success } from '../../lib/output.js';
9
+ import { ApiClient } from '../../../../lib/api/index.js';
10
+ function collectVars(value, previous) {
11
+ const [key, val] = value.split('=');
12
+ return { ...previous, [key]: val };
13
+ }
14
+ export const runCommand = new Command('run')
15
+ .description('Run a test definition')
16
+ .argument('[test]', 'Test name or path (e.g., auth/login)')
17
+ .option('--id <uuid>', 'Run cloud test by ID instead of local file')
18
+ .option('--all', 'Run all tests in test directory')
19
+ .option('--persist', 'Save test to cloud after run')
20
+ .option('--no-headless', 'Show browser window')
21
+ .option('--no-autofix', 'Disable AI self-healing')
22
+ .option('--screenshots', 'Capture screenshots at each step')
23
+ .option('--var <key=value...>', 'Variable overrides', collectVars, {})
24
+ .option('--app-config-id <uuid>', 'App config ID to use')
25
+ .option('--timeout <seconds>', 'Timeout in seconds', '300')
26
+ .action(async (test, options) => {
27
+ try {
28
+ const config = await loadConfig();
29
+ // Check API key
30
+ if (!config.api_key) {
31
+ console.log(error('API key not configured'));
32
+ console.log(' Run `qa-use setup` to configure');
33
+ process.exit(1);
34
+ }
35
+ // Initialize API client
36
+ const client = new ApiClient(config.api_url);
37
+ client.setApiKey(config.api_key);
38
+ let testDefinitions;
39
+ if (options.id) {
40
+ // Run by cloud ID - no local definition needed
41
+ testDefinitions = undefined;
42
+ }
43
+ else if (options.all) {
44
+ // Load all test definitions
45
+ console.log('Loading all tests...');
46
+ testDefinitions = await loadAllTests(config.test_directory || './qa-tests');
47
+ console.log(success(`Loaded ${testDefinitions.length} tests\n`));
48
+ }
49
+ else if (test) {
50
+ // Load specific test and its dependencies
51
+ console.log(`Loading test: ${test}...`);
52
+ testDefinitions = await loadTestWithDeps(test, config.test_directory || './qa-tests');
53
+ console.log(success(`Loaded ${testDefinitions.length} test(s)\n`));
54
+ }
55
+ else {
56
+ console.log(error('Usage: qa-use test run <test-name>'));
57
+ console.log(' qa-use test run --id <uuid>');
58
+ console.log(' qa-use test run --all');
59
+ process.exit(1);
60
+ }
61
+ // Apply variable overrides
62
+ if (testDefinitions && Object.keys(options.var).length > 0) {
63
+ applyVariableOverrides(testDefinitions, options.var);
64
+ console.log(success(`Applied ${Object.keys(options.var).length} variable overrides\n`));
65
+ }
66
+ // Run the test with SSE streaming
67
+ const result = await runTest(client, {
68
+ test_definitions: testDefinitions,
69
+ test_id: options.id,
70
+ persist: options.persist || config.defaults?.persist || false,
71
+ headless: options.headless !== false && (config.defaults?.headless ?? true),
72
+ allow_fix: options.autofix !== false && (config.defaults?.allow_fix ?? true),
73
+ capture_screenshots: options.screenshots || false,
74
+ });
75
+ // Print result summary
76
+ if (result.assets) {
77
+ console.log('\nAssets:');
78
+ if (result.assets.recording_url) {
79
+ console.log(` Recording: ${result.assets.recording_url}`);
80
+ }
81
+ if (result.assets.har_url) {
82
+ console.log(` HAR: ${result.assets.har_url}`);
83
+ }
84
+ }
85
+ // Exit with appropriate code
86
+ if (result.status !== 'passed') {
87
+ process.exit(1);
88
+ }
89
+ }
90
+ catch (err) {
91
+ console.log(error(`Test execution failed: ${err}`));
92
+ process.exit(1);
93
+ }
94
+ });
95
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/cli/commands/test/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * qa-use test validate - Validate test definitions
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const validateCommand: Command;
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/test/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,eAAe,SAoExB,CAAC"}