Skip to content

FixWright Class

FixWright Class

The main class for processing failure cases and applying AI-powered fixes.

Import

import { FixWright } from '@korvol/fixwright';

Constructor

constructor(config: PartialFixWrightConfig)

Parameters:

NameTypeDescription
configPartialFixWrightConfigConfiguration options

Example:

const fixwright = new FixWright({
ai: {
apiKey: process.env.ANTHROPIC_API_KEY!,
model: 'claude-sonnet-4-20250514',
},
git: {
baseBranch: 'main',
fixBranchPrefix: 'fix/stepwright-',
},
github: {
token: process.env.GITHUB_TOKEN!,
owner: 'your-org',
repo: 'your-repo',
},
});

Methods

Source Configuration

useFileSource(directory)

Configure a file-based failure source.

useFileSource(directory: string): this

Parameters:

NameTypeDescription
directorystringDirectory to watch for failure case JSON files

Returns: this

Example:

fixwright.useFileSource('./failure-cases');

useSource(source)

Configure a custom failure source.

useSource(source: FailureSource): this

Parameters:

NameTypeDescription
sourceFailureSourceCustom failure source implementation

Returns: this

Example:

import { DatabaseFailureSource } from '@korvol/fixwright';
const source = new DatabaseFailureSource({
connectionString: process.env.DATABASE_URL,
});
fixwright.useSource(source);

Verbosity Control

setVerbosity(level)

Set the verbosity level for output.

setVerbosity(level: VerbosityLevel): this

Parameters:

NameTypeDescription
level'quiet' | 'normal' | 'verbose'Verbosity level

Returns: this

Example:

fixwright.setVerbosity('verbose');

getVerbosity()

Get the current verbosity level.

getVerbosity(): VerbosityLevel

Returns: VerbosityLevel

Lifecycle Methods

start()

Start processing failures.

async start(): Promise<void>

Throws:

  • Error if already running
  • Error if no failure source configured

Example:

await fixwright.start();
// FixWright is now listening for failures

stop()

Stop processing failures.

async stop(): Promise<void>

Example:

await fixwright.stop();

Manual Processing

processFailure(failureCase)

Process a single failure case manually.

async processFailure(failureCase: FailureCase): Promise<FixAttempt>

Parameters:

NameTypeDescription
failureCaseFailureCaseFailure case to process

Returns: Promise<FixAttempt>

Example:

const failureCase = JSON.parse(
await fs.readFile('./failure.json', 'utf-8')
);
const attempt = await fixwright.processFailure(failureCase);
console.log('Result:', attempt.status);

Configuration Access

getConfig()

Get the current configuration.

getConfig(): FixWrightConfig

Returns: FixWrightConfig

Example:

const config = fixwright.getConfig();
console.log('Base branch:', config.git.baseBranch);

Events

FixWright extends EventEmitter and emits the following events:

Lifecycle Events

fixwright.on('started', () => void);
fixwright.on('stopped', () => void);
fixwright.on('failure:received', (failureCase: FailureCase) => void);
fixwright.on('failure:completed', (summary: FixCompletionSummary) => void);

Attempt Events

fixwright.on('attempt:start', (attempt: FixAttempt) => void);
fixwright.on('attempt:analyzing', (attempt: FixAttempt) => void);
fixwright.on('attempt:fixing', (attempt: FixAttempt) => void);
fixwright.on('attempt:validating', (attempt: FixAttempt) => void);
fixwright.on('attempt:success', (attempt: FixAttempt) => void);
fixwright.on('attempt:failed', (attempt: FixAttempt) => void);
fixwright.on('attempt:regression', (attempt: FixAttempt) => void);
fixwright.on('attempt:new_error', (attempt: FixAttempt, newError: string) => void);

Agent Events

fixwright.on('agent:start', () => void);
fixwright.on('agent:complete', (result: AgentFixResult) => void);
fixwright.on('agent:message', (message: SDKMessage) => void);
fixwright.on('agent:error', (error: Error) => void);
fixwright.on('agent:thinking', (text: string) => void);
fixwright.on('agent:text', (text: string) => void);
fixwright.on('agent:tool_use', (toolName: string, input: unknown) => void);

Tool Events (Verbose Mode)

fixwright.on('agent:read', (info: ReadInfo) => void);
fixwright.on('agent:edit', (info: EditInfo) => void);
fixwright.on('agent:bash', (info: BashInfo) => void);
fixwright.on('agent:grep', (info: GrepInfo) => void);
fixwright.on('agent:glob', (info: GlobInfo) => void);

Result Events

fixwright.on('pr:created', (prUrl: string) => void);
fixwright.on('error', (error: Error) => void);

Complete Example

import { FixWright } from '@korvol/fixwright';
const fixwright = new FixWright({
ai: {
apiKey: process.env.ANTHROPIC_API_KEY!,
model: 'claude-sonnet-4-20250514',
},
git: {
baseBranch: 'main',
fixBranchPrefix: 'fix/stepwright-',
},
github: {
token: process.env.GITHUB_TOKEN!,
owner: 'my-org',
repo: 'my-repo',
},
fixing: {
maxAttempts: 3,
},
});
// Configure source
fixwright.useFileSource('./failure-cases');
// Set verbosity
fixwright.setVerbosity('normal');
// Listen to events
fixwright.on('started', () => {
console.log('FixWright started');
});
fixwright.on('failure:received', (fc) => {
console.log('Processing:', fc.script.name);
});
fixwright.on('attempt:start', (a) => {
console.log(`Attempt ${a.attemptNumber}`);
});
fixwright.on('agent:tool_use', (tool, input) => {
console.log(`Using ${tool}`);
});
fixwright.on('attempt:success', (a) => {
console.log('Fix successful!');
console.log('Cause:', a.analysis?.causeType);
});
fixwright.on('pr:created', (url) => {
console.log('PR created:', url);
});
fixwright.on('error', (error) => {
console.error('Error:', error);
});
// Start processing
await fixwright.start();
// Stop on SIGINT
process.on('SIGINT', async () => {
await fixwright.stop();
process.exit(0);
});

See Also