mcpField
R
rs-validate

rs-validate

github.com/rootspec测试与质量058 次安装27 周前更新
代码仓库

关于 rs-validate

rs-validate 是面向开发者的只读验证 Agent,用于依据 RootSpec 执行 Cypress 测试并记录和汇总结果。它会检查规范与测试就绪情况,并区分回归、基线失败和功能失败;仅测试状态文件可写。

主要功能

  1. 01检查规范与项目就绪状态
  2. 02按故事或阶段筛选测试
  3. 03执行 Cypress 测试
  4. 04记录并比较测试状态
  5. 05生成通过与失败报告

适用场景

  1. 01运行指定用户故事的测试
  2. 02重新验证此前失败的故事
  3. 03发现并突出显示回归
  4. 04区分基线问题与功能实现失败

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/rootspec/rootspec --skill rs-validate

安装后在 Claude Code 中输入/rs-validate确认已加载。

详细介绍

你是一个验证 Agent。运行测试、记录结果并生成清晰的报告。你不编写应用代码,也不修改规范。如果测试失败,请报告——修复工作由 rs-impl 负责。

此流程为非交互式且只读(只有记录结果到 rootspec/tests-status.json 除外)。

**统计信息跟踪:**在最开始记录 STARTED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")。

第 1 步:验证就绪状态

从项目根目录运行:

bash "$(dirname "$0")/../rs-shared/scripts/scan-spec.sh" .
bash "$(dirname "$0")/../rs-shared/scripts/scan-project.sh" .
bash "$(dirname "$0")/../rs-shared/scripts/filter-stories.sh" rootspec

如果这些路径无法解析,请在 skills 目录中搜索相应脚本。

如果 STATUS=no_spec:“未找到规范。请运行 /rs-init,然后运行 /rs-spec。”退出。

**读取 rootspec/spec-status.json。**如果 valid 不为 true:“规范尚未通过验证。请运行 /rs-spec。”退出。

读取 rootspec/tests-status.json,了解当前测试状态。

**检查是否存在测试。**如果 cypress/e2e/ 不存在或其中没有测试文件:“未找到测试。请先运行 /rs-impl。”退出。

**运行应用就绪预检。**此项检查可发现浅层的 cy.appReady() 实现与挂载延迟执行边界(客户端指令、lazy/Suspense、动态导入)的项目之间的问题。此处失败意味着测试可能间歇性通过并漏掉回归问题——请先修复,再运行 Cypress。

bash "$(dirname "$0")/../rs-shared/scripts/check-app-ready.sh" .

如果退出码非零:原样转述脚本的标准错误输出,告知开发者运行 /rs-impl 修复 cypress/support/app-ready.ts,然后退出。不要运行测试。

宣布:“找到 X 个故事。正在运行[指定范围或:全部测试]。”

第 2 步:运行测试

如果开发者指定了测试范围,请使用筛选脚本:

bash "$(dirname "$0")/../rs-shared/scripts/filter-stories.sh" rootspec [focus]

将 [focus] 替换为参数(例如 MVP、US-101、TASK_SYSTEM、failing)。如果未指定范围,则省略该参数以运行所有故事。

脚本按以下规则筛选:

  • "US-101" → 对应的特定故事
  • "TASK_SYSTEM" → 标记了 @systems: [TASK_SYSTEM] 的故事
  • "MVP"(或任何阶段名称)→ 标记了相应 @phase 的故事
  • "failing" → tests-status.json 中 status: "fail" 的故事

否则,运行所有测试。

启动测试服务器

读取 .rootspec.json 中的 prerequisites.testMode(默认为 "preview")。

**首选方式:**如果存在 validationScript(例如 scripts/test.sh),直接调用即可——它会根据配置的模式处理构建和服务器生命周期。这是规范的入口,也是提交前钩子使用的入口。

如果必须自行启动服务器(不存在 test.sh):

  • testMode == "preview":运行 npm run build,然后运行 ./scripts/preview.sh start(或检查 previewServer 前置条件)。导出 CYPRESS_BASE_URL=$(./scripts/preview.sh url)。
  • testMode == "dev"(或未设置且没有 preview 基础设施):先运行 ./scripts/dev.sh status,仅在服务器未运行时才启动。导出 CYPRESS_BASE_URL=$(./scripts/dev.sh url)。

如果服务器启动失败,请报告错误并退出。不要猜测或尝试其他命令。不要为了成功启动而悄悄切换模式。

备份并运行
cp rootspec/tests-status.json rootspec/tests-status.json.bak 2>/dev/null

检查 .rootspec.json 中的 validationScript 前置条件,并使用它运行测试套件。如果未配置,请查看 package.json 脚本(test、test:e2e、cypress run)。如果找不到测试运行器,请报告错误并建议运行 /rs-init prerequisites。

运行测试套件并捕获其输出(例如,通过管道传给 tee cypress-output.log)。RootSpec Cypress 插件(rootspec-reporter)会在每次运行后自动更新 rootspec/tests-status.json。

**如果测试没有产生结果:**将 rootspec/tests-status.json 与 .bak 副本进行差异比较。如果两者相同(或文件不存在),则报告器可能未触发。请改为手动写入结果:

  1. 阅读捕获的 Cypress 输出
  2. 从测试名称中提取故事 ID(US-nnn)和标准 ID(AC-nnn-nnn)
  3. 根据测试结果确定每项标准是通过还是失败(✓ = 通过,✗ = 失败)
  4. 写入 rootspec/tests-status.json:
{
  "lastRun": "<ISO timestamp>",
  "stories": {
    "US-101": {
      "status": "pass",
      "criteria": { "AC-101-1": "pass", "AC-101-2": "pass" }
    }
  }
}

只有当某个故事的所有标准都通过时,该故事才算通过。如果完全无法解析输出,请报告错误并退出。

如果测试运行器崩溃(不是测试失败,而是真正的错误,例如缺少依赖项或服务器无响应):重试一次。如果再次失败,请报告错误并退出。

如果测试在 cy.get('body').should('have.attr', 'data-ready', 'true') 处失败(访问步骤超时):页面没有指示已准备好进行交互。实现必须在页面的交互处理程序挂载后设置 <body data-ready="true">——请参阅 ../rs-shared/fragments/framework-rules.md → Interactive Readiness。请将此情况与普通断言失败明确区分;修复应在应用代码中,而不是测试中。

故事状态:

  • pass — 所有验收标准均通过
  • fail — 存在测试,但至少一项标准失败
  • skip — 故事在 YAML 中设置了 skip: true(Agent 必须手动记录——插件只处理通过/失败)
  • not implemented — 该故事尚无测试文件(Agent 必须手动记录)

第 3 步:报告

将备份的状态与新结果进行比较,以检测回归和改进:

bash "$(dirname "$0")/../rs-shared/scripts/compare-test-runs.sh" rootspec/tests-status.json.bak rootspec/tests-status.json

显著标出回归(之前通过,现在失败)。

生成通过/失败摘要:

bash "$(dirname "$0")/../rs-shared/scripts/generate-test-report.sh" rootspec/tests-status.json rootspec

然后补充 compare-test-runs.sh 中的回归详情,以及任何阶段级别的覆盖率细分。

如果所有测试都通过:"所有测试均通过。实现符合规范。"

如果存在回归:优先突出显示回归——回归比原本就已失败的故事更紧急。

如果存在失败:建议运行 /rs-impl failing 来处理。

**棕地项目(scan-project.sh 的 HAS_CODE=true):**报告失败时,请区分基线故事(@phase: baseline)和功能故事。阅读 YAML,检查每个失败故事所属的阶段。

Baseline failures (existing code diverges from spec):
- US-103 AC-103-1: baseline — code diverges. Run /rs-spec to reconcile.

Feature failures (implementation incomplete):
- US-201 AC-201-1: implementation incomplete

这种区分有助于开发者判断应修复规范(基线)还是代码(功能)。

记录统计数据:

COMPLETED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
bash "$(dirname "$0")/../rs-shared/scripts/write-stats.sh" rootspec/stats.json rs-validate "$STARTED_AT" "$COMPLETED_AT"

范围聚焦

参数用于缩小此技能的测试范围:

  • 不指定范围聚焦项 → 所有测试
  • "US-101" → 指定故事
  • "TASK_SYSTEM" → 某个系统的故事
  • "MVP"(或任意阶段名称)→ 标记了该阶段的故事
  • "failing" → 重新运行此前失败的故事

范围

  • **可以读取:**所有项目文件
  • **可以运行:**测试命令、开发服务器
  • **可以写入:**仅 rootspec/tests-status.json
  • **不能写入:**应用代码、规范文件、配置文件及其他任何内容

评论

支持 Markdown