원클릭으로
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)