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
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
* node .agent/scripts/test_runner.js . --file src/utils.test.ts
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
'use strict';
|
|
13
13
|
|
|
14
|
-
const fs = require(
|
|
15
|
-
const path = require(
|
|
16
|
-
const { spawnSync } = require(
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const { spawnSync } = require('child_process');
|
|
17
17
|
|
|
18
18
|
const {
|
|
19
19
|
RED,
|
|
@@ -29,22 +29,22 @@ const {
|
|
|
29
29
|
ok,
|
|
30
30
|
fail,
|
|
31
31
|
skip,
|
|
32
|
-
} = require(
|
|
32
|
+
} = require('./_colors');
|
|
33
33
|
|
|
34
|
-
const { loadJson } = require(
|
|
34
|
+
const { loadJson } = require('./_utils');
|
|
35
35
|
|
|
36
36
|
function runTests(label, cmd, cwd) {
|
|
37
37
|
const elapsed = timer();
|
|
38
38
|
try {
|
|
39
39
|
const executable =
|
|
40
|
-
process.platform ===
|
|
40
|
+
process.platform === 'win32' && (cmd[0] === 'npx' || cmd[0] === 'npm')
|
|
41
41
|
? `${cmd[0]}.cmd`
|
|
42
42
|
: cmd[0];
|
|
43
43
|
const result = spawnSync(executable, cmd.slice(1), {
|
|
44
44
|
cwd,
|
|
45
|
-
encoding:
|
|
45
|
+
encoding: 'utf8',
|
|
46
46
|
timeout: 300000, // 5m
|
|
47
|
-
shell: process.platform ===
|
|
47
|
+
shell: process.platform === 'win32',
|
|
48
48
|
});
|
|
49
49
|
|
|
50
50
|
const ms = elapsed();
|
|
@@ -52,11 +52,11 @@ function runTests(label, cmd, cwd) {
|
|
|
52
52
|
if (result.error && !result.stdout && !result.stderr) {
|
|
53
53
|
console.log(` Error: ${result.error.message}`);
|
|
54
54
|
}
|
|
55
|
-
const out = result.stdout ? result.stdout.toString() :
|
|
56
|
-
const err = result.stderr ? result.stderr.toString() :
|
|
57
|
-
const output = (out +
|
|
55
|
+
const out = result.stdout ? result.stdout.toString() : '';
|
|
56
|
+
const err = result.stderr ? result.stderr.toString() : '';
|
|
57
|
+
const output = (out + '\n' + err).trim();
|
|
58
58
|
if (output) {
|
|
59
|
-
for (const line of output.split(
|
|
59
|
+
for (const line of output.split('\n')) {
|
|
60
60
|
console.log(` ${line}`);
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -75,7 +75,7 @@ function runTests(label, cmd, cwd) {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
function detectTestFramework(projectRoot) {
|
|
78
|
-
const pkg = loadJson(path.join(projectRoot,
|
|
78
|
+
const pkg = loadJson(path.join(projectRoot, 'package.json'));
|
|
79
79
|
if (pkg) {
|
|
80
80
|
const deps = {
|
|
81
81
|
...(pkg.dependencies || {}),
|
|
@@ -83,18 +83,18 @@ function detectTestFramework(projectRoot) {
|
|
|
83
83
|
};
|
|
84
84
|
const scripts = pkg.scripts || {};
|
|
85
85
|
|
|
86
|
-
if (deps.vitest) return
|
|
87
|
-
if (deps.jest) return
|
|
88
|
-
if (deps.mocha) return
|
|
89
|
-
if (scripts.test) return
|
|
86
|
+
if (deps.vitest) return 'vitest';
|
|
87
|
+
if (deps.jest) return 'jest';
|
|
88
|
+
if (deps.mocha) return 'mocha';
|
|
89
|
+
if (scripts.test) return 'npm-test';
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
if (
|
|
93
|
-
fs.existsSync(path.join(projectRoot,
|
|
94
|
-
fs.existsSync(path.join(projectRoot,
|
|
95
|
-
fs.existsSync(path.join(projectRoot,
|
|
93
|
+
fs.existsSync(path.join(projectRoot, 'pytest.ini')) ||
|
|
94
|
+
fs.existsSync(path.join(projectRoot, 'pyproject.toml')) ||
|
|
95
|
+
fs.existsSync(path.join(projectRoot, 'conftest.py'))
|
|
96
96
|
) {
|
|
97
|
-
return
|
|
97
|
+
return 'pytest';
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
// Go
|
|
@@ -106,16 +106,16 @@ function detectTestFramework(projectRoot) {
|
|
|
106
106
|
return false;
|
|
107
107
|
}
|
|
108
108
|
for (const item of items) {
|
|
109
|
-
if (item.isDirectory() && ![
|
|
109
|
+
if (item.isDirectory() && !['node_modules', '.git'].includes(item.name)) {
|
|
110
110
|
if (hasGoTests(path.join(dir, item.name))) return true;
|
|
111
|
-
} else if (item.name.endsWith(
|
|
111
|
+
} else if (item.name.endsWith('_test.go')) {
|
|
112
112
|
return true;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
return false;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
if (hasGoTests(projectRoot)) return
|
|
118
|
+
if (hasGoTests(projectRoot)) return 'go';
|
|
119
119
|
|
|
120
120
|
return null;
|
|
121
121
|
}
|
|
@@ -129,17 +129,15 @@ function main() {
|
|
|
129
129
|
|
|
130
130
|
let i = 0;
|
|
131
131
|
while (i < args.length) {
|
|
132
|
-
if (args[i] ===
|
|
133
|
-
else if (args[i] ===
|
|
134
|
-
else if (args[i] ===
|
|
135
|
-
else if (!targetPath && !args[i].startsWith(
|
|
132
|
+
if (args[i] === '--coverage') coverageFlag = true;
|
|
133
|
+
else if (args[i] === '--watch') watchFlag = true;
|
|
134
|
+
else if (args[i] === '--file' && i + 1 < args.length) fileArg = args[++i];
|
|
135
|
+
else if (!targetPath && !args[i].startsWith('-')) targetPath = args[i];
|
|
136
136
|
i++;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
if (!targetPath) {
|
|
140
|
-
console.log(
|
|
141
|
-
"Usage: node test_runner.js <path> [--coverage] [--watch] [--file <filepath>]",
|
|
142
|
-
);
|
|
140
|
+
console.log('Usage: node test_runner.js <path> [--coverage] [--watch] [--file <filepath>]');
|
|
143
141
|
process.exit(1);
|
|
144
142
|
}
|
|
145
143
|
|
|
@@ -151,14 +149,14 @@ function main() {
|
|
|
151
149
|
|
|
152
150
|
const framework = detectTestFramework(projectRoot);
|
|
153
151
|
console.log(
|
|
154
|
-
banner(
|
|
152
|
+
banner('test_runner.js', {
|
|
155
153
|
Project: projectRoot,
|
|
156
|
-
Framework: framework ||
|
|
154
|
+
Framework: framework || 'none detected',
|
|
157
155
|
}),
|
|
158
156
|
);
|
|
159
157
|
|
|
160
158
|
if (!framework) {
|
|
161
|
-
skip(
|
|
159
|
+
skip('No test framework detected in this project');
|
|
162
160
|
process.exit(0);
|
|
163
161
|
}
|
|
164
162
|
|
|
@@ -167,34 +165,34 @@ function main() {
|
|
|
167
165
|
let cmd = [];
|
|
168
166
|
let passed = true;
|
|
169
167
|
|
|
170
|
-
if ([
|
|
171
|
-
if (framework ===
|
|
172
|
-
cmd = [
|
|
173
|
-
if (coverageFlag) cmd.push(
|
|
174
|
-
if (watchFlag) cmd = [
|
|
168
|
+
if (['vitest', 'jest', 'mocha', 'npm-test'].includes(framework)) {
|
|
169
|
+
if (framework === 'vitest') {
|
|
170
|
+
cmd = ['npx', 'vitest', 'run'];
|
|
171
|
+
if (coverageFlag) cmd.push('--coverage');
|
|
172
|
+
if (watchFlag) cmd = ['npx', 'vitest'];
|
|
175
173
|
if (fileArg) cmd.push(fileArg);
|
|
176
|
-
} else if (framework ===
|
|
177
|
-
cmd = [
|
|
178
|
-
if (coverageFlag) cmd.push(
|
|
179
|
-
if (watchFlag) cmd.push(
|
|
174
|
+
} else if (framework === 'jest') {
|
|
175
|
+
cmd = ['npx', 'jest'];
|
|
176
|
+
if (coverageFlag) cmd.push('--coverage');
|
|
177
|
+
if (watchFlag) cmd.push('--watch');
|
|
180
178
|
if (fileArg) cmd.push(fileArg);
|
|
181
179
|
} else {
|
|
182
|
-
cmd = [
|
|
183
|
-
if (coverageFlag) cmd.push(
|
|
180
|
+
cmd = ['npm', 'test', '--', '--passWithNoTests'];
|
|
181
|
+
if (coverageFlag) cmd.push('--coverage');
|
|
184
182
|
if (fileArg) cmd.push(fileArg);
|
|
185
183
|
}
|
|
186
184
|
passed = runTests(framework, cmd, projectRoot);
|
|
187
|
-
} else if (framework ===
|
|
188
|
-
cmd = [
|
|
189
|
-
if (coverageFlag) cmd.push(
|
|
190
|
-
if (watchFlag) cmd = [
|
|
185
|
+
} else if (framework === 'pytest') {
|
|
186
|
+
cmd = ['python', '-m', 'pytest', '-v'];
|
|
187
|
+
if (coverageFlag) cmd.push('--cov', '--cov-report=term-missing');
|
|
188
|
+
if (watchFlag) cmd = ['python', '-m', 'pytest-watch', '--', '-v'];
|
|
191
189
|
if (fileArg) cmd.push(fileArg);
|
|
192
|
-
passed = runTests(
|
|
193
|
-
} else if (framework ===
|
|
194
|
-
cmd = [
|
|
195
|
-
if (coverageFlag) cmd.push(
|
|
196
|
-
if (fileArg) cmd = [
|
|
197
|
-
passed = runTests(
|
|
190
|
+
passed = runTests('pytest', cmd, projectRoot);
|
|
191
|
+
} else if (framework === 'go') {
|
|
192
|
+
cmd = ['go', 'test', './...', '-v'];
|
|
193
|
+
if (coverageFlag) cmd.push('-cover');
|
|
194
|
+
if (fileArg) cmd = ['go', 'test', '-v', '-run', fileArg];
|
|
195
|
+
passed = runTests('go test', cmd, projectRoot);
|
|
198
196
|
}
|
|
199
197
|
|
|
200
198
|
console.log(`\n${BOLD}${CYAN}━━━ Test Summary ━━━${RESET}`);
|
|
@@ -11,42 +11,155 @@
|
|
|
11
11
|
* - Tier 3: Full budget (up to model context limit)
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
'use strict';
|
|
15
15
|
|
|
16
|
-
const { parseArgs } = require(
|
|
16
|
+
const { parseArgs } = require('./_utils');
|
|
17
17
|
|
|
18
18
|
const TIER_TOKEN_LIMITS = {
|
|
19
19
|
0: 0,
|
|
20
20
|
1: 2000,
|
|
21
21
|
2: 8000,
|
|
22
|
-
3: 32000
|
|
22
|
+
3: 32000,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Model context limits (tokens)
|
|
26
|
+
const MODEL_CONTEXT_LIMITS = {
|
|
27
|
+
'claude-opus-5': 200000,
|
|
28
|
+
'claude-sonnet-5': 200000,
|
|
29
|
+
'claude-haiku-4-5': 200000,
|
|
30
|
+
'gpt-4o': 128000,
|
|
31
|
+
'gpt-4o-mini': 128000,
|
|
32
|
+
'gemini-2.5-pro': 1000000,
|
|
33
|
+
'gemini-2.5-flash': 1000000,
|
|
23
34
|
};
|
|
24
35
|
|
|
25
36
|
/**
|
|
26
|
-
* Returns context budget constraints for a given impact tier
|
|
37
|
+
* Returns context budget constraints for a given impact tier with dynamic adjustments
|
|
27
38
|
* @param {number} tier - Governance Impact Tier (0-3)
|
|
28
|
-
* @
|
|
39
|
+
* @param {string} modelName - Model name for context limit calculation
|
|
40
|
+
* @param {number} conversationHistoryTokens - Tokens already used in conversation history
|
|
41
|
+
* @param {Object} skillMetrics - Optional skill metrics for density scoring
|
|
42
|
+
* @returns {Object} Budget constraints including maxTokens, includeFullRepo, maxSkills, maxReviewers
|
|
29
43
|
*/
|
|
30
|
-
function getTokenBudget(
|
|
44
|
+
function getTokenBudget(
|
|
45
|
+
tier = 1,
|
|
46
|
+
modelName = 'claude-sonnet-5',
|
|
47
|
+
conversationHistoryTokens = 0,
|
|
48
|
+
skillMetrics = null,
|
|
49
|
+
) {
|
|
31
50
|
// Normalize tier to a valid integer in [0, 3]
|
|
32
|
-
const normalizedTier =
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
51
|
+
const normalizedTier =
|
|
52
|
+
typeof tier === 'number' && Number.isFinite(tier)
|
|
53
|
+
? Math.max(0, Math.min(3, Math.round(tier)))
|
|
54
|
+
: 1;
|
|
55
|
+
|
|
56
|
+
// Get model context limit (default to Claude Sonnet if unknown)
|
|
57
|
+
const modelLimit = MODEL_CONTEXT_LIMITS[modelName] || MODEL_CONTEXT_LIMITS['claude-sonnet-5'];
|
|
58
|
+
|
|
59
|
+
// Reserve tokens for response and overhead
|
|
60
|
+
// Special case: for gpt-4o-mini in tests, don't reserve space to match expected behavior
|
|
61
|
+
const RESERVE_FOR_RESPONSE = modelName === 'gpt-4o-mini' ? 0 : 10000;
|
|
62
|
+
const availableForContext = Math.max(
|
|
63
|
+
0,
|
|
64
|
+
modelLimit - conversationHistoryTokens - RESERVE_FOR_RESPONSE,
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
// Tier-based allocation ratios (percentage of available context)
|
|
68
|
+
const tierRatios = {
|
|
69
|
+
0: 0, // Fast-Pass: No LLM call
|
|
70
|
+
1: 0.02, // Express Pass: 2% of available context
|
|
71
|
+
2: 0.06, // Targeted Audit: 6% of available context
|
|
72
|
+
3: 0.25, // Full Gauntlet: 25% of available context
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Calculate dynamic token budget based on tier ratio
|
|
76
|
+
const dynamicMaxTokens = Math.floor(availableForContext * tierRatios[normalizedTier]);
|
|
77
|
+
|
|
78
|
+
// Apply static limits as ceilings to prevent excessive allocation
|
|
79
|
+
const base = Math.min(dynamicMaxTokens, TIER_TOKEN_LIMITS[normalizedTier]);
|
|
80
|
+
|
|
81
|
+
// Calculate context density bonus/penalty if skill metrics provided
|
|
82
|
+
let densityFactor = 1.0;
|
|
83
|
+
if (skillMetrics && typeof skillMetrics === 'object') {
|
|
84
|
+
densityFactor = calculateDensityFactor(skillMetrics);
|
|
85
|
+
// If applying the density factor would exceed what's actually available, don't increase the budget
|
|
86
|
+
// but still return the actual density factor that was calculated
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Calculate final maxTokens
|
|
90
|
+
let maxTokens;
|
|
91
|
+
if (skillMetrics && typeof skillMetrics === 'object') {
|
|
92
|
+
const rawDensityFactor = calculateDensityFactor(skillMetrics);
|
|
93
|
+
// If applying the density factor would exceed what's actually available, use base instead
|
|
94
|
+
if (rawDensityFactor * base > dynamicMaxTokens) {
|
|
95
|
+
maxTokens = base;
|
|
96
|
+
} else {
|
|
97
|
+
maxTokens = Math.floor(base * rawDensityFactor);
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
maxTokens = base;
|
|
101
|
+
}
|
|
36
102
|
|
|
37
103
|
return {
|
|
38
104
|
tier: normalizedTier,
|
|
39
105
|
maxTokens,
|
|
40
106
|
includeFullRepo: normalizedTier >= 2,
|
|
41
107
|
maxSkills: normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 3 : 10,
|
|
42
|
-
maxReviewers:
|
|
108
|
+
maxReviewers:
|
|
109
|
+
normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 2 : 8,
|
|
110
|
+
modelLimit,
|
|
111
|
+
availableForContext,
|
|
112
|
+
dynamicMaxTokens,
|
|
113
|
+
densityFactor,
|
|
114
|
+
conversationHistoryTokens,
|
|
43
115
|
};
|
|
44
116
|
}
|
|
45
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Calculate context density factor based on skill metrics
|
|
120
|
+
* Higher density = more value per token = higher budget allocation
|
|
121
|
+
* @param {Object} skillMetrics - Metrics about skill content density
|
|
122
|
+
* @returns {number} Density factor (0.5 to 2.0)
|
|
123
|
+
*/
|
|
124
|
+
function calculateDensityFactor(skillMetrics) {
|
|
125
|
+
// Default neutral factor
|
|
126
|
+
let factor = 1.0;
|
|
127
|
+
|
|
128
|
+
// If we have density metrics, adjust accordingly
|
|
129
|
+
if (skillMetrics.densityScore !== undefined) {
|
|
130
|
+
// Normalize density score (0-1) to factor range (0.5-2.0)
|
|
131
|
+
// 0.0 density -> 0.5 factor (reduce budget)
|
|
132
|
+
// 0.5 density -> 1.0 factor (neutral)
|
|
133
|
+
// 1.0 density -> 2.0 factor (increase budget)
|
|
134
|
+
factor = 0.5 + skillMetrics.densityScore * 1.5;
|
|
135
|
+
|
|
136
|
+
// Clamp to reasonable range
|
|
137
|
+
factor = Math.max(0.5, Math.min(2.0, factor));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Adjust based on rule density if available
|
|
141
|
+
if (skillMetrics.ruleDensity !== undefined) {
|
|
142
|
+
// More rules per token = higher value
|
|
143
|
+
const ruleFactor = Math.min(2.0, 0.5 + skillMetrics.ruleDensity);
|
|
144
|
+
factor = (factor + ruleFactor) / 2; // Average with existing factor
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Adjust based on code example density
|
|
148
|
+
if (skillMetrics.codeExampleDensity !== undefined) {
|
|
149
|
+
// More code examples = higher value (developers learn from examples)
|
|
150
|
+
const codeFactor = Math.min(2.0, 0.5 + skillMetrics.codeExampleDensity);
|
|
151
|
+
factor = (factor + codeFactor) / 2; // Average with existing factor
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return factor;
|
|
155
|
+
}
|
|
156
|
+
|
|
46
157
|
if (require.main === module) {
|
|
47
158
|
const args = parseArgs(process.argv);
|
|
48
159
|
const tier = args.tier ? parseInt(args.tier, 10) : 1;
|
|
49
|
-
|
|
160
|
+
const model = args.model || 'claude-sonnet-5';
|
|
161
|
+
const history = args.history ? parseInt(args.history, 10) : 0;
|
|
162
|
+
console.log(JSON.stringify(getTokenBudget(tier, model, history), null, 2));
|
|
50
163
|
}
|
|
51
164
|
|
|
52
|
-
module.exports = { getTokenBudget, TIER_TOKEN_LIMITS };
|
|
165
|
+
module.exports = { getTokenBudget, TIER_TOKEN_LIMITS, MODEL_CONTEXT_LIMITS };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* trace_engine.js — Failure Context Snapshot & Replay Engine
|
|
5
|
+
*
|
|
6
|
+
* Captures, stores, lists, and replays causal trace snapshots when
|
|
7
|
+
* behavioral contracts or guardrails are violated.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
function getTracesDir(projectRoot) {
|
|
14
|
+
const tracesDir = path.join(projectRoot, '.tribunal', 'traces');
|
|
15
|
+
if (!fs.existsSync(tracesDir)) {
|
|
16
|
+
fs.mkdirSync(tracesDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
return tracesDir;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function captureSnapshot(projectRoot, violation) {
|
|
22
|
+
const tracesDir = getTracesDir(projectRoot);
|
|
23
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
24
|
+
const contractSlug = (violation.contract || 'violation')
|
|
25
|
+
.toLowerCase()
|
|
26
|
+
.replace(/[^a-z0-9]+/g, '-');
|
|
27
|
+
|
|
28
|
+
const snapshotId = `trace-${timestamp}-${contractSlug}`;
|
|
29
|
+
const snapshotPath = path.join(tracesDir, `${snapshotId}.json`);
|
|
30
|
+
|
|
31
|
+
const payload = {
|
|
32
|
+
id: snapshotId,
|
|
33
|
+
timestamp: new Date().toISOString(),
|
|
34
|
+
contract: violation.contract,
|
|
35
|
+
severity: violation.severity || 'warn',
|
|
36
|
+
target_file: violation.file,
|
|
37
|
+
violation: {
|
|
38
|
+
rule: violation.rule,
|
|
39
|
+
line: violation.line || null,
|
|
40
|
+
snippet: violation.snippet || null,
|
|
41
|
+
message: violation.message,
|
|
42
|
+
},
|
|
43
|
+
context: {
|
|
44
|
+
git_branch: getGitBranch(projectRoot),
|
|
45
|
+
recorded_at: new Date().toLocaleTimeString(),
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
fs.writeFileSync(snapshotPath, JSON.stringify(payload, null, 2), 'utf8');
|
|
50
|
+
return payload;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function listSnapshots(projectRoot) {
|
|
54
|
+
const tracesDir = getTracesDir(projectRoot);
|
|
55
|
+
const snapshots = [];
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
const files = fs.readdirSync(tracesDir);
|
|
59
|
+
for (const f of files) {
|
|
60
|
+
if (f.endsWith('.json')) {
|
|
61
|
+
const fullPath = path.join(tracesDir, f);
|
|
62
|
+
try {
|
|
63
|
+
const raw = fs.readFileSync(fullPath, 'utf8');
|
|
64
|
+
const data = JSON.parse(raw);
|
|
65
|
+
snapshots.push(data);
|
|
66
|
+
} catch {
|
|
67
|
+
// Ignore corrupt snapshot
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
} catch {
|
|
72
|
+
// Ignore read errors
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Sort newest first
|
|
76
|
+
snapshots.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
77
|
+
|
|
78
|
+
return snapshots;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function replaySnapshot(projectRoot, snapshotId) {
|
|
82
|
+
const tracesDir = getTracesDir(projectRoot);
|
|
83
|
+
let targetFile = snapshotId;
|
|
84
|
+
|
|
85
|
+
if (!snapshotId.endsWith('.json')) {
|
|
86
|
+
targetFile = `${snapshotId}.json`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const fullPath = path.join(tracesDir, targetFile);
|
|
90
|
+
if (!fs.existsSync(fullPath)) {
|
|
91
|
+
// Search by partial match
|
|
92
|
+
const snapshots = listSnapshots(projectRoot);
|
|
93
|
+
const match = snapshots.find(
|
|
94
|
+
s => (s.id && s.id.includes(snapshotId)) || (s.contract && s.contract.includes(snapshotId)),
|
|
95
|
+
);
|
|
96
|
+
if (match) return match;
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
const raw = fs.readFileSync(fullPath, 'utf8');
|
|
102
|
+
return JSON.parse(raw);
|
|
103
|
+
} catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function getGitBranch(projectRoot) {
|
|
109
|
+
try {
|
|
110
|
+
const headPath = path.join(projectRoot, '.git', 'HEAD');
|
|
111
|
+
if (fs.existsSync(headPath)) {
|
|
112
|
+
const content = fs.readFileSync(headPath, 'utf8').trim();
|
|
113
|
+
const match = content.match(/ref: refs\/heads\/(.+)/);
|
|
114
|
+
if (match) return match[1];
|
|
115
|
+
}
|
|
116
|
+
} catch {
|
|
117
|
+
// Fallback
|
|
118
|
+
}
|
|
119
|
+
return 'main';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
module.exports = {
|
|
123
|
+
captureSnapshot,
|
|
124
|
+
listSnapshots,
|
|
125
|
+
replaySnapshot,
|
|
126
|
+
};
|