/**
 * VCS-native test runner — executes manifest suites and records vcs:testRun ops.
 */
import type { EngineContext } from './engine-context.js';
import { type TestManifest, type TestSuiteDef } from './test-manifest.js';
export type TestRunTrigger = 'manual' | 'watch' | 'pre-promote' | 'pre-close' | 'criterion';
export interface TestRunResult {
    testRunId: string;
    suite?: string;
    command: string;
    status: 'passed' | 'failed';
    output?: string;
    exitCode?: number;
    durationMs?: number;
    opHash?: string;
}
export interface RunTestSuiteParams {
    /** Working directory for the shell command (lane worktree or repo root). */
    cwd: string;
    /** Repo root containing `.trellis/tests.json` (defaults to `cwd`). */
    manifestRoot?: string;
    suiteId: string;
    manifest?: TestManifest;
    laneId?: string;
    issueId?: string;
    trigger?: TestRunTrigger;
}
export declare function executeTestCommand(opts: {
    command: string;
    cwd: string;
    timeoutMs?: number;
}): Promise<{
    status: 'passed' | 'failed';
    output: string;
    exitCode: number;
    durationMs: number;
}>;
export declare function emitTestRunOp(ctx: EngineContext, params: {
    suiteId?: string;
    command: string;
    status: 'passed' | 'failed';
    output?: string;
    exitCode?: number;
    durationMs?: number;
    laneId?: string;
    issueId?: string;
    trigger: TestRunTrigger;
}): Promise<TestRunResult>;
export declare function runTestSuite(ctx: EngineContext, params: RunTestSuiteParams): Promise<TestRunResult>;
export declare function runTestSuites(ctx: EngineContext, params: {
    cwd: string;
    manifestRoot?: string;
    suiteIds: string[];
    manifest?: TestManifest;
    laneId?: string;
    issueId?: string;
    trigger?: TestRunTrigger;
}): Promise<TestRunResult[]>;
export declare function runPromoteRequiredTests(ctx: EngineContext, cwd: string, laneId: string, manifestRoot?: string): Promise<TestRunResult[]>;
export declare function allTestRunsPassed(results: TestRunResult[]): boolean;
/** Load manifest if present; never throws for missing file. */
export declare function tryLoadTestManifest(rootPath: string): TestManifest | null;
export declare function describeSuite(suiteId: string, suite: TestSuiteDef): string;
//# sourceMappingURL=test-runner.d.ts.map