## MODIFIED Requirements ### Requirement: CheckerRegistry 注册中心 系统 SHALL 在 `src/server/checker/runner/registry.ts` 中提供 `CheckerRegistry` 类,支持 `register(checker)`、`get(type)` 和 `supportedTypes`。重复注册同一 type SHALL 抛出错误。registry 内部 SHALL 存储 `CheckerDefinition`(使用默认泛型参数),对外提供类型擦除后的接口。 #### Scenario: 查询支持的 type 列表 - **WHEN** 注册了 "http" 和 "cmd" 两个 checker 后查询 `registry.supportedTypes` - **THEN** 返回的数组 SHALL 包含 `["http", "cmd"]`(按注册顺序) ### Requirement: Command checker 提供契约片段 系统 SHALL 支持 checker 提供自身 TypeBox 配置契约片段,用于描述该 checker 的 defaults 分组、target 领域分组和 expect 分组。 #### Scenario: Cmd checker 提供契约片段 - **WHEN** Cmd checker 被注册 - **THEN** registry SHALL 能提供 Cmd defaults、Cmd target 和 Cmd expect 的 TypeBox 契约片段 ### Requirement: 配置解析通过 registry 委托 checker 系统 SHALL 在 `config-loader.ts` 的配置加载流程中通过 `checkerRegistry` 发现已注册 checker,组合公共 TypeBox 契约与 checker 契约,并将 checker 专属语义校验和解析委托给对应 checker。 #### Scenario: 配置解析委托 checker - **WHEN** config-loader 解析一个 type 为 "cmd" 的 target - **THEN** config-loader SHALL 调用 `checkerRegistry.get("cmd")` 获取对应 checker,并委托该 checker 执行语义校验和 resolve ### Requirement: Command text 断言位于 Cmd 目录 系统 SHALL 在 checker 专用目录中提供 text 断言函数。 #### Scenario: Command text 断言位于 Cmd 目录 - **WHEN** Cmd checker 需要对 stdout/stderr 执行文本规则校验 - **THEN** SHALL 调用 `runner/cmd/text.ts` 中的 `checkTextRules(text, rules, phase)` ### Requirement: Command 专用 expect 系统 SHALL 在 checker 专用目录中提供 exitCode 断言函数。 #### Scenario: Command 专用 expect - **WHEN** Cmd checker 需要校验退出码 - **THEN** SHALL 调用 `runner/cmd/expect.ts` 中的 `checkExitCode()` ### Requirement: Checker 接口定义 系统 SHALL 在 `src/server/checker/runner/types.ts` 中定义面向扩展的泛型 `CheckerDefinition`,包含 `type`、`configKey`、TypeBox 配置契约、启动期语义校验、`resolve`、`execute`、`serialize` 成员。 #### Scenario: type 与 configKey 默认一致 - **WHEN** checker 定义 `type: "cmd"` - **THEN** checker 的 `configKey` SHALL 默认使用 `"cmd"`,对应 target 的 `cmd` 分组和 defaults.cmd 分组