mirror of
https://github.com/jackwener/OpenCLI.git
synced 2026-09-14 18:25:42 +08:00
664a971ed5
* feat: add structured diagnostic output for AI-driven adapter repair When OPENCLI_DIAGNOSTIC=1 is set, failed commands emit a RepairContext JSON to stderr containing the error, adapter source, and browser state (DOM snapshot, network requests, console errors). AI Agents consume this to diagnose and fix adapters when websites change. Also adds the opencli-repair skill guide for AI Agents. * fix: correct e2e test binary path to dist/src/main.js The e2e helpers pointed to dist/main.js but the actual build output is at dist/src/main.js (matching package.json "main" field). This caused all e2e-headed tests to fail with "Cannot find module". * fix: correct dist/main.js path in autoresearch scripts * fix: emit diagnostic for pre-session browser failures When browser connection fails before the session callback runs (e.g., BrowserConnectError), the inner diagnostic catch never fires. Use a flag to ensure the outer catch emits diagnostic as a fallback. * test: tolerate unavailable Bloomberg RSS feeds in e2e * test: skip flaky bloomberg businessweek e2e test The Bloomberg Businessweek RSS feed is intermittently unavailable, causing CI failures unrelated to code changes. * revert: restore bloomberg businessweek e2e coverage
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
/**
|
|
* Shared helpers for E2E tests.
|
|
* Runs the built opencli binary as a subprocess.
|
|
*/
|
|
|
|
import { execFile } from 'node:child_process';
|
|
import { promisify } from 'node:util';
|
|
import * as path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const exec = promisify(execFile);
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
const ROOT = path.resolve(__dirname, '../..');
|
|
const MAIN = path.join(ROOT, 'dist', 'src', 'main.js');
|
|
|
|
export interface CliResult {
|
|
stdout: string;
|
|
stderr: string;
|
|
code: number;
|
|
}
|
|
|
|
/**
|
|
* Run `opencli` as a child process with the given arguments.
|
|
* Without PLAYWRIGHT_MCP_EXTENSION_TOKEN, opencli auto-launches its own browser.
|
|
*/
|
|
export async function runCli(
|
|
args: string[],
|
|
opts: { timeout?: number; env?: Record<string, string> } = {},
|
|
): Promise<CliResult> {
|
|
const timeout = opts.timeout ?? 30_000;
|
|
try {
|
|
const runtime = process.env.OPENCLI_TEST_RUNTIME || 'node';
|
|
const { stdout, stderr } = await exec(runtime, [MAIN, ...args], {
|
|
cwd: ROOT,
|
|
timeout,
|
|
env: {
|
|
...process.env,
|
|
// Prevent chalk colors from polluting test assertions
|
|
FORCE_COLOR: '0',
|
|
NO_COLOR: '1',
|
|
...opts.env,
|
|
},
|
|
});
|
|
return { stdout, stderr, code: 0 };
|
|
} catch (err: any) {
|
|
return {
|
|
stdout: err.stdout ?? '',
|
|
stderr: err.stderr ?? '',
|
|
code: err.code ?? 1,
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Parse JSON output from a CLI command.
|
|
* Throws a descriptive error if parsing fails.
|
|
*/
|
|
export function parseJsonOutput(stdout: string): any {
|
|
try {
|
|
return JSON.parse(stdout.trim());
|
|
} catch {
|
|
throw new Error(`Failed to parse CLI JSON output:\n${stdout.slice(0, 500)}`);
|
|
}
|
|
}
|