tribunal-kit 6.0.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/ARCHITECTURE.md +9 -6
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/config/claude.json +18 -0
- package/.agent/config/plugin.json +102 -0
- package/.agent/config/slash-commands.json +103 -0
- package/.agent/config/specialist-registry.json +415 -0
- package/.agent/config/system-prompt.md +191 -0
- package/.agent/history/architecture-graph.yaml +302 -3
- package/.agent/history/graph-cache.json +515 -45
- package/.agent/history/memory/.memory.idx +1532 -1
- package/.agent/history/memory/MEMORY.md +102 -1
- package/.agent/history/memory.db +0 -0
- package/.agent/history/snapshots/bin__adapter-install.js.json +13 -0
- package/.agent/history/snapshots/bin__global-store.js.json +15 -0
- package/.agent/history/snapshots/bin__mcp-server.js.json +19 -0
- package/.agent/history/snapshots/bin__proxy-server.js.json +20 -0
- package/.agent/history/snapshots/bin__spawn-agent.js.json +12 -0
- package/.agent/history/snapshots/bin__tk-proxy.js.json +21 -0
- package/.agent/history/snapshots/bin__tribunal-kit.js.json +9 -7
- package/.agent/history/snapshots/bin__wrapper.js.json +14 -0
- package/.agent/history/snapshots/eslint.config.js.json +1 -2
- package/.agent/history/snapshots/scripts__benchmark.js.json +14 -0
- package/.agent/history/snapshots/scripts__changelog.js.json +1 -2
- package/.agent/history/snapshots/scripts__fix-vbc.js.json +11 -0
- package/.agent/history/snapshots/scripts__stress_benchmark.js.json +15 -0
- package/.agent/history/snapshots/scripts__sync-version.js.json +1 -2
- package/.agent/history/snapshots/scripts__validate-payload.js.json +1 -2
- package/.agent/history/snapshots/scripts__visual_audit.js.json +11 -0
- package/.agent/history/snapshots/test__integration__bridges.test.js.json +1 -2
- package/.agent/history/snapshots/test__integration__graceful_degradation.test.js.json +12 -0
- package/.agent/history/snapshots/test__integration__init.test.js.json +1 -2
- package/.agent/history/snapshots/test__integration__minimal_change_pipeline.test.js.json +13 -0
- package/.agent/history/snapshots/test__integration__parallel_tribunal.test.js.json +12 -0
- package/.agent/history/snapshots/test__integration__routing.test.js.json +1 -2
- package/.agent/history/snapshots/test__integration__swarm_dispatcher.test.js.json +1 -2
- package/.agent/history/snapshots/test__integration__sync_status.test.js.json +13 -0
- package/.agent/history/snapshots/test__integration__wave2.test.js.json +1 -2
- package/.agent/history/snapshots/test__integration__wrapper.test.js.json +13 -0
- package/.agent/history/snapshots/test__unit__align.test.js.json +10 -0
- package/.agent/history/snapshots/test__unit__args.test.js.json +3 -3
- package/.agent/history/snapshots/test__unit__audit_release.test.js.json +16 -0
- package/.agent/history/snapshots/test__unit__case_law_manager.test.js.json +1 -2
- package/.agent/history/snapshots/test__unit__cicd_validator.test.js.json +12 -0
- package/.agent/history/snapshots/test__unit__compile.test.js.json +10 -0
- package/.agent/history/snapshots/test__unit__context_broker.test.js.json +1 -2
- package/.agent/history/snapshots/test__unit__contract_engine.test.js.json +13 -0
- package/.agent/history/snapshots/test__unit__copyDir.test.js.json +3 -3
- package/.agent/history/snapshots/test__unit__graph_tools.test.js.json +1 -2
- package/.agent/history/snapshots/test__unit__guardrail_engine.test.js.json +10 -0
- package/.agent/history/snapshots/test__unit__impact_classifier.test.js.json +12 -0
- package/.agent/history/snapshots/test__unit__init.test.js.json +14 -0
- package/.agent/history/snapshots/test__unit__inner_loop_validator.test.js.json +1 -2
- package/.agent/history/snapshots/test__unit__integrity_manifest.test.js.json +13 -0
- package/.agent/history/snapshots/test__unit__learn.test.js.json +11 -0
- package/.agent/history/snapshots/test__unit__marathon.test.js.json +22 -0
- package/.agent/history/snapshots/test__unit__mcp_server.test.js.json +16 -0
- package/.agent/history/snapshots/test__unit__memory.test.js.json +13 -0
- package/.agent/history/snapshots/test__unit__minimal_change.test.js.json +10 -0
- package/.agent/history/snapshots/test__unit__native.test.js.json +10 -0
- package/.agent/history/snapshots/test__unit__optimize.test.js.json +13 -0
- package/.agent/history/snapshots/test__unit__path_resolution.test.js.json +14 -0
- package/.agent/history/snapshots/test__unit__production_readiness_evidence.test.js.json +21 -0
- package/.agent/history/snapshots/test__unit__selfInstall.test.js.json +3 -3
- package/.agent/history/snapshots/test__unit__semver.test.js.json +3 -3
- package/.agent/history/snapshots/test__unit__skill_evolution.test.js.json +11 -0
- package/.agent/history/snapshots/test__unit__stress.test.js.json +15 -0
- package/.agent/history/snapshots/test__unit__swarm_dispatcher.test.js.json +3 -3
- package/.agent/history/snapshots/test__unit__utils.test.js.json +10 -0
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2033 -263
- package/.agent/rules/GEMINI.md +11 -9
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/ast_context_loader.js +137 -0
- 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/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/memory_engine.js +581 -0
- 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/payload_schemas.js +146 -0
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +166 -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 +397 -200
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +126 -13
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +22 -3
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +6 -2
- package/.agent/skills/ai-app-hardening/SKILL.md +9 -8
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +5 -4
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +7 -3
- package/.agent/skills/edge-ai-mobile/SKILL.md +5 -1
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +2 -1
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +2 -1
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +1 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +3 -2
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +10 -12
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +3 -2
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +11 -6
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +2 -1
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/.claude/CLAUDE.md +442 -0
- package/CONTRIBUTING.md +3 -3
- package/README.md +105 -45
- package/SECURITY.md +11 -11
- package/bin/adapter-install.js +240 -0
- package/bin/global-store.js +48 -0
- package/bin/mcp-server.js +781 -332
- package/bin/proxy-server.js +113 -0
- package/bin/spawn-agent.js +39 -0
- package/bin/tk-proxy.js +34 -0
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +40 -46
- package/dist/cli.js +6 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/init.js +8 -51
- package/dist/commands/status.js +61 -30
- package/dist/commands/validate.js +22 -31
- package/dist/index.d.ts +8 -1
- package/dist/tui/banner.js +77 -0
- package/dist/tui/index.js +21 -0
- package/dist/tui/reviewer-grid.js +90 -0
- package/dist/tui/shimmer.js +91 -0
- package/dist/tui/theme.js +130 -0
- package/dist/tui/tree.js +93 -0
- package/dist/tui/wizard.js +148 -0
- package/dist/utils/helpers.js +5 -41
- package/package.json +33 -15
- package/scripts/benchmark.js +62 -86
- package/scripts/build-graph.js +71 -0
- 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
- package/.agent/history/snapshots/migrate_refs.js.json +0 -11
- package/.agent/scripts/compile_router.py +0 -112
- package/.agent/scripts/migrate_skills_frontmatter.py +0 -64
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before designing agentic loops, tool schemas, or memory architectures, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. `package.json` / LLM SDK definitions → Check tool calling syntax (Zod schemas, OpenAI/Anthropic function calling API)
|
|
24
25
|
2. Agent Loop boundaries (Section 1) → Define hard caps on `MAX_STEPS` (default: 10) and explicit termination reasons
|
|
25
26
|
3. Human-in-the-loop gates (Section 5) → Ensure approval gates for destructive, data-deleting, or high-cost API calls
|
|
@@ -45,7 +46,7 @@ PERCEIVE → PLAN → ACT → OBSERVE → (repeat or terminate)
|
|
|
45
46
|
```ts
|
|
46
47
|
// The three termination conditions — always define all three
|
|
47
48
|
type AgentResult = {
|
|
48
|
-
reason:
|
|
49
|
+
reason: 'goal_reached' | 'max_steps_exceeded' | 'human_escalation';
|
|
49
50
|
steps: number;
|
|
50
51
|
result: string;
|
|
51
52
|
};
|
|
@@ -63,23 +64,24 @@ Tools are the agent's interface to the real world. Design them defensively:
|
|
|
63
64
|
// Tool definition — what the LLM sees and how to call it
|
|
64
65
|
const tools = [
|
|
65
66
|
{
|
|
66
|
-
type:
|
|
67
|
+
type: 'function',
|
|
67
68
|
function: {
|
|
68
|
-
name:
|
|
69
|
-
description:
|
|
69
|
+
name: 'search_database',
|
|
70
|
+
description:
|
|
71
|
+
'Search the product database. Use this before creating a new record to avoid duplicates.',
|
|
70
72
|
parameters: {
|
|
71
|
-
type:
|
|
73
|
+
type: 'object',
|
|
72
74
|
properties: {
|
|
73
75
|
query: {
|
|
74
|
-
type:
|
|
75
|
-
description:
|
|
76
|
+
type: 'string',
|
|
77
|
+
description: 'Search terms — be specific',
|
|
76
78
|
},
|
|
77
79
|
limit: {
|
|
78
|
-
type:
|
|
79
|
-
description:
|
|
80
|
+
type: 'number',
|
|
81
|
+
description: 'Max results to return. Default: 5, max: 20',
|
|
80
82
|
},
|
|
81
83
|
},
|
|
82
|
-
required: [
|
|
84
|
+
required: ['query'],
|
|
83
85
|
},
|
|
84
86
|
},
|
|
85
87
|
},
|
|
@@ -145,10 +147,13 @@ async function buildContext(userId: string, currentQuery: string) {
|
|
|
145
147
|
});
|
|
146
148
|
|
|
147
149
|
return [
|
|
148
|
-
{ role:
|
|
150
|
+
{ role: 'system', content: systemPrompt },
|
|
149
151
|
// Inject relevant past context — NOT entire history
|
|
150
|
-
{
|
|
151
|
-
|
|
152
|
+
{
|
|
153
|
+
role: 'system',
|
|
154
|
+
content: `Relevant past context:\n${pastMemories.map(m => m.content).join('\n')}`,
|
|
155
|
+
},
|
|
156
|
+
{ role: 'user', content: currentQuery },
|
|
152
157
|
];
|
|
153
158
|
}
|
|
154
159
|
```
|
|
@@ -175,7 +180,10 @@ Supervisor agent ─→ breaks task into subtasks
|
|
|
175
180
|
|
|
176
181
|
```ts
|
|
177
182
|
// Two independent agents answer the same question — supervisor resolves disagreement
|
|
178
|
-
const [answerA, answerB] = await Promise.all([
|
|
183
|
+
const [answerA, answerB] = await Promise.all([
|
|
184
|
+
agentA.complete(question),
|
|
185
|
+
agentB.complete(question),
|
|
186
|
+
]);
|
|
179
187
|
|
|
180
188
|
if (answerA.answer === answerB.answer) {
|
|
181
189
|
return answerA; // Agreement — high confidence
|
|
@@ -209,13 +217,13 @@ async function agentLoop(task: string) {
|
|
|
209
217
|
reason: planned.reasoning,
|
|
210
218
|
confidence: planned.confidence,
|
|
211
219
|
});
|
|
212
|
-
if (!approved) return { reason:
|
|
220
|
+
if (!approved) return { reason: 'human_rejected', step };
|
|
213
221
|
}
|
|
214
222
|
|
|
215
223
|
// ✅ Confidence gate — don't act when uncertain
|
|
216
224
|
if (planned.confidence < 0.7) {
|
|
217
225
|
return {
|
|
218
|
-
reason:
|
|
226
|
+
reason: 'human_escalation',
|
|
219
227
|
message: `Low confidence (${planned.confidence}) on: ${planned.action.description}`,
|
|
220
228
|
};
|
|
221
229
|
}
|
|
@@ -238,23 +246,23 @@ Every production agent needs:
|
|
|
238
246
|
const guardrails = {
|
|
239
247
|
// Input guardrails — reject bad prompts before they reach the agent
|
|
240
248
|
input: [
|
|
241
|
-
{ check:
|
|
242
|
-
{ check:
|
|
243
|
-
{ check:
|
|
249
|
+
{ check: 'no_prompt_injection', action: 'reject' },
|
|
250
|
+
{ check: 'within_scope', action: 'reject' }, // Off-topic requests
|
|
251
|
+
{ check: 'pii_detection', action: 'redact' }, // Redact before processing
|
|
244
252
|
],
|
|
245
253
|
|
|
246
254
|
// Output guardrails — validate before returning
|
|
247
255
|
output: [
|
|
248
|
-
{ check:
|
|
249
|
-
{ check:
|
|
250
|
-
{ check:
|
|
256
|
+
{ check: 'no_hallucinated_citations', action: 'flag' },
|
|
257
|
+
{ check: 'schema_valid', action: 'retry_once' },
|
|
258
|
+
{ check: 'no_pii_leaked', action: 'reject' },
|
|
251
259
|
],
|
|
252
260
|
|
|
253
261
|
// Resource guardrails — prevent runaway cost/loops
|
|
254
262
|
resource: [
|
|
255
|
-
{ check:
|
|
256
|
-
{ check:
|
|
257
|
-
{ check:
|
|
263
|
+
{ check: 'max_tokens_per_session', limit: 100_000 },
|
|
264
|
+
{ check: 'max_tool_calls_per_session', limit: 50 },
|
|
265
|
+
{ check: 'max_cost_per_session_usd', limit: 1.0 },
|
|
258
266
|
],
|
|
259
267
|
};
|
|
260
268
|
```
|
|
@@ -19,6 +19,7 @@ skills:
|
|
|
19
19
|
## Mandatory Pre-Flight Context Inspection
|
|
20
20
|
|
|
21
21
|
Before designing autonomous agent loops:
|
|
22
|
+
|
|
22
23
|
1. Tool Contract Validation → Enforce strict JSON Schema / Zod validation for every tool call
|
|
23
24
|
2. Hard Execution Limit → Enforce a maximum iteration cap (max 10 turns) to prevent infinite loops
|
|
24
25
|
3. Human-in-the-Loop Gate → Require human approval for destructive operations (file deletion, production deploy, DB writes)
|
|
@@ -44,9 +45,12 @@ export async function runAgentLoop(task: string, maxTurns = 10) {
|
|
|
44
45
|
turn++;
|
|
45
46
|
const response = await callLLM(history);
|
|
46
47
|
const parsed = ToolCallSchema.safeParse(response);
|
|
47
|
-
|
|
48
|
+
|
|
48
49
|
if (!parsed.success) {
|
|
49
|
-
history.push({
|
|
50
|
+
history.push({
|
|
51
|
+
role: 'system',
|
|
52
|
+
content: `Invalid tool call payload: ${parsed.error.message}`,
|
|
53
|
+
});
|
|
50
54
|
continue;
|
|
51
55
|
}
|
|
52
56
|
|
|
@@ -19,6 +19,7 @@ skills:
|
|
|
19
19
|
## Mandatory Pre-Flight Context Inspection
|
|
20
20
|
|
|
21
21
|
Before deploying AI features:
|
|
22
|
+
|
|
22
23
|
1. Indirect Prompt Injection Defense → Sanitize third-party content (scraped URLs, PDF imports, RAG docs) before feeding to LLMs
|
|
23
24
|
2. XML Delimiter Sandboxing → Enclose user/external inputs inside `<external_context>` and instruct model to ignore instructions within
|
|
24
25
|
3. Insecure Output Handling (OWASP LLM02) → Escape HTML/script tags on all rendered model outputs
|
|
@@ -28,13 +29,13 @@ Before deploying AI features:
|
|
|
28
29
|
```typescript
|
|
29
30
|
export function sanitizeRAGDocument(rawDocumentContent: string): string {
|
|
30
31
|
if (!rawDocumentContent || typeof rawDocumentContent !== 'string') return '';
|
|
31
|
-
|
|
32
|
+
|
|
32
33
|
// 1. Redact indirect prompt injection trigger phrases
|
|
33
34
|
let cleaned = rawDocumentContent.replace(
|
|
34
35
|
/(?:system:\s*ignore|override system prompt|you are now in developer mode|print system prompt)/gi,
|
|
35
|
-
'[REDACTED_INDIRECT_INJECTION]'
|
|
36
|
+
'[REDACTED_INDIRECT_INJECTION]',
|
|
36
37
|
);
|
|
37
|
-
|
|
38
|
+
|
|
38
39
|
// 2. Escape structural tag injection attempts
|
|
39
40
|
cleaned = cleaned.replace(/<\/?(?:system|user_input|external_context)[^>]*>/gi, '');
|
|
40
41
|
|
|
@@ -45,12 +46,12 @@ export function sanitizeRAGDocument(rawDocumentContent: string): string {
|
|
|
45
46
|
|
|
46
47
|
## OWASP LLM Top 10 (2026 Matrix)
|
|
47
48
|
|
|
48
|
-
| Risk ID
|
|
49
|
-
|
|
49
|
+
| Risk ID | Vulnerability | Defense Implementation |
|
|
50
|
+
| --------- | ------------------------------------ | --------------------------------------------------- |
|
|
50
51
|
| **LLM01** | Prompt Injection (Direct & Indirect) | Delimiter sandboxing + `sanitizeRAGDocument` filter |
|
|
51
|
-
| **LLM02** | Insecure Output Handling
|
|
52
|
-
| **LLM04** | Model Denial of Service
|
|
53
|
-
| **LLM07** | System Prompt Leakage
|
|
52
|
+
| **LLM02** | Insecure Output Handling | Strict Zod output parsing + DOMPurify on frontend |
|
|
53
|
+
| **LLM04** | Model Denial of Service | Hard `max_tokens` limit + IP bucket rate limiting |
|
|
54
|
+
| **LLM07** | System Prompt Leakage | System prompt redaction guards in output stream |
|
|
54
55
|
|
|
55
56
|
## 🛑 Verification-Before-Completion (VBC) Protocol
|
|
56
57
|
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before engineering LLM prompts or processing untrusted user input, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Message Role Isolation (Section 15) → Place user input exclusively in `role: "user"` messages; never concatenate user input into `role: "system"`
|
|
24
25
|
2. Delimiter Sandboxing (Section 49) → Frame untrusted input inside XML tags (`<user_input>`) or randomized nonces (`<data_a8b4f1c9>`)
|
|
25
26
|
3. Human-in-the-Loop Gate (Section 119) → Require explicit human approval before executing state-changing tool operations (`delete_user`, `process_payment`)
|
|
@@ -74,9 +75,9 @@ ${userInput}
|
|
|
74
75
|
If an attacker guesses your delimiter (`</user_input> Ignore that.`), they can escape the sandbox. Generating random delimit tokens prevents this.
|
|
75
76
|
|
|
76
77
|
```typescript
|
|
77
|
-
import crypto from
|
|
78
|
+
import crypto from 'crypto';
|
|
78
79
|
|
|
79
|
-
const nonce = crypto.randomBytes(8).toString(
|
|
80
|
+
const nonce = crypto.randomBytes(8).toString('hex'); // e.g., "a8b4f1c9"
|
|
80
81
|
const startTag = `<data_${nonce}>`;
|
|
81
82
|
const endTag = `</data_${nonce}>`;
|
|
82
83
|
|
|
@@ -106,12 +107,12 @@ ${userInput}
|
|
|
106
107
|
</text>`;
|
|
107
108
|
|
|
108
109
|
const response = await scanWithFastModel(checkPrompt);
|
|
109
|
-
return response.trim().includes(
|
|
110
|
+
return response.trim().includes('MALICIOUS');
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
// Flow:
|
|
113
114
|
if (await detectInjection(req.body.text)) {
|
|
114
|
-
return res.status(400).json({ error:
|
|
115
|
+
return res.status(400).json({ error: 'Input violates security policy.' });
|
|
115
116
|
}
|
|
116
117
|
// Proceed to main agent
|
|
117
118
|
```
|
|
@@ -136,8 +137,8 @@ If the LLM has tools (Function Calling):
|
|
|
136
137
|
```typescript
|
|
137
138
|
// ❌ VULNERABLE TOOL DEFINITION
|
|
138
139
|
const deleteUserTool = {
|
|
139
|
-
name:
|
|
140
|
-
description:
|
|
140
|
+
name: 'delete_user',
|
|
141
|
+
description: 'Deletes a user account from the DB',
|
|
141
142
|
}; // An injected prompt can trigger this autonomously
|
|
142
143
|
|
|
143
144
|
// ✅ PREVENTATIVE ARCHITECTURE
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before implementing scroll-driven animations, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Target browser support → Prefer pure CSS `animation-timeline: view()` / `scroll()` when possible
|
|
24
25
|
2. Pinning & Scrubbing rules (Section 45) → Use `scrub: 1` in GSAP ScrollTrigger timelines for smooth inertia
|
|
25
26
|
3. Anti-Scrolljacking rule (Section 88) → Never hijack native scroll wheel momentum or override browser scrolling velocity
|
|
@@ -31,6 +32,7 @@ Architect performant scroll-linked motion and scrollytelling sequences that feel
|
|
|
31
32
|
## 3 Scroll-Driven Architecture Patterns
|
|
32
33
|
|
|
33
34
|
### 1. Modern Pure CSS `view-timeline` (No JavaScript Required)
|
|
35
|
+
|
|
34
36
|
```css
|
|
35
37
|
@keyframes reveal-on-scroll {
|
|
36
38
|
from {
|
|
@@ -51,30 +53,37 @@ Architect performant scroll-linked motion and scrollytelling sequences that feel
|
|
|
51
53
|
```
|
|
52
54
|
|
|
53
55
|
### 2. Sticky Canvas / Section Pinned Storytelling (GSAP ScrollTrigger)
|
|
56
|
+
|
|
54
57
|
```javascript
|
|
55
|
-
import { gsap } from
|
|
56
|
-
import { ScrollTrigger } from
|
|
58
|
+
import { gsap } from 'gsap';
|
|
59
|
+
import { ScrollTrigger } from 'gsap/ScrollTrigger';
|
|
57
60
|
|
|
58
61
|
gsap.registerPlugin(ScrollTrigger);
|
|
59
62
|
|
|
60
|
-
gsap
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
.
|
|
63
|
+
gsap
|
|
64
|
+
.timeline({
|
|
65
|
+
scrollTrigger: {
|
|
66
|
+
trigger: '.story-container',
|
|
67
|
+
start: 'top top',
|
|
68
|
+
end: '+=200%',
|
|
69
|
+
pin: true,
|
|
70
|
+
scrub: 1, // Smooth scrub delay
|
|
71
|
+
},
|
|
72
|
+
})
|
|
73
|
+
.to('.story-step-1', { opacity: 0, y: -20 })
|
|
74
|
+
.from('.story-step-2', { opacity: 0, y: 20 });
|
|
71
75
|
```
|
|
72
76
|
|
|
73
77
|
### 3. Scroll Progress Indicator Bar
|
|
78
|
+
|
|
74
79
|
```css
|
|
75
80
|
@keyframes grow-progress {
|
|
76
|
-
from {
|
|
77
|
-
|
|
81
|
+
from {
|
|
82
|
+
transform: scaleX(0);
|
|
83
|
+
}
|
|
84
|
+
to {
|
|
85
|
+
transform: scaleX(1);
|
|
86
|
+
}
|
|
78
87
|
}
|
|
79
88
|
|
|
80
89
|
.scroll-progress-bar {
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before defining animation tokens or styling transitions, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. `index.css` / `DESIGN.md` → Verify presence of centralized `--duration-*` and `--ease-*` CSS custom properties
|
|
24
25
|
2. Centralized Motion Tokens Schema (Section 26) → Enforce standardized duration tiers (80ms instant to 500ms delight)
|
|
25
26
|
3. Anti-Ad-Hoc Easing Rule (Section 48) → Strictly prohibit inline custom cubic-bezier curves; reference motion tokens instead
|
|
@@ -35,18 +36,18 @@ Define standardized design tokens for motion in global CSS or Tailwind config:
|
|
|
35
36
|
```css
|
|
36
37
|
:root {
|
|
37
38
|
/* Duration Scale */
|
|
38
|
-
--duration-instant:
|
|
39
|
-
--duration-fast:
|
|
40
|
-
--duration-normal:
|
|
41
|
-
--duration-slow:
|
|
42
|
-
--duration-delight: 500ms;
|
|
39
|
+
--duration-instant: 80ms; /* Micro feedback, toggle switches */
|
|
40
|
+
--duration-fast: 150ms; /* Tooltips, hover states, press feedback */
|
|
41
|
+
--duration-normal: 220ms; /* Dropdowns, menus, tab switching */
|
|
42
|
+
--duration-slow: 320ms; /* Modals, drawers, page reveals */
|
|
43
|
+
--duration-delight: 500ms; /* Milestone celebrations, toasts */
|
|
43
44
|
|
|
44
45
|
/* Standardized Easing Curves */
|
|
45
|
-
--ease-snappy:
|
|
46
|
-
--ease-out-ui:
|
|
47
|
-
--ease-in-ui:
|
|
48
|
-
--ease-spring:
|
|
49
|
-
--ease-in-out:
|
|
46
|
+
--ease-snappy: cubic-bezier(0.2, 0, 0, 1); /* Quick response for press/active */
|
|
47
|
+
--ease-out-ui: cubic-bezier(0.16, 1, 0.3, 1); /* Smooth entrance for popovers/modals */
|
|
48
|
+
--ease-in-ui: cubic-bezier(0.7, 0, 0.84, 0); /* Smooth exit for modals */
|
|
49
|
+
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* Subtle spring overshoot */
|
|
50
|
+
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); /* Morphing layout changes */
|
|
50
51
|
}
|
|
51
52
|
```
|
|
52
53
|
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before configuring JS/TS tooling or lint rules, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Pure ESM-First Requirement (Section 24) → Set `"type": "module"` in `package.json`; ban CommonJS `require()` or `module.exports`
|
|
24
25
|
2. ESLint Flat Config (`eslint.config.js`) (Section 28) → Use `@antfu/eslint-config` with flat config format; ban legacy `.eslintrc.json`
|
|
25
26
|
3. Explicit Type Imports (`import type`) (Section 45) → Enforce `import type` for type-only symbols to allow clean tree-shaking compilation
|
|
@@ -33,27 +34,31 @@ Enforce Anthony Fu's modern JavaScript/TypeScript engineering conventions: ESM-f
|
|
|
33
34
|
## 4 Core Tooling Conventions
|
|
34
35
|
|
|
35
36
|
### 1. ESM-First Standards
|
|
37
|
+
|
|
36
38
|
- Use pure ES Modules (`"type": "module"` in `package.json`).
|
|
37
39
|
- Avoid CommonJS `require()` or `module.exports`. Use explicit `.js` extension in relative imports when building Node ESM modules.
|
|
38
40
|
|
|
39
41
|
### 2. Single ESLint Flat Config (`eslint.config.js`)
|
|
42
|
+
|
|
40
43
|
- Use `@antfu/eslint-config` for unified linting across TypeScript, Vue, React, JSON, and Markdown in 1 simple config file.
|
|
41
44
|
|
|
42
45
|
```javascript
|
|
43
46
|
// eslint.config.js
|
|
44
|
-
import antfu from '@antfu/eslint-config'
|
|
47
|
+
import antfu from '@antfu/eslint-config';
|
|
45
48
|
|
|
46
49
|
export default antfu({
|
|
47
50
|
typescript: true,
|
|
48
51
|
vue: true,
|
|
49
52
|
react: true,
|
|
50
|
-
})
|
|
53
|
+
});
|
|
51
54
|
```
|
|
52
55
|
|
|
53
56
|
### 3. PNPM Catalog & Workspace Monorepo
|
|
57
|
+
|
|
54
58
|
- Use `pnpm-workspace.yaml` with PNPM catalogs (`catalog:`) to lock unified dependency versions across monorepos.
|
|
55
59
|
|
|
56
60
|
### 4. Explicit Type Imports (`import type`)
|
|
61
|
+
|
|
57
62
|
- Enforce `import type { User } from './types'` to allow tree-shaking compilers (esbuild/tsdown) to strip type imports cleanly without runtime side effects.
|
|
58
63
|
|
|
59
64
|
---
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before designing or implementing API endpoints, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Authorization Header Token Passing (Section 17) → Pass JWTs in `Authorization: Bearer` headers; strictly ban tokens in URL query params
|
|
24
25
|
2. Cursor-Based Pagination (Section 19) → Use cursor pagination for datasets >10K rows to eliminate `OFFSET N` performance degradation
|
|
25
26
|
3. Idempotency Header for Mutations (Section 21) → Require `Idempotency-Key` headers for state-changing `POST` or `PATCH` retry operations
|
|
@@ -108,7 +109,7 @@ interface ApiError {
|
|
|
108
109
|
// GET /api/v1/posts?cursor=eyJpZCI6MTAwfQ&limit=20
|
|
109
110
|
const posts = await db.post.findMany({
|
|
110
111
|
where: { id: { lt: decodeCursor(req.query.cursor).id } },
|
|
111
|
-
orderBy: { id:
|
|
112
|
+
orderBy: { id: 'desc' },
|
|
112
113
|
take: limit + 1, // fetch one extra to determine hasMore
|
|
113
114
|
});
|
|
114
115
|
const hasMore = posts.length > limit;
|
|
@@ -126,15 +127,15 @@ return { data: posts, meta: { hasMore, nextCursor: encodeCursor(posts.at(-1)) }
|
|
|
126
127
|
|
|
127
128
|
```typescript
|
|
128
129
|
// POST /api/v1/payments with header: Idempotency-Key: <uuid>
|
|
129
|
-
app.post(
|
|
130
|
-
const key = req.headers[
|
|
131
|
-
if (!key) return res.status(400).json({ error:
|
|
130
|
+
app.post('/api/v1/payments', async (req, res) => {
|
|
131
|
+
const key = req.headers['idempotency-key'];
|
|
132
|
+
if (!key) return res.status(400).json({ error: 'Missing Idempotency-Key' });
|
|
132
133
|
|
|
133
134
|
const cached = await redis.get(`idempotency:${key}`);
|
|
134
135
|
if (cached) return res.status(200).json(JSON.parse(cached));
|
|
135
136
|
|
|
136
137
|
const result = await processPayment(req.body);
|
|
137
|
-
await redis.set(`idempotency:${key}`, JSON.stringify(result),
|
|
138
|
+
await redis.set(`idempotency:${key}`, JSON.stringify(result), 'EX', 86400);
|
|
138
139
|
return res.status(201).json(result);
|
|
139
140
|
});
|
|
140
141
|
// GET, PUT, DELETE → naturally idempotent (safe to retry without a key)
|
|
@@ -147,15 +148,18 @@ app.post("/api/v1/payments", async (req, res) => {
|
|
|
147
148
|
|
|
148
149
|
```typescript
|
|
149
150
|
// HMAC signature verification (always verify — never trust unsigned webhooks)
|
|
150
|
-
import { createHmac, timingSafeEqual } from
|
|
151
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
151
152
|
function verify(payload: string, signature: string, secret: string): boolean {
|
|
152
|
-
const expected = createHmac(
|
|
153
|
+
const expected = createHmac('sha256', secret).update(payload).digest('hex');
|
|
153
154
|
return timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
|
|
154
155
|
}
|
|
155
156
|
|
|
156
|
-
app.post(
|
|
157
|
-
if (
|
|
158
|
-
|
|
157
|
+
app.post('/webhooks', (req, res) => {
|
|
158
|
+
if (
|
|
159
|
+
!verify(JSON.stringify(req.body), req.headers['x-webhook-signature'] as string, WEBHOOK_SECRET)
|
|
160
|
+
)
|
|
161
|
+
return res.status(401).send('Invalid signature');
|
|
162
|
+
res.status(200).send('OK'); // respond immediately
|
|
159
163
|
processWebhookAsync(req.body); // process asynchronously
|
|
160
164
|
});
|
|
161
165
|
// Retry policy: 3 retries with exponential backoff (1s → 10s → 100s)
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before auditing or hardening API endpoints, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. IDOR Prevention (Section 17) → Perform explicit tenancy checks (`receipt.userId === req.user.id`) and prefer UUIDv4/CUID over sequential integer IDs
|
|
24
25
|
2. Mass Assignment Mitigations (Section 47) → Enforce strict Zod schemas (`.strict()`) to prevent parameter overposting into DB updates
|
|
25
26
|
3. Distributed Rate Limiting (Section 80) → Store rate limit state in Redis for multi-pod load balanced environments to prevent limit bypasses
|
|
@@ -34,19 +35,19 @@ IDOR occurs when an application provides direct access to objects based on user-
|
|
|
34
35
|
|
|
35
36
|
```typescript
|
|
36
37
|
// ❌ VULNERABLE: Trusting the requested ID blindly
|
|
37
|
-
app.get(
|
|
38
|
+
app.get('/api/receipts/:id', async (req, res) => {
|
|
38
39
|
const receipt = await db.receipts.findById(req.params.id);
|
|
39
40
|
res.json(receipt); // Attack: Increment ID to view others' receipts
|
|
40
41
|
});
|
|
41
42
|
|
|
42
43
|
// ✅ SAFE: Verifying ownership
|
|
43
|
-
app.get(
|
|
44
|
+
app.get('/api/receipts/:id', async (req, res) => {
|
|
44
45
|
const receipt = await db.receipts.findById(req.params.id);
|
|
45
46
|
if (!receipt) return res.status(404).send();
|
|
46
47
|
|
|
47
48
|
// Explicit tenancy check
|
|
48
|
-
if (receipt.userId !== req.user.id && req.user.role !==
|
|
49
|
-
return res.status(403).json({ error:
|
|
49
|
+
if (receipt.userId !== req.user.id && req.user.role !== 'admin') {
|
|
50
|
+
return res.status(403).json({ error: 'Access denied' });
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
res.json(receipt);
|
|
@@ -64,20 +65,20 @@ Occurs when web frameworks automatically bind HTTP request parameters to applica
|
|
|
64
65
|
|
|
65
66
|
```typescript
|
|
66
67
|
// ❌ VULNERABLE: Direct object binding
|
|
67
|
-
app.put(
|
|
68
|
+
app.put('/api/users/:id', async (req, res) => {
|
|
68
69
|
// Attack: req.body = { name: "Bob", role: "admin", isPaid: true }
|
|
69
70
|
await db.users.update({ id: req.params.id }, req.body);
|
|
70
|
-
res.send(
|
|
71
|
+
res.send('Updated');
|
|
71
72
|
});
|
|
72
73
|
|
|
73
74
|
// ✅ SAFE: Explicit property selection (DTOs)
|
|
74
|
-
app.put(
|
|
75
|
+
app.put('/api/users/:id', async (req, res) => {
|
|
75
76
|
// Only extract explicitly allowed fields
|
|
76
77
|
const { name, email, bio } = req.body;
|
|
77
78
|
const safeData = { name, email, bio };
|
|
78
79
|
|
|
79
80
|
await db.users.update({ id: req.params.id }, safeData);
|
|
80
|
-
res.send(
|
|
81
|
+
res.send('Updated');
|
|
81
82
|
});
|
|
82
83
|
|
|
83
84
|
// ✅ BEST: Validation libraries (Zod, Joi) handling stripping
|
|
@@ -95,8 +96,8 @@ const UpdateUserSchema = z
|
|
|
95
96
|
|
|
96
97
|
```typescript
|
|
97
98
|
// Basic Rate Limiting (Express)
|
|
98
|
-
import rateLimit from
|
|
99
|
-
import RedisStore from
|
|
99
|
+
import rateLimit from 'express-rate-limit';
|
|
100
|
+
import RedisStore from 'rate-limit-redis';
|
|
100
101
|
|
|
101
102
|
// Global baseline limit
|
|
102
103
|
export const globalLimiter = rateLimit({
|
|
@@ -111,7 +112,7 @@ export const authLimiter = rateLimit({
|
|
|
111
112
|
store: new RedisStore({ client: redisClient }),
|
|
112
113
|
windowMs: 60 * 60 * 1000, // 1 Hour
|
|
113
114
|
max: 5, // 5 login attempts per IP per hour
|
|
114
|
-
message:
|
|
115
|
+
message: 'Too many login attempts, please try again later',
|
|
115
116
|
});
|
|
116
117
|
|
|
117
118
|
// ❌ HALLUCINATION TRAP: In-memory rate limiting across multiple server pods
|
|
@@ -144,8 +145,8 @@ Best Practices for issuance and storage:
|
|
|
144
145
|
|
|
145
146
|
// 1. Query Depth Limiting (Prevent nested joins crushing the DB)
|
|
146
147
|
// User -> Posts -> Comments -> Author -> Posts -> Comments...
|
|
147
|
-
import depthLimit from
|
|
148
|
-
app.use(
|
|
148
|
+
import depthLimit from 'graphql-depth-limit';
|
|
149
|
+
app.use('/graphql', graphqlHTTP({ validationRules: [depthLimit(5)] }));
|
|
149
150
|
|
|
150
151
|
// 2. Query Cost Analysis
|
|
151
152
|
// Prevent attackers from requesting 100,000 items in a single query
|
|
@@ -155,7 +156,7 @@ app.use("/graphql", graphqlHTTP({ validationRules: [depthLimit(5)] }));
|
|
|
155
156
|
// Introspection allows attackers to download your entire schema.
|
|
156
157
|
const server = new ApolloServer({
|
|
157
158
|
schema,
|
|
158
|
-
introspection: process.env.NODE_ENV !==
|
|
159
|
+
introspection: process.env.NODE_ENV !== 'production',
|
|
159
160
|
});
|
|
160
161
|
```
|
|
161
162
|
|
|
@@ -20,6 +20,7 @@ scripts-binding:
|
|
|
20
20
|
## Mandatory Pre-Flight Context Inspection
|
|
21
21
|
|
|
22
22
|
Before scaffolding or orchestrating application builds, you MUST inspect:
|
|
23
|
+
|
|
23
24
|
1. Clarification Gate (Section 48) → Ask 4 core purpose/constraint questions before selecting stack or creating files
|
|
24
25
|
2. Plan Verification (Section 220) → Ensure `{task-slug}.md` is created and verified in project root before invoking specialist agents
|
|
25
26
|
3. Incremental Build Rule (Section 15) → Never generate entire applications in one shot; build and verify module by module
|
|
@@ -93,11 +93,11 @@ project-name/
|
|
|
93
93
|
Ensure `src/app/globals.css` uses the new import syntax instead of a config file:
|
|
94
94
|
|
|
95
95
|
```css
|
|
96
|
-
@import
|
|
96
|
+
@import 'tailwindcss';
|
|
97
97
|
|
|
98
98
|
@theme {
|
|
99
99
|
--color-primary: oklch(0.5 0.2 240);
|
|
100
|
-
--font-sans:
|
|
100
|
+
--font-sans: 'Inter', sans-serif;
|
|
101
101
|
}
|
|
102
102
|
```
|
|
103
103
|
|
|
@@ -52,10 +52,10 @@ Using `next.config.ts` instead of `.js` for better type safety.
|
|
|
52
52
|
|
|
53
53
|
```typescript
|
|
54
54
|
// next.config.ts
|
|
55
|
-
import type { NextConfig } from
|
|
55
|
+
import type { NextConfig } from 'next';
|
|
56
56
|
|
|
57
57
|
const nextConfig: NextConfig = {
|
|
58
|
-
output:
|
|
58
|
+
output: 'export', // Required for Static Hosting (S3, GitHub Pages)
|
|
59
59
|
images: {
|
|
60
60
|
unoptimized: true, // Required if not using Node.js server image optimization
|
|
61
61
|
},
|
|
@@ -74,19 +74,19 @@ Deprecated next-seo. Configure directly in layout.tsx or page.tsx.
|
|
|
74
74
|
|
|
75
75
|
```typescript
|
|
76
76
|
// src/app/layout.tsx
|
|
77
|
-
import type { Metadata } from
|
|
77
|
+
import type { Metadata } from 'next';
|
|
78
78
|
|
|
79
79
|
export const metadata: Metadata = {
|
|
80
80
|
title: {
|
|
81
|
-
template:
|
|
82
|
-
default:
|
|
81
|
+
template: '%s | Product Name',
|
|
82
|
+
default: 'Home - Product Name',
|
|
83
83
|
},
|
|
84
|
-
description:
|
|
84
|
+
description: 'SEO optimized description for the landing page.',
|
|
85
85
|
openGraph: {
|
|
86
|
-
type:
|
|
87
|
-
locale:
|
|
88
|
-
url:
|
|
89
|
-
siteName:
|
|
86
|
+
type: 'website',
|
|
87
|
+
locale: 'en_US',
|
|
88
|
+
url: 'https://mysite.com',
|
|
89
|
+
siteName: 'My Brand',
|
|
90
90
|
},
|
|
91
91
|
};
|
|
92
92
|
```
|
|
@@ -138,11 +138,11 @@ export const metadata: Metadata = {
|
|
|
138
138
|
3. Configure Tailwind v4 (in `src/app/globals.css`):
|
|
139
139
|
|
|
140
140
|
```css
|
|
141
|
-
@import
|
|
141
|
+
@import 'tailwindcss';
|
|
142
142
|
|
|
143
143
|
@theme {
|
|
144
144
|
--color-primary: #3b82f6;
|
|
145
|
-
--font-sans:
|
|
145
|
+
--font-sans: 'Inter', sans-serif;
|
|
146
146
|
}
|
|
147
147
|
```
|
|
148
148
|
|