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:
| Name | Type | Description |
|---|---|---|
config | PartialFixWrightConfig | Configuration 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): thisParameters:
| Name | Type | Description |
|---|---|---|
directory | string | Directory to watch for failure case JSON files |
Returns: this
Example:
fixwright.useFileSource('./failure-cases');useSource(source)
Configure a custom failure source.
useSource(source: FailureSource): thisParameters:
| Name | Type | Description |
|---|---|---|
source | FailureSource | Custom 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): thisParameters:
| Name | Type | Description |
|---|---|---|
level | 'quiet' | 'normal' | 'verbose' | Verbosity level |
Returns: this
Example:
fixwright.setVerbosity('verbose');getVerbosity()
Get the current verbosity level.
getVerbosity(): VerbosityLevelReturns: VerbosityLevel
Lifecycle Methods
start()
Start processing failures.
async start(): Promise<void>Throws:
Errorif already runningErrorif no failure source configured
Example:
await fixwright.start();// FixWright is now listening for failuresstop()
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:
| Name | Type | Description |
|---|---|---|
failureCase | FailureCase | Failure 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(): FixWrightConfigReturns: 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 sourcefixwright.useFileSource('./failure-cases');
// Set verbosityfixwright.setVerbosity('normal');
// Listen to eventsfixwright.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 processingawait fixwright.start();
// Stop on SIGINTprocess.on('SIGINT', async () => { await fixwright.stop(); process.exit(0);});See Also
- AgentFixer - Direct agent access
- FailureSource - Custom sources
- Types - All type definitions