tribunal-kit 6.0.1 → 7.0.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 +9 -6
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/history/memory/.memory.idx +1532 -1
- package/.agent/history/memory/MEMORY.md +102 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2033 -263
- package/.agent/rules/GEMINI.md +11 -9
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/auto_preview.js +39 -43
- package/.agent/scripts/bundle_analyzer.js +47 -60
- package/.agent/scripts/case_law_manager.js +200 -294
- package/.agent/scripts/checklist.js +73 -94
- package/.agent/scripts/cicd_validator.js +305 -0
- package/.agent/scripts/compile_router.py +4 -111
- package/.agent/scripts/context_broker.js +317 -412
- package/.agent/scripts/contract_engine.js +402 -0
- package/.agent/scripts/dependency_analyzer.js +112 -124
- package/.agent/scripts/graph_builder.js +75 -103
- package/.agent/scripts/graph_visualizer.js +10 -12
- package/.agent/scripts/graph_zoom.js +38 -55
- package/.agent/scripts/guardrail_engine.js +195 -145
- package/.agent/scripts/impact_classifier.js +55 -30
- package/.agent/scripts/inner_loop_validator.js +108 -159
- package/.agent/scripts/integrity_manifest.js +59 -67
- package/.agent/scripts/lint_runner.js +65 -75
- package/.agent/scripts/marathon_harness.js +131 -208
- package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
- package/.agent/scripts/minify_context.js +29 -33
- package/.agent/scripts/minimal_change_engine.js +95 -87
- package/.agent/scripts/mutation_runner.js +46 -62
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +118 -93
- package/.agent/scripts/schema_validator.js +73 -121
- package/.agent/scripts/security_scan.js +88 -117
- package/.agent/scripts/session_manager.js +52 -69
- package/.agent/scripts/signal_detector.js +24 -22
- package/.agent/scripts/skill_evolution.js +184 -245
- package/.agent/scripts/skill_integrator.js +35 -48
- package/.agent/scripts/socratic_gate_policy.js +15 -12
- package/.agent/scripts/strengthen_skills.js +29 -33
- package/.agent/scripts/swarm_dispatcher.js +120 -151
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +9 -7
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +22 -3
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +6 -2
- package/.agent/skills/ai-app-hardening/SKILL.md +9 -8
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +5 -4
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +7 -3
- package/.agent/skills/edge-ai-mobile/SKILL.md +5 -1
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +2 -1
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +2 -1
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +1 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +3 -2
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +10 -12
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +3 -2
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +11 -6
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +2 -1
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/CONTRIBUTING.md +3 -3
- package/README.md +94 -44
- package/SECURITY.md +10 -10
- package/bin/mcp-server.js +385 -252
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +40 -46
- package/dist/cli.js +6 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/status.js +6 -0
- package/dist/index.d.ts +8 -1
- package/package.json +13 -12
- package/scripts/benchmark.js +62 -86
- package/scripts/changelog.js +67 -73
- package/scripts/fix-vbc.js +13 -15
- package/scripts/fix-vbc.ps1 +2 -118
- package/scripts/stress_benchmark.js +358 -0
- package/scripts/sync-version.js +71 -41
- package/scripts/validate-payload.js +23 -30
- package/scripts/visual_audit.js +23 -13
|
@@ -17,6 +17,7 @@ last-updated: 2026-07-29
|
|
|
17
17
|
## Mandatory Pre-Flight Context Inspection
|
|
18
18
|
|
|
19
19
|
Before generating metadata, sitemaps, or structured data, you MUST inspect:
|
|
20
|
+
|
|
20
21
|
1. `app/layout.tsx` / `next.config.js` → Read base URL, default metadata options, and OpenGraph defaults
|
|
21
22
|
2. Page templates (`app/**/page.tsx`) → Verify heading hierarchy (single `<h1>` per page) and Schema.org JSON-LD scripts
|
|
22
23
|
3. AI bot middleware / GEO paths → Audit `sitemap.ts`, `robots.ts`, and crawler detection rules
|
|
@@ -25,20 +26,24 @@ Before generating metadata, sitemaps, or structured data, you MUST inspect:
|
|
|
25
26
|
|
|
26
27
|
```typescript
|
|
27
28
|
// app/products/[slug]/page.tsx
|
|
28
|
-
import { Metadata } from
|
|
29
|
+
import { Metadata } from 'next';
|
|
29
30
|
|
|
30
31
|
// Static metadata
|
|
31
32
|
export const metadata: Metadata = {
|
|
32
|
-
title:
|
|
33
|
-
description:
|
|
33
|
+
title: 'Product Name | Brand',
|
|
34
|
+
description: 'Compelling 155-character description that matches search intent.',
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
// Dynamic metadata (fetched per-page)
|
|
37
|
-
export async function generateMetadata({
|
|
38
|
+
export async function generateMetadata({
|
|
39
|
+
params,
|
|
40
|
+
}: {
|
|
41
|
+
params: Promise<{ slug: string }>;
|
|
42
|
+
}): Promise<Metadata> {
|
|
38
43
|
const { slug } = await params;
|
|
39
44
|
const product = await getProduct(slug);
|
|
40
45
|
|
|
41
|
-
if (!product) return { title:
|
|
46
|
+
if (!product) return { title: 'Not Found' };
|
|
42
47
|
|
|
43
48
|
return {
|
|
44
49
|
title: `${product.name} | Brand`,
|
|
@@ -56,12 +61,12 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str
|
|
|
56
61
|
alt: product.name,
|
|
57
62
|
},
|
|
58
63
|
],
|
|
59
|
-
siteName:
|
|
60
|
-
type:
|
|
64
|
+
siteName: 'Your Brand',
|
|
65
|
+
type: 'website',
|
|
61
66
|
},
|
|
62
67
|
|
|
63
68
|
twitter: {
|
|
64
|
-
card:
|
|
69
|
+
card: 'summary_large_image',
|
|
65
70
|
title: product.name,
|
|
66
71
|
description: product.seoDescription,
|
|
67
72
|
images: [product.imageUrl],
|
|
@@ -81,21 +86,23 @@ export default async function ProductPage({ params }) {
|
|
|
81
86
|
const product = await getProduct(slug);
|
|
82
87
|
|
|
83
88
|
const jsonLd = {
|
|
84
|
-
|
|
85
|
-
|
|
89
|
+
'@context': 'https://schema.org',
|
|
90
|
+
'@type': 'Product',
|
|
86
91
|
name: product.name,
|
|
87
92
|
image: product.imageUrl,
|
|
88
93
|
description: product.description,
|
|
89
94
|
sku: product.sku,
|
|
90
95
|
offers: {
|
|
91
|
-
|
|
96
|
+
'@type': 'Offer',
|
|
92
97
|
price: product.price,
|
|
93
|
-
priceCurrency:
|
|
94
|
-
availability: product.inStock
|
|
98
|
+
priceCurrency: 'USD',
|
|
99
|
+
availability: product.inStock
|
|
100
|
+
? 'https://schema.org/InStock'
|
|
101
|
+
: 'https://schema.org/OutOfStock',
|
|
95
102
|
url: `https://yoursite.com/products/${slug}`,
|
|
96
103
|
},
|
|
97
104
|
aggregateRating: {
|
|
98
|
-
|
|
105
|
+
'@type': 'AggregateRating',
|
|
99
106
|
ratingValue: product.averageRating,
|
|
100
107
|
reviewCount: product.reviewCount,
|
|
101
108
|
},
|
|
@@ -103,7 +110,10 @@ export default async function ProductPage({ params }) {
|
|
|
103
110
|
|
|
104
111
|
return (
|
|
105
112
|
<>
|
|
106
|
-
<script
|
|
113
|
+
<script
|
|
114
|
+
type="application/ld+json"
|
|
115
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
|
116
|
+
/>
|
|
107
117
|
{/* page content */}
|
|
108
118
|
</>
|
|
109
119
|
);
|
|
@@ -116,29 +126,29 @@ export default async function ProductPage({ params }) {
|
|
|
116
126
|
|
|
117
127
|
```typescript
|
|
118
128
|
// app/sitemap.ts
|
|
119
|
-
import { MetadataRoute } from
|
|
129
|
+
import { MetadataRoute } from 'next';
|
|
120
130
|
|
|
121
131
|
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
|
122
132
|
const products = await getAllProducts();
|
|
123
133
|
|
|
124
|
-
const productUrls = products.map(
|
|
134
|
+
const productUrls = products.map(product => ({
|
|
125
135
|
url: `https://yoursite.com/products/${product.slug}`,
|
|
126
136
|
lastModified: product.updatedAt,
|
|
127
|
-
changeFrequency:
|
|
137
|
+
changeFrequency: 'weekly' as const,
|
|
128
138
|
priority: 0.8,
|
|
129
139
|
}));
|
|
130
140
|
|
|
131
141
|
return [
|
|
132
142
|
{
|
|
133
|
-
url:
|
|
143
|
+
url: 'https://yoursite.com',
|
|
134
144
|
lastModified: new Date(),
|
|
135
|
-
changeFrequency:
|
|
145
|
+
changeFrequency: 'daily',
|
|
136
146
|
priority: 1.0,
|
|
137
147
|
},
|
|
138
148
|
{
|
|
139
|
-
url:
|
|
149
|
+
url: 'https://yoursite.com/products',
|
|
140
150
|
lastModified: new Date(),
|
|
141
|
-
changeFrequency:
|
|
151
|
+
changeFrequency: 'daily',
|
|
142
152
|
priority: 0.9,
|
|
143
153
|
},
|
|
144
154
|
...productUrls,
|
|
@@ -177,7 +187,7 @@ When AI engines (Perplexity, ChatGPT Search) index your site, they need:
|
|
|
177
187
|
// Next.js Edge Middleware: serve bare markdown to AI bots
|
|
178
188
|
// middleware.ts
|
|
179
189
|
export function middleware(req: NextRequest) {
|
|
180
|
-
const ua = req.headers.get(
|
|
190
|
+
const ua = req.headers.get('user-agent') ?? '';
|
|
181
191
|
const isAIBot = /ChatGPT-User|PerplexityBot|ClaudeBot|GPTBot/i.test(ua);
|
|
182
192
|
|
|
183
193
|
if (isAIBot) {
|
|
@@ -21,6 +21,7 @@ SQL mistakes are quiet, catastrophic, and permanent. Injection vulnerabilities e
|
|
|
21
21
|
## Mandatory Pre-Flight Context Inspection
|
|
22
22
|
|
|
23
23
|
Before auditing SQL queries or ORM calls, you MUST inspect:
|
|
24
|
+
|
|
24
25
|
1. `schema.prisma` / `drizzle.schema.ts` / DB migrations → Inspect table schema, existing indices, and foreign key relations
|
|
25
26
|
2. ORM & DB driver in `package.json` → Confirm parameterization syntax (`$1` in pg vs `?` in mysql vs Prisma objects)
|
|
26
27
|
3. Query invocation sites → Check for raw SQL strings (`SELECT ... ${input}`) or `for` loops making queries inside loop bodies
|
|
@@ -40,7 +41,7 @@ await db.execute(query);
|
|
|
40
41
|
const result = await db.execute(`SELECT * FROM orders WHERE id = ${orderId}`);
|
|
41
42
|
|
|
42
43
|
// ✅ SAFE: Parameterized query (Postgres/pg driver)
|
|
43
|
-
const result = await client.query(
|
|
44
|
+
const result = await client.query('SELECT * FROM users WHERE email = $1', [userInput]);
|
|
44
45
|
|
|
45
46
|
// ✅ SAFE: Prisma — never interpolates user input into SQL
|
|
46
47
|
const user = await prisma.user.findUnique({
|
|
@@ -73,14 +74,14 @@ const users = await prisma.user.findMany({
|
|
|
73
74
|
// ❌ N+1: GraphQL resolver without DataLoader
|
|
74
75
|
const resolver = {
|
|
75
76
|
User: {
|
|
76
|
-
posts:
|
|
77
|
+
posts: parent => db.posts.findAll({ where: { userId: parent.id } }), // Fires per user!
|
|
77
78
|
},
|
|
78
79
|
};
|
|
79
80
|
|
|
80
81
|
// ✅ FIXED: DataLoader batches all requests into one query
|
|
81
|
-
const postsLoader = new DataLoader(async
|
|
82
|
+
const postsLoader = new DataLoader(async userIds => {
|
|
82
83
|
const posts = await db.posts.findAll({ where: { userId: userIds } });
|
|
83
|
-
return userIds.map(
|
|
84
|
+
return userIds.map(id => posts.filter(p => p.userId === id));
|
|
84
85
|
});
|
|
85
86
|
```
|
|
86
87
|
|
|
@@ -18,6 +18,7 @@ last-updated: 2026-07-29
|
|
|
18
18
|
## Mandatory Pre-Flight Context Inspection
|
|
19
19
|
|
|
20
20
|
Before decomposing goals into worker dispatches, you MUST inspect:
|
|
21
|
+
|
|
21
22
|
1. `swarm-worker-registry.md` → Read the primary routing table and specialist worker capabilities
|
|
22
23
|
2. Active codebase file layout (`task.md`, file structure) → Ensure worker target file paths do not overlap across parallel tasks
|
|
23
24
|
3. System constraints & dependencies (`package.json`, environment variables) → Verify context passed to workers is grounded in current repo state
|
|
@@ -78,8 +79,17 @@ Every worker receives a structured JSON dispatch. No unstructured natural langua
|
|
|
78
79
|
"scope": "Refactor the UserCard component to use Server Components and remove client-side state that belongs on the server.",
|
|
79
80
|
"files_to_read": ["src/components/UserCard.tsx", "src/app/users/[id]/page.tsx"],
|
|
80
81
|
"files_to_write": ["src/components/UserCard.tsx", "src/components/UserCardClient.tsx"],
|
|
81
|
-
"context_summary": [
|
|
82
|
-
|
|
82
|
+
"context_summary": [
|
|
83
|
+
"The app uses Next.js 15 App Router",
|
|
84
|
+
"Authentication is handled via next-auth v5 (now 'auth' package)",
|
|
85
|
+
"Database uses Prisma 6 with PostgreSQL",
|
|
86
|
+
"No existing tests for this component"
|
|
87
|
+
],
|
|
88
|
+
"constraints": [
|
|
89
|
+
"Do NOT modify any files outside the listed files_to_write",
|
|
90
|
+
"Store only interactive state in the Client Component",
|
|
91
|
+
"Maintain identical visual output — no design changes"
|
|
92
|
+
],
|
|
83
93
|
"output_format": {
|
|
84
94
|
"status": "COMPLETE | BLOCKED | ERROR",
|
|
85
95
|
"files_modified": ["list of files actually changed"],
|
|
@@ -18,16 +18,16 @@ interface WorkerRequest {
|
|
|
18
18
|
|
|
19
19
|
// The category of work being requested.
|
|
20
20
|
type:
|
|
21
|
-
|
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
21
|
+
| 'research' // Understand or explain something
|
|
22
|
+
| 'generate_code' // Write new code
|
|
23
|
+
| 'review_code' // Audit existing code
|
|
24
|
+
| 'debug' // Find and fix a bug
|
|
25
|
+
| 'plan' // Produce a structured plan only (no code)
|
|
26
|
+
| 'design_schema' // Design a database or data schema
|
|
27
|
+
| 'write_docs' // Write documentation or comments
|
|
28
|
+
| 'security_audit' // OWASP security review
|
|
29
|
+
| 'optimize' // Refactor for performance
|
|
30
|
+
| 'test'; // Write or run tests
|
|
31
31
|
|
|
32
32
|
// The agent to route this WorkerRequest to.
|
|
33
33
|
// MUST match a filename in .agent/agents/ (without the .md extension).
|
|
@@ -77,9 +77,9 @@ interface WorkerResult {
|
|
|
77
77
|
|
|
78
78
|
// Outcome of the Worker's execution.
|
|
79
79
|
status:
|
|
80
|
-
|
|
|
81
|
-
|
|
|
82
|
-
|
|
|
80
|
+
| 'success' // Task completed. Output is valid.
|
|
81
|
+
| 'failure' // Task failed but retries remain.
|
|
82
|
+
| 'escalate'; // Task failed after max_retries. Requires human intervention.
|
|
83
83
|
|
|
84
84
|
// The agent's output if status is "success".
|
|
85
85
|
// Empty string if status is "failure" or "escalate".
|
|
@@ -8,35 +8,35 @@ All agents listed here MUST exist as `.md` files in `.agent/agents/`.
|
|
|
8
8
|
|
|
9
9
|
## Primary Routing Table
|
|
10
10
|
|
|
11
|
-
| Task Type | Domain Keywords
|
|
12
|
-
| ---------------- |
|
|
13
|
-
| `research` | any
|
|
14
|
-
| `research` | security, vulnerability, owasp
|
|
15
|
-
| `research` | database, schema, sql, orm
|
|
16
|
-
| `research` | performance, profiling, optimization
|
|
17
|
-
| `generate_code` | api, route, endpoint, server, express, auth, jwt
|
|
18
|
-
| `generate_code` | python, fastapi, django, flask
|
|
19
|
-
| `generate_code` | c#, .net, blazor, aspnet
|
|
20
|
-
| `generate_code` | component, hook, react, next, ui, css
|
|
21
|
-
| `generate_code` | mobile, react native, flutter, ios, android
|
|
22
|
-
| `generate_code` | docker, ci, cd, deploy, github actions, cloud
|
|
23
|
-
| `generate_code` | sql, query, migration, prisma, drizzle
|
|
24
|
-
| `generate_code` | vue, nuxt
|
|
25
|
-
| `review_code` | api, backend, auth
|
|
26
|
-
| `review_code` | react, component, hook
|
|
27
|
-
| `review_code` | sql, query
|
|
28
|
-
| `review_code` | security (any domain)
|
|
29
|
-
| `debug` | any
|
|
30
|
-
| `plan` | any
|
|
31
|
-
| `design_schema` | any
|
|
32
|
-
| `write_docs` | any
|
|
33
|
-
| `security_audit` | any
|
|
34
|
-
| `optimize` | any
|
|
35
|
-
| `test` | any
|
|
36
|
-
| `visual_audit` | ui, component, visual, screenshot, layout, render| `ui-visual-auditor`
|
|
37
|
-
| `generate_code` | aws, terraform, ecs, fargate, lambda, iac, vpc
|
|
38
|
-
| `plan` | system design, scale, capacity, architecture
|
|
39
|
-
| `test` | e2e, playwright, automation, cypress
|
|
11
|
+
| Task Type | Domain Keywords | Route to Agent |
|
|
12
|
+
| ---------------- | ------------------------------------------------- | ------------------------ |
|
|
13
|
+
| `research` | any | `explorer-agent` |
|
|
14
|
+
| `research` | security, vulnerability, owasp | `security-auditor` |
|
|
15
|
+
| `research` | database, schema, sql, orm | `database-architect` |
|
|
16
|
+
| `research` | performance, profiling, optimization | `performance-optimizer` |
|
|
17
|
+
| `generate_code` | api, route, endpoint, server, express, auth, jwt | `backend-specialist` |
|
|
18
|
+
| `generate_code` | python, fastapi, django, flask | `python-pro` |
|
|
19
|
+
| `generate_code` | c#, .net, blazor, aspnet | `csharp-developer` |
|
|
20
|
+
| `generate_code` | component, hook, react, next, ui, css | `frontend-specialist` |
|
|
21
|
+
| `generate_code` | mobile, react native, flutter, ios, android | `mobile-developer` |
|
|
22
|
+
| `generate_code` | docker, ci, cd, deploy, github actions, cloud | `devops-engineer` |
|
|
23
|
+
| `generate_code` | sql, query, migration, prisma, drizzle | `sql-pro` |
|
|
24
|
+
| `generate_code` | vue, nuxt | `vue-expert` |
|
|
25
|
+
| `review_code` | api, backend, auth | `backend-specialist` |
|
|
26
|
+
| `review_code` | react, component, hook | `frontend-specialist` |
|
|
27
|
+
| `review_code` | sql, query | `sql-pro` |
|
|
28
|
+
| `review_code` | security (any domain) | `security-auditor` |
|
|
29
|
+
| `debug` | any | `debugger` |
|
|
30
|
+
| `plan` | any | `project-planner` |
|
|
31
|
+
| `design_schema` | any | `database-architect` |
|
|
32
|
+
| `write_docs` | any | `documentation-writer` |
|
|
33
|
+
| `security_audit` | any | `security-auditor` |
|
|
34
|
+
| `optimize` | any | `performance-optimizer` |
|
|
35
|
+
| `test` | any | `test-engineer` |
|
|
36
|
+
| `visual_audit` | ui, component, visual, screenshot, layout, render | `ui-visual-auditor` |
|
|
37
|
+
| `generate_code` | aws, terraform, ecs, fargate, lambda, iac, vpc | `cloud-engineer` |
|
|
38
|
+
| `plan` | system design, scale, capacity, architecture | `system-architect` |
|
|
39
|
+
| `test` | e2e, playwright, automation, cypress | `qa-automation-engineer` |
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -54,28 +54,28 @@ When multiple domain keywords match, apply the following priority order:
|
|
|
54
54
|
|
|
55
55
|
Quick reference for Supervisor triage. Full instructions are in each agent's `.md` file.
|
|
56
56
|
|
|
57
|
-
| Agent File
|
|
58
|
-
|
|
|
59
|
-
| `backend-specialist.md`
|
|
60
|
-
| `python-pro.md`
|
|
61
|
-
| `csharp-developer`
|
|
62
|
-
| `frontend-specialist.md`
|
|
63
|
-
| `react-specialist.md`
|
|
64
|
-
| `vue-expert.md`
|
|
65
|
-
| `mobile-developer.md`
|
|
66
|
-
| `database-architect.md`
|
|
67
|
-
| `sql-pro.md`
|
|
68
|
-
| `devops-engineer.md`
|
|
69
|
-
| `security-auditor.md`
|
|
70
|
-
| `performance-optimizer.md`
|
|
71
|
-
| `debugger.md`
|
|
72
|
-
| `project-planner.md`
|
|
73
|
-
| `documentation-writer.md`
|
|
74
|
-
| `test-engineer.md`
|
|
75
|
-
| `explorer-agent.md`
|
|
76
|
-
| `cloud-engineer.md`
|
|
77
|
-
| `system-architect.md`
|
|
78
|
-
| `qa-automation-engineer.md
|
|
57
|
+
| Agent File | Best For | Do NOT Use For |
|
|
58
|
+
| --------------------------- | ------------------------------------------------ | ----------------------- |
|
|
59
|
+
| `backend-specialist.md` | REST APIs, auth flows, server logic | React components |
|
|
60
|
+
| `python-pro.md` | FastAPI, Django, data scripts | Node/TypeScript code |
|
|
61
|
+
| `csharp-developer` | .NET 8+, C#, Blazor, AOT | Python or Node backends |
|
|
62
|
+
| `frontend-specialist.md` | Web UI, CSS, components | Server code |
|
|
63
|
+
| `react-specialist.md` | Advanced React patterns, Next.js architecture | Vue or mobile |
|
|
64
|
+
| `vue-expert.md` | Vue 3, Nuxt 3, Pinia | React or Angular |
|
|
65
|
+
| `mobile-developer.md` | React Native, Flutter | Web browser UI |
|
|
66
|
+
| `database-architect.md` | Schema design, ORM selection, migrations | Raw SQL query tuning |
|
|
67
|
+
| `sql-pro.md` | Complex queries, CTEs, window functions, indexes | Schema design |
|
|
68
|
+
| `devops-engineer.md` | CI/CD, Docker, Kubernetes, cloud infra | Application code |
|
|
69
|
+
| `security-auditor.md` | OWASP review, pen test findings, auth hardening | Feature development |
|
|
70
|
+
| `performance-optimizer.md` | Profiling, bottleneck resolution, caching | New feature design |
|
|
71
|
+
| `debugger.md` | Root cause analysis, systematic issue isolation | Code generation |
|
|
72
|
+
| `project-planner.md` | Planning, task breakdown, estimates | Implementation |
|
|
73
|
+
| `documentation-writer.md` | READMEs, API docs, inline comments | Code or schemas |
|
|
74
|
+
| `test-engineer.md` | Unit/integration test design and strategy | Production code |
|
|
75
|
+
| `explorer-agent.md` | Mapping unknown codebases before acting | Building new features |
|
|
76
|
+
| `cloud-engineer.md` | AWS, Terraform, Docker, ECS, GitHub Actions CI | Application code |
|
|
77
|
+
| `system-architect.md` | System design, capacity planning, scalability | Implementation details |
|
|
78
|
+
| `qa-automation-engineer.md` | E2E testing, Playwright, test automation | Unit test design |
|
|
79
79
|
|
|
80
80
|
---
|
|
81
81
|
|
|
@@ -15,6 +15,7 @@ last-updated: 2026-07-29
|
|
|
15
15
|
## Mandatory Pre-Flight Context Inspection
|
|
16
16
|
|
|
17
17
|
Before designing high-level system architectures, you MUST inspect:
|
|
18
|
+
|
|
18
19
|
1. Active codebase scale & dependencies (`package.json`, `ARCHITECTURE.md`, microservices vs monolith setup)
|
|
19
20
|
2. Data storage models (`schema.prisma`, SQL schemas, cache configs) → Assess read/write ratios, partitioning, and replica setups
|
|
20
21
|
3. Scale targets (DAU, peak QPS, storage growth, latency SLOs) → Establish quantitative bounds before making component choices
|
|
@@ -21,6 +21,7 @@ Coverage numbers are vanity metrics. You audit for **behavioral completeness**
|
|
|
21
21
|
## Mandatory Pre-Flight Context Inspection
|
|
22
22
|
|
|
23
23
|
Before auditing test coverage and quality, you MUST inspect:
|
|
24
|
+
|
|
24
25
|
1. Active test runner config (`vitest.config.ts`, `jest.config.js`, `playwright.config.ts`) → Read coverage thresholds and test match globs
|
|
25
26
|
2. Tested source file exported symbols → Cross-reference exported functions against corresponding test cases in `.test.ts` or `.spec.ts`
|
|
26
27
|
3. Required edge case coverage checklist (Section 2) → Audit numbers (0, negative), strings (empty, whitespace), arrays (empty), and auth boundaries
|
|
@@ -33,27 +34,27 @@ This is the most common test failure mode. AI generates tests for the success ca
|
|
|
33
34
|
|
|
34
35
|
```typescript
|
|
35
36
|
// ❌ INCOMPLETE: Only tests the success path
|
|
36
|
-
describe(
|
|
37
|
-
it(
|
|
37
|
+
describe('calculateDiscount()', () => {
|
|
38
|
+
it('applies 10% to orders over $100', () => {
|
|
38
39
|
expect(calculateDiscount(150)).toBe(135);
|
|
39
40
|
});
|
|
40
41
|
});
|
|
41
42
|
|
|
42
43
|
// ✅ COMPLETE: Tests all behavioral boundaries
|
|
43
|
-
describe(
|
|
44
|
-
it(
|
|
44
|
+
describe('calculateDiscount()', () => {
|
|
45
|
+
it('applies 10% to orders over $100', () => {
|
|
45
46
|
expect(calculateDiscount(150)).toBe(135);
|
|
46
47
|
});
|
|
47
|
-
it(
|
|
48
|
+
it('applies no discount to orders at exactly $100', () => {
|
|
48
49
|
expect(calculateDiscount(100)).toBe(100); // Boundary edge case
|
|
49
50
|
});
|
|
50
|
-
it(
|
|
51
|
+
it('applies no discount to orders under $100', () => {
|
|
51
52
|
expect(calculateDiscount(50)).toBe(50);
|
|
52
53
|
});
|
|
53
|
-
it(
|
|
54
|
+
it('throws on negative input', () => {
|
|
54
55
|
expect(() => calculateDiscount(-50)).toThrow(/negative/i);
|
|
55
56
|
});
|
|
56
|
-
it(
|
|
57
|
+
it('handles zero input', () => {
|
|
57
58
|
expect(calculateDiscount(0)).toBe(0);
|
|
58
59
|
});
|
|
59
60
|
});
|
|
@@ -81,19 +82,19 @@ For any function being tested, flag if these are missing:
|
|
|
81
82
|
|
|
82
83
|
```typescript
|
|
83
84
|
// ❌ BRITTLE: CSS selectors break on UI refactoring
|
|
84
|
-
const button = container.querySelector(
|
|
85
|
+
const button = container.querySelector('.btn-primary > span');
|
|
85
86
|
|
|
86
87
|
// ❌ BRITTLE: Index-based selection — breaks when order changes
|
|
87
|
-
const firstItem = getAllByRole(
|
|
88
|
+
const firstItem = getAllByRole('listitem')[0];
|
|
88
89
|
|
|
89
90
|
// ❌ BRITTLE: Text content in another language context (i18n risk)
|
|
90
|
-
const btn = getByText(
|
|
91
|
+
const btn = getByText('Enregistrer'); // French — breaks if locale changes
|
|
91
92
|
|
|
92
93
|
// ✅ RESILIENT: Role-based selector — verifies accessibility simultaneously
|
|
93
|
-
const submitBtn = getByRole(
|
|
94
|
+
const submitBtn = getByRole('button', { name: /submit/i });
|
|
94
95
|
|
|
95
96
|
// ✅ RESILIENT: data-testid for non-semantic elements
|
|
96
|
-
const card = getByTestId(
|
|
97
|
+
const card = getByTestId('product-card-42');
|
|
97
98
|
```
|
|
98
99
|
|
|
99
100
|
---
|
|
@@ -102,25 +103,27 @@ const card = getByTestId("product-card-42");
|
|
|
102
103
|
|
|
103
104
|
```typescript
|
|
104
105
|
// ❌ BAD: Mocking internal business logic — tests nothing real
|
|
105
|
-
vi.mock(
|
|
106
|
+
vi.mock('./calculateTax'); // Now the test just verifies the mock, not the function
|
|
106
107
|
|
|
107
108
|
// ❌ BAD: Overspecified mock — asserting exact call parameters that will change
|
|
108
109
|
expect(mockSendEmail).toHaveBeenCalledWith(
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
'user@example.com',
|
|
111
|
+
'Welcome!',
|
|
111
112
|
expect.any(String),
|
|
112
113
|
{ cc: undefined, bcc: undefined, replyTo: null }, // Too brittle
|
|
113
114
|
);
|
|
114
115
|
|
|
115
116
|
// ✅ GOOD: Mock at architectural boundaries only (network, DB, filesystem)
|
|
116
117
|
// MSW intercepts network — component behaves exactly as in production
|
|
117
|
-
import { setupServer } from
|
|
118
|
-
const server = setupServer(
|
|
118
|
+
import { setupServer } from 'msw/node';
|
|
119
|
+
const server = setupServer(
|
|
120
|
+
http.get('/api/users', () => HttpResponse.json([{ id: 1, name: 'Alice' }])),
|
|
121
|
+
);
|
|
119
122
|
|
|
120
123
|
// ✅ GOOD: Assert meaningful behavior — not exact implementation
|
|
121
124
|
expect(mockSendEmail).toHaveBeenCalledWith(
|
|
122
|
-
|
|
123
|
-
expect.stringContaining(
|
|
125
|
+
'user@example.com',
|
|
126
|
+
expect.stringContaining('Welcome'), // Cares about content, not exact format
|
|
124
127
|
);
|
|
125
128
|
```
|
|
126
129
|
|
|
@@ -130,14 +133,14 @@ expect(mockSendEmail).toHaveBeenCalledWith(
|
|
|
130
133
|
|
|
131
134
|
```typescript
|
|
132
135
|
// ❌ BAD: Tests internal private state (breaks on refactor)
|
|
133
|
-
test(
|
|
136
|
+
test('stores user in internal cache', () => {
|
|
134
137
|
const service = new UserService();
|
|
135
138
|
service.fetchUser(1);
|
|
136
139
|
expect(service._cache.has(1)).toBe(true); // Internal implementation detail
|
|
137
140
|
});
|
|
138
141
|
|
|
139
142
|
// ✅ GOOD: Tests observable behavior — the public contract
|
|
140
|
-
test(
|
|
143
|
+
test('returns cached user on second call without network request', async () => {
|
|
141
144
|
const service = new UserService();
|
|
142
145
|
await service.fetchUser(1); // First call — hits network
|
|
143
146
|
await service.fetchUser(1); // Second call — from cache
|
|
@@ -18,6 +18,7 @@ last-updated: 2026-07-29
|
|
|
18
18
|
## Mandatory Pre-Flight Context Inspection
|
|
19
19
|
|
|
20
20
|
Before generating unit or integration tests, you MUST inspect:
|
|
21
|
+
|
|
21
22
|
1. `package.json` → Confirm test runner engine (`vitest`, `jest`, `playwright`, `pytest`) and assertions configuration
|
|
22
23
|
2. Target source file (`src/`, `lib/`, `app/`) → Read function signatures, export statements, and exception paths
|
|
23
24
|
3. Existing test utilities (`test/setup.ts`, `vitest.config.ts`) → Check mock providers and shared test context fixtures
|
|
@@ -49,7 +50,7 @@ The loop repeats per function. The key is that the test drives the design — no
|
|
|
49
50
|
|
|
50
51
|
```typescript
|
|
51
52
|
// ✅ Tests a specific, observable output
|
|
52
|
-
expect(formatCurrency(1500)).toBe(
|
|
53
|
+
expect(formatCurrency(1500)).toBe('$1,500.00');
|
|
53
54
|
|
|
54
55
|
// ❌ Tests that the function ran (not what it produced)
|
|
55
56
|
const result = formatCurrency(1500);
|
|
@@ -63,16 +64,16 @@ expect(formatCurrency(1500)).toBe(formatCurrency(1500));
|
|
|
63
64
|
|
|
64
65
|
```typescript
|
|
65
66
|
// ✅ One test → one behavior
|
|
66
|
-
it(
|
|
67
|
+
it('adds VAT to the price', () => {
|
|
67
68
|
expect(addVat(100, 0.2)).toBe(120);
|
|
68
69
|
});
|
|
69
70
|
|
|
70
|
-
it(
|
|
71
|
-
expect(() => addVat(100, -0.2)).toThrow(
|
|
71
|
+
it('throws when rate is negative', () => {
|
|
72
|
+
expect(() => addVat(100, -0.2)).toThrow('Rate must be positive');
|
|
72
73
|
});
|
|
73
74
|
|
|
74
75
|
// ❌ Two behaviors in one test — which one failed?
|
|
75
|
-
it(
|
|
76
|
+
it('adds VAT correctly', () => {
|
|
76
77
|
expect(addVat(100, 0.2)).toBe(120);
|
|
77
78
|
expect(() => addVat(100, -0.2)).toThrow();
|
|
78
79
|
});
|
|
@@ -86,15 +87,15 @@ it("adds VAT correctly", () => {
|
|
|
86
87
|
// ✅ Mock only the direct external dependency
|
|
87
88
|
// Testing: userService.create()
|
|
88
89
|
// Mock: the DB layer (because we don't need a real DB for this unit)
|
|
89
|
-
vi.mock(
|
|
90
|
-
insert: vi.fn().mockResolvedValue({ id:
|
|
90
|
+
vi.mock('../db', () => ({
|
|
91
|
+
insert: vi.fn().mockResolvedValue({ id: 'u1', email: 'test@example.com' }),
|
|
91
92
|
}));
|
|
92
93
|
|
|
93
94
|
// ❌ Over-mocking — nothing real is being tested
|
|
94
|
-
vi.mock(
|
|
95
|
-
vi.mock(
|
|
96
|
-
vi.mock(
|
|
97
|
-
vi.mock(
|
|
95
|
+
vi.mock('../db');
|
|
96
|
+
vi.mock('../logger');
|
|
97
|
+
vi.mock('../validator');
|
|
98
|
+
vi.mock('../emailService');
|
|
98
99
|
// At this point you're testing that mocks return mocks
|
|
99
100
|
```
|
|
100
101
|
|