用途:为 Drupal 贡献提供快速内循环验证,在本地按 CI 真实严格度复现 drupalci 任务,并运行 AI 政策门与 eval 门。所有门只在有实际产物(命令输出、diff、真实结果)时才判定通过,绝不只报「通过」。可被 /drupal-ai-contrib:verify 调用。
主要能力:先做环境匹配,从 .gitlab-ci.yml 读取 _TARGET_CORE、TARGET_PHP、GITLAB_TEMPLATES_REF、PHPUNIT_CONCURRENT、SKIP*、OPT_IN_TEST* 等,安装对应核心版本与 drupal/core-dev,使 phpunit/phpstan 解析到 CI 使用的版本;版本按解析得到而非写死。随后解析启用的门集合及各任务实际阻断状态(allow_failure、SKIP),并运行 drupalci-parity 门:composer(validate + install)、phpcs(项目 phpcs.xml.dist,Drupal 与 DrupalPractice,drupal/coder 固定 ^8.3,默认阻断)、phpstan(allow_failure 默认 true,报告但标记非阻断)、phpunit(核心配置 vendor/bin/phpunit -c web/core/phpunit.xml.dist --webroot=web,_PHPUNIT_CONCURRENT: 1 时改用 core/scripts/run-tests.sh,零失败零警告零弃用才算通过)、cspell、eslint/stylelint(有 JS/CSS 且未跳过时)。JS/CSS 工具需按 CI 方式解析配置,例如链接 .eslintrc.passing.json、.eslintrc.jquery.json、.prettierrc.json 与 .prettierignore,并运行任务本身完整调用(含 --no-error-on-unmatched-pattern、--ignore-pattern=".es6.js"、--resolve-plugins-relative-to=<core>、--ext=.js,.yml),注意写入贡献仓库内的链接事后要删除。
AI 政策门每次运行:派发 drupal-ai-contrib:ai-policy-checker 获取最新政策与 ai_best_practices,不写死政策文本;通过需记录披露决定、确认验证清单、附上实时抓取的政策状态。政策源不可达则记为 UNRUN,不得记通过。eval 门为尽力而为:若存在 evals/evals.json 则本地运行,缺失或 schema 变更时静默降级,不硬依赖、不固定 schema、不采用 promptfoo。
重新验证:任何在通过后被再次编辑的路径即失效,PostToolUse 钩子记录编辑账本,可用 ${CLAUDE_PLUGIN_ROOT}/scripts/reverify-list.sh 读取、用 ${CLAUDE_PLUGIN_ROOT}/scripts/reverify-list.sh --clear 清除;报告前需对所有失效路径重跑对应门。报告须给出每道门的实际阻断状态、PASS/FAIL/UNRUN 及捕获产物;opt-in 变体(OPT_IN_TEST_PREVIOUS_MAJOR 等,v1.15.0+ 改为手动触发)标为 UNRUN。
限制:本地无法运行的门(如 _MAX_PHP)报 UNRUN 并交由 contribution-pipeline;本地版本与 _TARGET_CORE 不一致时的绿色不构成证据。验证的是未审查贡献的代码,属不可信代码执行(composer 脚本与测试套件会运行任意 PHP),建议在进程级沙箱运行(如 @anthropic-ai/sandbox-runtime),完全不可信仓库应使用专用 VM 或 Claude Code on the web。大型代码库应把门限定在改动子树。缺少 .gitlab-ci.yml 时报告缺口并指向 /drupal-ai-contrib:setup。偏向一致性与标准哲学审查交由 code-quality-tools。