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.
Files changed (353) hide show
  1. package/.agent/.manifest.json +78 -0
  2. package/.agent/ARCHITECTURE.md +19 -241
  3. package/.agent/agents/accessibility-reviewer.md +23 -16
  4. package/.agent/agents/ai-code-reviewer.md +25 -21
  5. package/.agent/agents/anti-pattern-reviewer.md +12 -7
  6. package/.agent/agents/api-architect.md +1 -0
  7. package/.agent/agents/backend-specialist.md +23 -22
  8. package/.agent/agents/cloud-engineer.md +1 -0
  9. package/.agent/agents/code-archaeologist.md +1 -0
  10. package/.agent/agents/complexity-reviewer.md +10 -7
  11. package/.agent/agents/database-architect.md +3 -2
  12. package/.agent/agents/db-latency-auditor.md +6 -2
  13. package/.agent/agents/debugger.md +3 -2
  14. package/.agent/agents/dependency-reviewer.md +1 -0
  15. package/.agent/agents/devops-engineer.md +9 -8
  16. package/.agent/agents/documentation-writer.md +6 -5
  17. package/.agent/agents/explorer-agent.md +1 -0
  18. package/.agent/agents/frontend-reviewer.md +21 -17
  19. package/.agent/agents/frontend-specialist.md +23 -20
  20. package/.agent/agents/game-developer.md +1 -0
  21. package/.agent/agents/interaction-reviewer.md +10 -5
  22. package/.agent/agents/logic-reviewer.md +3 -0
  23. package/.agent/agents/minimalist-reviewer.md +6 -0
  24. package/.agent/agents/mobile-developer.md +7 -6
  25. package/.agent/agents/mobile-reviewer.md +14 -13
  26. package/.agent/agents/orchestrator.md +3 -0
  27. package/.agent/agents/penetration-tester.md +1 -0
  28. package/.agent/agents/performance-optimizer.md +6 -5
  29. package/.agent/agents/performance-reviewer.md +6 -6
  30. package/.agent/agents/pipeline-reviewer.md +144 -0
  31. package/.agent/agents/precedence-reviewer.md +1 -0
  32. package/.agent/agents/product-manager.md +1 -0
  33. package/.agent/agents/product-owner.md +1 -0
  34. package/.agent/agents/product-reviewer.md +12 -7
  35. package/.agent/agents/project-planner.md +3 -0
  36. package/.agent/agents/qa-automation-engineer.md +50 -43
  37. package/.agent/agents/resilience-reviewer.md +1 -0
  38. package/.agent/agents/schema-reviewer.md +1 -0
  39. package/.agent/agents/security-auditor.md +24 -24
  40. package/.agent/agents/seo-specialist.md +33 -23
  41. package/.agent/agents/sql-reviewer.md +5 -4
  42. package/.agent/agents/supervisor-agent.md +12 -2
  43. package/.agent/agents/swarm-worker-contracts.md +13 -13
  44. package/.agent/agents/swarm-worker-registry.md +51 -51
  45. package/.agent/agents/system-architect.md +1 -0
  46. package/.agent/agents/test-coverage-reviewer.md +25 -22
  47. package/.agent/agents/test-engineer.md +12 -11
  48. package/.agent/agents/throughput-optimizer.md +45 -40
  49. package/.agent/agents/type-safety-reviewer.md +5 -4
  50. package/.agent/agents/ui-ux-auditor.md +6 -4
  51. package/.agent/agents/ui-visual-auditor.md +3 -0
  52. package/.agent/agents/ux-reviewer.md +11 -6
  53. package/.agent/agents/visual-reviewer.md +11 -6
  54. package/.agent/agents/vitals-reviewer.md +5 -4
  55. package/.agent/history/memory/.memory.idx +3716 -1
  56. package/.agent/history/memory/MEMORY.md +246 -1
  57. package/.agent/mcp_config.json +1 -6
  58. package/.agent/routing_index.json +2034 -263
  59. package/.agent/rules/GEMINI.md +12 -10
  60. package/.agent/rules/GEMINI_PLANNER.md +19 -21
  61. package/.agent/scripts/_colors.js +52 -54
  62. package/.agent/scripts/_utils.js +52 -53
  63. package/.agent/scripts/auto_preview.js +39 -43
  64. package/.agent/scripts/bundle_analyzer.js +47 -60
  65. package/.agent/scripts/case_law_manager.js +200 -294
  66. package/.agent/scripts/checklist.js +73 -94
  67. package/.agent/scripts/cicd_validator.js +305 -0
  68. package/.agent/scripts/compile_router.py +4 -111
  69. package/.agent/scripts/context_broker.js +317 -412
  70. package/.agent/scripts/contract_engine.js +402 -0
  71. package/.agent/scripts/dependency_analyzer.js +112 -124
  72. package/.agent/scripts/graph_builder.js +75 -103
  73. package/.agent/scripts/graph_visualizer.js +10 -12
  74. package/.agent/scripts/graph_zoom.js +38 -55
  75. package/.agent/scripts/guardrail_engine.js +195 -145
  76. package/.agent/scripts/impact_classifier.js +55 -30
  77. package/.agent/scripts/inner_loop_validator.js +108 -159
  78. package/.agent/scripts/integrity_manifest.js +59 -67
  79. package/.agent/scripts/lint_runner.js +65 -75
  80. package/.agent/scripts/marathon_harness.js +131 -208
  81. package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
  82. package/.agent/scripts/minify_context.js +29 -33
  83. package/.agent/scripts/minimal_change_engine.js +95 -87
  84. package/.agent/scripts/mutation_runner.js +46 -62
  85. package/.agent/scripts/pipeline_engine.js +320 -209
  86. package/.agent/scripts/prompt_compiler.js +118 -93
  87. package/.agent/scripts/schema_validator.js +73 -121
  88. package/.agent/scripts/security_scan.js +88 -117
  89. package/.agent/scripts/session_manager.js +52 -69
  90. package/.agent/scripts/signal_detector.js +24 -22
  91. package/.agent/scripts/skill_evolution.js +184 -245
  92. package/.agent/scripts/skill_integrator.js +35 -48
  93. package/.agent/scripts/socratic_gate_policy.js +15 -12
  94. package/.agent/scripts/strengthen_skills.js +29 -33
  95. package/.agent/scripts/swarm_dispatcher.js +120 -151
  96. package/.agent/scripts/test_runner.js +54 -56
  97. package/.agent/scripts/token_budget_broker.js +9 -7
  98. package/.agent/scripts/trace_engine.js +126 -0
  99. package/.agent/scripts/verify_all.js +76 -93
  100. package/.agent/scripts/visual_audit.js +16 -21
  101. package/.agent/skill_topic_map.json +237 -0
  102. package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
  103. package/.agent/skills/60fps-animation/SKILL.md +7 -0
  104. package/.agent/skills/accessible-animation/SKILL.md +5 -1
  105. package/.agent/skills/adapt/SKILL.md +7 -1
  106. package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
  107. package/.agent/skills/agent-organizer/SKILL.md +1 -0
  108. package/.agent/skills/agentic-patterns/SKILL.md +33 -25
  109. package/.agent/skills/agentic-workflows-2026/SKILL.md +80 -0
  110. package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
  111. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
  112. package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
  113. package/.agent/skills/animation-systems/SKILL.md +11 -10
  114. package/.agent/skills/antfu-conventions/SKILL.md +7 -2
  115. package/.agent/skills/api-patterns/SKILL.md +14 -10
  116. package/.agent/skills/api-security-auditor/SKILL.md +15 -14
  117. package/.agent/skills/app-builder/SKILL.md +1 -0
  118. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
  119. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
  120. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
  121. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
  122. package/.agent/skills/apple-design/SKILL.md +8 -7
  123. package/.agent/skills/architecture/SKILL.md +3 -2
  124. package/.agent/skills/audit-and-fix/SKILL.md +8 -5
  125. package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
  126. package/.agent/skills/backend-security-expert/SKILL.md +1 -0
  127. package/.agent/skills/baseline-ui/SKILL.md +8 -7
  128. package/.agent/skills/bash-linux/SKILL.md +1 -0
  129. package/.agent/skills/behavioral-modes/SKILL.md +1 -0
  130. package/.agent/skills/better-colors/SKILL.md +11 -7
  131. package/.agent/skills/better-typography/SKILL.md +30 -16
  132. package/.agent/skills/better-ui/SKILL.md +17 -10
  133. package/.agent/skills/bolder/SKILL.md +6 -0
  134. package/.agent/skills/brainstorming/SKILL.md +6 -4
  135. package/.agent/skills/browser-native-ai/SKILL.md +5 -4
  136. package/.agent/skills/build-primitive/SKILL.md +5 -0
  137. package/.agent/skills/building-native-ui/SKILL.md +1 -0
  138. package/.agent/skills/cicd-pro/SKILL.md +2 -1
  139. package/.agent/skills/clarify/SKILL.md +19 -14
  140. package/.agent/skills/clean-code/SKILL.md +16 -15
  141. package/.agent/skills/cloud-architect/SKILL.md +1 -0
  142. package/.agent/skills/cobejs/SKILL.md +7 -9
  143. package/.agent/skills/code-review-checklist/SKILL.md +1 -0
  144. package/.agent/skills/codebase-design/SKILL.md +7 -2
  145. package/.agent/skills/colorize/SKILL.md +8 -3
  146. package/.agent/skills/compact-landing/SKILL.md +8 -3
  147. package/.agent/skills/company-logos/SKILL.md +6 -0
  148. package/.agent/skills/config-validator/SKILL.md +10 -9
  149. package/.agent/skills/containerization-pro/SKILL.md +6 -5
  150. package/.agent/skills/context-engineering-pro/SKILL.md +70 -0
  151. package/.agent/skills/create-design-md/SKILL.md +13 -5
  152. package/.agent/skills/critique/SKILL.md +10 -8
  153. package/.agent/skills/csharp-developer/SKILL.md +1 -0
  154. package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
  155. package/.agent/skills/database-design/SKILL.md +2 -1
  156. package/.agent/skills/delight/SKILL.md +6 -0
  157. package/.agent/skills/deployment-procedures/SKILL.md +2 -1
  158. package/.agent/skills/design-lab/SKILL.md +5 -0
  159. package/.agent/skills/devops-engineer/SKILL.md +3 -2
  160. package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
  161. package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
  162. package/.agent/skills/distill/SKILL.md +7 -2
  163. package/.agent/skills/documentation-templates/SKILL.md +3 -2
  164. package/.agent/skills/domain-modeling/SKILL.md +12 -4
  165. package/.agent/skills/duckdb-analytical-sql/SKILL.md +59 -0
  166. package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
  167. package/.agent/skills/edge-computing/SKILL.md +9 -8
  168. package/.agent/skills/emil-design-eng/SKILL.md +43 -27
  169. package/.agent/skills/error-resilience/SKILL.md +34 -16
  170. package/.agent/skills/expo-router-v4/SKILL.md +81 -0
  171. package/.agent/skills/extract-design-system/SKILL.md +12 -11
  172. package/.agent/skills/fabel-protocol/SKILL.md +24 -17
  173. package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
  174. package/.agent/skills/fixing-metadata/SKILL.md +24 -13
  175. package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
  176. package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
  177. package/.agent/skills/frontend-design/SKILL.md +21 -13
  178. package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
  179. package/.agent/skills/game-design-expert/SKILL.md +1 -0
  180. package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
  181. package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
  182. package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
  183. package/.agent/skills/git-pro/SKILL.md +10 -9
  184. package/.agent/skills/github-operations/SKILL.md +2 -1
  185. package/.agent/skills/gpt-taste/SKILL.md +7 -0
  186. package/.agent/skills/gsap-core/SKILL.md +26 -22
  187. package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
  188. package/.agent/skills/gsap-performance/SKILL.md +4 -3
  189. package/.agent/skills/gsap-plugins/SKILL.md +34 -33
  190. package/.agent/skills/gsap-react/SKILL.md +9 -8
  191. package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
  192. package/.agent/skills/gsap-timeline/SKILL.md +18 -15
  193. package/.agent/skills/gsap-utils/SKILL.md +25 -24
  194. package/.agent/skills/harden/SKILL.md +9 -3
  195. package/.agent/skills/harness-protocol/SKILL.md +1 -0
  196. package/.agent/skills/i18n-localization/SKILL.md +10 -9
  197. package/.agent/skills/impeccable/SKILL.md +5 -0
  198. package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
  199. package/.agent/skills/improve-ui/SKILL.md +12 -5
  200. package/.agent/skills/intelligent-routing/SKILL.md +7 -6
  201. package/.agent/skills/knowledge-graph/SKILL.md +1 -0
  202. package/.agent/skills/landing-page/SKILL.md +1 -0
  203. package/.agent/skills/lint-and-validate/SKILL.md +9 -4
  204. package/.agent/skills/llm-engineering/SKILL.md +55 -54
  205. package/.agent/skills/local-first/SKILL.md +20 -19
  206. package/.agent/skills/local-first-architecture/SKILL.md +6 -1
  207. package/.agent/skills/lottie-animation/SKILL.md +7 -3
  208. package/.agent/skills/marquee-loop/SKILL.md +1 -0
  209. package/.agent/skills/masked-reveal/SKILL.md +17 -4
  210. package/.agent/skills/mcp-builder/SKILL.md +13 -10
  211. package/.agent/skills/micro-interaction/SKILL.md +20 -5
  212. package/.agent/skills/mobile-design/SKILL.md +26 -15
  213. package/.agent/skills/monorepo-management/SKILL.md +3 -2
  214. package/.agent/skills/morphing-icons/SKILL.md +16 -6
  215. package/.agent/skills/motion-engineering/SKILL.md +19 -15
  216. package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
  217. package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
  218. package/.agent/skills/observability/SKILL.md +45 -44
  219. package/.agent/skills/opentelemetry-observability/SKILL.md +59 -0
  220. package/.agent/skills/page-transition-animation/SKILL.md +6 -3
  221. package/.agent/skills/parallel-agents/SKILL.md +7 -2
  222. package/.agent/skills/performance-profiling/SKILL.md +24 -13
  223. package/.agent/skills/plan-writing/SKILL.md +1 -0
  224. package/.agent/skills/platform-engineer/SKILL.md +3 -2
  225. package/.agent/skills/platform-engineering-opentofu/SKILL.md +68 -0
  226. package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
  227. package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
  228. package/.agent/skills/polish/SKILL.md +13 -12
  229. package/.agent/skills/powershell-windows/SKILL.md +1 -0
  230. package/.agent/skills/pricing-page/SKILL.md +8 -3
  231. package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
  232. package/.agent/skills/progressive-blur/SKILL.md +9 -4
  233. package/.agent/skills/project-idioms/SKILL.md +1 -0
  234. package/.agent/skills/property-based-testing/SKILL.md +58 -0
  235. package/.agent/skills/python-patterns/SKILL.md +1 -0
  236. package/.agent/skills/python-pro/SKILL.md +1 -0
  237. package/.agent/skills/quieter/SKILL.md +6 -0
  238. package/.agent/skills/react-doctor/SKILL.md +6 -0
  239. package/.agent/skills/react-specialist/SKILL.md +32 -28
  240. package/.agent/skills/readme-builder/SKILL.md +1 -0
  241. package/.agent/skills/realtime-patterns/SKILL.md +34 -33
  242. package/.agent/skills/red-team-tactics/SKILL.md +1 -0
  243. package/.agent/skills/redesign-skill/SKILL.md +6 -0
  244. package/.agent/skills/review-animations/SKILL.md +5 -2
  245. package/.agent/skills/review-animations/STANDARDS.md +37 -23
  246. package/.agent/skills/rust-pro/SKILL.md +1 -0
  247. package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
  248. package/.agent/skills/server-management/SKILL.md +1 -0
  249. package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
  250. package/.agent/skills/shape/SKILL.md +9 -2
  251. package/.agent/skills/skill-creator/SKILL.md +1 -0
  252. package/.agent/skills/soft-skill/SKILL.md +6 -0
  253. package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
  254. package/.agent/skills/sql-pro/SKILL.md +1 -0
  255. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
  256. package/.agent/skills/svg-animation/SKILL.md +16 -7
  257. package/.agent/skills/swiftui-expert/SKILL.md +1 -0
  258. package/.agent/skills/swiss-design/SKILL.md +5 -0
  259. package/.agent/skills/system-design-pro/SKILL.md +1 -0
  260. package/.agent/skills/systematic-debugging/SKILL.md +1 -0
  261. package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
  262. package/.agent/skills/taste-skill/SKILL.md +6 -0
  263. package/.agent/skills/tdd-workflow/SKILL.md +5 -0
  264. package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
  265. package/.agent/skills/testing-patterns/SKILL.md +123 -115
  266. package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
  267. package/.agent/skills/thinking-protocol/SKILL.md +3 -0
  268. package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
  269. package/.agent/skills/transitions-dev/SKILL.md +19 -6
  270. package/.agent/skills/trend-researcher/SKILL.md +1 -0
  271. package/.agent/skills/typescript-advanced/SKILL.md +23 -18
  272. package/.agent/skills/typeset/SKILL.md +10 -1
  273. package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
  274. package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
  275. package/.agent/skills/ui-skills-root/SKILL.md +39 -38
  276. package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
  277. package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
  278. package/.agent/skills/vector-search-pgvector/SKILL.md +78 -0
  279. package/.agent/skills/vue-expert/SKILL.md +22 -19
  280. package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
  281. package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
  282. package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
  283. package/.agent/skills/web-quality-audit/SKILL.md +5 -0
  284. package/.agent/skills/webapp-testing/SKILL.md +14 -13
  285. package/.agent/skills/webgpu-performance/SKILL.md +1 -0
  286. package/.agent/skills/whimsy-injector/SKILL.md +9 -5
  287. package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
  288. package/.agent/skills/zero-trust-passkeys/SKILL.md +90 -0
  289. package/.agent/templates/DESIGN.md +119 -110
  290. package/.agent/templates/design-tokens.json +9 -6
  291. package/.agent/workflows/acf.md +1 -0
  292. package/.agent/workflows/api-tester.md +1 -0
  293. package/.agent/workflows/audit.md +1 -0
  294. package/.agent/workflows/brainstorm.md +1 -0
  295. package/.agent/workflows/changelog.md +1 -0
  296. package/.agent/workflows/contract.md +60 -0
  297. package/.agent/workflows/create.md +1 -0
  298. package/.agent/workflows/debug.md +1 -0
  299. package/.agent/workflows/deploy.md +1 -0
  300. package/.agent/workflows/enhance.md +1 -0
  301. package/.agent/workflows/fix-ci.md +89 -0
  302. package/.agent/workflows/fix.md +1 -0
  303. package/.agent/workflows/generate.md +1 -0
  304. package/.agent/workflows/marathon.md +1 -0
  305. package/.agent/workflows/migrate.md +1 -0
  306. package/.agent/workflows/minimal.md +9 -7
  307. package/.agent/workflows/orchestrate.md +1 -0
  308. package/.agent/workflows/performance-benchmarker.md +1 -0
  309. package/.agent/workflows/pipeline.md +26 -21
  310. package/.agent/workflows/plan.md +1 -0
  311. package/.agent/workflows/preview.md +1 -0
  312. package/.agent/workflows/refactor.md +3 -2
  313. package/.agent/workflows/review-ai.md +4 -3
  314. package/.agent/workflows/review.md +1 -0
  315. package/.agent/workflows/session.md +1 -0
  316. package/.agent/workflows/status.md +1 -0
  317. package/.agent/workflows/strengthen-skills.md +1 -0
  318. package/.agent/workflows/super-prompt.md +1 -0
  319. package/.agent/workflows/swarm.md +15 -3
  320. package/.agent/workflows/test.md +8 -7
  321. package/.agent/workflows/tribunal-backend.md +3 -2
  322. package/.agent/workflows/tribunal-cicd.md +104 -0
  323. package/.agent/workflows/tribunal-database.md +1 -0
  324. package/.agent/workflows/tribunal-frontend.md +8 -6
  325. package/.agent/workflows/tribunal-full.md +15 -14
  326. package/.agent/workflows/tribunal-mobile.md +6 -5
  327. package/.agent/workflows/tribunal-performance.md +1 -0
  328. package/.agent/workflows/tribunal-speed.md +1 -0
  329. package/.agent/workflows/tribunal-ui.md +29 -21
  330. package/.agent/workflows/ui-ux-pro-max.md +19 -15
  331. package/CONTRIBUTING.md +3 -3
  332. package/README.md +160 -88
  333. package/SECURITY.md +11 -11
  334. package/bin/mcp-server.js +512 -233
  335. package/bin/tribunal-kit.js +29 -30
  336. package/bin/wrapper.js +45 -48
  337. package/dist/cli.js +26 -0
  338. package/dist/commands/case.js +2 -0
  339. package/dist/commands/contract.js +440 -0
  340. package/dist/commands/memory.js +3 -2
  341. package/dist/commands/native.js +36 -0
  342. package/dist/commands/status.js +6 -0
  343. package/dist/esm/index.mjs +32 -0
  344. package/dist/index.d.ts +58 -3
  345. package/package.json +20 -16
  346. package/scripts/benchmark.js +62 -86
  347. package/scripts/changelog.js +67 -73
  348. package/scripts/fix-vbc.js +13 -15
  349. package/scripts/fix-vbc.ps1 +2 -118
  350. package/scripts/stress_benchmark.js +358 -0
  351. package/scripts/sync-version.js +71 -41
  352. package/scripts/validate-payload.js +23 -30
  353. 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 "vue";
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?: "primary" | "secondary" }>(), { variant: "primary" });
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>("count"); // named model
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: "Alice", age: 25 });
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: (v) => {
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 "pinia";
135
- export const useCounterStore = defineStore("counter", () => {
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 "pinia";
151
+ import { storeToRefs } from 'pinia';
149
152
  const { count } = storeToRefs(store);
150
153
 
151
154
  // Persist plugin:
152
- import { createPinia } from "pinia";
153
- import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
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 "vue-router";
166
+ import { createRouter, createWebHistory } from 'vue-router';
164
167
  const router = createRouter({
165
168
  history: createWebHistory(),
166
169
  routes: [
167
- { path: "/", component: () => import("./views/Home.vue") }, // lazy-loaded
168
- { path: "/user/:id", component: UserView, props: true }, // props:true passes params as props
169
- { path: "/:pathMatch(.*)*", component: NotFound }, // 404 catch-all
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: "Login" };
177
+ if (to.meta.requiresAuth && !isLoggedIn()) return { name: 'Login' };
175
178
  });
176
179
 
177
180
  // In component:
178
- import { useRouter, useRoute } from "vue-router";
181
+ import { useRouter, useRoute } from 'vue-router';
179
182
  const router = useRouter();
180
183
  const route = useRoute();
181
- router.push({ name: "User", params: { id: 42 } });
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: (r) => r.user,
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("SELECT * FROM users WHERE email = $1", [email]);
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("/proxy", async (req, res) => {
95
- const data = await fetch(req.query.url).then((r) => r.text());
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(["api.example.com", "cdn.example.com"]);
103
+ const ALLOWED_HOSTS = new Set(['api.example.com', 'cdn.example.com']);
103
104
 
104
- app.get("/proxy", async (req, res) => {
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: "Domain not allowed" });
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: "Private IP not allowed" });
113
+ return res.status(403).json({ error: 'Private IP not allowed' });
113
114
  }
114
- const data = await fetch(url).then((r) => r.text());
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 "jsonwebtoken";
126
+ import jwt from 'jsonwebtoken';
126
127
 
127
128
  // ✅ SAFE: Specify algorithm explicitly
128
129
  const token = jwt.sign(payload, SECRET, {
129
- algorithm: "HS256", // explicit
130
- expiresIn: "15m", // short-lived access token
131
- issuer: "myapp",
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: ["HS256"], // MUST specify — prevents algorithm confusion attack
137
- issuer: "myapp",
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("/api/posts/:id", async (req, res) => {
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: "Not found" });
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 !== "admin") {
151
- return res.status(403).json({ error: "Forbidden" });
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 "helmet";
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: ["https://myapp.com", "https://admin.myapp.com"],
215
- methods: ["GET", "POST", "PUT", "DELETE"],
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("myModal").showModal();
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
- * **Body Text:** Lc > 75 is required for body text readability.
35
- * **Headings:** Lc > 60 is required for headings.
36
- * **Controls/Borders:** Lc > 45 is required for visual divider borders and focus rings.
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
- * **Largest Contentful Paint (LCP < 1.5s):** Hero banners and images must use the `fetchpriority="high"` tag. Avoid blocking layout paints with heavy JS scripts.
42
- * **Interaction to Next Paint (INP < 100ms):** Enforce main-thread speed. Wrap heavy operations in `startTransition` or React's deferred values.
43
- * **Cumulative Layout Shift (CLS = 0.00):** Image nodes must declare explicit width/height dimensions or aspect-ratios. Pre-allocate spaces for dynamic elements.
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
- * **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.
49
- * **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.
50
- * **Font Subsetting:** Self-host typography files and use variable fonts to minimize network payloads.
51
- * **Image Formats:** Serve images exclusively in AVIF or WebP formats.
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("axios");
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 "msw";
64
- import { setupServer } from "msw/node";
64
+ import { http, HttpResponse } from 'msw';
65
+ import { setupServer } from 'msw/node';
65
66
 
66
67
  export const handlers = [
67
- http.get("/api/users", () => {
68
- return HttpResponse.json([{ id: 1, name: "John Appleseed" }]);
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("Subtotal cannot be negative");
116
- if (state === "CA") return subtotal * 0.0825;
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 "vitest";
122
+ import { describe, it, expect } from 'vitest';
122
123
 
123
- describe("calculateTax()", () => {
124
- it("applies CA tax correctly", () => {
125
- expect(calculateTax(100, "CA")).toBe(8.25);
124
+ describe('calculateTax()', () => {
125
+ it('applies CA tax correctly', () => {
126
+ expect(calculateTax(100, 'CA')).toBe(8.25);
126
127
  });
127
128
 
128
- it("throws on negative input", () => {
129
- expect(() => calculateTax(-50, "CA")).toThrowError("negative");
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
- (entries) => {
82
- entries.forEach((entry) => {
82
+ entries => {
83
+ entries.forEach(entry => {
83
84
  if (entry.isIntersecting) {
84
- entry.target.classList.add("visible");
85
+ entry.target.classList.add('visible');
85
86
  }
86
87
  });
87
88
  },
88
89
  { threshold: 0.1 },
89
90
  );
90
- document.querySelectorAll(".reveal").forEach((el) => observer.observe(el));
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 key={item.id} variants={{ hidden: { opacity: 0, y: 20 }, show: { opacity: 1, y: 0 } }} />
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.