@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.
- package/README.md +36 -0
- package/dist/README.md +36 -0
- package/dist/commands/suite/delete.d.ts +6 -0
- package/dist/commands/suite/delete.d.ts.map +1 -0
- package/dist/commands/suite/delete.js +31 -0
- package/dist/commands/suite/delete.js.map +1 -0
- package/dist/commands/suite/formatters.d.ts +7 -0
- package/dist/commands/suite/formatters.d.ts.map +1 -0
- package/dist/commands/suite/formatters.js +100 -0
- package/dist/commands/suite/formatters.js.map +1 -0
- package/dist/commands/suite/generate.d.ts +6 -0
- package/dist/commands/suite/generate.d.ts.map +1 -0
- package/dist/commands/suite/generate.js +98 -0
- package/dist/commands/suite/generate.js.map +1 -0
- package/dist/commands/suite/get.d.ts +6 -0
- package/dist/commands/suite/get.d.ts.map +1 -0
- package/dist/commands/suite/get.js +30 -0
- package/dist/commands/suite/get.js.map +1 -0
- package/dist/commands/suite/index.d.ts +6 -0
- package/dist/commands/suite/index.d.ts.map +1 -0
- package/dist/commands/suite/index.js +24 -0
- package/dist/commands/suite/index.js.map +1 -0
- package/dist/commands/suite/list.d.ts +6 -0
- package/dist/commands/suite/list.d.ts.map +1 -0
- package/dist/commands/suite/list.js +29 -0
- package/dist/commands/suite/list.js.map +1 -0
- package/dist/commands/suite/run.d.ts +6 -0
- package/dist/commands/suite/run.d.ts.map +1 -0
- package/dist/commands/suite/run.js +57 -0
- package/dist/commands/suite/run.js.map +1 -0
- package/dist/commands/suite/schedule.d.ts +6 -0
- package/dist/commands/suite/schedule.d.ts.map +1 -0
- package/dist/commands/suite/schedule.js +46 -0
- package/dist/commands/suite/schedule.js.map +1 -0
- package/dist/commands/suite/secrets.d.ts +6 -0
- package/dist/commands/suite/secrets.d.ts.map +1 -0
- package/dist/commands/suite/secrets.js +38 -0
- package/dist/commands/suite/secrets.js.map +1 -0
- package/dist/commands/suite/status.d.ts +6 -0
- package/dist/commands/suite/status.d.ts.map +1 -0
- package/dist/commands/suite/status.js +52 -0
- package/dist/commands/suite/status.js.map +1 -0
- package/dist/commands/suite/vars.d.ts +4 -0
- package/dist/commands/suite/vars.d.ts.map +1 -0
- package/dist/commands/suite/vars.js +38 -0
- package/dist/commands/suite/vars.js.map +1 -0
- package/dist/commands/suite/wait.d.ts +6 -0
- package/dist/commands/suite/wait.d.ts.map +1 -0
- package/dist/commands/suite/wait.js +40 -0
- package/dist/commands/suite/wait.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/services/api-client.service.d.ts +25 -1
- package/dist/services/api-client.service.d.ts.map +1 -1
- package/dist/services/api-client.service.js +65 -0
- package/dist/services/api-client.service.js.map +1 -1
- package/dist/types/index.d.ts +49 -0
- package/dist/types/index.d.ts.map +1 -1
- 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":"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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 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"}
|