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.
Files changed (250) hide show
  1. package/.agent/ARCHITECTURE.md +99 -99
  2. package/.agent/GEMINI.md +52 -52
  3. package/.agent/agents/accessibility-reviewer.md +139 -86
  4. package/.agent/agents/ai-code-reviewer.md +160 -90
  5. package/.agent/agents/backend-specialist.md +164 -127
  6. package/.agent/agents/code-archaeologist.md +115 -73
  7. package/.agent/agents/database-architect.md +130 -110
  8. package/.agent/agents/debugger.md +137 -97
  9. package/.agent/agents/dependency-reviewer.md +78 -30
  10. package/.agent/agents/devops-engineer.md +161 -118
  11. package/.agent/agents/documentation-writer.md +151 -87
  12. package/.agent/agents/explorer-agent.md +117 -99
  13. package/.agent/agents/frontend-reviewer.md +127 -47
  14. package/.agent/agents/frontend-specialist.md +169 -109
  15. package/.agent/agents/game-developer.md +28 -164
  16. package/.agent/agents/logic-reviewer.md +87 -49
  17. package/.agent/agents/mobile-developer.md +151 -103
  18. package/.agent/agents/mobile-reviewer.md +133 -50
  19. package/.agent/agents/orchestrator.md +121 -110
  20. package/.agent/agents/penetration-tester.md +103 -77
  21. package/.agent/agents/performance-optimizer.md +136 -92
  22. package/.agent/agents/performance-reviewer.md +139 -69
  23. package/.agent/agents/product-manager.md +104 -70
  24. package/.agent/agents/product-owner.md +6 -25
  25. package/.agent/agents/project-planner.md +95 -95
  26. package/.agent/agents/qa-automation-engineer.md +174 -87
  27. package/.agent/agents/security-auditor.md +133 -129
  28. package/.agent/agents/seo-specialist.md +160 -99
  29. package/.agent/agents/sql-reviewer.md +132 -44
  30. package/.agent/agents/supervisor-agent.md +137 -109
  31. package/.agent/agents/swarm-worker-contracts.md +17 -17
  32. package/.agent/agents/swarm-worker-registry.md +46 -46
  33. package/.agent/agents/test-coverage-reviewer.md +132 -53
  34. package/.agent/agents/test-engineer.md +0 -21
  35. package/.agent/agents/type-safety-reviewer.md +143 -33
  36. package/.agent/patterns/generator.md +9 -9
  37. package/.agent/patterns/inversion.md +12 -12
  38. package/.agent/patterns/pipeline.md +9 -9
  39. package/.agent/patterns/reviewer.md +13 -13
  40. package/.agent/patterns/tool-wrapper.md +9 -9
  41. package/.agent/rules/GEMINI.md +63 -63
  42. package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
  43. package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
  44. package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
  45. package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
  46. package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
  47. package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
  48. package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
  49. package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
  50. package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
  51. package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
  52. package/.agent/scripts/compress_skills.py +167 -0
  53. package/.agent/scripts/consolidate_skills.py +173 -0
  54. package/.agent/scripts/deep_compress.py +202 -0
  55. package/.agent/scripts/minify_context.py +80 -0
  56. package/.agent/scripts/security_scan.py +1 -1
  57. package/.agent/scripts/strip_tribunal.py +41 -0
  58. package/.agent/skills/agent-organizer/SKILL.md +60 -100
  59. package/.agent/skills/agentic-patterns/SKILL.md +0 -70
  60. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
  61. package/.agent/skills/api-patterns/SKILL.md +197 -257
  62. package/.agent/skills/api-security-auditor/SKILL.md +125 -57
  63. package/.agent/skills/app-builder/SKILL.md +326 -50
  64. package/.agent/skills/app-builder/templates/SKILL.md +13 -15
  65. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
  66. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
  67. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
  68. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
  69. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
  70. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
  71. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
  72. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
  73. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
  74. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
  75. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
  76. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
  77. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
  78. package/.agent/skills/appflow-wireframe/SKILL.md +71 -98
  79. package/.agent/skills/architecture/SKILL.md +161 -200
  80. package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
  81. package/.agent/skills/bash-linux/SKILL.md +71 -166
  82. package/.agent/skills/behavioral-modes/SKILL.md +8 -69
  83. package/.agent/skills/brainstorming/SKILL.md +345 -127
  84. package/.agent/skills/building-native-ui/SKILL.md +125 -57
  85. package/.agent/skills/clean-code/SKILL.md +266 -149
  86. package/.agent/skills/code-review-checklist/SKILL.md +0 -62
  87. package/.agent/skills/config-validator/SKILL.md +73 -131
  88. package/.agent/skills/csharp-developer/SKILL.md +434 -73
  89. package/.agent/skills/database-design/SKILL.md +190 -275
  90. package/.agent/skills/deployment-procedures/SKILL.md +81 -158
  91. package/.agent/skills/devops-engineer/SKILL.md +255 -94
  92. package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
  93. package/.agent/skills/doc.md +5 -5
  94. package/.agent/skills/documentation-templates/SKILL.md +19 -63
  95. package/.agent/skills/edge-computing/SKILL.md +75 -165
  96. package/.agent/skills/extract-design-system/SKILL.md +84 -58
  97. package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
  98. package/.agent/skills/frontend-design/SKILL.md +151 -499
  99. package/.agent/skills/game-design-expert/SKILL.md +71 -0
  100. package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
  101. package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
  102. package/.agent/skills/github-operations/SKILL.md +197 -272
  103. package/.agent/skills/gsap-expert/SKILL.md +194 -0
  104. package/.agent/skills/i18n-localization/SKILL.md +60 -172
  105. package/.agent/skills/intelligent-routing/SKILL.md +123 -103
  106. package/.agent/skills/lint-and-validate/SKILL.md +8 -52
  107. package/.agent/skills/llm-engineering/SKILL.md +281 -195
  108. package/.agent/skills/local-first/SKILL.md +76 -159
  109. package/.agent/skills/mcp-builder/SKILL.md +48 -188
  110. package/.agent/skills/mobile-design/SKILL.md +213 -219
  111. package/.agent/skills/motion-engineering/SKILL.md +184 -0
  112. package/.agent/skills/nextjs-react-expert/SKILL.md +184 -203
  113. package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
  114. package/.agent/skills/observability/SKILL.md +211 -203
  115. package/.agent/skills/parallel-agents/SKILL.md +53 -146
  116. package/.agent/skills/performance-profiling/SKILL.md +171 -151
  117. package/.agent/skills/plan-writing/SKILL.md +49 -153
  118. package/.agent/skills/platform-engineer/SKILL.md +57 -103
  119. package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
  120. package/.agent/skills/powershell-windows/SKILL.md +61 -179
  121. package/.agent/skills/python-patterns/SKILL.md +7 -35
  122. package/.agent/skills/python-pro/SKILL.md +273 -114
  123. package/.agent/skills/react-specialist/SKILL.md +227 -108
  124. package/.agent/skills/readme-builder/SKILL.md +15 -85
  125. package/.agent/skills/realtime-patterns/SKILL.md +216 -243
  126. package/.agent/skills/red-team-tactics/SKILL.md +10 -51
  127. package/.agent/skills/rust-pro/SKILL.md +525 -142
  128. package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
  129. package/.agent/skills/server-management/SKILL.md +110 -166
  130. package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
  131. package/.agent/skills/skill-creator/SKILL.md +18 -58
  132. package/.agent/skills/sql-pro/SKILL.md +543 -68
  133. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
  134. package/.agent/skills/swiftui-expert/SKILL.md +124 -57
  135. package/.agent/skills/systematic-debugging/SKILL.md +49 -151
  136. package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
  137. package/.agent/skills/tdd-workflow/SKILL.md +63 -169
  138. package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
  139. package/.agent/skills/testing-patterns/SKILL.md +437 -130
  140. package/.agent/skills/trend-researcher/SKILL.md +30 -71
  141. package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
  142. package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
  143. package/.agent/skills/vue-expert/SKILL.md +225 -119
  144. package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
  145. package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
  146. package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
  147. package/.agent/skills/webapp-testing/SKILL.md +71 -196
  148. package/.agent/skills/whimsy-injector/SKILL.md +58 -132
  149. package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
  150. package/.agent/workflows/api-tester.md +96 -224
  151. package/.agent/workflows/audit.md +81 -122
  152. package/.agent/workflows/brainstorm.md +69 -105
  153. package/.agent/workflows/changelog.md +65 -97
  154. package/.agent/workflows/create.md +73 -88
  155. package/.agent/workflows/debug.md +80 -111
  156. package/.agent/workflows/deploy.md +119 -92
  157. package/.agent/workflows/enhance.md +80 -91
  158. package/.agent/workflows/fix.md +68 -97
  159. package/.agent/workflows/generate.md +165 -164
  160. package/.agent/workflows/migrate.md +106 -109
  161. package/.agent/workflows/orchestrate.md +103 -86
  162. package/.agent/workflows/performance-benchmarker.md +77 -268
  163. package/.agent/workflows/plan.md +120 -98
  164. package/.agent/workflows/preview.md +39 -96
  165. package/.agent/workflows/refactor.md +105 -97
  166. package/.agent/workflows/review-ai.md +63 -102
  167. package/.agent/workflows/review.md +71 -110
  168. package/.agent/workflows/session.md +53 -113
  169. package/.agent/workflows/status.md +42 -88
  170. package/.agent/workflows/strengthen-skills.md +90 -51
  171. package/.agent/workflows/swarm.md +114 -129
  172. package/.agent/workflows/test.md +125 -102
  173. package/.agent/workflows/tribunal-backend.md +60 -78
  174. package/.agent/workflows/tribunal-database.md +62 -100
  175. package/.agent/workflows/tribunal-frontend.md +62 -82
  176. package/.agent/workflows/tribunal-full.md +56 -100
  177. package/.agent/workflows/tribunal-mobile.md +65 -94
  178. package/.agent/workflows/tribunal-performance.md +62 -105
  179. package/.agent/workflows/ui-ux-pro-max.md +72 -121
  180. package/README.md +11 -15
  181. package/package.json +1 -1
  182. package/.agent/skills/api-patterns/api-style.md +0 -42
  183. package/.agent/skills/api-patterns/auth.md +0 -24
  184. package/.agent/skills/api-patterns/documentation.md +0 -26
  185. package/.agent/skills/api-patterns/graphql.md +0 -41
  186. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  187. package/.agent/skills/api-patterns/response.md +0 -37
  188. package/.agent/skills/api-patterns/rest.md +0 -40
  189. package/.agent/skills/api-patterns/security-testing.md +0 -122
  190. package/.agent/skills/api-patterns/trpc.md +0 -41
  191. package/.agent/skills/api-patterns/versioning.md +0 -22
  192. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  193. package/.agent/skills/app-builder/feature-building.md +0 -53
  194. package/.agent/skills/app-builder/project-detection.md +0 -34
  195. package/.agent/skills/app-builder/scaffolding.md +0 -118
  196. package/.agent/skills/app-builder/tech-stack.md +0 -40
  197. package/.agent/skills/architecture/context-discovery.md +0 -43
  198. package/.agent/skills/architecture/examples.md +0 -94
  199. package/.agent/skills/architecture/pattern-selection.md +0 -68
  200. package/.agent/skills/architecture/patterns-reference.md +0 -50
  201. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  202. package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
  203. package/.agent/skills/database-design/database-selection.md +0 -43
  204. package/.agent/skills/database-design/indexing.md +0 -39
  205. package/.agent/skills/database-design/migrations.md +0 -48
  206. package/.agent/skills/database-design/optimization.md +0 -36
  207. package/.agent/skills/database-design/orm-selection.md +0 -30
  208. package/.agent/skills/database-design/schema-design.md +0 -56
  209. package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
  210. package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
  211. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  212. package/.agent/skills/frontend-design/color-system.md +0 -329
  213. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  214. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  215. package/.agent/skills/frontend-design/typography-system.md +0 -363
  216. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  217. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  218. package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
  219. package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
  220. package/.agent/skills/game-development/SKILL.md +0 -236
  221. package/.agent/skills/game-development/game-art/SKILL.md +0 -185
  222. package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
  223. package/.agent/skills/game-development/game-design/SKILL.md +0 -129
  224. package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
  225. package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
  226. package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
  227. package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
  228. package/.agent/skills/game-development/web-games/SKILL.md +0 -150
  229. package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
  230. package/.agent/skills/mobile-design/decision-trees.md +0 -516
  231. package/.agent/skills/mobile-design/mobile-backend.md +0 -491
  232. package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
  233. package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
  234. package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
  235. package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
  236. package/.agent/skills/mobile-design/mobile-performance.md +0 -767
  237. package/.agent/skills/mobile-design/mobile-testing.md +0 -356
  238. package/.agent/skills/mobile-design/mobile-typography.md +0 -433
  239. package/.agent/skills/mobile-design/platform-android.md +0 -666
  240. package/.agent/skills/mobile-design/platform-ios.md +0 -561
  241. package/.agent/skills/mobile-design/touch-psychology.md +0 -537
  242. package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
  243. package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
  244. package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
  245. package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
  246. package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
  247. package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
  248. package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
  249. package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
  250. package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
@@ -1,132 +1,193 @@
1
1
  ---
2
2
  name: seo-specialist
3
- description: Search engine optimization strategist covering technical SEO, content structure, Core Web Vitals, and schema markup. Keywords: seo, search, ranking, meta, schema, sitemap, crawl, indexing, keyword.
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 Strategist
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
- ## My SEO Framework: Three Pillars
16
-
17
- ```
18
- Technical SEO → Can search engines crawl and index this?
19
- Content Relevance Does this answer what the searcher is looking for?
20
- Authority signals → Do other credible sources reference this?
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
- ## Technical SEO Audit Sequence
28
-
29
- When auditing a page or site:
30
-
31
- ```
32
- 1. Crawlability → robots.txt correct? No accidental noindex?
33
- 2. Indexability → Canonical tags set? Duplicate content handled?
34
- 3. Core Web Vitals → LCP < 2.5s? INP < 200ms? CLS < 0.1?
35
- 4. Mobile → Viewport meta tag? Touch targets ≥ 48px?
36
- 5. Structured data → Schema.org markup valid? Correct type?
37
- 6. Internal links → Key pages linked from multiple entry points?
38
- 7. Sitemaps → XML sitemap up to date and submitted?
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
- ## Core Web Vitals SEO Impact
44
-
45
- | Metric | Target | Impact if Miss |
46
- |---|---|---|
47
- | LCP | < 2.5s | Lower ranking signal in page experience |
48
- | INP | < 200ms | Affects perceived quality signals |
49
- | CLS | < 0.1 | Image layout shifts hurt E-E-A-T perception |
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
- ## On-Page SEO Checklist
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
- <!-- Compelling meta description — 150-160 characters -->
62
- <meta name="description" content="Learn how to implement JWT auth in Node.js with Express. Step-by-step guide with secure token generation and validation." />
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
- <!-- Single H1 matching primary keyword intent -->
65
- <h1>JWT Authentication in Node.js: Complete Guide</h1>
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
- <!-- Canonical to prevent duplicate content -->
68
- <link rel="canonical" href="https://yoursite.com/blog/jwt-auth-nodejs" />
69
-
70
- <!-- Open Graph for social sharing -->
71
- <meta property="og:title" content="..." />
72
- <meta property="og:description" content="..." />
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
- ## Schema Markup by Content Type
79
-
80
- ```json
81
- // Blog post / article
82
- {
83
- "@context": "https://schema.org",
84
- "@type": "Article",
85
- "headline": "...",
86
- "author": { "@type": "Person", "name": "..." },
87
- "datePublished": "2025-01-15",
88
- "dateModified": "2025-02-01"
89
- }
90
-
91
- // FAQ content — triggers rich results
92
- {
93
- "@context": "https://schema.org",
94
- "@type": "FAQPage",
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
- ## What I Will Never Do
106
-
107
- - Cite search volume numbers without a verified tool source
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 risks, N+1 queries, missing transactions, and hallucinated table/column names. Activates on /tribunal-database and /tribunal-full.
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 Database Guardian
8
+ # SQL Reviewer — The Query Auditor
7
9
 
8
- ## Core Philosophy
9
-
10
- > "One hallucinated column name will crash your migration. One interpolated string will expose your entire database."
10
+ ---
11
11
 
12
- ## Your Mindset
12
+ ## Core Mandate
13
13
 
14
- - **Schema is ground truth**: Table and column names not in the schema = suspect
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
- ## What You Check
18
+ ## Section 1: SQL Injection Patterns
22
19
 
23
- ### 1. SQL Injection
20
+ **Rule:** Zero string interpolation into SQL queries. Ever.
24
21
 
25
- ```
26
- db.query(`SELECT * FROM users WHERE email = '${email}'`)
27
- db.query('SELECT * FROM users WHERE email = $1', [email])
28
- ```
22
+ ```typescript
23
+ // CRITICAL INJECTION VULNERABILITY
24
+ const query = `SELECT * FROM users WHERE email = '${userInput}'`;
25
+ await db.execute(query);
29
26
 
30
- ### 2. Hallucinated Table/Column Names
27
+ // STILL VULNERABLE: Template literals bypass parameterization
28
+ const result = await db.execute(`SELECT * FROM orders WHERE id = ${orderId}`);
31
29
 
32
- If a schema was provided in context:
33
- - Flag any table or column name NOT found in the provided schema
34
- - These may be fabricated by the AI and will cause runtime errors
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
- ### 3. Missing Transactions (Multi-write)
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
- ✅ await db.transaction(async (trx) => {
43
- await trx.insert('orders', order);
44
- await trx.update('inventory', { deduct: 1 });
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
- ### 4. N+1 Query Pattern
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
- ❌ const posts = await getPosts();
52
- for (const post of posts) {
53
- post.author = await getUser(post.userId); // 1 query per post
54
- }
55
-
56
- ✅ const posts = await db
57
- .select('posts.*', 'users.name as author_name')
58
- .from('posts')
59
- .join('users', 'users.id', 'posts.user_id'); // Single JOIN query
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
- ## Output Format
140
+ ## Section 5: Dangerous Operations
65
141
 
66
- ```
67
- 🗄️ SQL Review: [APPROVED / REJECTED ❌]
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
- Issues found:
70
- - Line 8: String interpolation in SQL query → SQL injection risk
71
- - Line 24: 'user_profiles' table referenced but not in provided schema (hallucinated?)
72
- - Lines 30-35: N+1 pattern getUser() called inside a loop. Use a JOIN.
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
+ ---