ワンクリックで
harness-verify
动态设计验证。通过 Playwright 在真实浏览器中运行并截图,测试响应式视口、WCAG 可访问性、Console 错误。替换纯静态 diff 分析,用视觉证据说话。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
动态设计验证。通过 Playwright 在真实浏览器中运行并截图,测试响应式视口、WCAG 可访问性、Console 错误。替换纯静态 diff 分析,用视觉证据说话。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
模块开发主循环。轻量协调者:加载上下文后调用 harness-onboard(需求分类+影响面+流程确认),再调用 harness-roles(帽子系统多角色执行),最后沉淀上下文。通常由 .harness/AGENTS.md 自动激活,也可通过 /harness-dev 显式调用。
在当前模块目录下初始化 Harness 框架。扫描代码结构、预填上下文文件、引导开发者逐节审核确认,最终写入 .harness/ 目录。适用于 cmd/、apps/、pkg/ 下的任意模块。
升级当前模块 .harness/framework/ 到最新版本。三层分离设计保证 context/(开发者托管)和 overrides/ 永不被覆盖。可在 harness-dev 提示有新版本时调用,也可直接执行 /harness-upgrade。
Team-level AI spend visibility. Tracks token usage per PR, attribute costs to author/reviewer, generates exportable cost reports. Built on top of harness-roles budget tracking.
CI failure auto-fix. Reads failure logs, identifies root cause, applies fix, commits and creates PR. Triggered by workflow_run or called directly via /fix-ci.
需求分类 + 影响面分析 + 动态流程确认。从用户描述推断工作类型,fetch-first 扫描代码,输出影响面报告,解析 workflow/dev.md 的 rules 动态调整插槽列表,展示流程供用户确认调整,最终输出 resolved_slots JSON 交给 harness-roles 执行。
| name | harness-verify |
| description | 动态设计验证。通过 Playwright 在真实浏览器中运行并截图,测试响应式视口、WCAG 可访问性、Console 错误。替换纯静态 diff 分析,用视觉证据说话。 |
Anthropic Quickstart 的核心方法论:"Live Environment First" 在静态分析之前先用 Playwright 验证运行环境。 7-Phase Design Review:Interaction / Responsiveness / Visual / A11y / Robustness / Code / Console
用户:「验证这个 UI 变更」
用户:「在浏览器里看看这个页面」
用户:「截图看看效果」
用户:「检查一下响应式布局」
自动触发:当 harness-review 的评分处于 6-7 分区且涉及 UI 变更时,建议调用。
以下情况必须 live 验证:
- 涉及 HTML/CSS/JS 前端变更
- 涉及 UI 组件库变更
- 涉及页面布局、样式、响应式
- 涉及用户交互行为
以下情况可跳过:
- 纯后端 API 变更
- 配置文件变更
- 文档变更
- 测试文件变更
如果跳过,输出:SKIP — 无 UI 变更,无需 live 验证
# 检查 playwright 是否可用
if ! command -v playwright &> /dev/null; then
echo "⚠️ Playwright 未安装"
echo "Install: npm install -g playwright && playwright install chromium"
echo "Or use npx: npx playwright --version"
fi
# 检查是否有可用的 browser
playwright --version 2>/dev/null || npx playwright --version 2>/dev/null || echo "NO_PLAYWRIGHT"
降级处理:
⚠️ 无法 live 验证,降级为静态分析为每个变更的 UI 文件生成验证脚本:
// .harness/verify/temp-verify-{timestamp}.js
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
viewport: { width: 1280, height: 800 }
});
const page = await context.newPage();
// 1. 加载页面
await page.goto('file:///path/to/changed/file.html', { waitUntil: 'networkidle' });
// 2. 捕获 Console 错误
const consoleErrors = [];
page.on('console', msg => {
if (msg.type() === 'error') consoleErrors.push(msg.text());
});
// 3. 截图
await page.screenshot({ path: '.harness/verify/screenshots/desktop-{timestamp}.png', fullPage: false });
await page.screenshot({ path: '.harness/verify/screenshots/desktop-full-{timestamp}.png', fullPage: true });
// 4. 响应式测试(视口)
const viewports = [
{ name: 'mobile', width: 375, height: 812 },
{ name: 'tablet', width: 768, height: 1024 },
{ name: 'laptop', width: 1440, height: 900 }
];
for (const vp of viewports) {
await page.setViewportSize({ width: vp.width, height: vp.height });
await page.screenshot({
path: `.harness/verify/screenshots/${vp.name}-{timestamp}.png`,
fullPage: false
});
}
// 5. 交互测试(如果有按钮、表单)
const buttons = await page.$$('button');
for (const btn of buttons) {
await btn.hover();
await btn.click({ force: true });
await page.waitForTimeout(300);
}
// 6. Console 错误
if (consoleErrors.length > 0) {
console.log('CONSOLE_ERRORS:');
consoleErrors.forEach(e => console.log(' - ' + e));
}
await browser.close();
console.log('VERIFY_DONE');
})();
# 创建截图目录
mkdir -p .harness/verify/screenshots
# 运行 Playwright 脚本
node .harness/verify/temp-verify-{timestamp}.js
# 如果涉及 API 后端,先启动本地服务
# (cd app && npm run dev) &
# sleep 5
# node .harness/verify/temp-verify-{timestamp}.js
对每次截图执行 7 维度检查:
## Phase 1: Interaction(交互)
- 按钮可点击?有 hover 效果?
- 表单可提交?有验证提示?
- 导航流畅?有 active 状态?
## Phase 2: Responsiveness(响应式)
- mobile (375px): 内容是否溢出?字体是否可读?
- tablet (768px): 布局是否自适应?
- laptop (1440px): 是否有空白浪费?
## Phase 3: Visual(视觉)
- 颜色是否符合品牌规范?
- 间距是否一致?
- 是否有明显的布局错位?
## Phase 4: Accessibility(WCAG AA)
- 文字对比度是否 ≥ 4.5:1?
- 是否有 alt 文本(图片)?
- 键盘可导航?(Tab 顺序)
- 焦点可见?
## Phase 5: Robustness(健壮性)
- 网络差时是否有 loading 状态?
- 错误时是否有友好提示?
- 空白状态是否有占位?
## Phase 6: Code(代码)
- DOM 结构语义化?(header/main/footer/nav)
- 无内联样式?(样式分离)
- 无资源 404?(检查网络请求)
## Phase 7: Console(控制台)
- 是否有 JS 错误?(ERROR 级别)
- 是否有未捕获的异常?
- 是否有 CORS 错误?
┌─────────────────────────────────────────────────────┐
│ Live Verification Results │
├─────────────────────────────────────────────────────┤
│ BLOCKER(必须修复) │
│ 🛑 Console ERROR: [具体错误] @ [文件:行号] │
│ 🛑 移动端布局完全崩溃(内容溢出、元素重叠) │
│ 🛑 关键交互无响应(按钮点击无效) │
│ │
│ HIGH(强烈建议修复) │
│ ⚠️ 文字对比度 3.2:1(低于 WCAG AA 4.5:1) │
│ ⚠️ 移动端字体 < 14px,可读性差 │
│ ⚠️ 图片缺少 alt 属性 │
│ │
│ MEDIUM(可以接受但需改进) │
│ 🔶 间距不一致(16px vs 24px) │
│ 🔶 loading 状态样式简陋 │
│ │
│ NITPICK(吹毛求疵) │
│ 💬 按钮颜色可以更鲜明一些 │
└─────────────────────────────────────────────────────┘
harness-review 评分处于 6-7 区间时:
↓
自动调用 harness-verify
↓
Playwright 执行 + 截图
↓
生成 Triage 矩阵 + 截图证据
↓
返回给 harness-review 更新评分
↓
如果 3 次迭代后仍 FAIL,汇报给用户时附带截图证据
# 完整验证
/harness-verify
# 快速截图(不运行交互测试)
/harness-verify --screenshot-only
# 指定文件
/harness-verify "src/components/LoginForm.tsx"
playwright(可选,npx playwright fallback)