# CLI E2e Test Harness

> Set up E2E test harness for CLI applications with process spawning and assertions.

- Skill: `a5c-ai/cli-e2e-test-harness` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add a5c-ai/cli-e2e-test-harness`
- Raw SKILL.md: https://api.skillmd.com/api/skills/a5c-ai/cli-e2e-test-harness/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: a5c-ai (https://skillmd.com/u/a5c-ai)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/a5c-ai/cli-e2e-test-harness

---


# CLI E2E Test Harness

Set up E2E test harness for CLI applications.

## Generated Patterns

```typescript
import { spawn, SpawnOptions } from 'child_process';

interface CLIResult {
  stdout: string;
  stderr: string;
  exitCode: number | null;
}

export async function runCLI(args: string[], options?: SpawnOptions): Promise<CLIResult> {
  return new Promise((resolve) => {
    const proc = spawn('node', ['./dist/index.js', ...args], {
      env: { ...process.env, NO_COLOR: '1' },
      ...options,
    });

    let stdout = '';
    let stderr = '';

    proc.stdout?.on('data', (data) => { stdout += data; });
    proc.stderr?.on('data', (data) => { stderr += data; });

    proc.on('close', (exitCode) => {
      resolve({ stdout, stderr, exitCode });
    });
  });
}

export function expectOutput(result: CLIResult) {
  return {
    toContain: (text: string) => expect(result.stdout).toContain(text),
    toMatchSnapshot: () => expect(result.stdout).toMatchSnapshot(),
    toExitWith: (code: number) => expect(result.exitCode).toBe(code),
  };
}
```

## Target Processes

- cli-unit-integration-testing
- mcp-server-testing-suite

