feat: 第二期 — Tier 2 场景级 mock + 错误/流程/依赖测试

This commit is contained in:
2026-06-09 15:52:01 +08:00
parent 8739a404f6
commit bb7d5e740c
5 changed files with 493 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
import type { RuneConfig } from "../../src/types.ts";
import type { AgentRunner, AgentResult } from "./runner.ts";
import { CommandLevelRunner } from "./tier1-command.ts";
export type PlanOverride = (
projectDir: string,
changeName: string,
docName: string,
config: RuneConfig,
) => Promise<AgentResult>;
export type BuildOverride = (
projectDir: string,
changeName: string,
config: RuneConfig,
) => Promise<AgentResult>;
export type ArchiveOverride = (
projectDir: string,
changeName: string,
config: RuneConfig,
) => Promise<AgentResult>;
export interface ScenarioOverrides {
plan?: PlanOverride;
build?: BuildOverride;
archive?: ArchiveOverride;
}
export class ScenarioRunner implements AgentRunner {
readonly tier = 2;
private defaults: CommandLevelRunner;
private overrides: ScenarioOverrides;
constructor(defaults: CommandLevelRunner, overrides: ScenarioOverrides = {}) {
this.defaults = defaults;
this.overrides = overrides;
}
async runPlan(
projectDir: string,
changeName: string,
docName: string,
config: RuneConfig,
): Promise<AgentResult> {
if (this.overrides.plan) {
return this.overrides.plan(projectDir, changeName, docName, config);
}
return this.defaults.runPlan(projectDir, changeName, docName, config);
}
async runBuild(projectDir: string, changeName: string, config: RuneConfig): Promise<AgentResult> {
if (this.overrides.build) {
return this.overrides.build(projectDir, changeName, config);
}
return this.defaults.runBuild(projectDir, changeName, config);
}
async runArchive(
projectDir: string,
changeName: string,
config: RuneConfig,
): Promise<AgentResult> {
if (this.overrides.archive) {
return this.overrides.archive(projectDir, changeName, config);
}
return this.defaults.runArchive(projectDir, changeName, config);
}
}