Skip to main content

rpiv-loop-validate

根据项目结构自动选择 lint、测试、构建及可选服务检查,并输出摘要

Jump to install

Source facts

Repository
zhuqingxun/zqxbase
Last source activity
September 9, 2026 at 07:14
Detected SKILL.md language
Chinese
Stars
0
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
rpiv-loop:validate
description
根据项目结构自动选择 lint、测试、构建及可选服务检查,并输出摘要
allowed-tools
Read, Bash, Edit, Grep, Glob
version
2.17.15
> `<rpiv-loop-root>` 解析顺序:环境变量 `RPIV_LOOP_ROOT` -> `CLAUDE_PLUGIN_ROOT` -> 当前插件根目录;均不存在时停止并请用户配置 `RPIV_LOOP_ROOT` 或 `CLAUDE_PLUGIN_ROOT`。 # 运行项目的全面验证 按项目类型执行验证并报告。优先采用项目自定义的验证方式,否则根据检测到的技术栈自动选择 lint、测试、构建及可选的服务健康检查。 --- ## 第 0 步:项目级 DoD gates(rpiv/dod.yaml) **若存在 `rpiv/dod.yaml`**(由 rpiv-loop 入口 skill 幂等创建、用户按项目修订),先读取其 `gates` 逐条执行,再继续后续验证流程(本步不短路「优先级 0」与「按类型检测」): 1. 命令型 `verification_method` → 运行并记录退出码;与后续步骤将执行的命令相同时(如 `uv run pytest`)只跑一次,复用结果 2. `verification_method: manual_review` → 不自动执行,在摘要报告中列为「人工确认」项 3. 命令因工具/脚本缺失无法执行 → 该 gate 记为失败,并提示用户修订 dod.yaml(模板允许删除或替换不适用条目) 4. **判定**:任一 `blocking: true` 的 gate 失败 → 整体健康评估记为**失败**;非 blocking gate 失败仅记警告 5. 不存在 `rpiv/dod.yaml` → 跳过本步,不视为异常 执行结果在「摘要报告」的「DoD gates」小节逐条列出(gate id / blocking / 通过与否 / 证据摘要)。 --- ## 第 0.5 步:产物类型分派(skill 分支入口) **PRD 定位规则**:复用本文件「AC 逐条证据采集」章节已确立的 `<feature>` 输入契约——该契约的路径是 `rpiv/validation/<feature>/acceptance.yaml`,本步同构地读取 `rpiv/requirements/prd-<feature>.md` 的 frontmatter `product_types` 字段。**不引入任何新的"如何确定当前 feature"机制。** **两种缺省一律静默回落 `[code]`**——不报错、不中断流程、不在报告中标记为异常: 1. PRD 文件存在但无 `product_types` 字段 → 按 `[code]`(存量 PRD 无需回填) 2. 按约定路径找不到 PRD 文件 → 按 `[code]`。**这不是理论情况**:PRD 归档后会被移动到 `rpiv/archive/`,约定路径就此失效,任何已交付归档的历史特性再跑 validate 都会命中这条 分派规则: 1. **含 `skill`** → 执行 skill 验证分支:Read `<rpiv-loop-root>/references/skill-authoring/skill-validation-checklist.md`,按其通用质量门与分层验收清单逐项验收,结果记入「摘要报告」新增的「skill 质量门」小节 2. **含 `code`** → 继续下方「优先级 0」与「按类型检测与执行」,行为不变 3. **`[code, skill]`** → 两条分支**都执行**,摘要报告分节呈现,互不遮蔽 4. **纯 `[skill]`(不含 `code`)** → **跳过**下方「优先级 0」与「按类型检测与执行」的代码侧流程,直接进入「摘要报告」。此时代码检查 / 测试 / 覆盖率 / 构建各项一律标注「**不适用(纯 skill 产物)**」,**不得**输出「未执行自动验证」——纯 Markdown 产物落入 3.7 节「其他 / 未识别」而整体标为未验证,正是本分派要消除的空转 **本步不被「优先级 0」短路**:即使项目命中了自定义验证入口(脚本 / Make / 包管理器 script),skill 分支仍须执行——「优先级 0」的「直接进入摘要报告」只作用于代码侧验证流程。 --- ## 优先级 0:项目自定义 **先依次检查,若存在则按该方式执行,并直接进入文末「摘要报告」;否则继续「按类型检测与执行」。** 1. **脚本**:`./scripts/validate.sh`、`./scripts/validate`(或 Windows 下 `.cmd`、`.ps1`) 2. **Make**:`make validate`(若存在 Makefile 且包含 validate 目标) 3. **包管理器入口**:`npm run validate`、`pnpm validate`、`uv run validate`(或 pyproject 的 `[project.scripts]` 中的 validate) 4. **项目内命令定义**:`项目/.claude/commands/validation/validate.md` 或 `docs/validate-commands.md`(若存在,按其中步骤执行) 5. **CLAUDE.md / README**:若在「验证命令」「测试」「常用命令」等章节中**明确列出**用于验证的完整命令序列(如 `pytest -m "not slow"`、`ruff check .`),则按该序列执行 --- ## 按类型检测与执行 若优先级 0 均未命中,先检测项目结构,再按类型执行。 ### 3.1 检测项目结构 通过 `ls`、`test -f`、`git ls-files` 等查找: - `pyproject.toml`、`requirements.txt`、`setup.py` → 视为含 **Python** - `package.json`(根目录或 `frontend/`、`packages/*`)→ 视为含 **Node/前端** - `go.mod`、`Cargo.toml` → 视为 **Go**、**Rust** - `backend/`、`frontend/`、`src/`、`packages/` → 用于确定工作目录 ### 3.2 Python - **工作目录**:若存在 `backend/` 则 `backend/`,否则 `src/`(若存在),否则项目根 - **运行方式**:若项目使用 uv(存在 `uv.lock` 或 `pyproject.toml` 中 `[tool.uv]` 等),优先 `uv run <cmd>`;否则 `python -m` 或 `pip` 安装后直接命令 **Lint**(按存在性选择其一,**均无则跳过并注明**): - 存在 `[tool.ruff]`、`ruff.toml` 或项目常用 ruff → `uv run ruff check .` 或 `ruff check .` - 存在 `[tool.flake8]` 或 `.flake8` → `flake8 .` 或 `flake8 <常用目录>` - 存在 pylint 配置 → `pylint <目标模块或目录>` **Test**: - 存在 `pytest` 或 `[tool.pytest]` → 按上方「运行方式」选择 `uv run pytest -v` 或 `pytest -v`(若 CLAUDE/README 有约定如 `-m "not slow"` 则加上);若无 pytest 有 `unittest` → 按上方「运行方式」选择 `uv run python -m unittest discover` 或 `python -m unittest discover`;均无则跳过并注明 **Coverage**: - 若 `[tool.coverage]` 或项目惯用 `--cov`,运行 `pytest --cov=<包名> --cov-report=term-missing`;否则**可选**跳过 ### 3.3 Node / 前端 - **工作目录**:`frontend/`、`packages/frontend` 或 根(若仅有一个 `package.json`) - **包管理器**:若存在 `pnpm-lock.yaml` 用 `pnpm`,否则 `npm` **Lint**:若 `package.json` 的 `scripts` 中有 `lint` → `npm run lint` 或 `pnpm lint`;否则跳过并注明 **Test**:若 `scripts` 中有 `test` → `npm test` 或 `pnpm test`;否则跳过 **Build**:若 `scripts` 中有 `build` → `npm run build` 或 `pnpm build`;否则跳过 ### 3.4 多组件(如 backend + frontend) - 先对 **backend**(按 3.2 若为 Python,或按 3.3 若为 Node)在对应工作目录下执行 - 再对 **frontend** 按 3.3 执行 - 若根目录的 `package.json` 仅为 monorepo 根、无实质代码,不重复跑根目录的 lint/test ### 3.5 Go 在工作目录(含 `go.mod` 的目录或根)执行: ```bash go build ./... go test ./... ``` ### 3.6 Rust 在工作目录(含 `Cargo.toml` 的目录或根)执行: ```bash cargo build # 或 cargo check cargo test ``` ### 3.7 其他 / 未识别 若未识别到 Python/Node/Go/Rust 的常见结构,注明:「未自动识别到常见技术栈,请参考 README、CLAUDE.md 或 CI(如 .github/workflows)中的验证步骤」。可仅输出报告,整体标为「未执行自动验证」。 --- ## 可选:服务健康检查 - **条件**:CLAUDE.md 或 README 中**明确写出**启动命令(如 `uvicorn xxx:app --port 8765`、`npm run dev`)以及健康或文档 URL(如 `/health`、`/docs`、`http://localhost:8765/...`) - **步骤**:按文档启动(后台),等待 2–5 秒后请求该 URL,根据状态码判断通过/失败 - **停止**:若文档未要求长期运行,验证后可尝试停止: - **Windows**:`taskkill /F /IM <进程名>` 或按端口查进程后结束 - **Unix**:`lsof -ti:<端口> | xargs kill -9` 或 `pkill -f <可识别子串>` - 若无法可靠停止或存在权限/环境差异,可**不执行停止**,只在报告中写明「已进行健康检查,请必要时手动停止服务」 - **未写明**:跳过并注明「未发现启动命令与健康检查 URL,已跳过服务验证」 --- ## AC 逐条证据采集(强约束) **输入契约**:`rpiv/validation/<feature>/acceptance.yaml`(由 plan-feature 阶段产出骨架,已含 `id / given / when / then / verification_method / blocking`)。 **本阶段职责**:对 `acceptance.yaml` 中的每一条 AC,执行其 `verification_method` 并**逐条填写 `evidence` 与 `status`**。 ### 操作步骤 1. **读取 acceptance.yaml**:通过 `Read` 工具载入全部 AC 条目 2. **逐条执行 `verification_method`**: - 命令型(如 `uv run pytest ...`)→ 运行并捕获输出 - 脚本型(如 `bash tests/integration/*.sh`)→ 运行并记录退出码 - 可视/手工型(如 smoke screenshot)→ 产生截图后登记路径 3. **翻 `status`**: - `passed`:执行成功且证据充分 - `failed`:执行失败或证据与 `then` 断言不符 - `not_applicable`:环境不支持(此时 `notes` 必须说明理由) 4. **填 `evidence`**(**禁止模糊文本**): - 测试类:`tests/test_xxx.py::test_name` 或 `tests/test_xxx.py:123` - 命令类:关键 stdout/stderr 片段(≤ 200 字符)或完整输出文件路径 - 日志类:`logs/validate-<date>.log` 的行号片段 - 截图类:`docs/screenshots/<feature>-ac-NNN.png` - **反例**:`evidence: "已测"`、`evidence: "OK"`、`evidence: "通过"` — 这类一律视为 failed ### 禁止修改的字段 本阶段**只能**动 `evidence / status / notes` 三个字段。以下字段是 plan 阶段产出的契约,validate 阶段**禁止改动**: - `id` — 唯一标识 - `given / when / then` — Gherkin 三段 - `verification_method` — 验证手段 - `blocking` — 强/软约束标记 如发现 plan 阶段的 AC 本身有问题(措辞模糊、验证方法不可执行),回退到 plan-feature 阶段修订,不要在 validate 阶段绕过。 ### 完成后校验 本阶段结束前**必须**运行: ```bash uv run --no-project python <rpiv-loop-root>/tools/check_acceptance.py <feature> ``` - 退出码 `0` → 所有 blocking AC 均 passed 或 not_applicable(且 evidence/notes 非空)→ 可进入 delivery-report - 退出码 `1` → 有 blocking AC 未过,按输出清单补齐 - 退出码 `2` → 文件缺失或 YAML 格式错误,修文件后重跑 --- ## 摘要报告 所有验证(及可选的服务检查)完成后,提供包含以下内容的摘要报告: - **DoD gates**:逐条列出 `rpiv/dod.yaml` 的 gate 结果(id / blocking / 通过与否 / manual_review 项列为人工确认);无 dod.yaml 时标注「未配置」 - **skill 质量门**:产物类型含 `skill` 时,逐条列出通用质量门与分层验收结果(未含 skill 时标注「不适用」) - **代码检查(Lint)**:通过 / 失败 / 未执行(及原因) - **测试**:通过 / 失败 / 未执行(及原因) - **覆盖率**:百分比或「未执行」(若执行了带 coverage 的测试) - **构建**:通过 / 失败 / 未执行(若执行了 build) - **服务健康检查**:通过 / 失败 / 未执行(若执行了) - **错误或警告**:列出的具体信息 - **整体健康评估**:**通过** / **失败** 使用清晰标题和状态符号(如 ✓/✗ 或 通过/失败)格式化。 --- ## 跨平台与边界说明 - **工作目录**:所有 `cd` 与命令均在上述「工作目录」下执行;多组件时分别 `cd` 到 backend 与 frontend。 - **杀进程 / 停服务**:仅在「可选:服务健康检查」中涉及;若环境难以可靠杀进程,以「报告 + 提示用户手动停止」代替,不要求必须成功杀进程。 - **存在性判断**:通过 `test -f`、`ls`、`cat package.json | grep scripts` 等可脚本化方式判断,避免主观假定。
View on GitHub