tribunal-kit 6.0.0 → 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/.manifest.json +78 -0
- package/.agent/ARCHITECTURE.md +19 -241
- 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 +3716 -1
- package/.agent/history/memory/MEMORY.md +246 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2034 -263
- package/.agent/rules/GEMINI.md +12 -10
- 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 +237 -0
- 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 +80 -0
- package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
- 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 +70 -0
- 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 +59 -0
- package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
- 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 +81 -0
- 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 +59 -0
- 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 +68 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
- 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 +58 -0
- 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 +78 -0
- 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 +90 -0
- 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 +15 -14
- 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 +160 -88
- package/SECURITY.md +11 -11
- package/bin/mcp-server.js +512 -233
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +45 -48
- package/dist/cli.js +26 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/memory.js +3 -2
- package/dist/commands/native.js +36 -0
- package/dist/commands/status.js +6 -0
- package/dist/esm/index.mjs +32 -0
- package/dist/index.d.ts +58 -3
- package/package.json +20 -16
- 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
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vector-search-pgvector
|
|
3
|
+
description: Production vector database search using pgvector 0.8.0+, halfvec, sparsevec, Pinecone, Weaviate, hybrid sparse-dense retrieval, and iterative HNSW scanning.
|
|
4
|
+
tools: Read, Grep, Glob, Edit, Write
|
|
5
|
+
version: 3.0.0
|
|
6
|
+
last-updated: 2026-08-05
|
|
7
|
+
script: .agent/scripts/schema_validator.js
|
|
8
|
+
scripts-binding:
|
|
9
|
+
- .agent/scripts/schema_validator.js
|
|
10
|
+
skills:
|
|
11
|
+
- database-architect
|
|
12
|
+
- sql-pro
|
|
13
|
+
- advanced-rag-pipelines
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Vector Search & pgvector 0.8.0+ — 2026 Database Standards
|
|
17
|
+
|
|
18
|
+
## Mandatory Pre-Flight Context Inspection
|
|
19
|
+
|
|
20
|
+
Before creating vector tables or indexes:
|
|
21
|
+
|
|
22
|
+
1. Index Type & Precision → Use `halfvec` (half-precision) for 50% RAM savings on HNSW indexes; use `sparsevec` for high-dimensional sparse vectors
|
|
23
|
+
2. Iterative Index Scans (pgvector 0.8.0+) → Enable iterative scanning to prevent HNSW overfiltering when combining `WHERE` clauses with vector similarity
|
|
24
|
+
3. Hybrid Search Strategy → Combine BM25 full-text search with dense vector similarity via Reciprocal Rank Fusion (RRF)
|
|
25
|
+
|
|
26
|
+
## High-Performance pgvector 0.8.0+ Schema (`halfvec` + HNSW)
|
|
27
|
+
|
|
28
|
+
```sql
|
|
29
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
30
|
+
|
|
31
|
+
CREATE TABLE document_chunks (
|
|
32
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
33
|
+
document_id UUID NOT NULL,
|
|
34
|
+
chunk_index INT NOT NULL,
|
|
35
|
+
content TEXT NOT NULL,
|
|
36
|
+
fts_vector tsvector GENERATED ALWAYS AS (to_tsvector('english', content)) STORED,
|
|
37
|
+
embedding halfvec(1536) NOT NULL -- 50% memory reduction vs float4 vector
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
-- HNSW index using halfvec with iterative scanning support (pgvector 0.8.0+)
|
|
41
|
+
CREATE INDEX idx_chunks_embedding_hnsw
|
|
42
|
+
ON document_chunks USING hnsw (embedding halfvec_cosine_ops)
|
|
43
|
+
WITH (m = 16, ef_construction = 64);
|
|
44
|
+
|
|
45
|
+
-- Full text search GIN index
|
|
46
|
+
CREATE INDEX idx_chunks_fts ON document_chunks USING gin (fts_vector);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Hybrid Search Query (pgvector 0.8.0+ Iterative Scan + RRF)
|
|
50
|
+
|
|
51
|
+
```sql
|
|
52
|
+
-- pgvector 0.8.0+ automatically performs iterative prober scans when filtering
|
|
53
|
+
WITH vector_search AS (
|
|
54
|
+
SELECT id, content, ROW_NUMBER() OVER (ORDER BY embedding <=> $1::halfvec) as rank
|
|
55
|
+
FROM document_chunks
|
|
56
|
+
WHERE document_id = $3 -- Iterative scan prevents overfiltering
|
|
57
|
+
LIMIT 20
|
|
58
|
+
),
|
|
59
|
+
fts_search AS (
|
|
60
|
+
SELECT id, content, ROW_NUMBER() OVER (ORDER BY ts_rank(fts_vector, websearch_to_tsquery($2)) DESC) as rank
|
|
61
|
+
FROM document_chunks
|
|
62
|
+
WHERE fts_vector @@ websearch_to_tsquery($2) AND document_id = $3
|
|
63
|
+
LIMIT 20
|
|
64
|
+
)
|
|
65
|
+
SELECT
|
|
66
|
+
COALESCE(v.id, f.id) as id,
|
|
67
|
+
COALESCE(v.content, f.content) as content,
|
|
68
|
+
COALESCE(1.0 / (60 + v.rank), 0.0) + COALESCE(1.0 / (60 + f.rank), 0.0) as rrf_score
|
|
69
|
+
FROM vector_search v
|
|
70
|
+
FULL OUTER JOIN fts_search f ON v.id = f.id
|
|
71
|
+
ORDER BY rrf_score DESC
|
|
72
|
+
LIMIT 10;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 🛑 Verification-Before-Completion (VBC) Protocol
|
|
76
|
+
|
|
77
|
+
- Verify vector index construction queries pass `EXPLAIN ANALYZE` with `halfvec`.
|
|
78
|
+
- Confirm pgvector extension version is >= 0.8.0 for iterative scanning support.
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before writing Vue 3.5+ or Nuxt 4 components, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Script Setup Architecture → Use `<script setup lang="ts">` exclusively; ban legacy Options API
|
|
24
25
|
2. Pinia & Reactivity Rules (Section 133) → Use `storeToRefs(store)` when destructuring Pinia state to preserve reactivity
|
|
25
26
|
3. Model & Watcher Syntax (Section 42) → Use `defineModel<T>()` (Vue 3.4+) and `watch(() => state.prop, ...)` for primitive watchers
|
|
@@ -42,19 +43,21 @@ Before writing Vue 3.5+ or Nuxt 4 components, you MUST inspect:
|
|
|
42
43
|
|
|
43
44
|
```vue
|
|
44
45
|
<script setup lang="ts">
|
|
45
|
-
import { ref, computed, watch, onMounted } from
|
|
46
|
+
import { ref, computed, watch, onMounted } from 'vue';
|
|
46
47
|
|
|
47
48
|
// Props
|
|
48
49
|
const props = defineProps<{ title: string; count?: number }>();
|
|
49
50
|
// With defaults:
|
|
50
|
-
const props = withDefaults(defineProps<{ variant?:
|
|
51
|
+
const props = withDefaults(defineProps<{ variant?: 'primary' | 'secondary' }>(), {
|
|
52
|
+
variant: 'primary',
|
|
53
|
+
});
|
|
51
54
|
|
|
52
55
|
// Emits
|
|
53
56
|
const emit = defineEmits<{ update: [value: string]; delete: [id: number] }>();
|
|
54
57
|
|
|
55
58
|
// v-model (Vue 3.4+)
|
|
56
59
|
const modelValue = defineModel<string>(); // default model
|
|
57
|
-
const count = defineModel<number>(
|
|
60
|
+
const count = defineModel<number>('count'); // named model
|
|
58
61
|
|
|
59
62
|
// Expose to parent ref
|
|
60
63
|
defineExpose({ reset: () => {}, focus: () => {} });
|
|
@@ -71,7 +74,7 @@ const count = ref(0);
|
|
|
71
74
|
count.value++;
|
|
72
75
|
|
|
73
76
|
// reactive — for objects (loses reactivity on reassign/destructure)
|
|
74
|
-
const state = reactive({ name:
|
|
77
|
+
const state = reactive({ name: 'Alice', age: 25 });
|
|
75
78
|
// ❌ const { name } = state; // loses reactivity
|
|
76
79
|
// ✅ const name = computed(() => state.name);
|
|
77
80
|
|
|
@@ -79,8 +82,8 @@ const state = reactive({ name: "Alice", age: 25 });
|
|
|
79
82
|
const doubled = computed(() => count.value * 2);
|
|
80
83
|
const fullName = computed({
|
|
81
84
|
get: () => `${first.value} ${last.value}`,
|
|
82
|
-
set:
|
|
83
|
-
[first.value, last.value] = v.split(
|
|
85
|
+
set: v => {
|
|
86
|
+
[first.value, last.value] = v.split(' ');
|
|
84
87
|
},
|
|
85
88
|
});
|
|
86
89
|
|
|
@@ -131,8 +134,8 @@ export function useAsyncData<T>(fn: () => Promise<T>) {
|
|
|
131
134
|
|
|
132
135
|
```ts
|
|
133
136
|
// stores/counter.ts
|
|
134
|
-
import { defineStore } from
|
|
135
|
-
export const useCounterStore = defineStore(
|
|
137
|
+
import { defineStore } from 'pinia';
|
|
138
|
+
export const useCounterStore = defineStore('counter', () => {
|
|
136
139
|
const count = ref(0); // Setup Store (preferred)
|
|
137
140
|
const doubled = computed(() => count.value * 2);
|
|
138
141
|
function increment() {
|
|
@@ -145,12 +148,12 @@ export const useCounterStore = defineStore("counter", () => {
|
|
|
145
148
|
const store = useCounterStore();
|
|
146
149
|
// ❌ const { count } = store; // loses reactivity!
|
|
147
150
|
// ✅ const count = storeToRefs(store).count;
|
|
148
|
-
import { storeToRefs } from
|
|
151
|
+
import { storeToRefs } from 'pinia';
|
|
149
152
|
const { count } = storeToRefs(store);
|
|
150
153
|
|
|
151
154
|
// Persist plugin:
|
|
152
|
-
import { createPinia } from
|
|
153
|
-
import piniaPluginPersistedstate from
|
|
155
|
+
import { createPinia } from 'pinia';
|
|
156
|
+
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
|
|
154
157
|
const pinia = createPinia().use(piniaPluginPersistedstate);
|
|
155
158
|
```
|
|
156
159
|
|
|
@@ -160,25 +163,25 @@ const pinia = createPinia().use(piniaPluginPersistedstate);
|
|
|
160
163
|
|
|
161
164
|
```ts
|
|
162
165
|
// router/index.ts
|
|
163
|
-
import { createRouter, createWebHistory } from
|
|
166
|
+
import { createRouter, createWebHistory } from 'vue-router';
|
|
164
167
|
const router = createRouter({
|
|
165
168
|
history: createWebHistory(),
|
|
166
169
|
routes: [
|
|
167
|
-
{ path:
|
|
168
|
-
{ path:
|
|
169
|
-
{ path:
|
|
170
|
+
{ path: '/', component: () => import('./views/Home.vue') }, // lazy-loaded
|
|
171
|
+
{ path: '/user/:id', component: UserView, props: true }, // props:true passes params as props
|
|
172
|
+
{ path: '/:pathMatch(.*)*', component: NotFound }, // 404 catch-all
|
|
170
173
|
],
|
|
171
174
|
});
|
|
172
175
|
// Route guards
|
|
173
176
|
router.beforeEach(async (to, from) => {
|
|
174
|
-
if (to.meta.requiresAuth && !isLoggedIn()) return { name:
|
|
177
|
+
if (to.meta.requiresAuth && !isLoggedIn()) return { name: 'Login' };
|
|
175
178
|
});
|
|
176
179
|
|
|
177
180
|
// In component:
|
|
178
|
-
import { useRouter, useRoute } from
|
|
181
|
+
import { useRouter, useRoute } from 'vue-router';
|
|
179
182
|
const router = useRouter();
|
|
180
183
|
const route = useRoute();
|
|
181
|
-
router.push({ name:
|
|
184
|
+
router.push({ name: 'User', params: { id: 42 } });
|
|
182
185
|
const userId = route.params.id as string;
|
|
183
186
|
```
|
|
184
187
|
|
|
@@ -243,7 +246,7 @@ const { id } = useRoute().params; // auto-imported
|
|
|
243
246
|
const { data, error, refresh } = await useFetch(`/api/users/${id}`, {
|
|
244
247
|
lazy: false, // SSR: wait for data before rendering
|
|
245
248
|
server: true, // fetch on server (default)
|
|
246
|
-
transform:
|
|
249
|
+
transform: r => r.user,
|
|
247
250
|
});
|
|
248
251
|
// ❌ TRAP: useFetch in Nuxt ≠ @tanstack/react-query. It's Nuxt-specific.
|
|
249
252
|
// ❌ TRAP: useAsyncData key must be UNIQUE per page/component
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before scanning codebases for security vulnerabilities, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. SQL Injection Vectors (Section 39) → Ban template literal interpolation in SQL queries (`SELECT ... WHERE id = ${id}`); require parameterized queries
|
|
24
25
|
2. Explicit JWT Algorithms (Section 121) → Verify `jwt.verify(token, secret, { algorithms: ["HS256"] })` specifies explicit algorithms to prevent "None" attacks
|
|
25
26
|
3. SSRF Domain Allowlist (Section 87) → Validate external request URLs against a strict domain allowlist and block private IP ranges (169.254.169.254, 127.0.0.1)
|
|
@@ -55,7 +56,7 @@ const query = `SELECT * FROM users WHERE email = '${email}'`;
|
|
|
55
56
|
// Attack: email = "'; DROP TABLE users; --"
|
|
56
57
|
|
|
57
58
|
// ✅ SAFE: Parameterized queries
|
|
58
|
-
const result = await db.query(
|
|
59
|
+
const result = await db.query('SELECT * FROM users WHERE email = $1', [email]);
|
|
59
60
|
|
|
60
61
|
// ✅ SAFE: ORM (Prisma, Drizzle)
|
|
61
62
|
const user = await prisma.user.findUnique({ where: { email } });
|
|
@@ -91,27 +92,27 @@ element.textContent = userComment;
|
|
|
91
92
|
|
|
92
93
|
```typescript
|
|
93
94
|
// ❌ VULNERABLE: fetching user-provided URLs
|
|
94
|
-
app.get(
|
|
95
|
-
const data = await fetch(req.query.url).then(
|
|
95
|
+
app.get('/proxy', async (req, res) => {
|
|
96
|
+
const data = await fetch(req.query.url).then(r => r.text());
|
|
96
97
|
res.send(data);
|
|
97
98
|
});
|
|
98
99
|
// Attack: url = "http://169.254.169.254/latest/meta-data/" (AWS metadata)
|
|
99
100
|
// Attack: url = "http://localhost:6379/" (internal Redis)
|
|
100
101
|
|
|
101
102
|
// ✅ SAFE: Allowlist of domains
|
|
102
|
-
const ALLOWED_HOSTS = new Set([
|
|
103
|
+
const ALLOWED_HOSTS = new Set(['api.example.com', 'cdn.example.com']);
|
|
103
104
|
|
|
104
|
-
app.get(
|
|
105
|
+
app.get('/proxy', async (req, res) => {
|
|
105
106
|
const url = new URL(req.query.url as string);
|
|
106
107
|
if (!ALLOWED_HOSTS.has(url.hostname)) {
|
|
107
|
-
return res.status(403).json({ error:
|
|
108
|
+
return res.status(403).json({ error: 'Domain not allowed' });
|
|
108
109
|
}
|
|
109
110
|
// Additional: block private IP ranges
|
|
110
111
|
const ip = await dns.resolve4(url.hostname);
|
|
111
112
|
if (isPrivateIP(ip[0])) {
|
|
112
|
-
return res.status(403).json({ error:
|
|
113
|
+
return res.status(403).json({ error: 'Private IP not allowed' });
|
|
113
114
|
}
|
|
114
|
-
const data = await fetch(url).then(
|
|
115
|
+
const data = await fetch(url).then(r => r.text());
|
|
115
116
|
res.send(data);
|
|
116
117
|
});
|
|
117
118
|
```
|
|
@@ -122,19 +123,19 @@ app.get("/proxy", async (req, res) => {
|
|
|
122
123
|
|
|
123
124
|
```typescript
|
|
124
125
|
// JWT Best Practices
|
|
125
|
-
import jwt from
|
|
126
|
+
import jwt from 'jsonwebtoken';
|
|
126
127
|
|
|
127
128
|
// ✅ SAFE: Specify algorithm explicitly
|
|
128
129
|
const token = jwt.sign(payload, SECRET, {
|
|
129
|
-
algorithm:
|
|
130
|
-
expiresIn:
|
|
131
|
-
issuer:
|
|
130
|
+
algorithm: 'HS256', // explicit
|
|
131
|
+
expiresIn: '15m', // short-lived access token
|
|
132
|
+
issuer: 'myapp',
|
|
132
133
|
});
|
|
133
134
|
|
|
134
135
|
// ✅ SAFE: Verify with explicit algorithms
|
|
135
136
|
const decoded = jwt.verify(token, SECRET, {
|
|
136
|
-
algorithms: [
|
|
137
|
-
issuer:
|
|
137
|
+
algorithms: ['HS256'], // MUST specify — prevents algorithm confusion attack
|
|
138
|
+
issuer: 'myapp',
|
|
138
139
|
});
|
|
139
140
|
|
|
140
141
|
// ❌ HALLUCINATION TRAP: jwt.verify() without algorithms option is VULNERABLE
|
|
@@ -142,13 +143,13 @@ const decoded = jwt.verify(token, SECRET, {
|
|
|
142
143
|
// ✅ jwt.verify(token, SECRET, { algorithms: ["HS256"] });
|
|
143
144
|
|
|
144
145
|
// Authorization: check BEFORE business logic
|
|
145
|
-
app.delete(
|
|
146
|
+
app.delete('/api/posts/:id', async (req, res) => {
|
|
146
147
|
const post = await getPost(req.params.id);
|
|
147
|
-
if (!post) return res.status(404).json({ error:
|
|
148
|
+
if (!post) return res.status(404).json({ error: 'Not found' });
|
|
148
149
|
|
|
149
150
|
// ✅ Authorization check BEFORE delete
|
|
150
|
-
if (post.authorId !== req.user.id && req.user.role !==
|
|
151
|
-
return res.status(403).json({ error:
|
|
151
|
+
if (post.authorId !== req.user.id && req.user.role !== 'admin') {
|
|
152
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
152
153
|
}
|
|
153
154
|
|
|
154
155
|
await deletePost(post.id);
|
|
@@ -196,7 +197,7 @@ Defense:
|
|
|
196
197
|
## Security Headers
|
|
197
198
|
|
|
198
199
|
```typescript
|
|
199
|
-
import helmet from
|
|
200
|
+
import helmet from 'helmet';
|
|
200
201
|
|
|
201
202
|
app.use(helmet()); // Sets secure defaults
|
|
202
203
|
|
|
@@ -211,8 +212,8 @@ app.use(helmet()); // Sets secure defaults
|
|
|
211
212
|
// CORS — never wildcard in production
|
|
212
213
|
app.use(
|
|
213
214
|
cors({
|
|
214
|
-
origin: [
|
|
215
|
-
methods: [
|
|
215
|
+
origin: ['https://myapp.com', 'https://admin.myapp.com'],
|
|
216
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
216
217
|
credentials: true,
|
|
217
218
|
}),
|
|
218
219
|
);
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before auditing accessibility or building UI components, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Native Semantic HTML First Rule (Section 28) → Use native `<button>`, `<a>`, `<label>` elements; ban adding `role="button"` to non-interactive `<div>` tags
|
|
24
25
|
2. Keyboard Focus Visibility (Section 61) → Preserve `:focus-visible` outlines; ban global outline removal (`*:focus { outline: none; }`)
|
|
25
26
|
3. Explicit Form Label Linking (Section 129) → Explicitly link inputs to `<label>` via `id`/`for` attributes; ban using `placeholder` as a label replacement
|
|
@@ -104,7 +105,7 @@ When a modal opens:
|
|
|
104
105
|
<button formmethod="dialog">Close</button>
|
|
105
106
|
</dialog>
|
|
106
107
|
<script>
|
|
107
|
-
document.getElementById(
|
|
108
|
+
document.getElementById('myModal').showModal();
|
|
108
109
|
</script>
|
|
109
110
|
```
|
|
110
111
|
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before enforcing web design guidelines or reviewing UI code, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. APCA Contrast Thresholds (Section 14) → Require Lc > 75 for body text, Lc > 60 for headings, Lc > 45 for controls/borders
|
|
24
25
|
2. Core Web Vitals Targets (Section 23) → Ensure LCP < 1.5s (fetchpriority="high"), INP < 100ms, and CLS = 0.00 (explicit aspect-ratio)
|
|
25
26
|
3. Compositor-Only Motion (Section 30) → Restrict animations strictly to `transform` and `opacity` to avoid layout reflows
|
|
@@ -31,30 +32,35 @@ This skill defines performance, accessibility, and rendering efficiency guidelin
|
|
|
31
32
|
## 1. APCA Contrast Guidelines (WCAG 3.0 Base)
|
|
32
33
|
|
|
33
34
|
APCA calculates lightness contrast mathematically based on font size and background luminance.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
|
|
36
|
+
- **Body Text:** Lc > 75 is required for body text readability.
|
|
37
|
+
- **Headings:** Lc > 60 is required for headings.
|
|
38
|
+
- **Controls/Borders:** Lc > 45 is required for visual divider borders and focus rings.
|
|
37
39
|
|
|
38
40
|
---
|
|
39
41
|
|
|
40
42
|
## 2. Core Web Vitals (CWV)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
|
|
44
|
+
- **Largest Contentful Paint (LCP < 1.5s):** Hero banners and images must use the `fetchpriority="high"` tag. Avoid blocking layout paints with heavy JS scripts.
|
|
45
|
+
- **Interaction to Next Paint (INP < 100ms):** Enforce main-thread speed. Wrap heavy operations in `startTransition` or React's deferred values.
|
|
46
|
+
- **Cumulative Layout Shift (CLS = 0.00):** Image nodes must declare explicit width/height dimensions or aspect-ratios. Pre-allocate spaces for dynamic elements.
|
|
44
47
|
|
|
45
48
|
---
|
|
46
49
|
|
|
47
50
|
## 3. Sustainable & Battery-Efficient UI
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
|
|
52
|
+
- **Compositor Properties:** Transitions and animations must only animate `transform` and `opacity`. Animating properties like `margin`, `width`, `height`, or `top` triggers layout reflows and wastes CPU cycles.
|
|
53
|
+
- **OLED Blacks:** For dark luxury themes, base backgrounds must use OLED-friendly blacks (`oklch(0.08 0.005 250)` or `#000000`) to physically turn off pixels on compatible screens.
|
|
54
|
+
- **Font Subsetting:** Self-host typography files and use variable fonts to minimize network payloads.
|
|
55
|
+
- **Image Formats:** Serve images exclusively in AVIF or WebP formats.
|
|
52
56
|
|
|
53
57
|
---
|
|
54
58
|
|
|
55
59
|
## Pre-Flight Checklist
|
|
60
|
+
|
|
56
61
|
- [ ] Have I reviewed the user's specific constraints and requests?
|
|
57
62
|
- [ ] Have I checked the environment for relevant existing implementations?
|
|
58
63
|
|
|
59
64
|
## VBC Protocol (Verification-Before-Completion)
|
|
65
|
+
|
|
60
66
|
You MUST verify existing code signatures and variables before attempting to modify or call them. No hallucination is permitted.
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before executing web quality audits or Lighthouse-style evaluations, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Core Web Vitals Benchmarks (Section 24) → LCP $\le 2.5\text{s}$, INP $\le 200\text{ms}$, CLS $\le 0.1$
|
|
24
25
|
2. Layout Shift Prevention (Section 27) → Enforce explicit `width`/`height` or aspect-ratio declarations on all media tags
|
|
25
26
|
3. Async Script Loading (Section 46) → Enforce `async` or `defer` attributes on all third-party script tags in `<head>`
|
|
@@ -31,19 +32,23 @@ Conduct a comprehensive multi-pillar web quality audit covering Performance, Acc
|
|
|
31
32
|
## 4 Quality Pillars
|
|
32
33
|
|
|
33
34
|
### 1. Core Web Vitals (Performance)
|
|
35
|
+
|
|
34
36
|
- **Largest Contentful Paint (LCP)**: Target $\le 2.5\text{s}$. Preload hero images using `<link rel="preload" as="image">` and fetchpriority="high".
|
|
35
37
|
- **Interaction to Next Paint (INP)**: Target $\le 200\text{ms}$. Break long JS tasks into smaller chunks using `setTimeout` or `requestIdleCallback`.
|
|
36
38
|
- **Cumulative Layout Shift (CLS)**: Target $\le 0.1$. Set explicit `width` and `height` attributes on images and videos; reserve space for dynamic ads/banners.
|
|
37
39
|
|
|
38
40
|
### 2. Accessibility (a11y)
|
|
41
|
+
|
|
39
42
|
- Target 100/100 score. Verify all interactive controls have accessible names, proper contrast ($\ge 4.5:1$), and complete keyboard accessibility.
|
|
40
43
|
|
|
41
44
|
### 3. Web Best Practices
|
|
45
|
+
|
|
42
46
|
- Serve images in modern formats (`.webp` or `.avif`).
|
|
43
47
|
- Enforce HTTPS security headers (`Content-Security-Policy`, `X-Frame-Options`, `Strict-Transport-Security`).
|
|
44
48
|
- Eliminate console errors and unhandled promise rejections.
|
|
45
49
|
|
|
46
50
|
### 4. Search Engine Optimization (SEO)
|
|
51
|
+
|
|
47
52
|
- Valid HTML5 document structure (`<!DOCTYPE html>`, `<html>` with `lang`, single `<h1>`).
|
|
48
53
|
- Robots.txt, sitemap.xml, canonical URLs, and structured JSON-LD data.
|
|
49
54
|
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before building web application test suites or configuring component mocks, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Testing Trophy Allocation (Section 27) → Prioritize Integration tests (60% RTL + MSW) over pure Unit (20%) or E2E (10%)
|
|
24
25
|
2. MSW Network Interception Rule (Section 40) → Intercept HTTP network calls via MSW (`setupServer`); ban mocking library clients like `axios.get.mockResolvedValue`
|
|
25
26
|
3. Decouple Business Logic from React (Section 99) → Extract complex calculations into pure testable functions outside React components
|
|
@@ -55,17 +56,17 @@ To prevent network calls, utilize Mock Service Worker (MSW) which intercepts req
|
|
|
55
56
|
|
|
56
57
|
```typescript
|
|
57
58
|
// ❌ BAD: Mocking implementation details
|
|
58
|
-
jest.mock(
|
|
59
|
+
jest.mock('axios');
|
|
59
60
|
axios.get.mockResolvedValue({ data: { users: [] } });
|
|
60
61
|
|
|
61
62
|
// ✅ GOOD: MSW (Mock Service Worker) network level interception
|
|
62
63
|
// The component functions EXACTLY as it would in production
|
|
63
|
-
import { http, HttpResponse } from
|
|
64
|
-
import { setupServer } from
|
|
64
|
+
import { http, HttpResponse } from 'msw';
|
|
65
|
+
import { setupServer } from 'msw/node';
|
|
65
66
|
|
|
66
67
|
export const handlers = [
|
|
67
|
-
http.get(
|
|
68
|
-
return HttpResponse.json([{ id: 1, name:
|
|
68
|
+
http.get('/api/users', () => {
|
|
69
|
+
return HttpResponse.json([{ id: 1, name: 'John Appleseed' }]);
|
|
69
70
|
}),
|
|
70
71
|
];
|
|
71
72
|
const server = setupServer(...handlers);
|
|
@@ -112,21 +113,21 @@ Isolate business logic entirely from React.
|
|
|
112
113
|
```typescript
|
|
113
114
|
// ✅ Move complex logic OUT of the React component entirely
|
|
114
115
|
export function calculateTax(subtotal: number, state: string): number {
|
|
115
|
-
if (subtotal < 0) throw new Error(
|
|
116
|
-
if (state ===
|
|
116
|
+
if (subtotal < 0) throw new Error('Subtotal cannot be negative');
|
|
117
|
+
if (state === 'CA') return subtotal * 0.0825;
|
|
117
118
|
return 0; // Default
|
|
118
119
|
}
|
|
119
120
|
|
|
120
121
|
// ✅ Test with extreme precision and coverage
|
|
121
|
-
import { describe, it, expect } from
|
|
122
|
+
import { describe, it, expect } from 'vitest';
|
|
122
123
|
|
|
123
|
-
describe(
|
|
124
|
-
it(
|
|
125
|
-
expect(calculateTax(100,
|
|
124
|
+
describe('calculateTax()', () => {
|
|
125
|
+
it('applies CA tax correctly', () => {
|
|
126
|
+
expect(calculateTax(100, 'CA')).toBe(8.25);
|
|
126
127
|
});
|
|
127
128
|
|
|
128
|
-
it(
|
|
129
|
-
expect(() => calculateTax(-50,
|
|
129
|
+
it('throws on negative input', () => {
|
|
130
|
+
expect(() => calculateTax(-50, 'CA')).toThrowError('negative');
|
|
130
131
|
});
|
|
131
132
|
});
|
|
132
133
|
```
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before implementing WebGPU shaders or pipelines, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Feature Detection (Section 64) → Always feature-detect WebGPU with `if (!navigator.gpu)` and provide WebGL fallback
|
|
24
25
|
2. WGSL Buffer Alignment (Section 17) → Pad WGSL structs strictly to 16-byte boundaries (`vec4<f32>`) to prevent memory corruption
|
|
25
26
|
3. Async Buffer Mapping (Section 68) → Use `mapAsync(GPUMapMode.READ)` to read GPU buffers without main-thread blocking
|
|
@@ -21,6 +21,7 @@ scripts-binding:
|
|
|
21
21
|
## Mandatory Pre-Flight Context Inspection
|
|
22
22
|
|
|
23
23
|
Before injecting micro-animations or interaction polish, you MUST inspect:
|
|
24
|
+
|
|
24
25
|
1. `package.json` → Check installed motion dependencies (`framer-motion`, `gsap`, `@vueuse/motion`, CSS-only)
|
|
25
26
|
2. Whimsy Quota Rules (Section 228) → Max 3 distinct animation types per page; keep CLS impact at ZERO
|
|
26
27
|
3. Duration Constraints (Section 238) → Keep hover interactions $\le 150\text{ms}$ and entrance animations $\le 300\text{ms}$
|
|
@@ -78,23 +79,26 @@ You are a specialized agent for injecting "micro-delights" into user interfaces
|
|
|
78
79
|
```javascript
|
|
79
80
|
// Vanilla JS — IntersectionObserver trigger
|
|
80
81
|
const observer = new IntersectionObserver(
|
|
81
|
-
|
|
82
|
-
entries.forEach(
|
|
82
|
+
entries => {
|
|
83
|
+
entries.forEach(entry => {
|
|
83
84
|
if (entry.isIntersecting) {
|
|
84
|
-
entry.target.classList.add(
|
|
85
|
+
entry.target.classList.add('visible');
|
|
85
86
|
}
|
|
86
87
|
});
|
|
87
88
|
},
|
|
88
89
|
{ threshold: 0.1 },
|
|
89
90
|
);
|
|
90
|
-
document.querySelectorAll(
|
|
91
|
+
document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
|
|
91
92
|
```
|
|
92
93
|
|
|
93
94
|
```jsx
|
|
94
95
|
// React — Framer Motion stagger (only if framer-motion is in package.json)
|
|
95
96
|
<motion.ul variants={{ show: { transition: { staggerChildren: 0.05 } } }}>
|
|
96
97
|
{items.map((item, i) => (
|
|
97
|
-
<motion.li
|
|
98
|
+
<motion.li
|
|
99
|
+
key={item.id}
|
|
100
|
+
variants={{ hidden: { opacity: 0, y: 20 }, show: { opacity: 1, y: 0 } }}
|
|
101
|
+
/>
|
|
98
102
|
))}
|
|
99
103
|
</motion.ul>
|
|
100
104
|
```
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before analyzing tool-calling logs or task efficiency, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Tool Call Pattern Analysis table (Section 1) → Classify redundant reads, serial bottlenecks, and context dumps
|
|
24
25
|
2. Parallelism Opportunity Detection (Section 2) → Verify read/write dependency rules for batch tool calls
|
|
25
26
|
3. Efficiency Score formula (Section 105) → Compute actual vs optimal call ratios accurately
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zero-trust-passkeys
|
|
3
|
+
description: Modern passwordless authentication using WebAuthn, FIDO2 biometric passkeys, SimpleWebAuthn v13+, Conditional UI (Passkey Autofill), and Zero-Trust security.
|
|
4
|
+
tools: Read, Grep, Glob, Edit, Write
|
|
5
|
+
version: 3.0.0
|
|
6
|
+
last-updated: 2026-08-05
|
|
7
|
+
script: .agent/scripts/security_scan.js
|
|
8
|
+
scripts-binding:
|
|
9
|
+
- .agent/scripts/security_scan.js
|
|
10
|
+
skills:
|
|
11
|
+
- authentication-best-practices
|
|
12
|
+
- backend-security-expert
|
|
13
|
+
- frontend-security-expert
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Zero-Trust Passkeys & WebAuthn (SimpleWebAuthn v13+)
|
|
17
|
+
|
|
18
|
+
## Mandatory Pre-Flight Context Inspection
|
|
19
|
+
|
|
20
|
+
Before implementing auth flows:
|
|
21
|
+
|
|
22
|
+
1. Conditional UI (Passkey Autofill) → Use `useBrowserAutofill: true` and `autocomplete="username webauthn"` for seamless form autofill
|
|
23
|
+
2. Feature Detection & Abort Signals → Check `isConditionalMediationAvailable()` and manage cancellation via `AbortController`
|
|
24
|
+
3. Discoverable Credentials → Ensure `userVerification` and resident key options are enabled on registration
|
|
25
|
+
|
|
26
|
+
## Client-Side Passkey Autofill Pattern (SimpleWebAuthn v13 Browser)
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { startAuthentication, isConditionalMediationAvailable } from '@simplewebauthn/browser';
|
|
30
|
+
|
|
31
|
+
export async function initConditionalPasskeyAutofill(abortSignal: AbortSignal) {
|
|
32
|
+
const isAvailable = await isConditionalMediationAvailable();
|
|
33
|
+
if (!isAvailable) return;
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
// 1. Fetch options from server
|
|
37
|
+
const res = await fetch('/api/auth/generate-authentication-options');
|
|
38
|
+
const options = await res.json();
|
|
39
|
+
|
|
40
|
+
// 2. Trigger browser native autofill dropdown
|
|
41
|
+
const credential = await startAuthentication({
|
|
42
|
+
optionsJSON: options,
|
|
43
|
+
useBrowserAutofill: true,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// 3. Send response to server for verification
|
|
47
|
+
await fetch('/api/auth/verify-authentication', {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: { 'Content-Type': 'application/json' },
|
|
50
|
+
body: JSON.stringify(credential),
|
|
51
|
+
});
|
|
52
|
+
} catch (err: any) {
|
|
53
|
+
if (err.name !== 'AbortError') console.error('Passkey autofill error:', err);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Server Verification Pattern (SimpleWebAuthn v13 Server)
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import {
|
|
62
|
+
verifyAuthenticationResponse,
|
|
63
|
+
generateAuthenticationOptions,
|
|
64
|
+
} from '@simplewebauthn/server';
|
|
65
|
+
|
|
66
|
+
export async function verifyPasskeyAuth(
|
|
67
|
+
body: any,
|
|
68
|
+
expectedChallenge: string,
|
|
69
|
+
userPublicKey: Uint8Array,
|
|
70
|
+
) {
|
|
71
|
+
const verification = await verifyAuthenticationResponse({
|
|
72
|
+
response: body,
|
|
73
|
+
expectedChallenge,
|
|
74
|
+
expectedOrigin: process.env.APP_ORIGIN!,
|
|
75
|
+
expectedRPID: process.env.RP_ID!,
|
|
76
|
+
credential: {
|
|
77
|
+
id: body.id,
|
|
78
|
+
publicKey: userPublicKey,
|
|
79
|
+
counter: body.counter || 0,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return verification.verified;
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## 🛑 Verification-Before-Completion (VBC) Protocol
|
|
88
|
+
|
|
89
|
+
- Verify input tags have `autocomplete="username webauthn"`.
|
|
90
|
+
- Test passkey autofill flow with `AbortController` cancellation.
|