miaoda-game-devkit 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,25 +7,29 @@
7
7
  - React 游戏的生产/手动时钟、Strict Mode 安全 Controller ownership、JSDOM
8
8
  Vitest 配置和自动收集运行错误的 Testing Library setup,分别从 `miaoda-game-devkit/react`、
9
9
  `miaoda-game-devkit/react/testing` 和 `miaoda-game-devkit/react/vitest-config` 导入;
10
- - React 的 `playthroughTest` 与项目级 reporter 自动验证独立的 entry/primary DOM
11
- 输入、有界推进、结果断言及至少两次有序 checkpoint 签到;聚焦运行只提示未检查,
10
+ - React 的 `playthroughTest` 与项目级 reporter 自动验证连续的 enter/milestone/finish
11
+ 玩法阶段、真实 DOM 输入或确定性推进、有界结果、结果断言和阶段状态变化;聚焦运行只提示未检查,
12
12
  完整运行缺少有效流程时失败;
13
13
 
14
- `playthroughTest` 的主流程回调从参数接收 `user`、`performInput`、`checkpoint`、
15
- `stepUntil` 和绑定当前测试的 `expect`。按 entry 输入、`checkpoint("entered")`、primary 输入、
16
- 有界等待、使用回调提供的 `expect` 断言权威结果、
17
- `checkpoint("progress")` `checkpoint("terminal")` 的顺序记录最低证据。每条流程至少需要
18
- 这两次 checkpoint;checkpoint 只负责签到,不携带或验证状态。大型游戏仍只保留一条最短关键流程;
19
- 分支、关卡规则和恢复清理由专门测试覆盖。不要再次调用 `userEvent.setup()`。
14
+ `playthroughTest` 的主流程回调只需要编排 `enter`、至少三个唯一命名的 `milestone` 和
15
+ `finish`。`enter` 必须声明真实输入 `act`;后续阶段声明 `act` 或确定性 `step`。每个阶段还要
16
+ 提供初始为 false 的有界 `until`,以及使用 test-bound `expect` 的 `assert`。DevKit 在验证阶段
17
+ 前后 DOM 或权威 `observe` 状态确实变化后自动提交阶段证据。每个 `milestone` 使用非空且
18
+ 唯一的领域名称,表示一段独立的玩法进展。`finish.kind` 对有限结果使用 `terminal`,对无尽或
19
+ 沙盒游戏的有意义进展使用 `progress`。大型游戏保留一条最短关键流程;分支、关卡规则和恢复
20
+ 清理由专门测试覆盖。不要再次调用 `userEvent.setup()`。
21
+ Playthrough 测试始终以非并发任务运行,且只统计当前阶段 `act` 执行窗口内的输入事件,避免
22
+ 同一 JSDOM 中其他测试或后台事件污染玩法证据。
20
23
  时间、帧或自定义 scheduler 流程必须显式传入确定性 `step`;精确物理时间、暂停恢复
21
24
  或调度清理测试可使用 `ManualGameClock`。Canvas/Controller 流程在 `playthroughTest` 上声明一次
22
25
  `observe`,返回 JSON 可序列化的权威 Telemetry 状态;框架自动比较流程状态并复用为超时诊断。
23
26
 
24
- 失败的 production playthrough 会额外输出一条有界 `TRACE:`:记录 entry 后、primary 后和
25
- 最后一次可观测状态,以及已完成 checkpoint 与推进步数。通过流程不输出 TRACE,避免增加
27
+ 失败的 production playthrough 会额外输出一条有界 `TRACE:`:记录已完成 milestone、当前阶段、
28
+ 阶段前后可观测状态与推进步数。通过流程不输出 TRACE,避免增加
26
29
  常规 CI 噪声。显式启用 Vitest retry 时,每次尝试会重置证据,最终报告只展示最后一次尝试的
27
- CAUSE 与 TRACE;若测试主体已完成、随后由 `afterEach` 或运行时错误判失败,reporter 仍会从
28
- task metadata 恢复这条流程证据。状态优先来自 `observe`,没有 Telemetry 时才使用有界 DOM
30
+ CAUSE 与 TRACE;repeat 同样为每轮建立新证据。测试超时或取消会中止后续有界推进,并通过
31
+ Vitest test-local failure hook worker 最终同步前保留活动阶段;若测试主体已完成、随后由
32
+ `afterEach` 或运行时错误判失败,reporter 仍会从 task metadata 恢复这条流程证据。状态优先来自 `observe`,没有 Telemetry 时才使用有界 DOM
29
33
  摘要;不要把 TRACE 当作新的断言或第二份业务状态。
30
34
 
31
35
  Vitest 的 fake timers(包括 `vi.advanceTimersToNextFrame()`)适合在 devkit 自身的
@@ -33,114 +33,97 @@ interface StepUntilOptions {
33
33
  * The value is sampled only when the bound is exhausted.
34
34
  */
35
35
  diagnostics?: () => unknown;
36
+ /** 测试超时或运行取消时停止继续推进,通常由 playthroughTest 自动传入。 */
37
+ signal?: AbortSignal;
36
38
  }
37
39
 
40
+ type ReactPlaythroughStageKind = "entered" | "milestone" | "progress" | "terminal";
41
+ /** 一段已完成玩法留下的可序列化证据。 */
42
+ interface ReactPlaythroughStageEvidence {
43
+ name: string;
44
+ kind: ReactPlaythroughStageKind;
45
+ domInputEvents: number;
46
+ advancedSteps: number;
47
+ assertions: number;
48
+ stateChanged: boolean;
49
+ before: string;
50
+ after: string;
51
+ }
38
52
  /** 单条 React 主流程测试留下的可序列化运行期证据。 */
39
53
  interface ReactPlaythroughEvidence {
40
- /** 捕获阶段观察到的键盘、指针或触摸类 DOM 输入总数。 */
41
54
  domInputEvents: number;
42
- /** 由 performInput 明确标记的入口输入次数。 */
43
- entryInputs: number;
44
- /** 由 performInput 明确标记的核心玩法输入次数。 */
45
- primaryInputs: number;
46
- /** 在步数上限内成功满足条件的 stepUntil 次数。 */
47
- boundedRuns: number;
48
- /** 最后一次 stepUntil 成功后新增的 Vitest 断言数。 */
49
- assertionsAfterOutcome: number;
50
- /** 已记录的 checkpoint 类型,供 reporter 给出精确提示。 */
51
- checkpoints: ReactPlaythroughCheckpointKind[];
52
- /** helper 是否已经完成全部证据校验。 */
55
+ stages: ReactPlaythroughStageEvidence[];
53
56
  verified: boolean;
54
57
  }
55
58
  /** 通过 Vitest task metadata 从 worker 传递给主线程 reporter 的数据。 */
56
59
  interface ReactPlaythroughMetadata {
57
- /** metadata 结构版本,用于拒绝无法识别的旧数据。 */
58
- version: 3;
59
- /** 静态、非交互项目跳过主流程验证时必须提供的理由。 */
60
+ version: 4;
60
61
  waiverReason?: string;
61
- /** 仅供失败 reporter 兜底读取;成功运行不会输出。 */
62
62
  trace?: string;
63
- /** 测试执行期间持续更新的客观证据。 */
64
63
  evidence: ReactPlaythroughEvidence;
65
64
  }
66
-
67
- /** 玩家输入在最低可玩流程中的语义阶段。 */
68
- type ReactPlaythroughInputKind = "entry" | "primary";
69
- /** 可审计流程签到;entered 是入口,progress/terminal 是有效结果。 */
70
- type ReactPlaythroughCheckpointKind = "entered" | "progress" | "terminal";
71
- /** Canvas/Controller flows declare one authoritative read; simple DOM flows omit it. */
72
65
  interface ReactPlaythroughOptions {
73
- /** Stable, JSON-serializable production state sampled across the audited flow. */
66
+ /** Canvas/Controller flows expose one stable authoritative production read. */
74
67
  observe: () => unknown;
75
68
  }
76
- /** 主流程回调唯一需要学习的测试工具。 */
69
+ interface ReactPlaythroughAssertContext {
70
+ expect: ExpectStatic;
71
+ user: UserEvent;
72
+ view: RenderResult;
73
+ }
74
+ interface ReactPlaythroughStageShared {
75
+ until: () => boolean;
76
+ assert: (context: ReactPlaythroughAssertContext) => void | Promise<void>;
77
+ maxSteps?: number;
78
+ diagnostics?: () => unknown;
79
+ }
80
+ type ReactPlaythroughInteractiveStage = ReactPlaythroughStageShared & {
81
+ act: () => void | Promise<void>;
82
+ step?: StepUntilOptions["step"];
83
+ };
84
+ type ReactPlaythroughAutonomousStage = ReactPlaythroughStageShared & {
85
+ act?: never;
86
+ step: NonNullable<StepUntilOptions["step"]>;
87
+ };
88
+ type ReactPlaythroughStage = ReactPlaythroughInteractiveStage | ReactPlaythroughAutonomousStage;
89
+ /** 合法入口必须由真实生产 DOM 输入驱动,不能用自动 step 代替。 */
90
+ type ReactPlaythroughEnterStage = ReactPlaythroughInteractiveStage;
91
+ type ReactPlaythroughFinishStage = ReactPlaythroughStage & {
92
+ kind: "progress" | "terminal";
93
+ };
94
+ /** 游戏作者只编排进入、领域里程碑和最终结果。 */
77
95
  interface ReactPlaythroughArguments {
78
- /** Testing Library 对生产游戏入口的渲染结果。 */
79
96
  view: RenderResult;
80
- /** 已由 playthroughTest 创建的真实 DOM 用户输入驱动。 */
81
97
  user: UserEvent;
82
- /** Vitest 绑定到当前 test 的断言 API;结果断言必须使用这个实例。 */
83
- expect: ExpectStatic;
84
- /**
85
- * 包裹一段真实 DOM 输入并声明用途。
86
- * entry 用于进入合法游戏状态,primary 用于移动、挥拍、拖拽、落子等核心操作。
87
- */
88
- performInput(kind: ReactPlaythroughInputKind, input: () => void | Promise<void>): Promise<void>;
89
- /**
90
- * 记录流程签到。先在 entry 后记录 entered,再在 primary、stepUntil 和
91
- * 结果断言后记录 progress 或 terminal。
92
- */
93
- checkpoint(kind: ReactPlaythroughCheckpointKind): void;
94
- /**
95
- * 在硬性步数上限内等待权威结果。
96
- * 返回后必须再断言该结果,进入中间 active/running 状态不算完成。
97
- * 即时结果不需要 step;时间、帧或自定义 scheduler 流程必须传入确定性 step。
98
- */
99
- stepUntil(condition: () => boolean, options?: StepUntilOptions): Promise<number>;
98
+ enter(stage: ReactPlaythroughEnterStage): Promise<void>;
99
+ milestone(name: string, stage: ReactPlaythroughStage): Promise<void>;
100
+ finish(name: string, stage: ReactPlaythroughFinishStage): Promise<void>;
100
101
  }
101
- /** 使用方编写的生产玩法步骤;既支持同步游戏,也支持异步 DOM 输入。 */
102
102
  type ReactPlaythroughRun = (arguments_: ReactPlaythroughArguments) => void | Promise<void>;
103
- /** 低配置主流程测试函数及其结构化豁免入口。 */
104
103
  interface ReactPlaythroughTest {
105
- /** 渲染生产入口并声明一条最低可玩主流程。 */
106
104
  (element: ReactNode, run: ReactPlaythroughRun): void;
107
- /** Use one authoritative observer when gameplay results live outside the DOM. */
108
105
  (element: ReactNode, options: ReactPlaythroughOptions, run: ReactPlaythroughRun): void;
109
- /** 仅允许带充分理由地豁免确实没有玩家输入的项目。 */
110
- skip(reason: string, element: ReactNode, run: ReactPlaythroughRun): void;
106
+ skip(reason: string, element: ReactNode): void;
111
107
  }
112
108
  /** reporter 从单个 Vitest TestCase 提取出的稳定审计输入。 */
113
109
  interface ReactPlaythroughAuditInput {
114
- /** 包含 describe 层级的完整测试名,仅用于诊断输出。 */
115
110
  name: string;
116
- /** Vitest 报告的最终执行状态。 */
117
111
  state: "passed" | "failed" | "skipped" | "pending";
118
- /** 只有 playthroughTest 声明的测试才具备该字段。 */
119
112
  metadata?: ReactPlaythroughMetadata;
120
113
  }
121
- /** 整次 Vitest 运行的最低可玩性审计结果。 */
122
114
  interface ReactPlaythroughAuditResult {
123
- /** 是否满足有效主流程或有效豁免。 */
124
115
  passed: boolean;
125
- /** 是否依靠显式非交互理由通过,而非执行了主流程。 */
126
116
  waived: boolean;
127
- /** 可直接指导模型补测的稳定问题列表。 */
128
117
  issues: string[];
129
118
  }
130
119
  /** React 游戏测试的最低可玩主流程入口。 */
131
120
  declare const playthroughTest: ReactPlaythroughTest;
132
- /**
133
- * 供 Vitest reporter 与确定性契约测试共用的纯审计函数。
134
- *
135
- * 它只验证客观流程证据,不能理解任意游戏的胜负语义;具体结果仍由
136
- * 使用方在 stepUntil 返回后通过权威状态或玩家可见结果断言。
137
- */
121
+ /** 供 Vitest reporter 与确定性契约测试共用的纯审计函数。 */
138
122
  declare function auditReactPlaythroughRun(tests: ReactPlaythroughAuditInput[]): ReactPlaythroughAuditResult;
139
123
  declare module "vitest" {
140
124
  interface TaskMeta {
141
- /** 供 ReactPlaythroughReporter 汇总的可序列化主流程证据。 */
142
125
  reactPlaythrough?: ReactPlaythroughMetadata;
143
126
  }
144
127
  }
145
128
 
146
- export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type ReactPlaythroughCheckpointKind, type ReactPlaythroughEvidence, type ReactPlaythroughInputKind, type ReactPlaythroughMetadata, type ReactPlaythroughOptions, type ReactPlaythroughTest, type StepUntilOptions, auditReactPlaythroughRun, playthroughTest };
129
+ export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAssertContext, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type ReactPlaythroughAutonomousStage, type ReactPlaythroughEnterStage, type ReactPlaythroughEvidence, type ReactPlaythroughFinishStage, type ReactPlaythroughInteractiveStage, type ReactPlaythroughMetadata, type ReactPlaythroughOptions, type ReactPlaythroughStage, type ReactPlaythroughStageEvidence, type ReactPlaythroughStageKind, type ReactPlaythroughTest, type StepUntilOptions, auditReactPlaythroughRun, playthroughTest };
@@ -33,114 +33,97 @@ interface StepUntilOptions {
33
33
  * The value is sampled only when the bound is exhausted.
34
34
  */
35
35
  diagnostics?: () => unknown;
36
+ /** 测试超时或运行取消时停止继续推进,通常由 playthroughTest 自动传入。 */
37
+ signal?: AbortSignal;
36
38
  }
37
39
 
40
+ type ReactPlaythroughStageKind = "entered" | "milestone" | "progress" | "terminal";
41
+ /** 一段已完成玩法留下的可序列化证据。 */
42
+ interface ReactPlaythroughStageEvidence {
43
+ name: string;
44
+ kind: ReactPlaythroughStageKind;
45
+ domInputEvents: number;
46
+ advancedSteps: number;
47
+ assertions: number;
48
+ stateChanged: boolean;
49
+ before: string;
50
+ after: string;
51
+ }
38
52
  /** 单条 React 主流程测试留下的可序列化运行期证据。 */
39
53
  interface ReactPlaythroughEvidence {
40
- /** 捕获阶段观察到的键盘、指针或触摸类 DOM 输入总数。 */
41
54
  domInputEvents: number;
42
- /** 由 performInput 明确标记的入口输入次数。 */
43
- entryInputs: number;
44
- /** 由 performInput 明确标记的核心玩法输入次数。 */
45
- primaryInputs: number;
46
- /** 在步数上限内成功满足条件的 stepUntil 次数。 */
47
- boundedRuns: number;
48
- /** 最后一次 stepUntil 成功后新增的 Vitest 断言数。 */
49
- assertionsAfterOutcome: number;
50
- /** 已记录的 checkpoint 类型,供 reporter 给出精确提示。 */
51
- checkpoints: ReactPlaythroughCheckpointKind[];
52
- /** helper 是否已经完成全部证据校验。 */
55
+ stages: ReactPlaythroughStageEvidence[];
53
56
  verified: boolean;
54
57
  }
55
58
  /** 通过 Vitest task metadata 从 worker 传递给主线程 reporter 的数据。 */
56
59
  interface ReactPlaythroughMetadata {
57
- /** metadata 结构版本,用于拒绝无法识别的旧数据。 */
58
- version: 3;
59
- /** 静态、非交互项目跳过主流程验证时必须提供的理由。 */
60
+ version: 4;
60
61
  waiverReason?: string;
61
- /** 仅供失败 reporter 兜底读取;成功运行不会输出。 */
62
62
  trace?: string;
63
- /** 测试执行期间持续更新的客观证据。 */
64
63
  evidence: ReactPlaythroughEvidence;
65
64
  }
66
-
67
- /** 玩家输入在最低可玩流程中的语义阶段。 */
68
- type ReactPlaythroughInputKind = "entry" | "primary";
69
- /** 可审计流程签到;entered 是入口,progress/terminal 是有效结果。 */
70
- type ReactPlaythroughCheckpointKind = "entered" | "progress" | "terminal";
71
- /** Canvas/Controller flows declare one authoritative read; simple DOM flows omit it. */
72
65
  interface ReactPlaythroughOptions {
73
- /** Stable, JSON-serializable production state sampled across the audited flow. */
66
+ /** Canvas/Controller flows expose one stable authoritative production read. */
74
67
  observe: () => unknown;
75
68
  }
76
- /** 主流程回调唯一需要学习的测试工具。 */
69
+ interface ReactPlaythroughAssertContext {
70
+ expect: ExpectStatic;
71
+ user: UserEvent;
72
+ view: RenderResult;
73
+ }
74
+ interface ReactPlaythroughStageShared {
75
+ until: () => boolean;
76
+ assert: (context: ReactPlaythroughAssertContext) => void | Promise<void>;
77
+ maxSteps?: number;
78
+ diagnostics?: () => unknown;
79
+ }
80
+ type ReactPlaythroughInteractiveStage = ReactPlaythroughStageShared & {
81
+ act: () => void | Promise<void>;
82
+ step?: StepUntilOptions["step"];
83
+ };
84
+ type ReactPlaythroughAutonomousStage = ReactPlaythroughStageShared & {
85
+ act?: never;
86
+ step: NonNullable<StepUntilOptions["step"]>;
87
+ };
88
+ type ReactPlaythroughStage = ReactPlaythroughInteractiveStage | ReactPlaythroughAutonomousStage;
89
+ /** 合法入口必须由真实生产 DOM 输入驱动,不能用自动 step 代替。 */
90
+ type ReactPlaythroughEnterStage = ReactPlaythroughInteractiveStage;
91
+ type ReactPlaythroughFinishStage = ReactPlaythroughStage & {
92
+ kind: "progress" | "terminal";
93
+ };
94
+ /** 游戏作者只编排进入、领域里程碑和最终结果。 */
77
95
  interface ReactPlaythroughArguments {
78
- /** Testing Library 对生产游戏入口的渲染结果。 */
79
96
  view: RenderResult;
80
- /** 已由 playthroughTest 创建的真实 DOM 用户输入驱动。 */
81
97
  user: UserEvent;
82
- /** Vitest 绑定到当前 test 的断言 API;结果断言必须使用这个实例。 */
83
- expect: ExpectStatic;
84
- /**
85
- * 包裹一段真实 DOM 输入并声明用途。
86
- * entry 用于进入合法游戏状态,primary 用于移动、挥拍、拖拽、落子等核心操作。
87
- */
88
- performInput(kind: ReactPlaythroughInputKind, input: () => void | Promise<void>): Promise<void>;
89
- /**
90
- * 记录流程签到。先在 entry 后记录 entered,再在 primary、stepUntil 和
91
- * 结果断言后记录 progress 或 terminal。
92
- */
93
- checkpoint(kind: ReactPlaythroughCheckpointKind): void;
94
- /**
95
- * 在硬性步数上限内等待权威结果。
96
- * 返回后必须再断言该结果,进入中间 active/running 状态不算完成。
97
- * 即时结果不需要 step;时间、帧或自定义 scheduler 流程必须传入确定性 step。
98
- */
99
- stepUntil(condition: () => boolean, options?: StepUntilOptions): Promise<number>;
98
+ enter(stage: ReactPlaythroughEnterStage): Promise<void>;
99
+ milestone(name: string, stage: ReactPlaythroughStage): Promise<void>;
100
+ finish(name: string, stage: ReactPlaythroughFinishStage): Promise<void>;
100
101
  }
101
- /** 使用方编写的生产玩法步骤;既支持同步游戏,也支持异步 DOM 输入。 */
102
102
  type ReactPlaythroughRun = (arguments_: ReactPlaythroughArguments) => void | Promise<void>;
103
- /** 低配置主流程测试函数及其结构化豁免入口。 */
104
103
  interface ReactPlaythroughTest {
105
- /** 渲染生产入口并声明一条最低可玩主流程。 */
106
104
  (element: ReactNode, run: ReactPlaythroughRun): void;
107
- /** Use one authoritative observer when gameplay results live outside the DOM. */
108
105
  (element: ReactNode, options: ReactPlaythroughOptions, run: ReactPlaythroughRun): void;
109
- /** 仅允许带充分理由地豁免确实没有玩家输入的项目。 */
110
- skip(reason: string, element: ReactNode, run: ReactPlaythroughRun): void;
106
+ skip(reason: string, element: ReactNode): void;
111
107
  }
112
108
  /** reporter 从单个 Vitest TestCase 提取出的稳定审计输入。 */
113
109
  interface ReactPlaythroughAuditInput {
114
- /** 包含 describe 层级的完整测试名,仅用于诊断输出。 */
115
110
  name: string;
116
- /** Vitest 报告的最终执行状态。 */
117
111
  state: "passed" | "failed" | "skipped" | "pending";
118
- /** 只有 playthroughTest 声明的测试才具备该字段。 */
119
112
  metadata?: ReactPlaythroughMetadata;
120
113
  }
121
- /** 整次 Vitest 运行的最低可玩性审计结果。 */
122
114
  interface ReactPlaythroughAuditResult {
123
- /** 是否满足有效主流程或有效豁免。 */
124
115
  passed: boolean;
125
- /** 是否依靠显式非交互理由通过,而非执行了主流程。 */
126
116
  waived: boolean;
127
- /** 可直接指导模型补测的稳定问题列表。 */
128
117
  issues: string[];
129
118
  }
130
119
  /** React 游戏测试的最低可玩主流程入口。 */
131
120
  declare const playthroughTest: ReactPlaythroughTest;
132
- /**
133
- * 供 Vitest reporter 与确定性契约测试共用的纯审计函数。
134
- *
135
- * 它只验证客观流程证据,不能理解任意游戏的胜负语义;具体结果仍由
136
- * 使用方在 stepUntil 返回后通过权威状态或玩家可见结果断言。
137
- */
121
+ /** 供 Vitest reporter 与确定性契约测试共用的纯审计函数。 */
138
122
  declare function auditReactPlaythroughRun(tests: ReactPlaythroughAuditInput[]): ReactPlaythroughAuditResult;
139
123
  declare module "vitest" {
140
124
  interface TaskMeta {
141
- /** 供 ReactPlaythroughReporter 汇总的可序列化主流程证据。 */
142
125
  reactPlaythrough?: ReactPlaythroughMetadata;
143
126
  }
144
127
  }
145
128
 
146
- export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type ReactPlaythroughCheckpointKind, type ReactPlaythroughEvidence, type ReactPlaythroughInputKind, type ReactPlaythroughMetadata, type ReactPlaythroughOptions, type ReactPlaythroughTest, type StepUntilOptions, auditReactPlaythroughRun, playthroughTest };
129
+ export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAssertContext, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type ReactPlaythroughAutonomousStage, type ReactPlaythroughEnterStage, type ReactPlaythroughEvidence, type ReactPlaythroughFinishStage, type ReactPlaythroughInteractiveStage, type ReactPlaythroughMetadata, type ReactPlaythroughOptions, type ReactPlaythroughStage, type ReactPlaythroughStageEvidence, type ReactPlaythroughStageKind, type ReactPlaythroughTest, type StepUntilOptions, auditReactPlaythroughRun, playthroughTest };