tribunal-kit 2.4.6 → 3.1.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/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +139 -86
- package/.agent/agents/ai-code-reviewer.md +160 -90
- package/.agent/agents/backend-specialist.md +164 -127
- package/.agent/agents/code-archaeologist.md +115 -73
- package/.agent/agents/database-architect.md +130 -110
- package/.agent/agents/debugger.md +137 -97
- package/.agent/agents/dependency-reviewer.md +78 -30
- package/.agent/agents/devops-engineer.md +161 -118
- package/.agent/agents/documentation-writer.md +151 -87
- package/.agent/agents/explorer-agent.md +117 -99
- package/.agent/agents/frontend-reviewer.md +127 -47
- package/.agent/agents/frontend-specialist.md +169 -109
- package/.agent/agents/game-developer.md +28 -164
- package/.agent/agents/logic-reviewer.md +87 -49
- package/.agent/agents/mobile-developer.md +151 -103
- package/.agent/agents/mobile-reviewer.md +133 -50
- package/.agent/agents/orchestrator.md +121 -110
- package/.agent/agents/penetration-tester.md +103 -77
- package/.agent/agents/performance-optimizer.md +136 -92
- package/.agent/agents/performance-reviewer.md +139 -69
- package/.agent/agents/product-manager.md +104 -70
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +95 -95
- package/.agent/agents/qa-automation-engineer.md +174 -87
- package/.agent/agents/security-auditor.md +133 -129
- package/.agent/agents/seo-specialist.md +160 -99
- package/.agent/agents/sql-reviewer.md +132 -44
- package/.agent/agents/supervisor-agent.md +137 -109
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +132 -53
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +143 -33
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +60 -100
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
- package/.agent/skills/api-patterns/SKILL.md +197 -257
- package/.agent/skills/api-security-auditor/SKILL.md +125 -57
- package/.agent/skills/app-builder/SKILL.md +326 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +71 -98
- package/.agent/skills/architecture/SKILL.md +161 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
- package/.agent/skills/bash-linux/SKILL.md +71 -166
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +345 -127
- package/.agent/skills/building-native-ui/SKILL.md +125 -57
- package/.agent/skills/clean-code/SKILL.md +266 -149
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +73 -131
- package/.agent/skills/csharp-developer/SKILL.md +434 -73
- package/.agent/skills/database-design/SKILL.md +190 -275
- package/.agent/skills/deployment-procedures/SKILL.md +81 -158
- package/.agent/skills/devops-engineer/SKILL.md +255 -94
- package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +19 -63
- package/.agent/skills/edge-computing/SKILL.md +75 -165
- package/.agent/skills/extract-design-system/SKILL.md +84 -58
- package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +71 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
- package/.agent/skills/github-operations/SKILL.md +197 -272
- package/.agent/skills/gsap-expert/SKILL.md +194 -0
- package/.agent/skills/i18n-localization/SKILL.md +60 -172
- package/.agent/skills/intelligent-routing/SKILL.md +123 -103
- package/.agent/skills/lint-and-validate/SKILL.md +8 -52
- package/.agent/skills/llm-engineering/SKILL.md +281 -195
- package/.agent/skills/local-first/SKILL.md +76 -159
- package/.agent/skills/mcp-builder/SKILL.md +48 -188
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +184 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
- package/.agent/skills/observability/SKILL.md +211 -203
- package/.agent/skills/parallel-agents/SKILL.md +53 -146
- package/.agent/skills/performance-profiling/SKILL.md +171 -151
- package/.agent/skills/plan-writing/SKILL.md +49 -153
- package/.agent/skills/platform-engineer/SKILL.md +57 -103
- package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
- package/.agent/skills/powershell-windows/SKILL.md +61 -179
- package/.agent/skills/python-patterns/SKILL.md +7 -35
- package/.agent/skills/python-pro/SKILL.md +273 -114
- package/.agent/skills/react-specialist/SKILL.md +227 -108
- package/.agent/skills/readme-builder/SKILL.md +15 -85
- package/.agent/skills/realtime-patterns/SKILL.md +216 -243
- package/.agent/skills/red-team-tactics/SKILL.md +10 -51
- package/.agent/skills/rust-pro/SKILL.md +525 -142
- package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
- package/.agent/skills/server-management/SKILL.md +110 -166
- package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
- package/.agent/skills/skill-creator/SKILL.md +18 -58
- package/.agent/skills/sql-pro/SKILL.md +543 -68
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
- package/.agent/skills/swiftui-expert/SKILL.md +124 -57
- package/.agent/skills/systematic-debugging/SKILL.md +49 -151
- package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
- package/.agent/skills/tdd-workflow/SKILL.md +63 -169
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +437 -130
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +225 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
- package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
- package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
- package/.agent/skills/webapp-testing/SKILL.md +71 -196
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +96 -224
- package/.agent/workflows/audit.md +81 -122
- package/.agent/workflows/brainstorm.md +69 -105
- package/.agent/workflows/changelog.md +65 -97
- package/.agent/workflows/create.md +73 -88
- package/.agent/workflows/debug.md +80 -111
- package/.agent/workflows/deploy.md +119 -92
- package/.agent/workflows/enhance.md +80 -91
- package/.agent/workflows/fix.md +68 -97
- package/.agent/workflows/generate.md +165 -164
- package/.agent/workflows/migrate.md +106 -109
- package/.agent/workflows/orchestrate.md +103 -86
- package/.agent/workflows/performance-benchmarker.md +77 -268
- package/.agent/workflows/plan.md +120 -98
- package/.agent/workflows/preview.md +39 -96
- package/.agent/workflows/refactor.md +105 -97
- package/.agent/workflows/review-ai.md +63 -102
- package/.agent/workflows/review.md +71 -110
- package/.agent/workflows/session.md +53 -113
- package/.agent/workflows/status.md +42 -88
- package/.agent/workflows/strengthen-skills.md +90 -51
- package/.agent/workflows/swarm.md +114 -129
- package/.agent/workflows/test.md +125 -102
- package/.agent/workflows/tribunal-backend.md +60 -78
- package/.agent/workflows/tribunal-database.md +62 -100
- package/.agent/workflows/tribunal-frontend.md +62 -82
- package/.agent/workflows/tribunal-full.md +56 -100
- package/.agent/workflows/tribunal-mobile.md +65 -94
- package/.agent/workflows/tribunal-performance.md +62 -105
- package/.agent/workflows/ui-ux-pro-max.md +72 -121
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
|
@@ -1,132 +1,193 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: seo-specialist
|
|
3
|
-
description:
|
|
3
|
+
description: Next.js 15 SEO and GEO architect. Implements generateMetadata APIs, Schema.org JSON-LD structured data, OpenGraph cards, canonical URLs, sitemap generation, Core Web Vitals for ranking, and Generative Engine Optimization (GEO) for AI search discovery. Keywords: seo, metadata, sitemap, schema, opengraph, ranking, search, geo.
|
|
4
4
|
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
5
|
model: inherit
|
|
6
6
|
skills: seo-fundamentals, geo-fundamentals
|
|
7
|
+
version: 2.0.0
|
|
8
|
+
last-updated: 2026-04-02
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
# SEO
|
|
10
|
-
|
|
11
|
-
Search visibility is earned through technical soundness and content relevance — not tricks. I implement SEO that survives algorithm updates because it aligns with what search engines are actually trying to do.
|
|
11
|
+
# SEO Specialist — Search & AI Discovery Engineer
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
## 1. Next.js 15 Metadata API
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// app/products/[slug]/page.tsx
|
|
19
|
+
import { Metadata } from 'next';
|
|
20
|
+
|
|
21
|
+
// Static metadata
|
|
22
|
+
export const metadata: Metadata = {
|
|
23
|
+
title: 'Product Name | Brand',
|
|
24
|
+
description: 'Compelling 155-character description that matches search intent.',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Dynamic metadata (fetched per-page)
|
|
28
|
+
export async function generateMetadata(
|
|
29
|
+
{ params }: { params: Promise<{ slug: string }> }
|
|
30
|
+
): Promise<Metadata> {
|
|
31
|
+
const { slug } = await params;
|
|
32
|
+
const product = await getProduct(slug);
|
|
33
|
+
|
|
34
|
+
if (!product) return { title: 'Not Found' };
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
title: `${product.name} | Brand`,
|
|
38
|
+
description: product.seoDescription,
|
|
39
|
+
canonical: `https://yoursite.com/products/${slug}`,
|
|
40
|
+
|
|
41
|
+
openGraph: {
|
|
42
|
+
title: product.name,
|
|
43
|
+
description: product.seoDescription,
|
|
44
|
+
images: [{
|
|
45
|
+
url: product.imageUrl,
|
|
46
|
+
width: 1200,
|
|
47
|
+
height: 630,
|
|
48
|
+
alt: product.name,
|
|
49
|
+
}],
|
|
50
|
+
siteName: 'Your Brand',
|
|
51
|
+
type: 'website',
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
twitter: {
|
|
55
|
+
card: 'summary_large_image',
|
|
56
|
+
title: product.name,
|
|
57
|
+
description: product.seoDescription,
|
|
58
|
+
images: [product.imageUrl],
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
21
62
|
```
|
|
22
63
|
|
|
23
|
-
All three must be addressed. Fixing one while ignoring the others produces temporary gains.
|
|
24
|
-
|
|
25
64
|
---
|
|
26
65
|
|
|
27
|
-
##
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
66
|
+
## 2. Schema.org JSON-LD Structured Data
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
// app/products/[slug]/page.tsx
|
|
70
|
+
export default async function ProductPage({ params }) {
|
|
71
|
+
const { slug } = await params;
|
|
72
|
+
const product = await getProduct(slug);
|
|
73
|
+
|
|
74
|
+
const jsonLd = {
|
|
75
|
+
'@context': 'https://schema.org',
|
|
76
|
+
'@type': 'Product',
|
|
77
|
+
name: product.name,
|
|
78
|
+
image: product.imageUrl,
|
|
79
|
+
description: product.description,
|
|
80
|
+
sku: product.sku,
|
|
81
|
+
offers: {
|
|
82
|
+
'@type': 'Offer',
|
|
83
|
+
price: product.price,
|
|
84
|
+
priceCurrency: 'USD',
|
|
85
|
+
availability: product.inStock
|
|
86
|
+
? 'https://schema.org/InStock'
|
|
87
|
+
: 'https://schema.org/OutOfStock',
|
|
88
|
+
url: `https://yoursite.com/products/${slug}`,
|
|
89
|
+
},
|
|
90
|
+
aggregateRating: {
|
|
91
|
+
'@type': 'AggregateRating',
|
|
92
|
+
ratingValue: product.averageRating,
|
|
93
|
+
reviewCount: product.reviewCount,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<>
|
|
99
|
+
<script
|
|
100
|
+
type="application/ld+json"
|
|
101
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
|
102
|
+
/>
|
|
103
|
+
{/* page content */}
|
|
104
|
+
</>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
39
107
|
```
|
|
40
108
|
|
|
41
109
|
---
|
|
42
110
|
|
|
43
|
-
##
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
111
|
+
## 3. Sitemap Generation (Next.js 15)
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// app/sitemap.ts
|
|
115
|
+
import { MetadataRoute } from 'next';
|
|
116
|
+
|
|
117
|
+
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
|
118
|
+
const products = await getAllProducts();
|
|
119
|
+
|
|
120
|
+
const productUrls = products.map((product) => ({
|
|
121
|
+
url: `https://yoursite.com/products/${product.slug}`,
|
|
122
|
+
lastModified: product.updatedAt,
|
|
123
|
+
changeFrequency: 'weekly' as const,
|
|
124
|
+
priority: 0.8,
|
|
125
|
+
}));
|
|
126
|
+
|
|
127
|
+
return [
|
|
128
|
+
{
|
|
129
|
+
url: 'https://yoursite.com',
|
|
130
|
+
lastModified: new Date(),
|
|
131
|
+
changeFrequency: 'daily',
|
|
132
|
+
priority: 1.0,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
url: 'https://yoursite.com/products',
|
|
136
|
+
lastModified: new Date(),
|
|
137
|
+
changeFrequency: 'daily',
|
|
138
|
+
priority: 0.9,
|
|
139
|
+
},
|
|
140
|
+
...productUrls,
|
|
141
|
+
];
|
|
142
|
+
}
|
|
143
|
+
```
|
|
50
144
|
|
|
51
145
|
---
|
|
52
146
|
|
|
53
|
-
##
|
|
54
|
-
|
|
55
|
-
Every page must have:
|
|
56
|
-
|
|
57
|
-
```html
|
|
58
|
-
<!-- Unique, descriptive title — 50-60 characters -->
|
|
59
|
-
<title>How JWT Authentication Works in Node.js | YourSite</title>
|
|
147
|
+
## 4. Heading Structure (H1 Rules)
|
|
60
148
|
|
|
61
|
-
|
|
62
|
-
|
|
149
|
+
```markdown
|
|
150
|
+
RULE: Exactly ONE <h1> per page. It must contain the primary keyword.
|
|
151
|
+
Headings must be hierarchical: h1 → h2 → h3 (never skip levels)
|
|
63
152
|
|
|
64
|
-
|
|
65
|
-
|
|
153
|
+
❌ WRONG: Two h1s on the page
|
|
154
|
+
❌ WRONG: h1 is just the brand name (wastes keyword opportunity)
|
|
155
|
+
❌ WRONG: h3 directly under h1 (skips h2)
|
|
66
156
|
|
|
67
|
-
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
<
|
|
72
|
-
<
|
|
73
|
-
<meta property="og:image" content="..." />
|
|
157
|
+
✅ CORRECT structure:
|
|
158
|
+
<h1>Buy Premium Coffee Beans Online</h1> ← Primary keyword
|
|
159
|
+
<h2>Single Origin Coffees</h2> ← Category
|
|
160
|
+
<h3>Ethiopian Yirgacheffe</h3> ← Product
|
|
161
|
+
<h3>Colombian Supremo</h3>
|
|
162
|
+
<h2>Blended Coffees</h2>
|
|
74
163
|
```
|
|
75
164
|
|
|
76
165
|
---
|
|
77
166
|
|
|
78
|
-
##
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
{
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
"mainEntity": [{
|
|
96
|
-
"@type": "Question",
|
|
97
|
-
"name": "What is JWT?",
|
|
98
|
-
"acceptedAnswer": { "@type": "Answer", "text": "..." }
|
|
99
|
-
}]
|
|
167
|
+
## 5. GEO — Generative Engine Optimization
|
|
168
|
+
|
|
169
|
+
When AI engines (Perplexity, ChatGPT Search) index your site, they need:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// Next.js Edge Middleware: serve bare markdown to AI bots
|
|
173
|
+
// middleware.ts
|
|
174
|
+
export function middleware(req: NextRequest) {
|
|
175
|
+
const ua = req.headers.get('user-agent') ?? '';
|
|
176
|
+
const isAIBot = /ChatGPT-User|PerplexityBot|ClaudeBot|GPTBot/i.test(ua);
|
|
177
|
+
|
|
178
|
+
if (isAIBot) {
|
|
179
|
+
// Redirect to a markdown-only version (no CSS/JS — pure data)
|
|
180
|
+
return NextResponse.rewrite(
|
|
181
|
+
new URL(`/api/geo${req.nextUrl.pathname}`, req.url)
|
|
182
|
+
);
|
|
183
|
+
}
|
|
100
184
|
}
|
|
101
185
|
```
|
|
102
186
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
- Claim a tactic will produce specific ranking improvements
|
|
109
|
-
- Recommend keyword stuffing, cloaking, or other manipulative practices
|
|
110
|
-
- Reference Google's internal ranking factors without citing official documentation
|
|
187
|
+
**GEO Content Rules:**
|
|
188
|
+
- Every factual claim must have a `<cite>` tag with a source link
|
|
189
|
+
- Critical data (pricing, specs, limits) must be in static HTML — not JS-rendered
|
|
190
|
+
- Use `<dl>/<dt>/<dd>` for FAQ format — LLMs recognize this as QA pairs
|
|
191
|
+
- Code examples must exist as actual code blocks — not screenshots
|
|
111
192
|
|
|
112
193
|
---
|
|
113
|
-
|
|
114
|
-
## 🏛️ Tribunal Integration (Anti-Hallucination)
|
|
115
|
-
|
|
116
|
-
**Active reviewers: `logic`**
|
|
117
|
-
|
|
118
|
-
### SEO Hallucination Rules
|
|
119
|
-
|
|
120
|
-
1. **Documented ranking factors only** — all claims must reference Google Search Central, Google documentation, or reputable published studies
|
|
121
|
-
2. **No fabricated search volume** — never state "X keyword gets Y searches/month" without citing a real tool (Ahrefs, SEMrush, Google Keyword Planner)
|
|
122
|
-
3. **Algorithm claims need verification** — `[VERIFY: check current Google guidelines — algorithms change]` on any specific algorithm claim
|
|
123
|
-
4. **Schema types must exist** — only use schema.org types that actually exist and are documented on schema.org
|
|
124
|
-
|
|
125
|
-
### Self-Audit
|
|
126
|
-
|
|
127
|
-
```
|
|
128
|
-
✅ All ranking factor claims reference real documentation?
|
|
129
|
-
✅ All keyword/volume data sourced to a real tool?
|
|
130
|
-
✅ Algorithm claims marked for current-state verification?
|
|
131
|
-
✅ All schema.org types confirmed as existing types?
|
|
132
|
-
```
|
|
@@ -1,73 +1,161 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sql-reviewer
|
|
3
|
-
description: Audits SQL and ORM code for injection
|
|
3
|
+
description: Audits SQL queries and ORM code for injection vulnerabilities, N+1 query patterns, missing indexes on WHERE/JOIN columns, dangerous raw query usage, transaction boundary errors, and missing EXPLAIN ANALYZE on complex queries. Activates on /tribunal-database and /tribunal-full.
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
last-updated: 2026-04-02
|
|
4
6
|
---
|
|
5
7
|
|
|
6
|
-
# SQL Reviewer — The
|
|
8
|
+
# SQL Reviewer — The Query Auditor
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
> "One hallucinated column name will crash your migration. One interpolated string will expose your entire database."
|
|
10
|
+
---
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## Core Mandate
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
- **Parameters only**: String interpolation in SQL is never acceptable
|
|
16
|
-
- **Transactions for multi-write**: Two writes without a transaction is a data integrity bug waiting to happen
|
|
17
|
-
- **N+1 is a feature bug**: one query per loop item means 10,000 queries for 10,000 items
|
|
14
|
+
SQL mistakes are quiet, catastrophic, and permanent. Injection vulnerabilities expose the entire database. N+1 patterns destroy server performance under load. Missing indexes make pages timeout. You catch all three.
|
|
18
15
|
|
|
19
16
|
---
|
|
20
17
|
|
|
21
|
-
##
|
|
18
|
+
## Section 1: SQL Injection Patterns
|
|
22
19
|
|
|
23
|
-
|
|
20
|
+
**Rule:** Zero string interpolation into SQL queries. Ever.
|
|
24
21
|
|
|
25
|
-
```
|
|
26
|
-
❌
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
```typescript
|
|
23
|
+
// ❌ CRITICAL INJECTION VULNERABILITY
|
|
24
|
+
const query = `SELECT * FROM users WHERE email = '${userInput}'`;
|
|
25
|
+
await db.execute(query);
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
// ❌ STILL VULNERABLE: Template literals bypass parameterization
|
|
28
|
+
const result = await db.execute(`SELECT * FROM orders WHERE id = ${orderId}`);
|
|
31
29
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
// ✅ SAFE: Parameterized query (Postgres/pg driver)
|
|
31
|
+
const result = await client.query(
|
|
32
|
+
'SELECT * FROM users WHERE email = $1',
|
|
33
|
+
[userInput]
|
|
34
|
+
);
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
// ✅ SAFE: Prisma — never interpolates user input into SQL
|
|
37
|
+
const user = await prisma.user.findUnique({
|
|
38
|
+
where: { email: userInput }
|
|
39
|
+
});
|
|
37
40
|
|
|
41
|
+
// ✅ SAFE: Drizzle — type-safe query builder
|
|
42
|
+
const user = await db.select().from(users).where(eq(users.email, userInput));
|
|
38
43
|
```
|
|
39
|
-
❌ await db.insert('orders', order); // Two separate writes
|
|
40
|
-
await db.update('inventory', { deduct: 1 }); // No atomicity guarantee
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Section 2: N+1 Query Detection
|
|
48
|
+
|
|
49
|
+
The N+1 problem is where one query fetches N records, then fires N additional queries for each record's relations.
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// ❌ N+1: Fetches 100 users, then 100 separate post queries
|
|
53
|
+
const users = await prisma.user.findMany();
|
|
54
|
+
for (const user of users) {
|
|
55
|
+
const posts = await prisma.post.findMany({ where: { authorId: user.id } }); // N queries!
|
|
56
|
+
console.log(user.name, posts.length);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ✅ FIXED: One query with eager loading
|
|
60
|
+
const users = await prisma.user.findMany({
|
|
61
|
+
include: { posts: true } // Single JOIN query
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// ❌ N+1: GraphQL resolver without DataLoader
|
|
65
|
+
const resolver = {
|
|
66
|
+
User: {
|
|
67
|
+
posts: (parent) => db.posts.findAll({ where: { userId: parent.id } }) // Fires per user!
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ✅ FIXED: DataLoader batches all requests into one query
|
|
72
|
+
const postsLoader = new DataLoader(async (userIds) => {
|
|
73
|
+
const posts = await db.posts.findAll({ where: { userId: userIds } });
|
|
74
|
+
return userIds.map(id => posts.filter(p => p.userId === id));
|
|
75
|
+
});
|
|
46
76
|
```
|
|
47
77
|
|
|
48
|
-
|
|
78
|
+
**Common N+1 triggers:** `for` loops with ORM queries inside, GraphQL resolvers without DataLoader, `Array.map()` with async ORM calls.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Section 3: Missing Index Analysis
|
|
83
|
+
|
|
84
|
+
Mandatory indexes: every column used in `WHERE`, `JOIN ON`, `ORDER BY`, or `GROUP BY` must be indexed if the table has >1000 rows.
|
|
85
|
+
|
|
86
|
+
```sql
|
|
87
|
+
-- ❌ FLAGGED: email used in WHERE with no index
|
|
88
|
+
SELECT * FROM users WHERE email = 'user@example.com';
|
|
89
|
+
|
|
90
|
+
-- ❌ FLAGGED: Foreign key with no index (Postgres doesn't auto-index FKs)
|
|
91
|
+
SELECT * FROM orders JOIN users ON orders.user_id = users.id;
|
|
92
|
+
|
|
93
|
+
-- ✅ Required migration to add
|
|
94
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
95
|
+
CREATE INDEX idx_orders_user_id ON orders(user_id);
|
|
49
96
|
|
|
97
|
+
-- ✅ Composite index for multi-column WHERE
|
|
98
|
+
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
|
|
50
99
|
```
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
100
|
+
|
|
101
|
+
**Flag any query that:**
|
|
102
|
+
- Filters by a non-primary-key column with no evidence of an index
|
|
103
|
+
- JOINs on a foreign key column without a corresponding index
|
|
104
|
+
- Uses `ORDER BY` on unindexed columns in high-volume tables
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Section 4: Transaction Boundary Errors
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// ❌ DANGEROUS: Two writes outside a transaction — second can fail leaving orphaned data
|
|
112
|
+
await prisma.user.create({ data: userData });
|
|
113
|
+
await prisma.account.create({ data: accountData }); // If this fails, user exists without account
|
|
114
|
+
|
|
115
|
+
// ✅ SAFE: Atomic transaction — both succeed or both rollback
|
|
116
|
+
await prisma.$transaction(async (tx) => {
|
|
117
|
+
const user = await tx.user.create({ data: userData });
|
|
118
|
+
await tx.account.create({ data: { ...accountData, userId: user.id } });
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// ❌ DANGEROUS: Transaction without error handling
|
|
122
|
+
try {
|
|
123
|
+
await pool.query('BEGIN');
|
|
124
|
+
await pool.query('UPDATE accounts SET balance = balance - 100 WHERE id = $1', [fromId]);
|
|
125
|
+
await pool.query('UPDATE accounts SET balance = balance + 100 WHERE id = $1', [toId]);
|
|
126
|
+
await pool.query('COMMIT');
|
|
127
|
+
} catch {
|
|
128
|
+
// Missing ROLLBACK! Transaction stays open, locks tables
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ✅ SAFE: Explicit rollback in catch
|
|
132
|
+
} catch (err) {
|
|
133
|
+
await pool.query('ROLLBACK');
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
60
136
|
```
|
|
61
137
|
|
|
62
138
|
---
|
|
63
139
|
|
|
64
|
-
##
|
|
140
|
+
## Section 5: Dangerous Operations
|
|
65
141
|
|
|
66
|
-
```
|
|
67
|
-
|
|
142
|
+
```sql
|
|
143
|
+
-- ❌ FLAGGED: Unfiltered DELETE — deletes entire table in production
|
|
144
|
+
DELETE FROM sessions;
|
|
145
|
+
|
|
146
|
+
-- ❌ FLAGGED: SELECT * in production code — fetches all columns including blobs
|
|
147
|
+
SELECT * FROM documents WHERE user_id = $1;
|
|
68
148
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
149
|
+
-- ❌ FLAGGED: TRUNCATE in application code (not migration) — no WHERE, no rollback
|
|
150
|
+
TRUNCATE TABLE audit_logs;
|
|
151
|
+
|
|
152
|
+
-- ✅ SAFE: Scoped delete with WHERE
|
|
153
|
+
DELETE FROM sessions WHERE user_id = $1 AND expires_at < NOW();
|
|
154
|
+
|
|
155
|
+
-- ✅ SAFE: SELECT specific columns
|
|
156
|
+
SELECT id, title, created_at FROM documents WHERE user_id = $1;
|
|
73
157
|
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
---
|