@observeone/cli 1.6.0 → 1.8.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 (61) hide show
  1. package/README.md +36 -0
  2. package/dist/README.md +36 -0
  3. package/dist/commands/suite/delete.d.ts +6 -0
  4. package/dist/commands/suite/delete.d.ts.map +1 -0
  5. package/dist/commands/suite/delete.js +31 -0
  6. package/dist/commands/suite/delete.js.map +1 -0
  7. package/dist/commands/suite/formatters.d.ts +7 -0
  8. package/dist/commands/suite/formatters.d.ts.map +1 -0
  9. package/dist/commands/suite/formatters.js +100 -0
  10. package/dist/commands/suite/formatters.js.map +1 -0
  11. package/dist/commands/suite/generate.d.ts +6 -0
  12. package/dist/commands/suite/generate.d.ts.map +1 -0
  13. package/dist/commands/suite/generate.js +98 -0
  14. package/dist/commands/suite/generate.js.map +1 -0
  15. package/dist/commands/suite/get.d.ts +6 -0
  16. package/dist/commands/suite/get.d.ts.map +1 -0
  17. package/dist/commands/suite/get.js +30 -0
  18. package/dist/commands/suite/get.js.map +1 -0
  19. package/dist/commands/suite/index.d.ts +6 -0
  20. package/dist/commands/suite/index.d.ts.map +1 -0
  21. package/dist/commands/suite/index.js +24 -0
  22. package/dist/commands/suite/index.js.map +1 -0
  23. package/dist/commands/suite/list.d.ts +6 -0
  24. package/dist/commands/suite/list.d.ts.map +1 -0
  25. package/dist/commands/suite/list.js +29 -0
  26. package/dist/commands/suite/list.js.map +1 -0
  27. package/dist/commands/suite/run.d.ts +6 -0
  28. package/dist/commands/suite/run.d.ts.map +1 -0
  29. package/dist/commands/suite/run.js +57 -0
  30. package/dist/commands/suite/run.js.map +1 -0
  31. package/dist/commands/suite/schedule.d.ts +6 -0
  32. package/dist/commands/suite/schedule.d.ts.map +1 -0
  33. package/dist/commands/suite/schedule.js +46 -0
  34. package/dist/commands/suite/schedule.js.map +1 -0
  35. package/dist/commands/suite/secrets.d.ts +6 -0
  36. package/dist/commands/suite/secrets.d.ts.map +1 -0
  37. package/dist/commands/suite/secrets.js +38 -0
  38. package/dist/commands/suite/secrets.js.map +1 -0
  39. package/dist/commands/suite/status.d.ts +6 -0
  40. package/dist/commands/suite/status.d.ts.map +1 -0
  41. package/dist/commands/suite/status.js +52 -0
  42. package/dist/commands/suite/status.js.map +1 -0
  43. package/dist/commands/suite/vars.d.ts +4 -0
  44. package/dist/commands/suite/vars.d.ts.map +1 -0
  45. package/dist/commands/suite/vars.js +38 -0
  46. package/dist/commands/suite/vars.js.map +1 -0
  47. package/dist/commands/suite/wait.d.ts +6 -0
  48. package/dist/commands/suite/wait.d.ts.map +1 -0
  49. package/dist/commands/suite/wait.js +40 -0
  50. package/dist/commands/suite/wait.js.map +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/package.json +1 -1
  55. package/dist/services/api-client.service.d.ts +25 -1
  56. package/dist/services/api-client.service.d.ts.map +1 -1
  57. package/dist/services/api-client.service.js +65 -0
  58. package/dist/services/api-client.service.js.map +1 -1
  59. package/dist/types/index.d.ts +49 -0
  60. package/dist/types/index.d.ts.map +1 -1
  61. package/package.json +1 -1
package/README.md CHANGED
@@ -189,6 +189,42 @@ obs ai-check run --adhoc --url https://example.com --prompt "Verify login sectio
189
189
 
190
190
  ---
191
191
 
192
+ ## Playwright Autopilot Suites
193
+
194
+ Generate and manage AI-driven Playwright test suites from your terminal.
195
+
196
+ ```bash
197
+ # Generate a suite (runs immediately, manual trigger only)
198
+ obs suite generate https://example.com --name "Smoke Tests" --max-tests 5
199
+
200
+ # Generate with a cron schedule and wait for generation to finish
201
+ obs suite generate https://example.com --cron "0 */6 * * *" --wait
202
+
203
+ # Pass credentials/variables to the test runner
204
+ obs suite generate https://example.com --var USERNAME=admin --var PASSWORD=secret
205
+ obs suite generate https://example.com --var-file .env.test
206
+
207
+ # List all suites
208
+ obs suite list
209
+
210
+ # Get full suite details
211
+ obs suite get <id>
212
+
213
+ # Trigger a run and stream results
214
+ obs suite run <id> --wait
215
+
216
+ # Check the latest execution status
217
+ obs suite status <id>
218
+
219
+ # Wait on a specific execution
220
+ obs suite wait <id> <executionId>
221
+
222
+ # Delete a suite
223
+ obs suite delete <id>
224
+ ```
225
+
226
+ ---
227
+
192
228
  ## AI Agent Integration (Headless Mode)
193
229
 
194
230
  The `obs` CLI is explicitly designed to be used by AI coding agents.
package/dist/README.md CHANGED
@@ -189,6 +189,42 @@ obs ai-check run --adhoc --url https://example.com --prompt "Verify login sectio
189
189
 
190
190
  ---
191
191
 
192
+ ## Playwright Autopilot Suites
193
+
194
+ Generate and manage AI-driven Playwright test suites from your terminal.
195
+
196
+ ```bash
197
+ # Generate a suite (runs immediately, manual trigger only)
198
+ obs suite generate https://example.com --name "Smoke Tests" --max-tests 5
199
+
200
+ # Generate with a cron schedule and wait for generation to finish
201
+ obs suite generate https://example.com --cron "0 */6 * * *" --wait
202
+
203
+ # Pass credentials/variables to the test runner
204
+ obs suite generate https://example.com --var USERNAME=admin --var PASSWORD=secret
205
+ obs suite generate https://example.com --var-file .env.test
206
+
207
+ # List all suites
208
+ obs suite list
209
+
210
+ # Get full suite details
211
+ obs suite get <id>
212
+
213
+ # Trigger a run and stream results
214
+ obs suite run <id> --wait
215
+
216
+ # Check the latest execution status
217
+ obs suite status <id>
218
+
219
+ # Wait on a specific execution
220
+ obs suite wait <id> <executionId>
221
+
222
+ # Delete a suite
223
+ obs suite delete <id>
224
+ ```
225
+
226
+ ---
227
+
192
228
  ## AI Agent Integration (Headless Mode)
193
229
 
194
230
  The `obs` CLI is explicitly designed to be used by AI coding agents.
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../../services/api-client.service.js';
3
+ import { IConfigService } from '../../interfaces/config.interface.js';
4
+ import { IOutputService } from '../../interfaces/output.interface.js';
5
+ export declare function createSuiteDeleteCommand(_configService: IConfigService, apiClient: ApiClient, outputService: IOutputService): Command;
6
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAwBT"}
@@ -0,0 +1,31 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ export function createSuiteDeleteCommand(_configService, apiClient, outputService) {
4
+ return new Command('delete')
5
+ .description('Delete a suite')
6
+ .argument('<id>', 'Suite ID')
7
+ .action(async (id) => {
8
+ const isJson = process.env.OBS_JSON_OUTPUT === 'true';
9
+ try {
10
+ const suite = await apiClient.getSuite(id);
11
+ await apiClient.deleteSuite(id);
12
+ if (isJson) {
13
+ outputService.formatJsonOutput({ id, name: suite.suite_name });
14
+ }
15
+ else {
16
+ console.log(chalk.green(`\n Deleted suite: ${suite.suite_name} (${id})\n`));
17
+ }
18
+ }
19
+ catch (err) {
20
+ const msg = err.message || 'Failed to delete suite';
21
+ if (isJson) {
22
+ outputService.formatJsonOutput({ status: 'ERROR', error: { message: msg } });
23
+ }
24
+ else {
25
+ console.error(chalk.red(`❌ ${msg}`));
26
+ }
27
+ process.exit(1);
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/suite/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,UAAU,wBAAwB,CACtC,cAA8B,EAC9B,SAAoB,EACpB,aAA6B;IAE7B,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,gBAAgB,CAAC;SAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,MAAM,EAAE,CAAC;gBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,UAAU,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,IAAI,wBAAwB,CAAC;YAC/D,IAAI,MAAM,EAAE,CAAC;gBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Suite, SuiteExecution } from '../../types/index.js';
2
+ export declare function suiteStatusColor(status: string): string;
3
+ export declare function formatCron(expr: string, active: boolean): string;
4
+ export declare function printSuiteList(suites: Suite[]): void;
5
+ export declare function printSuiteDetail(suite: Suite): void;
6
+ export declare function printExecutionResults(execution: SuiteExecution): void;
7
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/formatters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAmB,MAAM,sBAAsB,CAAC;AAE9E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBvD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAOhE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAgBpD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAqBnD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAwBrE"}
@@ -0,0 +1,100 @@
1
+ import chalk from 'chalk';
2
+ export function suiteStatusColor(status) {
3
+ switch (status) {
4
+ case 'scheduled':
5
+ return chalk.green(status);
6
+ case 'failed':
7
+ return chalk.red(status);
8
+ case 'pending':
9
+ case 'generating':
10
+ return chalk.yellow(status);
11
+ case 'crawling':
12
+ case 'planning':
13
+ case 'healing':
14
+ return chalk.blue(status);
15
+ default:
16
+ return chalk.gray(status);
17
+ }
18
+ }
19
+ export function formatCron(expr, active) {
20
+ if (!active || !expr)
21
+ return chalk.gray('manual');
22
+ if (expr === '0 */6 * * *')
23
+ return chalk.gray('every 6h');
24
+ if (expr === '0 */12 * * *')
25
+ return chalk.gray('every 12h');
26
+ if (expr === '0 0 * * *')
27
+ return chalk.gray('daily');
28
+ if (expr === '0 0 * * 0')
29
+ return chalk.gray('weekly');
30
+ return chalk.gray(expr);
31
+ }
32
+ export function printSuiteList(suites) {
33
+ if (suites.length === 0) {
34
+ console.log(chalk.gray('\n No suites yet. Run: obs suite generate <url>\n'));
35
+ return;
36
+ }
37
+ console.log(chalk.bold(`\n Suites (${suites.length})`));
38
+ console.log(chalk.gray('─'.repeat(60)));
39
+ suites.forEach((suite, i) => {
40
+ const tests = chalk.gray(`${suite.test_count} tests`);
41
+ const schedule = formatCron(suite.cron_expression, suite.schedule_active);
42
+ console.log(` ${chalk.bold(`${i + 1}.`)} ${chalk.bold(suite.suite_name.padEnd(30))} ${suiteStatusColor(suite.status).padEnd(20)} ${tests.padEnd(10)} ${schedule}`);
43
+ console.log(chalk.gray(` ${suite.target_url} id: ${suite.id}`));
44
+ console.log('');
45
+ });
46
+ }
47
+ export function printSuiteDetail(suite) {
48
+ console.log(chalk.bold(`\n ${suite.suite_name}`));
49
+ console.log(chalk.gray('─'.repeat(60)));
50
+ console.log(` Status: ${suiteStatusColor(suite.status)}`);
51
+ console.log(` URL: ${suite.target_url}`);
52
+ console.log(` ID: ${suite.id}`);
53
+ console.log(` Tests: ${suite.test_count} / ${suite.max_tests} max`);
54
+ console.log(` Schedule: ${formatCron(suite.cron_expression, suite.schedule_active)}`);
55
+ if (suite.secret_keys.length > 0) {
56
+ console.log(` Variables: ${suite.secret_keys.map((k) => chalk.yellow(k)).join(', ')}`);
57
+ }
58
+ if (suite.error_message) {
59
+ console.log(` Error: ${chalk.red(suite.error_message)}`);
60
+ }
61
+ if (suite.generated_tests.length > 0) {
62
+ console.log(chalk.bold('\n Generated tests:'));
63
+ suite.generated_tests.forEach((t, i) => {
64
+ console.log(chalk.gray(` ${i + 1}. ${t.name} (id: ${t.id})`));
65
+ });
66
+ }
67
+ console.log('');
68
+ }
69
+ export function printExecutionResults(execution) {
70
+ const ok = execution.status === 'COMPLETED';
71
+ const icon = ok ? chalk.green('✔') : chalk.red('✘');
72
+ const dur = execution.duration_ms ? ` (${(execution.duration_ms / 1000).toFixed(1)}s)` : '';
73
+ console.log(`\n ${icon} Suite run ${execution.status.toLowerCase()}${dur}\n`);
74
+ for (const r of execution.test_results) {
75
+ printTestRow(r);
76
+ }
77
+ const total = execution.total || execution.test_results.length;
78
+ const passed = execution.passed ?? execution.test_results.filter((r) => r.status === 'PASSED').length;
79
+ const failed = execution.failed ?? execution.test_results.filter((r) => r.status === 'FAILED').length;
80
+ console.log('');
81
+ const summary = failed > 0
82
+ ? chalk.bold(` Results: ${passed}/${total} passed`) + chalk.red(` • ${failed} failed`)
83
+ : chalk.bold(` Results: ${passed}/${total} passed`) + chalk.green(' • all passed');
84
+ console.log(summary);
85
+ console.log(chalk.gray(` Execution ID: ${execution.id}`));
86
+ console.log('');
87
+ }
88
+ function printTestRow(r) {
89
+ const icon = r.status === 'PASSED'
90
+ ? chalk.green('PASSED ')
91
+ : r.status === 'FAILED'
92
+ ? chalk.red('FAILED ')
93
+ : r.status === 'SKIPPED'
94
+ ? chalk.yellow('SKIPPED')
95
+ : chalk.gray('PENDING');
96
+ const dur = r.duration_ms != null ? chalk.gray(` ${(r.duration_ms / 1000).toFixed(1)}s`) : '';
97
+ const err = r.error ? chalk.red(` → ${r.error}`) : '';
98
+ console.log(` ${icon} ${r.name.padEnd(40)}${dur}${err}`);
99
+ }
100
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../src/commands/suite/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../../services/api-client.service.js';
3
+ import { IConfigService } from '../../interfaces/config.interface.js';
4
+ import { IOutputService } from '../../interfaces/output.interface.js';
5
+ export declare function createSuiteGenerateCommand(_configService: IConfigService, apiClient: ApiClient, outputService: IOutputService): Command;
6
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AActE,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAyGT"}
@@ -0,0 +1,98 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { mergeVars } from './vars.js';
5
+ import { suiteStatusColor } from './formatters.js';
6
+ const STAGE_LABELS = {
7
+ pending: 'Queuing...',
8
+ crawling: 'Crawling pages...',
9
+ planning: 'Planning test scenarios...',
10
+ generating: 'Generating test scripts...',
11
+ healing: 'Healing & validating...',
12
+ scheduled: 'Done',
13
+ failed: 'Failed',
14
+ };
15
+ export function createSuiteGenerateCommand(_configService, apiClient, outputService) {
16
+ return new Command('generate')
17
+ .description('Generate a new Playwright Autopilot suite from a URL')
18
+ .argument('<url>', 'Target URL to generate tests for')
19
+ .option('--name <name>', 'Suite name (default: derived from URL hostname)')
20
+ .option('--cron <expr>', 'Cron schedule (e.g. "0 */6 * * *"). Omit for manual only.')
21
+ .option('--max-tests <n>', 'Max tests to generate (1-30, default: 10)', '10')
22
+ .option('--var <KEY=VALUE>', 'Variable/credential (repeatable)', (v, prev) => [...prev, v], [])
23
+ .option('--var-file <path>', 'Load variables from a .env file')
24
+ .option('--allow-form-submit', 'Allow AI agents to submit non-auth forms')
25
+ .option('-w, --wait', 'Wait for generation to complete')
26
+ .action(async (url, options) => {
27
+ const isJson = process.env.OBS_JSON_OUTPUT === 'true';
28
+ try {
29
+ const hostname = new URL(url.startsWith('http') ? url : `https://${url}`).hostname;
30
+ const suiteName = options.name || hostname;
31
+ let secrets;
32
+ try {
33
+ secrets = mergeVars(options.var, options.varFile);
34
+ }
35
+ catch (e) {
36
+ throw new Error(e.message);
37
+ }
38
+ const payload = {
39
+ target_url: url,
40
+ suite_name: suiteName,
41
+ max_tests: Math.min(30, Math.max(1, parseInt(options.maxTests || '10', 10))),
42
+ };
43
+ if (options.cron) {
44
+ payload.cron_expression = options.cron;
45
+ payload.schedule_active = true;
46
+ }
47
+ if (secrets)
48
+ payload.secrets = secrets;
49
+ if (options.allowFormSubmit)
50
+ payload.allow_form_submit = true;
51
+ const suite = await apiClient.generateSuite(payload);
52
+ if (!options.wait) {
53
+ if (isJson) {
54
+ outputService.formatJsonOutput({ suite });
55
+ }
56
+ else {
57
+ console.log(chalk.bold(`\n Suite created: ${suite.suite_name}`));
58
+ console.log(chalk.gray(` ID: ${suite.id}`));
59
+ console.log(chalk.gray(` Status: ${suiteStatusColor(suite.status)}`));
60
+ console.log(chalk.gray(` Track: obs suite get ${suite.id}\n`));
61
+ }
62
+ return;
63
+ }
64
+ if (!isJson) {
65
+ console.log(chalk.bold(`\n Generating suite for ${url}`));
66
+ console.log(chalk.gray('─'.repeat(56)));
67
+ }
68
+ const spinner = ora({ text: 'Queuing...', stream: process.stdout }).start();
69
+ const started = Date.now();
70
+ const done = await apiClient.pollSuiteGeneration(suite.id);
71
+ const elapsed = ((Date.now() - started) / 1000).toFixed(0);
72
+ if (done.status === 'failed') {
73
+ spinner.fail(chalk.red(`Generation failed: ${done.error_message || 'unknown error'}`));
74
+ if (isJson)
75
+ outputService.formatJsonOutput({ suite: done });
76
+ process.exit(1);
77
+ }
78
+ spinner.succeed(chalk.green(`Suite ready (${elapsed}s) • ${done.test_count} tests generated`));
79
+ console.log('');
80
+ console.log(chalk.gray(` Suite ID: ${done.id}`));
81
+ console.log(chalk.gray(` Run it: obs suite run ${done.id} --wait`));
82
+ console.log('');
83
+ if (isJson)
84
+ outputService.formatJsonOutput({ suite: done });
85
+ }
86
+ catch (err) {
87
+ const msg = err.message || 'Failed to generate suite';
88
+ if (isJson) {
89
+ outputService.formatJsonOutput({ status: 'ERROR', error: { message: msg } });
90
+ }
91
+ else {
92
+ console.error(chalk.red(`\n❌ ${msg}\n`));
93
+ }
94
+ process.exit(1);
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/commands/suite/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAItB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,YAAY,GAA2B;IAC3C,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,mBAAmB;IAC7B,QAAQ,EAAE,4BAA4B;IACtC,UAAU,EAAE,4BAA4B;IACxC,OAAO,EAAE,yBAAyB;IAClC,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,0BAA0B,CACxC,cAA8B,EAC9B,SAAoB,EACpB,aAA6B;IAE7B,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,CAAC,sDAAsD,CAAC;SACnE,QAAQ,CAAC,OAAO,EAAE,kCAAkC,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;SAC1E,MAAM,CAAC,eAAe,EAAE,2DAA2D,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,EAAE,IAAI,CAAC;SAC5E,MAAM,CACL,mBAAmB,EACnB,kCAAkC,EAClC,CAAC,CAAC,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EACnC,EAAc,CACf;SACA,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,0CAA0C,CAAC;SACzE,MAAM,CAAC,YAAY,EAAE,iCAAiC,CAAC;SACvD,MAAM,CACL,KAAK,EACH,GAAW,EACX,OAQC,EACD,EAAE;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC;YACnF,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC;YAE3C,IAAI,OAA2C,CAAC;YAChD,IAAI,CAAC;gBACH,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,OAAO,GAAkD;gBAC7D,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;aAC7E,CAAC;YACF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;gBACvC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YACjC,CAAC;YACD,IAAI,OAAO;gBAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;YACvC,IAAI,OAAO,CAAC,eAAe;gBAAE,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAE9D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAErD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,IAAI,MAAM,EAAE,CAAC;oBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;oBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBACjE,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE3B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAE3D,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAE3D,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;gBACvF,IAAI,MAAM;oBAAE,aAAa,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,OAAO,CACb,KAAK,CAAC,KAAK,CAAC,iBAAiB,OAAO,UAAU,IAAI,CAAC,UAAU,kBAAkB,CAAC,CACjF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,IAAI,MAAM;gBAAE,aAAa,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,IAAI,0BAA0B,CAAC;YACjE,IAAI,MAAM,EAAE,CAAC;gBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../../services/api-client.service.js';
3
+ import { IConfigService } from '../../interfaces/config.interface.js';
4
+ import { IOutputService } from '../../interfaces/output.interface.js';
5
+ export declare function createSuiteGetCommand(_configService: IConfigService, apiClient: ApiClient, outputService: IOutputService): Command;
6
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAuBT"}
@@ -0,0 +1,30 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { printSuiteDetail } from './formatters.js';
4
+ export function createSuiteGetCommand(_configService, apiClient, outputService) {
5
+ return new Command('get')
6
+ .description('Get details of a suite')
7
+ .argument('<id>', 'Suite ID')
8
+ .action(async (id) => {
9
+ const isJson = process.env.OBS_JSON_OUTPUT === 'true';
10
+ try {
11
+ const suite = await apiClient.getSuite(id);
12
+ if (isJson) {
13
+ outputService.formatJsonOutput({ suite });
14
+ return;
15
+ }
16
+ printSuiteDetail(suite);
17
+ }
18
+ catch (err) {
19
+ const msg = err.message || 'Failed to get suite';
20
+ if (isJson) {
21
+ outputService.formatJsonOutput({ status: 'ERROR', error: { message: msg } });
22
+ }
23
+ else {
24
+ console.error(chalk.red(`❌ ${msg}`));
25
+ }
26
+ process.exit(1);
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/suite/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,qBAAqB,CACnC,cAA8B,EAC9B,SAAoB,EACpB,aAA6B;IAE7B,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;SACtB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3C,IAAI,MAAM,EAAE,CAAC;gBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,IAAI,qBAAqB,CAAC;YAC5D,IAAI,MAAM,EAAE,CAAC;gBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../../services/api-client.service.js';
3
+ import { IConfigService } from '../../interfaces/config.interface.js';
4
+ import { IOutputService } from '../../interfaces/output.interface.js';
5
+ export declare function createSuiteCommand(configService: IConfigService, apiClient: ApiClient, outputService: IOutputService): Command;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAWtE,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,cAAc,EAC7B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAcT"}
@@ -0,0 +1,24 @@
1
+ import { Command } from 'commander';
2
+ import { createSuiteListCommand } from './list.js';
3
+ import { createSuiteGetCommand } from './get.js';
4
+ import { createSuiteGenerateCommand } from './generate.js';
5
+ import { createSuiteRunCommand } from './run.js';
6
+ import { createSuiteStatusCommand } from './status.js';
7
+ import { createSuiteWaitCommand } from './wait.js';
8
+ import { createSuiteDeleteCommand } from './delete.js';
9
+ import { createSuiteScheduleCommand } from './schedule.js';
10
+ import { createSuiteSecretsCommand } from './secrets.js';
11
+ export function createSuiteCommand(configService, apiClient, outputService) {
12
+ const suite = new Command('suite').description('Manage Playwright Autopilot suites');
13
+ suite.addCommand(createSuiteListCommand(configService, apiClient, outputService));
14
+ suite.addCommand(createSuiteGetCommand(configService, apiClient, outputService));
15
+ suite.addCommand(createSuiteGenerateCommand(configService, apiClient, outputService));
16
+ suite.addCommand(createSuiteRunCommand(configService, apiClient, outputService));
17
+ suite.addCommand(createSuiteStatusCommand(configService, apiClient, outputService));
18
+ suite.addCommand(createSuiteWaitCommand(configService, apiClient, outputService));
19
+ suite.addCommand(createSuiteDeleteCommand(configService, apiClient, outputService));
20
+ suite.addCommand(createSuiteScheduleCommand(configService, apiClient, outputService));
21
+ suite.addCommand(createSuiteSecretsCommand(configService, apiClient, outputService));
22
+ return suite;
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/suite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,UAAU,kBAAkB,CAChC,aAA6B,EAC7B,SAAoB,EACpB,aAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAErF,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAClF,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IACjF,KAAK,CAAC,UAAU,CAAC,0BAA0B,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IACtF,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IACjF,KAAK,CAAC,UAAU,CAAC,wBAAwB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IACpF,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAClF,KAAK,CAAC,UAAU,CAAC,wBAAwB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IACpF,KAAK,CAAC,UAAU,CAAC,0BAA0B,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IACtF,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAErF,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../../services/api-client.service.js';
3
+ import { IConfigService } from '../../interfaces/config.interface.js';
4
+ import { IOutputService } from '../../interfaces/output.interface.js';
5
+ export declare function createSuiteListCommand(_configService: IConfigService, apiClient: ApiClient, outputService: IOutputService): Command;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAsBT"}
@@ -0,0 +1,29 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { printSuiteList } from './formatters.js';
4
+ export function createSuiteListCommand(_configService, apiClient, outputService) {
5
+ return new Command('list')
6
+ .description('List all Playwright Autopilot suites')
7
+ .action(async () => {
8
+ const isJson = process.env.OBS_JSON_OUTPUT === 'true';
9
+ try {
10
+ const suites = await apiClient.listSuites();
11
+ if (isJson) {
12
+ outputService.formatJsonOutput({ suites });
13
+ return;
14
+ }
15
+ printSuiteList(suites);
16
+ }
17
+ catch (err) {
18
+ const msg = err.message || 'Failed to list suites';
19
+ if (isJson) {
20
+ outputService.formatJsonOutput({ status: 'ERROR', error: { message: msg } });
21
+ }
22
+ else {
23
+ console.error(chalk.red(`❌ ${msg}`));
24
+ }
25
+ process.exit(1);
26
+ }
27
+ });
28
+ }
29
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/suite/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,UAAU,sBAAsB,CACpC,cAA8B,EAC9B,SAAoB,EACpB,aAA6B;IAE7B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;YAC5C,IAAI,MAAM,EAAE,CAAC;gBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YACD,cAAc,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,IAAI,uBAAuB,CAAC;YAC9D,IAAI,MAAM,EAAE,CAAC;gBACX,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../../services/api-client.service.js';
3
+ import { IConfigService } from '../../interfaces/config.interface.js';
4
+ import { IOutputService } from '../../interfaces/output.interface.js';
5
+ export declare function createSuiteRunCommand(_configService: IConfigService, apiClient: ApiClient, outputService: IOutputService): Command;
6
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAsDT"}
@@ -0,0 +1,57 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { printExecutionResults } from './formatters.js';
5
+ export function createSuiteRunCommand(_configService, apiClient, outputService) {
6
+ return new Command('run')
7
+ .description('Trigger a suite execution')
8
+ .argument('<id>', 'Suite ID')
9
+ .option('-w, --wait', 'Wait for the execution to complete')
10
+ .option('--tests <ids>', 'Comma-separated list of test IDs to run')
11
+ .action(async (id, options) => {
12
+ const isJson = process.env.OBS_JSON_OUTPUT === 'true';
13
+ try {
14
+ const testIds = options.tests ? options.tests.split(',').map((s) => s.trim()) : undefined;
15
+ const { execution_id } = await apiClient.runSuite(id, testIds);
16
+ if (!options.wait) {
17
+ if (isJson) {
18
+ outputService.formatJsonOutput({ execution_id });
19
+ }
20
+ else {
21
+ console.log(chalk.bold(`\n Suite run triggered`));
22
+ console.log(chalk.gray(` Execution ID: ${execution_id}`));
23
+ console.log(chalk.gray(` Wait: obs suite wait ${id} ${execution_id}\n`));
24
+ }
25
+ return;
26
+ }
27
+ if (!isJson) {
28
+ console.log(chalk.bold(`\n Running suite...`));
29
+ console.log(chalk.gray('─'.repeat(56)));
30
+ }
31
+ const spinner = ora({ text: 'Running...', stream: process.stdout }).start();
32
+ const started = Date.now();
33
+ const done = await apiClient.pollSuiteExecution(id, execution_id);
34
+ const elapsed = ((Date.now() - started) / 1000).toFixed(0);
35
+ spinner.stop();
36
+ if (isJson) {
37
+ outputService.formatJsonOutput({ execution: done });
38
+ }
39
+ else {
40
+ printExecutionResults(done);
41
+ }
42
+ const allPassed = done.status === 'COMPLETED' && (done.failed ?? 0) === 0;
43
+ process.exit(allPassed ? 0 : 1);
44
+ }
45
+ catch (err) {
46
+ const msg = err.message || 'Failed to run suite';
47
+ if (isJson) {
48
+ outputService.formatJsonOutput({ status: 'ERROR', error: { message: msg } });
49
+ }
50
+ else {
51
+ console.error(chalk.red(`\n❌ ${msg}\n`));
52
+ }
53
+ process.exit(1);
54
+ }
55
+ });
56
+ }
57
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/suite/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { ApiClient } from '../../services/api-client.service.js';
3
+ import { IConfigService } from '../../interfaces/config.interface.js';
4
+ import { IOutputService } from '../../interfaces/output.interface.js';
5
+ export declare function createSuiteScheduleCommand(_configService: IConfigService, apiClient: ApiClient, outputService: IOutputService): Command;
6
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../../src/commands/suite/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,cAAc,GAC5B,OAAO,CA0CT"}