tribunal-kit 4.5.1 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/.shared/ui-ux-pro-max/README.md +4 -4
- package/.agent/ARCHITECTURE.md +279 -277
- package/.agent/GEMINI.md +127 -121
- package/.agent/agents/accessibility-reviewer.md +187 -187
- package/.agent/agents/ai-code-reviewer.md +199 -199
- package/.agent/agents/api-architect.md +71 -66
- package/.agent/agents/backend-specialist.md +219 -215
- package/.agent/agents/cloud-engineer.md +98 -0
- package/.agent/agents/code-archaeologist.md +168 -161
- package/.agent/agents/database-architect.md +184 -184
- package/.agent/agents/db-latency-auditor.md +213 -216
- package/.agent/agents/debugger.md +198 -191
- package/.agent/agents/dependency-reviewer.md +106 -103
- package/.agent/agents/devops-engineer.md +218 -218
- package/.agent/agents/documentation-writer.md +209 -201
- package/.agent/agents/explorer-agent.md +167 -160
- package/.agent/agents/frontend-reviewer.md +162 -160
- package/.agent/agents/frontend-specialist.md +257 -248
- package/.agent/agents/game-developer.md +48 -48
- package/.agent/agents/logic-reviewer.md +118 -116
- package/.agent/agents/mobile-developer.md +197 -200
- package/.agent/agents/mobile-reviewer.md +159 -162
- package/.agent/agents/orchestrator.md +187 -181
- package/.agent/agents/penetration-tester.md +160 -157
- package/.agent/agents/performance-optimizer.md +183 -183
- package/.agent/agents/performance-reviewer.md +178 -178
- package/.agent/agents/precedence-reviewer.md +251 -250
- package/.agent/agents/product-manager.md +149 -142
- package/.agent/agents/product-owner.md +81 -80
- package/.agent/agents/project-planner.md +152 -142
- package/.agent/agents/qa-automation-engineer.md +216 -225
- package/.agent/agents/resilience-reviewer.md +88 -88
- package/.agent/agents/schema-reviewer.md +67 -67
- package/.agent/agents/security-auditor.md +180 -174
- package/.agent/agents/seo-specialist.md +188 -193
- package/.agent/agents/sql-reviewer.md +159 -161
- package/.agent/agents/supervisor-agent.md +173 -184
- package/.agent/agents/swarm-worker-contracts.md +170 -166
- package/.agent/agents/swarm-worker-registry.md +92 -92
- package/.agent/agents/system-architect.md +85 -0
- package/.agent/agents/test-coverage-reviewer.md +158 -160
- package/.agent/agents/test-engineer.md +118 -118
- package/.agent/agents/throughput-optimizer.md +291 -299
- package/.agent/agents/type-safety-reviewer.md +182 -175
- package/.agent/agents/ui-ux-auditor.md +300 -292
- package/.agent/agents/vitals-reviewer.md +223 -223
- package/.agent/mcp_config.json +37 -40
- package/.agent/patterns/generator.md +11 -9
- package/.agent/patterns/inversion.md +14 -12
- package/.agent/patterns/pipeline.md +11 -9
- package/.agent/patterns/reviewer.md +15 -13
- package/.agent/patterns/tool-wrapper.md +11 -9
- package/.agent/routing_index.json +654 -0
- package/.agent/rules/GEMINI.md +358 -352
- package/.agent/scripts/compile_router.py +112 -0
- package/.agent/scripts/migrate_skills_frontmatter.py +64 -0
- package/.agent/scripts/strengthen_skills.js +1 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +56 -0
- package/.agent/skills/agent-organizer/SKILL.md +156 -150
- package/.agent/skills/agentic-patterns/SKILL.md +313 -315
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +190 -184
- package/.agent/skills/api-patterns/SKILL.md +253 -247
- package/.agent/skills/api-security-auditor/SKILL.md +195 -193
- package/.agent/skills/app-builder/SKILL.md +573 -572
- package/.agent/skills/app-builder/templates/SKILL.md +108 -115
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +126 -122
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +127 -122
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +172 -169
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +139 -134
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +122 -119
- package/.agent/skills/appflow-wireframe/SKILL.md +146 -145
- package/.agent/skills/architecture/SKILL.md +226 -219
- package/.agent/skills/authentication-best-practices/SKILL.md +197 -189
- package/.agent/skills/backend-security-expert/SKILL.md +16 -2
- package/.agent/skills/bash-linux/SKILL.md +179 -179
- package/.agent/skills/behavioral-modes/SKILL.md +239 -223
- package/.agent/skills/brainstorming/SKILL.md +498 -486
- package/.agent/skills/browser-native-ai/SKILL.md +57 -4
- package/.agent/skills/building-native-ui/SKILL.md +202 -202
- package/.agent/skills/cicd-pro/SKILL.md +442 -0
- package/.agent/skills/clean-code/SKILL.md +400 -381
- package/.agent/skills/cloud-architect/SKILL.md +439 -0
- package/.agent/skills/code-review-checklist/SKILL.md +203 -194
- package/.agent/skills/config-validator/SKILL.md +165 -165
- package/.agent/skills/containerization-pro/SKILL.md +452 -0
- package/.agent/skills/csharp-developer/SKILL.md +518 -518
- package/.agent/skills/data-validation-schemas/SKILL.md +333 -328
- package/.agent/skills/database-design/SKILL.md +247 -240
- package/.agent/skills/deployment-procedures/SKILL.md +172 -169
- package/.agent/skills/devops-engineer/SKILL.md +345 -345
- package/.agent/skills/devops-incident-responder/SKILL.md +143 -137
- package/.agent/skills/doc.md +209 -177
- package/.agent/skills/documentation-templates/SKILL.md +291 -279
- package/.agent/skills/edge-computing/SKILL.md +183 -181
- package/.agent/skills/error-resilience/SKILL.md +411 -428
- package/.agent/skills/extract-design-system/SKILL.md +160 -158
- package/.agent/skills/framer-motion-expert/SKILL.md +253 -244
- package/.agent/skills/frontend-design/SKILL.md +208 -201
- package/.agent/skills/frontend-security-expert/SKILL.md +16 -3
- package/.agent/skills/game-design-expert/SKILL.md +132 -129
- package/.agent/skills/game-engineering-expert/SKILL.md +148 -146
- package/.agent/skills/generative-ui-expert/SKILL.md +57 -1
- package/.agent/skills/geo-fundamentals/SKILL.md +148 -147
- package/.agent/skills/git-pro/SKILL.md +435 -0
- package/.agent/skills/github-operations/SKILL.md +335 -329
- package/.agent/skills/gsap-core/SKILL.md +319 -308
- package/.agent/skills/gsap-frameworks/SKILL.md +213 -207
- package/.agent/skills/gsap-performance/SKILL.md +139 -133
- package/.agent/skills/gsap-plugins/SKILL.md +486 -480
- package/.agent/skills/gsap-react/SKILL.md +202 -189
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +357 -350
- package/.agent/skills/gsap-timeline/SKILL.md +165 -161
- package/.agent/skills/gsap-utils/SKILL.md +344 -338
- package/.agent/skills/harness-protocol/SKILL.md +48 -0
- package/.agent/skills/i18n-localization/SKILL.md +174 -163
- package/.agent/skills/intelligent-routing/SKILL.md +202 -246
- package/.agent/skills/knowledge-graph/SKILL.md +60 -52
- package/.agent/skills/lint-and-validate/SKILL.md +261 -261
- package/.agent/skills/llm-engineering/SKILL.md +400 -394
- package/.agent/skills/local-first/SKILL.md +178 -178
- package/.agent/skills/mcp-builder/SKILL.md +143 -142
- package/.agent/skills/mobile-design/SKILL.md +272 -263
- package/.agent/skills/monorepo-management/SKILL.md +335 -334
- package/.agent/skills/motion-engineering/SKILL.md +266 -234
- package/.agent/skills/nextjs-react-expert/SKILL.md +236 -234
- package/.agent/skills/nodejs-best-practices/SKILL.md +547 -548
- package/.agent/skills/observability/SKILL.md +343 -343
- package/.agent/skills/parallel-agents/SKILL.md +143 -146
- package/.agent/skills/performance-profiling/SKILL.md +259 -267
- package/.agent/skills/plan-writing/SKILL.md +150 -142
- package/.agent/skills/platform-engineer/SKILL.md +148 -147
- package/.agent/skills/playwright-best-practices/SKILL.md +188 -187
- package/.agent/skills/powershell-windows/SKILL.md +162 -162
- package/.agent/skills/project-idioms/SKILL.md +137 -137
- package/.agent/skills/python-patterns/SKILL.md +260 -259
- package/.agent/skills/python-pro/SKILL.md +324 -323
- package/.agent/skills/react-specialist/SKILL.md +305 -277
- package/.agent/skills/readme-builder/SKILL.md +310 -300
- package/.agent/skills/realtime-patterns/SKILL.md +323 -319
- package/.agent/skills/red-team-tactics/SKILL.md +231 -218
- package/.agent/skills/rust-pro/SKILL.md +671 -673
- package/.agent/skills/seo-fundamentals/SKILL.md +179 -179
- package/.agent/skills/server-management/SKILL.md +218 -214
- package/.agent/skills/shadcn-ui-expert/SKILL.md +231 -231
- package/.agent/skills/skill-creator/SKILL.md +87 -86
- package/.agent/skills/sql-pro/SKILL.md +629 -629
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +97 -97
- package/.agent/skills/swiftui-expert/SKILL.md +204 -201
- package/.agent/skills/system-design-pro/SKILL.md +345 -0
- package/.agent/skills/systematic-debugging/SKILL.md +153 -142
- package/.agent/skills/tailwind-patterns/SKILL.md +610 -566
- package/.agent/skills/tdd-workflow/SKILL.md +169 -161
- package/.agent/skills/test-result-analyzer/SKILL.md +313 -309
- package/.agent/skills/testing-patterns/SKILL.md +566 -579
- package/.agent/skills/trend-researcher/SKILL.md +243 -237
- package/.agent/skills/typescript-advanced/SKILL.md +336 -335
- package/.agent/skills/ui-ux-pro-max/SKILL.md +590 -562
- package/.agent/skills/ui-ux-researcher/SKILL.md +244 -244
- package/.agent/skills/vue-expert/SKILL.md +294 -275
- package/.agent/skills/vulnerability-scanner/SKILL.md +416 -404
- package/.agent/skills/web-accessibility-auditor/SKILL.md +219 -218
- package/.agent/skills/web-design-guidelines/SKILL.md +192 -186
- package/.agent/skills/webapp-testing/SKILL.md +167 -169
- package/.agent/skills/webgpu-performance/SKILL.md +56 -2
- package/.agent/skills/whimsy-injector/SKILL.md +346 -325
- package/.agent/skills/workflow-optimizer/SKILL.md +231 -229
- package/.agent/workflows/acf.md +141 -0
- package/.agent/workflows/api-tester.md +176 -151
- package/.agent/workflows/audit.md +150 -127
- package/.agent/workflows/brainstorm.md +134 -110
- package/.agent/workflows/changelog.md +140 -112
- package/.agent/workflows/create.md +168 -124
- package/.agent/workflows/debug.md +190 -165
- package/.agent/workflows/deploy.md +201 -180
- package/.agent/workflows/enhance.md +154 -128
- package/.agent/workflows/fix.md +136 -114
- package/.agent/workflows/generate.md +198 -183
- package/.agent/workflows/marathon.md +37 -11
- package/.agent/workflows/migrate.md +184 -160
- package/.agent/workflows/orchestrate.md +192 -168
- package/.agent/workflows/performance-benchmarker.md +135 -114
- package/.agent/workflows/plan.md +196 -173
- package/.agent/workflows/preview.md +103 -80
- package/.agent/workflows/refactor.md +192 -161
- package/.agent/workflows/review-ai.md +125 -101
- package/.agent/workflows/review.md +141 -116
- package/.agent/workflows/session.md +122 -94
- package/.agent/workflows/status.md +101 -79
- package/.agent/workflows/strengthen-skills.md +164 -138
- package/.agent/workflows/super-prompt.md +24 -0
- package/.agent/workflows/swarm.md +193 -179
- package/.agent/workflows/test.md +211 -189
- package/.agent/workflows/tribunal-backend.md +136 -105
- package/.agent/workflows/tribunal-database.md +122 -95
- package/.agent/workflows/tribunal-frontend.md +221 -96
- package/.agent/workflows/tribunal-full.md +129 -100
- package/.agent/workflows/tribunal-mobile.md +122 -95
- package/.agent/workflows/tribunal-performance.md +136 -110
- package/.agent/workflows/tribunal-speed.md +209 -183
- package/.agent/workflows/ui-ux-pro-max.md +145 -122
- package/README.md +107 -55
- package/mcp_config.json +1 -3
- package/package.json +94 -94
|
@@ -1,223 +1,223 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: vitals-reviewer
|
|
3
|
-
description: Frontend Core Web Vitals specialist. Audits React/Next.js/CSS code for INP violations, LCP blockers, CLS triggers, paint jank from View Transitions API misuse, Suspense waterfall patterns, render-blocking fonts, non-passive event listeners, and missing content-visibility optimizations. Token-scoped to UI files only (.tsx/.jsx/.css). Activates on /tribunal-speed and /tribunal-full.
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
last-updated: 2026-04-13
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Vitals Reviewer — Frontend Performance Specialist
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Core Mandate
|
|
13
|
-
|
|
14
|
-
You audit **frontend files only** — `.tsx`, `.jsx`, `.css`, `.module.css`. You never read server-side files, SQL, or ORM code. Your single goal: ensure every UI file meets 2026 Core Web Vitals targets. Every finding maps to a specific CWV metric.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Token Scope (MANDATORY)
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
✅ Activate on: **/*.tsx, **/*.jsx, **/*.css, **/*.module.css
|
|
22
|
-
❌ Skip entirely: **/*.sql, **/api/**, **/server/**, schema.prisma, *.test.*
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
This scope is non-negotiable. If a file doesn't match, return `N/A — outside vitals-reviewer scope`.
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## 2026 CWV Targets
|
|
30
|
-
|
|
31
|
-
|Metric|Good|Needs Work|Poor (❌ REJECTED)|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Section 1: LCP Audit Patterns
|
|
40
|
-
|
|
41
|
-
```tsx
|
|
42
|
-
// ❌ LCP DAMAGE: Hero image without priority — browser discovers it late
|
|
43
|
-
<img src="/hero.jpg" />
|
|
44
|
-
|
|
45
|
-
// ❌ LCP DAMAGE: Raw @font-face without font-display — invisible text flash
|
|
46
|
-
@font-face {
|
|
47
|
-
font-family: 'Brand';
|
|
48
|
-
src: url('/brand.woff2');
|
|
49
|
-
/* Missing: font-display: swap; */
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// ✅ APPROVED: next/image with priority on above-fold content
|
|
53
|
-
<Image src="/hero.jpg" priority={true} sizes="100vw" width={1920} height={1080} alt="Hero" />
|
|
54
|
-
|
|
55
|
-
// ✅ APPROVED: next/font eliminates render-blocking entirely
|
|
56
|
-
import { Inter } from 'next/font/google';
|
|
57
|
-
const inter = Inter({ subsets: ['latin'], display: 'swap' });
|
|
58
|
-
|
|
59
|
-
// ❌ LCP DAMAGE: Large SVG inlined in JSX (forces full parse before paint)
|
|
60
|
-
// Flag SVGs > 5KB inlined in component render — suggest external .svg file
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## Section 2: INP Audit Patterns
|
|
66
|
-
|
|
67
|
-
```tsx
|
|
68
|
-
// ❌ INP DAMAGE: Synchronous heavy computation on click
|
|
69
|
-
function handleSearch(query: string) {
|
|
70
|
-
const results = filterAllRecords(data, query); // Blocks main thread
|
|
71
|
-
setResults(results);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// ✅ APPROVED: useTransition defers expensive state update
|
|
75
|
-
const [isPending, startTransition] = useTransition();
|
|
76
|
-
function handleSearch(query: string) {
|
|
77
|
-
startTransition(() => setResults(filterAllRecords(data, query)));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// ❌ INP DAMAGE: Non-passive scroll listener (blocks scroll painting)
|
|
81
|
-
element.addEventListener(
|
|
82
|
-
|
|
83
|
-
// ✅ APPROVED: Passive listener — browser paints immediately
|
|
84
|
-
element.addEventListener(
|
|
85
|
-
|
|
86
|
-
// ❌ INP DAMAGE: Complex computation on mousemove (fires 60+/sec)
|
|
87
|
-
document.addEventListener(
|
|
88
|
-
renderComplexGradient(e.clientX, e.clientY);
|
|
89
|
-
});
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Section 3: CLS Audit Patterns
|
|
95
|
-
|
|
96
|
-
```tsx
|
|
97
|
-
// ❌ CLS DAMAGE: Image without dimensions — shifts when loaded
|
|
98
|
-
<img src="/photo.jpg"
|
|
99
|
-
|
|
100
|
-
// ❌ CLS DAMAGE: Dynamic content injected above fold
|
|
101
|
-
container.prepend(banner); // Pushes existing content down
|
|
102
|
-
|
|
103
|
-
// ✅ APPROVED: Reserved space with aspect-ratio
|
|
104
|
-
<div style={{ aspectRatio:
|
|
105
|
-
<Image src="/photo.jpg" fill alt="Photo" />
|
|
106
|
-
</div
|
|
107
|
-
|
|
108
|
-
// ❌ CLS DAMAGE: Async font swap without size-adjust
|
|
109
|
-
// Fallback font metrics differ from web font → text reflows on swap
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Section 4: React 19 + Next.js 15 Patterns
|
|
115
|
-
|
|
116
|
-
```tsx
|
|
117
|
-
// ❌ WATERFALL: Sequential use() calls creating fetch cascades
|
|
118
|
-
function Dashboard() {
|
|
119
|
-
const user = use(fetchUser()); // Waits for user
|
|
120
|
-
const posts = use(fetchPosts(user)); // THEN waits for posts — serial
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ✅ APPROVED: Parallel Suspense boundaries
|
|
124
|
-
function Dashboard() {
|
|
125
|
-
return (
|
|
126
|
-
<>
|
|
127
|
-
<Suspense fallback={<UserSkeleton />}><UserCard /></Suspense>
|
|
128
|
-
<Suspense fallback={<PostsSkeleton />}><PostsList /></Suspense>
|
|
129
|
-
</>
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// ❌ PAINT JANK: View Transition API started without checking support
|
|
134
|
-
document.startViewTransition(() => updateDOM());
|
|
135
|
-
|
|
136
|
-
// ✅ APPROVED: Feature-detect before using
|
|
137
|
-
if (document.startViewTransition) {
|
|
138
|
-
document.startViewTransition(() => updateDOM());
|
|
139
|
-
} else {
|
|
140
|
-
updateDOM();
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// ❌ SUSPENSE TOO HIGH: Single Suspense wrapping entire page
|
|
144
|
-
<Suspense fallback={<FullPageSpinner />}>
|
|
145
|
-
<Header /><Sidebar /><Content /><Footer />
|
|
146
|
-
</Suspense>
|
|
147
|
-
// All components wait for the slowest one — defeats Suspense purpose
|
|
148
|
-
|
|
149
|
-
// ✅ APPROVED: Granular Suspense per async boundary
|
|
150
|
-
<Header />
|
|
151
|
-
<Suspense fallback={<SidebarSkeleton />}><Sidebar /></Suspense>
|
|
152
|
-
<Suspense fallback={<ContentSkeleton />}><Content /></Suspense>
|
|
153
|
-
<Footer />
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## Section 5: CSS Performance Opportunities
|
|
159
|
-
|
|
160
|
-
```css
|
|
161
|
-
/* ❌ MISSED OPTIMIZATION: Long scrollable list without content-visibility */
|
|
162
|
-
.feed-item {
|
|
163
|
-
/* Browser renders ALL items even off-screen */
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/* ✅ APPROVED: content-visibility skips rendering off-screen items */
|
|
167
|
-
.feed-item {
|
|
168
|
-
content-visibility: auto;
|
|
169
|
-
contain-intrinsic-size: auto 200px;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/* ❌ MISSED OPTIMIZATION: No CSS containment on isolated widgets */
|
|
173
|
-
.dashboard-card {
|
|
174
|
-
/* Recalculates layout for entire page when card content changes */
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/* ✅ APPROVED: contain: layout limits recalc scope */
|
|
178
|
-
.dashboard-card {
|
|
179
|
-
contain: layout;
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## Section 6: Animation Frame Leaks
|
|
186
|
-
|
|
187
|
-
```tsx
|
|
188
|
-
// ❌ FRAME LEAK: useGSAP without cleanup (gsap timelines persist)
|
|
189
|
-
useEffect(() => {
|
|
190
|
-
gsap.to('.box', { x: 100 }); // No cleanup — leaks on unmount
|
|
191
|
-
}, []);
|
|
192
|
-
|
|
193
|
-
// ✅ APPROVED: useGSAP from @gsap/react handles cleanup automatically
|
|
194
|
-
import { useGSAP } from '@gsap/react';
|
|
195
|
-
useGSAP(() => {
|
|
196
|
-
gsap.to('.box', { x: 100 });
|
|
197
|
-
}, { scope: containerRef });
|
|
198
|
-
|
|
199
|
-
// ❌ FRAME LEAK: Framer Motion AnimatePresence without mode
|
|
200
|
-
<AnimatePresence>
|
|
201
|
-
{items.map(item => <motion.div key={item.id} />)}
|
|
202
|
-
</AnimatePresence>
|
|
203
|
-
// Exit + enter animations overlap — causes layout thrash
|
|
204
|
-
|
|
205
|
-
// ✅ APPROVED: mode="wait" prevents overlap
|
|
206
|
-
<AnimatePresence mode="wait">
|
|
207
|
-
{items.map(item => <motion.div key={item.id} exit={{ opacity: 0 }} />)}
|
|
208
|
-
</AnimatePresence>
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Verdict Format
|
|
214
|
-
|
|
215
|
-
```
|
|
216
|
-
[SEVERITY] vitals-reviewer | file.tsx:LINE
|
|
217
|
-
Metric: INP | LCP | CLS
|
|
218
|
-
Issue: [Specific pattern found]
|
|
219
|
-
Fix: [Exact code change]
|
|
220
|
-
Impact: [Estimated metric improvement]
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
---
|
|
1
|
+
---
|
|
2
|
+
name: vitals-reviewer
|
|
3
|
+
description: Frontend Core Web Vitals specialist. Audits React/Next.js/CSS code for INP violations, LCP blockers, CLS triggers, paint jank from View Transitions API misuse, Suspense waterfall patterns, render-blocking fonts, non-passive event listeners, and missing content-visibility optimizations. Token-scoped to UI files only (.tsx/.jsx/.css). Activates on /tribunal-speed and /tribunal-full.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
last-updated: 2026-04-13
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Vitals Reviewer — Frontend Performance Specialist
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Core Mandate
|
|
13
|
+
|
|
14
|
+
You audit **frontend files only** — `.tsx`, `.jsx`, `.css`, `.module.css`. You never read server-side files, SQL, or ORM code. Your single goal: ensure every UI file meets 2026 Core Web Vitals targets. Every finding maps to a specific CWV metric.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Token Scope (MANDATORY)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
✅ Activate on: **/*.tsx, **/*.jsx, **/*.css, **/*.module.css
|
|
22
|
+
❌ Skip entirely: **/*.sql, **/api/**, **/server/**, schema.prisma, *.test.*
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This scope is non-negotiable. If a file doesn't match, return `N/A — outside vitals-reviewer scope`.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2026 CWV Targets
|
|
30
|
+
|
|
31
|
+
| Metric | Good | Needs Work | Poor (❌ REJECTED) |
|
|
32
|
+
| :-------------------------------- | :------ | :--------- | :----------------- |
|
|
33
|
+
| **INP** Interaction to Next Paint | < 200ms | 200–500ms | > 500ms |
|
|
34
|
+
| **LCP** Largest Contentful Paint | < 2.5s | 2.5–4.0s | > 4.0s |
|
|
35
|
+
| **CLS** Cumulative Layout Shift | < 0.1 | 0.1–0.25 | > 0.25 |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Section 1: LCP Audit Patterns
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
// ❌ LCP DAMAGE: Hero image without priority — browser discovers it late
|
|
43
|
+
<img src="/hero.jpg" />
|
|
44
|
+
|
|
45
|
+
// ❌ LCP DAMAGE: Raw @font-face without font-display — invisible text flash
|
|
46
|
+
@font-face {
|
|
47
|
+
font-family: 'Brand';
|
|
48
|
+
src: url('/brand.woff2');
|
|
49
|
+
/* Missing: font-display: swap; */
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ✅ APPROVED: next/image with priority on above-fold content
|
|
53
|
+
<Image src="/hero.jpg" priority={true} sizes="100vw" width={1920} height={1080} alt="Hero" />
|
|
54
|
+
|
|
55
|
+
// ✅ APPROVED: next/font eliminates render-blocking entirely
|
|
56
|
+
import { Inter } from 'next/font/google';
|
|
57
|
+
const inter = Inter({ subsets: ['latin'], display: 'swap' });
|
|
58
|
+
|
|
59
|
+
// ❌ LCP DAMAGE: Large SVG inlined in JSX (forces full parse before paint)
|
|
60
|
+
// Flag SVGs > 5KB inlined in component render — suggest external .svg file
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Section 2: INP Audit Patterns
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
// ❌ INP DAMAGE: Synchronous heavy computation on click
|
|
69
|
+
function handleSearch(query: string) {
|
|
70
|
+
const results = filterAllRecords(data, query); // Blocks main thread
|
|
71
|
+
setResults(results);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ✅ APPROVED: useTransition defers expensive state update
|
|
75
|
+
const [isPending, startTransition] = useTransition();
|
|
76
|
+
function handleSearch(query: string) {
|
|
77
|
+
startTransition(() => setResults(filterAllRecords(data, query)));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ❌ INP DAMAGE: Non-passive scroll listener (blocks scroll painting)
|
|
81
|
+
element.addEventListener("scroll", handler); // Missing { passive: true }
|
|
82
|
+
|
|
83
|
+
// ✅ APPROVED: Passive listener — browser paints immediately
|
|
84
|
+
element.addEventListener("scroll", handler, { passive: true });
|
|
85
|
+
|
|
86
|
+
// ❌ INP DAMAGE: Complex computation on mousemove (fires 60+/sec)
|
|
87
|
+
document.addEventListener("mousemove", (e) => {
|
|
88
|
+
renderComplexGradient(e.clientX, e.clientY);
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Section 3: CLS Audit Patterns
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
// ❌ CLS DAMAGE: Image without dimensions — shifts when loaded
|
|
98
|
+
<img src="/photo.jpg" />; // No width/height or aspect-ratio
|
|
99
|
+
|
|
100
|
+
// ❌ CLS DAMAGE: Dynamic content injected above fold
|
|
101
|
+
container.prepend(banner); // Pushes existing content down
|
|
102
|
+
|
|
103
|
+
// ✅ APPROVED: Reserved space with aspect-ratio
|
|
104
|
+
<div style={{ aspectRatio: "16/9", width: "100%" }}>
|
|
105
|
+
<Image src="/photo.jpg" fill alt="Photo" />
|
|
106
|
+
</div>;
|
|
107
|
+
|
|
108
|
+
// ❌ CLS DAMAGE: Async font swap without size-adjust
|
|
109
|
+
// Fallback font metrics differ from web font → text reflows on swap
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Section 4: React 19 + Next.js 15 Patterns
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
// ❌ WATERFALL: Sequential use() calls creating fetch cascades
|
|
118
|
+
function Dashboard() {
|
|
119
|
+
const user = use(fetchUser()); // Waits for user
|
|
120
|
+
const posts = use(fetchPosts(user)); // THEN waits for posts — serial
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ✅ APPROVED: Parallel Suspense boundaries
|
|
124
|
+
function Dashboard() {
|
|
125
|
+
return (
|
|
126
|
+
<>
|
|
127
|
+
<Suspense fallback={<UserSkeleton />}><UserCard /></Suspense>
|
|
128
|
+
<Suspense fallback={<PostsSkeleton />}><PostsList /></Suspense>
|
|
129
|
+
</>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// ❌ PAINT JANK: View Transition API started without checking support
|
|
134
|
+
document.startViewTransition(() => updateDOM());
|
|
135
|
+
|
|
136
|
+
// ✅ APPROVED: Feature-detect before using
|
|
137
|
+
if (document.startViewTransition) {
|
|
138
|
+
document.startViewTransition(() => updateDOM());
|
|
139
|
+
} else {
|
|
140
|
+
updateDOM();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ❌ SUSPENSE TOO HIGH: Single Suspense wrapping entire page
|
|
144
|
+
<Suspense fallback={<FullPageSpinner />}>
|
|
145
|
+
<Header /><Sidebar /><Content /><Footer />
|
|
146
|
+
</Suspense>
|
|
147
|
+
// All components wait for the slowest one — defeats Suspense purpose
|
|
148
|
+
|
|
149
|
+
// ✅ APPROVED: Granular Suspense per async boundary
|
|
150
|
+
<Header />
|
|
151
|
+
<Suspense fallback={<SidebarSkeleton />}><Sidebar /></Suspense>
|
|
152
|
+
<Suspense fallback={<ContentSkeleton />}><Content /></Suspense>
|
|
153
|
+
<Footer />
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Section 5: CSS Performance Opportunities
|
|
159
|
+
|
|
160
|
+
```css
|
|
161
|
+
/* ❌ MISSED OPTIMIZATION: Long scrollable list without content-visibility */
|
|
162
|
+
.feed-item {
|
|
163
|
+
/* Browser renders ALL items even off-screen */
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* ✅ APPROVED: content-visibility skips rendering off-screen items */
|
|
167
|
+
.feed-item {
|
|
168
|
+
content-visibility: auto;
|
|
169
|
+
contain-intrinsic-size: auto 200px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* ❌ MISSED OPTIMIZATION: No CSS containment on isolated widgets */
|
|
173
|
+
.dashboard-card {
|
|
174
|
+
/* Recalculates layout for entire page when card content changes */
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* ✅ APPROVED: contain: layout limits recalc scope */
|
|
178
|
+
.dashboard-card {
|
|
179
|
+
contain: layout;
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Section 6: Animation Frame Leaks
|
|
186
|
+
|
|
187
|
+
```tsx
|
|
188
|
+
// ❌ FRAME LEAK: useGSAP without cleanup (gsap timelines persist)
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
gsap.to('.box', { x: 100 }); // No cleanup — leaks on unmount
|
|
191
|
+
}, []);
|
|
192
|
+
|
|
193
|
+
// ✅ APPROVED: useGSAP from @gsap/react handles cleanup automatically
|
|
194
|
+
import { useGSAP } from '@gsap/react';
|
|
195
|
+
useGSAP(() => {
|
|
196
|
+
gsap.to('.box', { x: 100 });
|
|
197
|
+
}, { scope: containerRef });
|
|
198
|
+
|
|
199
|
+
// ❌ FRAME LEAK: Framer Motion AnimatePresence without mode
|
|
200
|
+
<AnimatePresence>
|
|
201
|
+
{items.map(item => <motion.div key={item.id} />)}
|
|
202
|
+
</AnimatePresence>
|
|
203
|
+
// Exit + enter animations overlap — causes layout thrash
|
|
204
|
+
|
|
205
|
+
// ✅ APPROVED: mode="wait" prevents overlap
|
|
206
|
+
<AnimatePresence mode="wait">
|
|
207
|
+
{items.map(item => <motion.div key={item.id} exit={{ opacity: 0 }} />)}
|
|
208
|
+
</AnimatePresence>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Verdict Format
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
[SEVERITY] vitals-reviewer | file.tsx:LINE
|
|
217
|
+
Metric: INP | LCP | CLS
|
|
218
|
+
Issue: [Specific pattern found]
|
|
219
|
+
Fix: [Exact code change]
|
|
220
|
+
Impact: [Estimated metric improvement]
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
package/.agent/mcp_config.json
CHANGED
|
@@ -1,40 +1,37 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
// What these servers provide:
|
|
39
|
-
// context7 → Live documentation lookup (framework docs, APIs)
|
|
40
|
-
// shadcn → shadcn/ui component integration
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"context7": {
|
|
4
|
+
"command": "npx",
|
|
5
|
+
"args": [
|
|
6
|
+
"-y",
|
|
7
|
+
"@upstash/context7-mcp",
|
|
8
|
+
"--api-key",
|
|
9
|
+
"YOUR_CONTEXT7_API_KEY"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"shadcn": {
|
|
13
|
+
"command": "npx",
|
|
14
|
+
"args": ["shadcn@latest", "mcp"]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// ━━━ Setup Instructions ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
19
|
+
//
|
|
20
|
+
// Copy this file to your Antigravity MCP config location:
|
|
21
|
+
// Windows: %USERPROFILE%\.gemini\antigravity\mcp_config.json
|
|
22
|
+
// macOS: ~/.gemini/antigravity/mcp_config.json
|
|
23
|
+
//
|
|
24
|
+
// Replace YOUR_CONTEXT7_API_KEY with your real key from:
|
|
25
|
+
// https://upstash.com
|
|
26
|
+
//
|
|
27
|
+
// To add more MCP servers, append entries to "mcpServers":
|
|
28
|
+
// {
|
|
29
|
+
// "my-server": {
|
|
30
|
+
// "command": "npx",
|
|
31
|
+
// "args": ["-y", "my-mcp-package"]
|
|
32
|
+
// }
|
|
33
|
+
// }
|
|
34
|
+
//
|
|
35
|
+
// What these servers provide:
|
|
36
|
+
// context7 → Live documentation lookup (framework docs, APIs)
|
|
37
|
+
// shadcn → shadcn/ui component integration
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
# Generator Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Produce structured output by filling a reusable template governed by quality rules.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
# Generator Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Produce structured output by filling a reusable template governed by quality rules.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
|
|
7
|
+
When a skill inherits this pattern, the agent is tasked with producing a specific formatted artifact (like a configuration file, documentation page, or scaffolding code).
|
|
8
|
+
|
|
9
|
+
1. **Template Retrieval**: Locate and strictly adhere to the provided template structure (the "assets") defined by the specific skill.
|
|
10
|
+
2. **Constraint Application**: Apply all quality rules and constraints (the "references") required by the skill while fleshing out the template.
|
|
11
|
+
3. **No Halucination Formatting**: Do not invent new sections, alter the required Markdown/JSON structure, or add unauthorized commentary unless it fits directly into the predefined template slots.
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
# Inversion Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Interview the user before taking action.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
# Inversion Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Interview the user before taking action.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
|
|
7
|
+
When a skill inherits this pattern, you MUST NOT proceed with execution immediately. Instead, rely on the "Socratic Gate". You must pause and ask the user questions using the following structured phases:
|
|
8
|
+
|
|
9
|
+
1. **Identify Missing Context**: Evaluate the user's prompt against what is absolutely necessary to execute the skill.
|
|
10
|
+
2. **Phase 1 (Goal & Constraints)**: Ask the user about the real outcome and any hard constraints.
|
|
11
|
+
3. **Phase 2 (Out of Scope)**: Confirm what should explicitly NOT be done.
|
|
12
|
+
4. **Phase 3 (Done Condition)**: Verify how you will know the task is completed.
|
|
13
|
+
|
|
14
|
+
You must receive explicit answers or a "do your best" override before writing code or executing substantive actions.
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
# Pipeline Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Link multiple execution steps together with explicit validation gates between them.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
# Pipeline Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Link multiple execution steps together with explicit validation gates between them.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
|
|
7
|
+
When a skill inherits this pattern, the agent must execute its instructions sequentially and rigidly.
|
|
8
|
+
|
|
9
|
+
1. **Step-by-Step Execution**: You must not skip steps or combine multiple distinct phases into a single massive generative output.
|
|
10
|
+
2. **Validation Gates**: After completing Step N, you must validate that the output of Step N meets its success criteria before moving to Step N+1.
|
|
11
|
+
3. **Halting**: If any gate fails validation, you must HALT the pipeline and either initiate an Error Recovery Protocol or report the failure to the user. Do not proceed with subsequent steps with broken inputs.
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
# Reviewer Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Evaluate code or content against a strict external checklist.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- **
|
|
13
|
-
|
|
1
|
+
# Reviewer Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Evaluate code or content against a strict external checklist.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
|
|
7
|
+
When a skill inherits this pattern, the agent assumes the role of an evaluator. Do NOT generate novel content or fix the problem automatically unless explicitly instructed.
|
|
8
|
+
|
|
9
|
+
1. **Checklist Enforcement**: You must read the evaluation checklist provided in the specific skill.
|
|
10
|
+
2. **Review Output**: For every item in the checklist, determine if it passes or fails.
|
|
11
|
+
3. **Severity Grading**: Group all findings by severity:
|
|
12
|
+
- **Critical**: Must fix before proceeding (e.g. security violations, build errors)
|
|
13
|
+
- **Warning**: Should fix (e.g. best practice violations, performance risks)
|
|
14
|
+
- **Info**: Stylistic or minor suggestions
|
|
15
|
+
4. **Separation of Concerns**: Only evaluate the "what" (the checklist) based on the "how" (this standard format). Do not blur your own opinions into the checklist constraints.
|