GSD Verifier by toonight/get-shit-done-for-antigravity
npx skills add https://github.com/toonight/get-shit-done-for-antigravity --skill 'GSD Verifier'你的任务:验证必备项,检测存根,识别差距,并生成包含结构化发现的 VERIFICATION.md。
不信任任何东西。验证一切。
在开始新验证之前,检查是否存在先前的 VERIFICATION.md:
Get-ChildItem ".gsd/phases/{N}/*-VERIFICATION.md" -ErrorAction SilentlyContinue
如果存在先前的验证且包含差距 → 重新验证模式:
is_re_verification = true如果不存在先前的验证 → 初始模式: 设置 is_re_verification = false,继续执行步骤 1。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
收集验证上下文:
# 阶段 PLAN 和 SUMMARY
Get-ChildItem ".gsd/phases/{N}/*-PLAN.md"
Get-ChildItem ".gsd/phases/{N}/*-SUMMARY.md"
# 来自 ROADMAP 的阶段目标
Select-String -Path ".gsd/ROADMAP.md" -Pattern "Phase {N}"
从 ROADMAP.md 中提取阶段目标。这是要验证的成果,而不是任务。
选项 A:PLAN 前置元数据中的必备项
must_haves:
truths:
- "用户可以看到现有消息"
- "用户可以发送消息"
artifacts:
- path: "src/components/Chat.tsx"
provides: "消息列表渲染"
key_links:
- from: "Chat.tsx"
to: "api/chat"
via: "useEffect 中的 fetch"
选项 B:从阶段目标推导
src/components/Chat.tsx,而不是"聊天组件"对于每个 truth,确定代码库是否支持它。
验证状态:
对于每个 truth:
对于每个必需的 artifact,验证三个级别:
Test-Path "src/components/Chat.tsx"
Get-Content "src/components/Chat.tsx" | Select-String -Pattern "TODO|placeholder|stub"
对于每个关键链接,验证连接是否存在:
模式:组件 → API
# 检查 Chat.tsx 是否调用 /api/chat
Select-String -Path "src/components/Chat.tsx" -Pattern "fetch.*api/chat"
模式:API → 数据库
# 检查路由是否调用 prisma
Select-String -Path "src/app/api/chat/route.ts" -Pattern "prisma\."
模式:表单 → 处理器
# 检查 onSubmit 是否有实现
Select-String -Path "src/components/Form.tsx" -Pattern "onSubmit" -Context 0,5
模式:状态 → 渲染
# 检查状态是否在 JSX 中使用
Select-String -Path "src/components/Chat.tsx" -Pattern "messages\.map"
如果 REQUIREMENTS.md 存在:
Select-String -Path ".gsd/REQUIREMENTS.md" -Pattern "Phase {N}"
对于每个需求:
需求状态:
对修改过的文件运行反模式检测:
# TODO/FIXME 注释
Select-String -Path "src/**/*.ts" -Pattern "TODO|FIXME|XXX|HACK"
# 占位符内容
Select-String -Path "src/**/*.tsx" -Pattern "placeholder|coming soon"
# 空实现
Select-String -Path "src/**/*.ts" -Pattern "return null|return \{\}|return \[\]"
# 仅 console.log
Select-String -Path "src/**/*.ts" -Pattern "console\.log" -Context 2
分类发现:
有些内容无法通过程序验证:
总是需要人工:
格式:
### 1. {测试名称}
**测试:** {要做什么}
**预期:** {应该发生什么}
**需要人工的原因:** {为什么无法通过程序验证}
状态:通过
状态:发现差距
状态:需要人工
计算分数:
score = verified_truths / total_truths
当发现差距时,为 /plan --gaps 结构化输出:
---
phase: {N}
verified: {timestamp}
status: gaps_found
score: {N}/{M} must-haves verified
gaps:
- truth: "用户可以看到现有消息"
status: failed
reason: "Chat.tsx 没有从 API 获取数据"
artifacts:
- path: "src/components/Chat.tsx"
issue: "没有带 fetch 调用的 useEffect"
missing:
- "useEffect 中对 /api/chat 的 API 调用"
- "用于存储获取到的消息的状态"
- "在 JSX 中渲染消息数组"
---
# 基于注释的存根
Select-String -Pattern "TODO|FIXME|XXX|HACK|PLACEHOLDER"
# 占位符文本
Select-String -Pattern "placeholder|lorem ipsum|coming soon"
# 空实现
Select-String -Pattern "return null|return undefined|return \{\}|return \[\]"
// 红色警报:
return <div>Component</div>
return <div>Placeholder</div>
return <div>{/* TODO */}</div>
return null
return <></>
// 空处理器:
onClick={() => {}}
onChange={() => console.log('clicked')}
onSubmit={(e) => e.preventDefault()} // 仅阻止默认行为
// 红色警报:
export async function POST() {
return Response.json({ message: "Not implemented" });
}
export async function GET() {
return Response.json([]); // 空数组,无数据库查询
}
// 仅 console.log:
export async function POST(req) {
console.log(await req.json());
return Response.json({ ok: true });
}
// Fetch 存在但忽略响应:
fetch('/api/messages') // 没有 await,没有 .then
// 查询存在但结果未返回:
await prisma.message.findMany()
return Response.json({ ok: true }) // 返回静态内容,而非查询结果
// 处理器仅阻止默认行为:
onSubmit={(e) => e.preventDefault()}
// 状态存在但未渲染:
const [messages, setMessages] = useState([])
return <div>No messages</div> // 总是显示静态内容
---
phase: {N}
verified: {timestamp}
status: {passed | gaps_found | human_needed}
score: {N}/{M} must-haves verified
is_re_verification: {true | false}
gaps: [...] # 如果 gaps_found
---
# 阶段 {N} 验证
## 必备项
### Truths
| Truth | 状态 | 证据 |
|-------|--------|----------|
| {truth 1} | ✓ 已验证 | {如何验证} |
| {truth 2} | ✗ 失败 | {缺失内容} |
### Artifacts
| 路径 | 存在 | 实质性 | 已连接 |
|------|--------|-------------|-------|
| src/components/Chat.tsx | ✓ | ✓ | ✗ |
### 关键链接
| 来源 | 目标 | 方式 | 状态 |
|------|-----|-----|--------|
| Chat.tsx | api/chat | fetch | ✗ 未连接 |
## 发现的反模式
- 🛑 {阻塞项}
- ⚠️ {警告项}
## 需要人工验证
### 1. 视觉审查
**测试:** 打开 http://localhost:3000/chat
**预期:** 消息列表使用真实数据渲染
**需要人工的原因:** 视觉布局验证
## 差距(如果有)
{为规划者准备的结构化差距分析}
## 结论
{状态说明}
每周安装次数
–
代码仓库
GitHub 星标
664
首次出现
–
安全审计
Your job: Verify must-haves, detect stubs, identify gaps, and produce VERIFICATION.md with structured findings.
Trust nothing. Verify everything.
Before starting fresh, check if a previous VERIFICATION.md exists:
Get-ChildItem ".gsd/phases/{N}/*-VERIFICATION.md" -ErrorAction SilentlyContinue
If previous verification exists with gaps → RE-VERIFICATION MODE:
is_re_verification = trueIf no previous verification → INITIAL MODE: Set is_re_verification = false, proceed with Step 1.
Gather verification context:
# Phase PLANs and SUMMARYs
Get-ChildItem ".gsd/phases/{N}/*-PLAN.md"
Get-ChildItem ".gsd/phases/{N}/*-SUMMARY.md"
# Phase goal from ROADMAP
Select-String -Path ".gsd/ROADMAP.md" -Pattern "Phase {N}"
Extract phase goal from ROADMAP.md. This is the outcome to verify, not the tasks.
Option A: Must-haves in PLAN frontmatter
must_haves:
truths:
- "User can see existing messages"
- "User can send a message"
artifacts:
- path: "src/components/Chat.tsx"
provides: "Message list rendering"
key_links:
- from: "Chat.tsx"
to: "api/chat"
via: "fetch in useEffect"
Option B: Derive from phase goal
src/components/Chat.tsx, not "chat component"For each truth, determine if codebase enables it.
Verification status:
For each truth:
For each required artifact, verify three levels:
Test-Path "src/components/Chat.tsx"
Get-Content "src/components/Chat.tsx" | Select-String -Pattern "TODO|placeholder|stub"
For each key link, verify the connection exists:
Pattern: Component → API
# Check Chat.tsx calls /api/chat
Select-String -Path "src/components/Chat.tsx" -Pattern "fetch.*api/chat"
Pattern: API → Database
# Check route calls prisma
Select-String -Path "src/app/api/chat/route.ts" -Pattern "prisma\."
Pattern: Form → Handler
# Check onSubmit has implementation
Select-String -Path "src/components/Form.tsx" -Pattern "onSubmit" -Context 0,5
Pattern: State → Render
# Check state is used in JSX
Select-String -Path "src/components/Chat.tsx" -Pattern "messages\.map"
If REQUIREMENTS.md exists:
Select-String -Path ".gsd/REQUIREMENTS.md" -Pattern "Phase {N}"
For each requirement:
Requirement status:
Run anti-pattern detection on modified files:
# TODO/FIXME comments
Select-String -Path "src/**/*.ts" -Pattern "TODO|FIXME|XXX|HACK"
# Placeholder content
Select-String -Path "src/**/*.tsx" -Pattern "placeholder|coming soon"
# Empty implementations
Select-String -Path "src/**/*.ts" -Pattern "return null|return \{\}|return \[\]"
# Console.log only
Select-String -Path "src/**/*.ts" -Pattern "console\.log" -Context 2
Categorize findings:
Some things can't be verified programmatically:
Always needs human:
Format:
### 1. {Test Name}
**Test:** {What to do}
**Expected:** {What should happen}
**Why human:** {Why can't verify programmatically}
Status: passed
Status: gaps_found
Status: human_needed
Calculate score:
score = verified_truths / total_truths
When gaps found, structure for /plan --gaps:
---
phase: {N}
verified: {timestamp}
status: gaps_found
score: {N}/{M} must-haves verified
gaps:
- truth: "User can see existing messages"
status: failed
reason: "Chat.tsx doesn't fetch from API"
artifacts:
- path: "src/components/Chat.tsx"
issue: "No useEffect with fetch call"
missing:
- "API call in useEffect to /api/chat"
- "State for storing fetched messages"
- "Render messages array in JSX"
---
# Comment-based stubs
Select-String -Pattern "TODO|FIXME|XXX|HACK|PLACEHOLDER"
# Placeholder text
Select-String -Pattern "placeholder|lorem ipsum|coming soon"
# Empty implementations
Select-String -Pattern "return null|return undefined|return \{\}|return \[\]"
// RED FLAGS:
return <div>Component</div>
return <div>Placeholder</div>
return <div>{/* TODO */}</div>
return null
return <></>
// Empty handlers:
onClick={() => {}}
onChange={() => console.log('clicked')}
onSubmit={(e) => e.preventDefault()} // Only prevents default
// RED FLAGS:
export async function POST() {
return Response.json({ message: "Not implemented" });
}
export async function GET() {
return Response.json([]); // Empty array, no DB query
}
// Console log only:
export async function POST(req) {
console.log(await req.json());
return Response.json({ ok: true });
}
// Fetch exists but response ignored:
fetch('/api/messages') // No await, no .then
// Query exists but result not returned:
await prisma.message.findMany()
return Response.json({ ok: true }) // Returns static, not query
// Handler only prevents default:
onSubmit={(e) => e.preventDefault()}
// State exists but not rendered:
const [messages, setMessages] = useState([])
return <div>No messages</div> // Always shows static
---
phase: {N}
verified: {timestamp}
status: {passed | gaps_found | human_needed}
score: {N}/{M} must-haves verified
is_re_verification: {true | false}
gaps: [...] # If gaps_found
---
# Phase {N} Verification
## Must-Haves
### Truths
| Truth | Status | Evidence |
|-------|--------|----------|
| {truth 1} | ✓ VERIFIED | {how verified} |
| {truth 2} | ✗ FAILED | {what's missing} |
### Artifacts
| Path | Exists | Substantive | Wired |
|------|--------|-------------|-------|
| src/components/Chat.tsx | ✓ | ✓ | ✗ |
### Key Links
| From | To | Via | Status |
|------|-----|-----|--------|
| Chat.tsx | api/chat | fetch | ✗ NOT_WIRED |
## Anti-Patterns Found
- 🛑 {blocker}
- ⚠️ {warning}
## Human Verification Needed
### 1. Visual Review
**Test:** Open http://localhost:3000/chat
**Expected:** Message list renders with real data
**Why human:** Visual layout verification
## Gaps (if any)
{Structured gap analysis for planner}
## Verdict
{Status explanation}
Weekly Installs
–
Repository
GitHub Stars
664
First Seen
–
Security Audits
agent-browser 浏览器自动化工具 - Vercel Labs 命令行网页操作与测试
144,300 周安装