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
|
@@ -4,22 +4,28 @@
|
|
|
4
4
|
* Validate Orchestrator micro-worker payloads (legacy) and Swarm payloads.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const fs = require(
|
|
10
|
-
const path = require(
|
|
11
|
-
const { execSync } = require(
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const { execSync } = require('child_process');
|
|
12
|
+
const {
|
|
13
|
+
WorkerRequestSchema: _WorkerRequestSchema,
|
|
14
|
+
WorkerResultSchema: _WorkerResultSchema,
|
|
15
|
+
SwarmPayloadSchema,
|
|
16
|
+
validatePayloadOrThrow,
|
|
17
|
+
} = require('./payload_schemas');
|
|
12
18
|
|
|
13
19
|
// ─── ANSI TUI Renderer ────────────────────────────────────────────────────────
|
|
14
20
|
class SwarmDashboard {
|
|
15
21
|
constructor(workers) {
|
|
16
|
-
this.workers = workers.map(
|
|
17
|
-
name: w.target_agent || w.agent ||
|
|
18
|
-
task: (w.task_description || w.goal ||
|
|
19
|
-
status:
|
|
20
|
-
color:
|
|
22
|
+
this.workers = workers.map(w => ({
|
|
23
|
+
name: w.target_agent || w.agent || 'Worker',
|
|
24
|
+
task: (w.task_description || w.goal || '').slice(0, 40) + '...',
|
|
25
|
+
status: '⏳ Pending',
|
|
26
|
+
color: '\x1b[33m', // Yellow
|
|
21
27
|
}));
|
|
22
|
-
this.spinnerFrames = [
|
|
28
|
+
this.spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
23
29
|
this.frameIdx = 0;
|
|
24
30
|
this.linesRendered = 0;
|
|
25
31
|
this.timer = null;
|
|
@@ -30,21 +36,19 @@ class SwarmDashboard {
|
|
|
30
36
|
process.stdout.write(`\x1b[${this.linesRendered}A`);
|
|
31
37
|
}
|
|
32
38
|
|
|
33
|
-
let output =
|
|
34
|
-
"\n\x1b[1m\x1b[36m━━━ Tribunal Swarm Dispatcher ━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n\n";
|
|
39
|
+
let output = '\n\x1b[1m\x1b[36m━━━ Tribunal Swarm Dispatcher ━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n\n';
|
|
35
40
|
const frame = this.spinnerFrames[this.frameIdx];
|
|
36
41
|
|
|
37
|
-
this.workers.forEach(
|
|
38
|
-
const icon = w.status.includes(
|
|
42
|
+
this.workers.forEach(w => {
|
|
43
|
+
const icon = w.status.includes('Pending')
|
|
39
44
|
? `\x1b[36m${frame}\x1b[0m`
|
|
40
|
-
: w.status.includes(
|
|
41
|
-
?
|
|
42
|
-
:
|
|
45
|
+
: w.status.includes('Done')
|
|
46
|
+
? '\x1b[32m✔\x1b[0m'
|
|
47
|
+
: '\x1b[31m✖\x1b[0m';
|
|
43
48
|
output += ` ${icon} \x1b[1m${w.name.padEnd(25)}\x1b[0m \x1b[2m|\x1b[0m ${w.color}${w.status.padEnd(12)}\x1b[0m \x1b[2m|\x1b[0m \x1b[3m${w.task}\x1b[0m\n`;
|
|
44
49
|
});
|
|
45
50
|
|
|
46
|
-
output +=
|
|
47
|
-
"\n\x1b[1m\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n";
|
|
51
|
+
output += '\n\x1b[1m\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n';
|
|
48
52
|
|
|
49
53
|
process.stdout.write(output);
|
|
50
54
|
this.linesRendered = this.workers.length + 5;
|
|
@@ -71,34 +75,34 @@ class SwarmDashboard {
|
|
|
71
75
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
72
76
|
|
|
73
77
|
const VALID_WORKER_TYPES = new Set([
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
78
|
+
'research',
|
|
79
|
+
'generate_code',
|
|
80
|
+
'review_code',
|
|
81
|
+
'debug',
|
|
82
|
+
'plan',
|
|
83
|
+
'design_schema',
|
|
84
|
+
'write_docs',
|
|
85
|
+
'security_audit',
|
|
86
|
+
'optimize',
|
|
87
|
+
'test',
|
|
84
88
|
]);
|
|
85
89
|
|
|
86
|
-
const VALID_RESULT_STATUSES = new Set([
|
|
90
|
+
const VALID_RESULT_STATUSES = new Set(['success', 'failure', 'escalate']);
|
|
87
91
|
|
|
88
92
|
const MAX_GOAL_LENGTH = 200;
|
|
89
93
|
const MAX_CONTEXT_LENGTH = 800;
|
|
90
|
-
const
|
|
94
|
+
const _MAX_WORKERS_PER_SWARM = 10;
|
|
91
95
|
|
|
92
96
|
function getBinaryPath() {
|
|
93
|
-
if (process.env.TRIBUNAL_FORCE_JS ===
|
|
94
|
-
const isWindows = process.platform ===
|
|
95
|
-
const ext = isWindows ?
|
|
97
|
+
if (process.env.TRIBUNAL_FORCE_JS === '1') return null;
|
|
98
|
+
const isWindows = process.platform === 'win32';
|
|
99
|
+
const ext = isWindows ? '.exe' : '';
|
|
96
100
|
const candidates = [
|
|
97
101
|
process.env.TRIBUNAL_CORE_PATH,
|
|
98
|
-
path.resolve(__dirname,
|
|
99
|
-
path.resolve(__dirname,
|
|
100
|
-
path.resolve(process.cwd(),
|
|
101
|
-
path.resolve(process.cwd(),
|
|
102
|
+
path.resolve(__dirname, '..', '..', 'tribunal-kit', 'target', 'release', `tribunal-core${ext}`),
|
|
103
|
+
path.resolve(__dirname, '..', '..', 'target', 'release', `tribunal-core${ext}`),
|
|
104
|
+
path.resolve(process.cwd(), 'target', 'release', `tribunal-core${ext}`),
|
|
105
|
+
path.resolve(process.cwd(), 'tribunal-kit', 'target', 'release', `tribunal-core${ext}`),
|
|
102
106
|
];
|
|
103
107
|
for (const c of candidates) {
|
|
104
108
|
if (c && fs.existsSync(c)) return c;
|
|
@@ -110,9 +114,9 @@ function nativeValidate(file, schemaType) {
|
|
|
110
114
|
const bin = getBinaryPath();
|
|
111
115
|
if (!bin || !file || !fs.existsSync(file)) return null;
|
|
112
116
|
try {
|
|
113
|
-
const { spawnSync } = require(
|
|
114
|
-
const res = spawnSync(bin, [
|
|
115
|
-
encoding:
|
|
117
|
+
const { spawnSync } = require('child_process');
|
|
118
|
+
const res = spawnSync(bin, ['validate', '--file', file, '--schema', schemaType], {
|
|
119
|
+
encoding: 'utf-8',
|
|
116
120
|
});
|
|
117
121
|
if (res.status === 0) {
|
|
118
122
|
return true;
|
|
@@ -127,7 +131,7 @@ function findAgentDir(startPath) {
|
|
|
127
131
|
let current = path.resolve(startPath);
|
|
128
132
|
const root = path.parse(current).root;
|
|
129
133
|
while (current !== root) {
|
|
130
|
-
const agentDir = path.join(current,
|
|
134
|
+
const agentDir = path.join(current, '.agent');
|
|
131
135
|
if (fs.existsSync(agentDir) && fs.statSync(agentDir).isDirectory()) {
|
|
132
136
|
return agentDir;
|
|
133
137
|
}
|
|
@@ -136,20 +140,54 @@ function findAgentDir(startPath) {
|
|
|
136
140
|
return null;
|
|
137
141
|
}
|
|
138
142
|
|
|
143
|
+
// ─── Retry Policy Configuration ───────────────────────────────────────────────
|
|
144
|
+
const MAX_RETRIES = 3;
|
|
145
|
+
const RETRY_DELAYS = [1000, 3000, 10000]; // Exponential backoff: 1s, 3s, 10s
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Execute a function with 3-strike retry policy
|
|
149
|
+
* @param {Function} fn - Function to execute
|
|
150
|
+
* @param {Object} context - Context for error reporting
|
|
151
|
+
* @returns {Promise<any>} Result of the function or throws error after max retries
|
|
152
|
+
*/
|
|
153
|
+
async function executeWithRetry(fn, _context = {}) {
|
|
154
|
+
let lastError;
|
|
155
|
+
|
|
156
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
157
|
+
try {
|
|
158
|
+
return await fn();
|
|
159
|
+
} catch (error) {
|
|
160
|
+
lastError = error;
|
|
161
|
+
|
|
162
|
+
// If this was the last attempt, don't delay
|
|
163
|
+
if (attempt === MAX_RETRIES) {
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Wait before retrying (exponential backoff)
|
|
168
|
+
const delay = RETRY_DELAYS[attempt - 1];
|
|
169
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// If we got here, all retries failed
|
|
174
|
+
throw new Error(
|
|
175
|
+
`Operation failed after ${MAX_RETRIES} attempts. Last error: ${lastError.message}`,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
139
179
|
// ─── Legacy mode: validate orchestrator micro-worker payloads ──────────────────
|
|
140
180
|
|
|
141
181
|
function validatePayload(payloadData, workspaceRoot, agentsDir, payloadFile = null) {
|
|
142
182
|
if (payloadFile) {
|
|
143
|
-
const nativeResult = nativeValidate(payloadFile,
|
|
183
|
+
const nativeResult = nativeValidate(payloadFile, 'micro-worker');
|
|
144
184
|
if (nativeResult === true) {
|
|
145
185
|
return true;
|
|
146
186
|
}
|
|
147
187
|
}
|
|
148
188
|
|
|
149
189
|
if (!payloadData.dispatch_micro_workers) {
|
|
150
|
-
console.error(
|
|
151
|
-
"ERROR: Payload missing required 'dispatch_micro_workers' array.",
|
|
152
|
-
);
|
|
190
|
+
console.error("ERROR: Payload missing required 'dispatch_micro_workers' array.");
|
|
153
191
|
return false;
|
|
154
192
|
}
|
|
155
193
|
|
|
@@ -171,9 +209,7 @@ function validatePayload(payloadData, workspaceRoot, agentsDir, payloadFile = nu
|
|
|
171
209
|
|
|
172
210
|
const agentFile = path.join(agentsDir, `${agentName}.md`);
|
|
173
211
|
if (!fs.existsSync(agentFile)) {
|
|
174
|
-
console.error(
|
|
175
|
-
`ERROR: Worker ${i}: target_agent '${agentName}' not found at ${agentFile}.`,
|
|
176
|
-
);
|
|
212
|
+
console.error(`ERROR: Worker ${i}: target_agent '${agentName}' not found at ${agentFile}.`);
|
|
177
213
|
allValid = false;
|
|
178
214
|
}
|
|
179
215
|
|
|
@@ -199,12 +235,12 @@ function validatePayload(payloadData, workspaceRoot, agentsDir, payloadFile = nu
|
|
|
199
235
|
|
|
200
236
|
function buildWorkerPrompts(payloadData, workspaceRoot) {
|
|
201
237
|
const prompts = [];
|
|
202
|
-
let astContext =
|
|
238
|
+
let astContext = '';
|
|
203
239
|
|
|
204
240
|
try {
|
|
205
241
|
const res = execSync(`python -m code_review_graph review-delta`, {
|
|
206
242
|
cwd: workspaceRoot,
|
|
207
|
-
stdio:
|
|
243
|
+
stdio: 'pipe',
|
|
208
244
|
})
|
|
209
245
|
.toString()
|
|
210
246
|
.trim();
|
|
@@ -218,31 +254,208 @@ function buildWorkerPrompts(payloadData, workspaceRoot) {
|
|
|
218
254
|
const workers = payloadData.dispatch_micro_workers || [];
|
|
219
255
|
for (const worker of workers) {
|
|
220
256
|
const agent = worker.target_agent;
|
|
221
|
-
const ctx = worker.context_summary ||
|
|
222
|
-
const task = worker.task_description ||
|
|
257
|
+
const ctx = worker.context_summary || '';
|
|
258
|
+
const task = worker.task_description || '';
|
|
223
259
|
const files = worker.files_attached || [];
|
|
224
260
|
|
|
225
261
|
let prompt = `--- MICRO-WORKER DISPATCH ---\n`;
|
|
226
262
|
prompt += `Agent: ${agent}\n`;
|
|
227
263
|
prompt += `Context: ${ctx}${astContext}\n`;
|
|
228
264
|
prompt += `Task: ${task}\n`;
|
|
229
|
-
prompt += `Attached Files: ${files.length ? files.join(
|
|
265
|
+
prompt += `Attached Files: ${files.length ? files.join(', ') : 'None'}\n`;
|
|
230
266
|
prompt += `-----------------------------`;
|
|
231
267
|
prompts.push(prompt);
|
|
232
268
|
}
|
|
233
269
|
return prompts;
|
|
234
270
|
}
|
|
235
271
|
|
|
272
|
+
// ─── Swarm Orchestrator (Wave-Based Execution) ───────────────────────────────
|
|
273
|
+
|
|
274
|
+
const TRIBUNAL_WAVES = {
|
|
275
|
+
'wave-1-core': {
|
|
276
|
+
reviewers: ['precedence-reviewer', 'logic-reviewer', 'schema-reviewer', 'resilience-reviewer'],
|
|
277
|
+
maxParallel: 4,
|
|
278
|
+
timeout: 30000,
|
|
279
|
+
failureMode: 'halt',
|
|
280
|
+
},
|
|
281
|
+
'wave-2-security': {
|
|
282
|
+
reviewers: [
|
|
283
|
+
'security-auditor',
|
|
284
|
+
'dependency-reviewer',
|
|
285
|
+
'type-safety-reviewer',
|
|
286
|
+
'complexity-reviewer',
|
|
287
|
+
'sql-reviewer',
|
|
288
|
+
'pipeline-reviewer',
|
|
289
|
+
],
|
|
290
|
+
maxParallel: 6,
|
|
291
|
+
timeout: 45000,
|
|
292
|
+
failureMode: 'continue-warn',
|
|
293
|
+
},
|
|
294
|
+
'wave-3-domain': {
|
|
295
|
+
reviewers: [
|
|
296
|
+
'frontend-reviewer',
|
|
297
|
+
'performance-reviewer',
|
|
298
|
+
'mobile-reviewer',
|
|
299
|
+
'ai-code-reviewer',
|
|
300
|
+
'test-coverage-reviewer',
|
|
301
|
+
'accessibility-reviewer',
|
|
302
|
+
'ui-ux-auditor',
|
|
303
|
+
'review-animations',
|
|
304
|
+
'vitals-reviewer',
|
|
305
|
+
'db-latency-auditor',
|
|
306
|
+
'throughput-optimizer',
|
|
307
|
+
],
|
|
308
|
+
maxParallel: 8,
|
|
309
|
+
timeout: 60000,
|
|
310
|
+
failureMode: 'continue',
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
class SwarmOrchestrator {
|
|
315
|
+
constructor(dashboard = null) {
|
|
316
|
+
this.dashboard = dashboard;
|
|
317
|
+
this.workers = [];
|
|
318
|
+
this.results = [];
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
async executeTribunal(payload, waveName = 'full') {
|
|
322
|
+
const wavesToRun =
|
|
323
|
+
waveName === 'full' ? ['wave-1-core', 'wave-2-security', 'wave-3-domain'] : [waveName];
|
|
324
|
+
|
|
325
|
+
const workers =
|
|
326
|
+
typeof payload === 'object' && payload !== null && payload.workers
|
|
327
|
+
? payload.workers
|
|
328
|
+
: Array.isArray(payload)
|
|
329
|
+
? payload
|
|
330
|
+
: [payload];
|
|
331
|
+
|
|
332
|
+
this.workers = workers;
|
|
333
|
+
this.results = [];
|
|
334
|
+
|
|
335
|
+
if (this.dashboard) {
|
|
336
|
+
this.dashboard.workers = this.workers.map(w => ({
|
|
337
|
+
name: w.target_agent || w.agent || 'Worker',
|
|
338
|
+
task: (w.task_description || w.goal || '').slice(0, 40) + '...',
|
|
339
|
+
status: '⏳ Pending',
|
|
340
|
+
color: '\x1b[33m', // Yellow
|
|
341
|
+
}));
|
|
342
|
+
this.dashboard.start();
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
for (const wave of wavesToRun) {
|
|
346
|
+
const config = TRIBUNAL_WAVES[wave] || {
|
|
347
|
+
maxParallel: 4,
|
|
348
|
+
timeout: 30000,
|
|
349
|
+
failureMode: 'continue',
|
|
350
|
+
};
|
|
351
|
+
// Filter workers belonging to this wave
|
|
352
|
+
let waveWorkers = [];
|
|
353
|
+
if (waveName === 'full') {
|
|
354
|
+
// If it's a full run, we only pick the reviewers designated for this wave
|
|
355
|
+
const allowedReviewers = new Set(config.reviewers || []);
|
|
356
|
+
waveWorkers = this.workers.filter(w => allowedReviewers.has(w.agent || w.target_agent));
|
|
357
|
+
} else {
|
|
358
|
+
waveWorkers = this.workers;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (waveWorkers.length === 0) continue;
|
|
362
|
+
|
|
363
|
+
const waveResults = await this.executeWave(wave, config, waveWorkers);
|
|
364
|
+
this.results.push(...waveResults);
|
|
365
|
+
|
|
366
|
+
if (config.failureMode === 'halt' && waveResults.some(r => r.status === 'failure')) {
|
|
367
|
+
if (this.dashboard) this.dashboard.stop();
|
|
368
|
+
console.error(
|
|
369
|
+
`\n\x1b[31m✖ HALT: Core wave '${wave}' encountered a failure. Aborting subsequent waves.\x1b[0m`,
|
|
370
|
+
);
|
|
371
|
+
return this.results;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (this.dashboard) {
|
|
376
|
+
this.dashboard.stop();
|
|
377
|
+
}
|
|
378
|
+
return this.results;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
async executeWave(waveName, config, workers) {
|
|
382
|
+
const results = [];
|
|
383
|
+
const { maxParallel } = config;
|
|
384
|
+
|
|
385
|
+
// Batch workers by maxParallel
|
|
386
|
+
for (let i = 0; i < workers.length; i += maxParallel) {
|
|
387
|
+
const batch = workers.slice(i, i + maxParallel);
|
|
388
|
+
const batchPromises = batch.map(worker => this.executeWorker(worker, config.timeout));
|
|
389
|
+
const batchResults = await Promise.allSettled(batchPromises);
|
|
390
|
+
results.push(...batchResults.map(r => r.value || r.reason));
|
|
391
|
+
}
|
|
392
|
+
return results;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
async executeWorker(worker, timeout) {
|
|
396
|
+
const workerIndex = this.workers.indexOf(worker);
|
|
397
|
+
if (this.dashboard && workerIndex !== -1) {
|
|
398
|
+
this.dashboard.updateStatus(workerIndex, 'Working', '\x1b[36m'); // Cyan
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const agentName = worker.agent || worker.target_agent || 'Unknown';
|
|
402
|
+
|
|
403
|
+
try {
|
|
404
|
+
const result = await executeWithRetry(
|
|
405
|
+
async () => {
|
|
406
|
+
return this.invokeReviewerMock(worker, timeout);
|
|
407
|
+
},
|
|
408
|
+
{ agentName },
|
|
409
|
+
);
|
|
410
|
+
|
|
411
|
+
if (this.dashboard && workerIndex !== -1) {
|
|
412
|
+
this.dashboard.updateStatus(workerIndex, '✔ Success', '\x1b[32m'); // Green
|
|
413
|
+
}
|
|
414
|
+
return {
|
|
415
|
+
agent: agentName,
|
|
416
|
+
status: 'success',
|
|
417
|
+
output: result,
|
|
418
|
+
};
|
|
419
|
+
} catch (error) {
|
|
420
|
+
if (this.dashboard && workerIndex !== -1) {
|
|
421
|
+
this.dashboard.updateStatus(workerIndex, '✖ Failed', '\x1b[31m'); // Red
|
|
422
|
+
}
|
|
423
|
+
return {
|
|
424
|
+
agent: agentName,
|
|
425
|
+
status: 'failure',
|
|
426
|
+
error: error.message,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Since this script primarily validates and outputs JSON, we simulate execution
|
|
432
|
+
// taking between 1-3 seconds for demo purposes.
|
|
433
|
+
async invokeReviewerMock(worker, _timeout) {
|
|
434
|
+
return new Promise((resolve, reject) => {
|
|
435
|
+
const delay = Math.floor(Math.random() * 2000) + 1000;
|
|
436
|
+
// 5% chance to simulate a transient failure for retry logic testing
|
|
437
|
+
const shouldFail = Math.random() < 0.05;
|
|
438
|
+
|
|
439
|
+
setTimeout(() => {
|
|
440
|
+
if (shouldFail) {
|
|
441
|
+
reject(new Error('Transient API failure simulated.'));
|
|
442
|
+
} else {
|
|
443
|
+
resolve(`Completed processing for ${worker.agent || worker.target_agent}`);
|
|
444
|
+
}
|
|
445
|
+
}, delay);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
450
|
+
|
|
236
451
|
// ─── Swarm mode: validate WorkerRequest / WorkerResult payloads ───────────────
|
|
237
452
|
|
|
238
453
|
function validateWorkerRequest(req, index, agentsDir) {
|
|
239
454
|
const errors = [];
|
|
240
455
|
|
|
241
456
|
const taskId = req.task_id;
|
|
242
|
-
if (!taskId || typeof taskId !==
|
|
243
|
-
errors.push(
|
|
244
|
-
`WorkerRequest[${index}]: 'task_id' must be a non-empty string.`,
|
|
245
|
-
);
|
|
457
|
+
if (!taskId || typeof taskId !== 'string') {
|
|
458
|
+
errors.push(`WorkerRequest[${index}]: 'task_id' must be a non-empty string.`);
|
|
246
459
|
}
|
|
247
460
|
|
|
248
461
|
const reqType = req.type;
|
|
@@ -253,7 +466,7 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
253
466
|
}
|
|
254
467
|
|
|
255
468
|
const agent = req.agent;
|
|
256
|
-
if (!agent || typeof agent !==
|
|
469
|
+
if (!agent || typeof agent !== 'string') {
|
|
257
470
|
errors.push(`WorkerRequest[${index}]: 'agent' must be a non-empty string.`);
|
|
258
471
|
} else {
|
|
259
472
|
const agentFile = path.join(agentsDir, `${agent}.md`);
|
|
@@ -265,7 +478,7 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
265
478
|
}
|
|
266
479
|
|
|
267
480
|
const goal = req.goal;
|
|
268
|
-
if (!goal || typeof goal !==
|
|
481
|
+
if (!goal || typeof goal !== 'string') {
|
|
269
482
|
errors.push(`WorkerRequest[${index}]: 'goal' must be a non-empty string.`);
|
|
270
483
|
} else if (goal.length > MAX_GOAL_LENGTH) {
|
|
271
484
|
errors.push(
|
|
@@ -274,10 +487,8 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
274
487
|
}
|
|
275
488
|
|
|
276
489
|
const context = req.context;
|
|
277
|
-
if (!context || typeof context !==
|
|
278
|
-
errors.push(
|
|
279
|
-
`WorkerRequest[${index}]: 'context' must be a non-empty string.`,
|
|
280
|
-
);
|
|
490
|
+
if (!context || typeof context !== 'string') {
|
|
491
|
+
errors.push(`WorkerRequest[${index}]: 'context' must be a non-empty string.`);
|
|
281
492
|
} else if (context.length > MAX_CONTEXT_LENGTH) {
|
|
282
493
|
errors.push(
|
|
283
494
|
`WorkerRequest[${index}]: 'context' exceeds ${MAX_CONTEXT_LENGTH} characters (${context.length} chars). Trim to minimal required context only.`,
|
|
@@ -287,7 +498,7 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
287
498
|
const maxRetries = req.max_retries;
|
|
288
499
|
if (maxRetries !== undefined) {
|
|
289
500
|
if (
|
|
290
|
-
typeof maxRetries !==
|
|
501
|
+
typeof maxRetries !== 'number' ||
|
|
291
502
|
!Number.isInteger(maxRetries) ||
|
|
292
503
|
maxRetries < 1 ||
|
|
293
504
|
maxRetries > 3
|
|
@@ -305,14 +516,12 @@ function validateWorkerResult(res, index) {
|
|
|
305
516
|
const errors = [];
|
|
306
517
|
|
|
307
518
|
const taskId = res.task_id;
|
|
308
|
-
if (!taskId || typeof taskId !==
|
|
309
|
-
errors.push(
|
|
310
|
-
`WorkerResult[${index}]: 'task_id' must be a non-empty string.`,
|
|
311
|
-
);
|
|
519
|
+
if (!taskId || typeof taskId !== 'string') {
|
|
520
|
+
errors.push(`WorkerResult[${index}]: 'task_id' must be a non-empty string.`);
|
|
312
521
|
}
|
|
313
522
|
|
|
314
523
|
const agent = res.agent;
|
|
315
|
-
if (!agent || typeof agent !==
|
|
524
|
+
if (!agent || typeof agent !== 'string') {
|
|
316
525
|
errors.push(`WorkerResult[${index}]: 'agent' must be a non-empty string.`);
|
|
317
526
|
}
|
|
318
527
|
|
|
@@ -325,12 +534,10 @@ function validateWorkerResult(res, index) {
|
|
|
325
534
|
|
|
326
535
|
const output = res.output;
|
|
327
536
|
const error = res.error;
|
|
328
|
-
if (status ===
|
|
329
|
-
errors.push(
|
|
330
|
-
`WorkerResult[${index}]: 'output' is required when status is 'success'.`,
|
|
331
|
-
);
|
|
537
|
+
if (status === 'success' && !output) {
|
|
538
|
+
errors.push(`WorkerResult[${index}]: 'output' is required when status is 'success'.`);
|
|
332
539
|
}
|
|
333
|
-
if ((status ===
|
|
540
|
+
if ((status === 'failure' || status === 'escalate') && !error) {
|
|
334
541
|
errors.push(
|
|
335
542
|
`WorkerResult[${index}]: 'error' is required when status is '${status}'. Be specific — 'Something went wrong' is not acceptable.`,
|
|
336
543
|
);
|
|
@@ -338,75 +545,91 @@ function validateWorkerResult(res, index) {
|
|
|
338
545
|
|
|
339
546
|
const attempts = res.attempts;
|
|
340
547
|
if (attempts !== undefined) {
|
|
341
|
-
if (
|
|
342
|
-
|
|
343
|
-
!Number.isInteger(attempts) ||
|
|
344
|
-
attempts < 1
|
|
345
|
-
) {
|
|
346
|
-
errors.push(
|
|
347
|
-
`WorkerResult[${index}]: 'attempts' must be an integer >= 1, got '${attempts}'.`,
|
|
348
|
-
);
|
|
548
|
+
if (typeof attempts !== 'number' || !Number.isInteger(attempts) || attempts < 1) {
|
|
549
|
+
errors.push(`WorkerResult[${index}]: 'attempts' must be an integer >= 1, got '${attempts}'.`);
|
|
349
550
|
}
|
|
350
551
|
}
|
|
351
552
|
|
|
352
553
|
return errors;
|
|
353
554
|
}
|
|
354
555
|
|
|
355
|
-
function validateSwarmPayload(payloadData, agentsDir, payloadFile = null) {
|
|
556
|
+
function validateSwarmPayload(payloadData, agentsDir, payloadFile = null, opts = {}) {
|
|
557
|
+
let resolvedAgentsDir = agentsDir;
|
|
558
|
+
let quiet = false;
|
|
559
|
+
|
|
560
|
+
if (typeof agentsDir === 'object' && agentsDir !== null && typeof agentsDir !== 'string') {
|
|
561
|
+
quiet = !!(agentsDir.quiet || agentsDir.silent);
|
|
562
|
+
resolvedAgentsDir = agentsDir.agentsDir || null;
|
|
563
|
+
}
|
|
564
|
+
if (opts && (opts.quiet || opts.silent)) quiet = true;
|
|
565
|
+
|
|
356
566
|
if (payloadFile) {
|
|
357
|
-
const nativeResult = nativeValidate(payloadFile,
|
|
567
|
+
const nativeResult = nativeValidate(payloadFile, 'swarm');
|
|
358
568
|
if (nativeResult === true) {
|
|
359
569
|
return true;
|
|
360
570
|
}
|
|
361
571
|
}
|
|
362
572
|
|
|
363
|
-
|
|
364
|
-
|
|
573
|
+
// Validate using Zod schema
|
|
574
|
+
try {
|
|
575
|
+
// Convert payloadData to the expected format for SwarmPayloadSchema
|
|
576
|
+
let swarmPayload;
|
|
365
577
|
if (Array.isArray(payloadData)) {
|
|
366
|
-
|
|
578
|
+
swarmPayload = { workers: payloadData };
|
|
367
579
|
} else if (payloadData.workers && Array.isArray(payloadData.workers)) {
|
|
368
|
-
|
|
580
|
+
swarmPayload = payloadData;
|
|
369
581
|
} else {
|
|
370
|
-
|
|
582
|
+
swarmPayload = { workers: [payloadData] };
|
|
371
583
|
}
|
|
372
|
-
} else {
|
|
373
|
-
console.error("ERROR: Swarm payload must be a JSON object or array.");
|
|
374
|
-
return false;
|
|
375
|
-
}
|
|
376
584
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
);
|
|
381
|
-
return false;
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const allErrors = [];
|
|
385
|
-
for (let i = 0; i < items.length; i++) {
|
|
386
|
-
const item = items[i];
|
|
387
|
-
if (typeof item !== "object" || item === null) {
|
|
388
|
-
allErrors.push(`Item[${i}]: must be a JSON object.`);
|
|
389
|
-
continue;
|
|
585
|
+
// Add default wave if not provided
|
|
586
|
+
if (!swarmPayload.wave) {
|
|
587
|
+
swarmPayload.wave = 'full';
|
|
390
588
|
}
|
|
391
589
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
590
|
+
// Validate using Zod schema
|
|
591
|
+
validatePayloadOrThrow(swarmPayload, SwarmPayloadSchema);
|
|
592
|
+
|
|
593
|
+
// Additional validation: check that agents exist
|
|
594
|
+
const workers = swarmPayload.workers;
|
|
595
|
+
for (let i = 0; i < workers.length; i++) {
|
|
596
|
+
const worker = workers[i];
|
|
597
|
+
const agent = worker.agent;
|
|
598
|
+
if (agent && typeof agent === 'string') {
|
|
599
|
+
const agentFile = path.join(resolvedAgentsDir, `${agent}.md`);
|
|
600
|
+
if (!fs.existsSync(agentFile)) {
|
|
601
|
+
if (!quiet) {
|
|
602
|
+
console.error(
|
|
603
|
+
`ERROR: Worker ${i}: agent '${agent}' not found at ${agentFile}. Only agents that exist in .agent/agents/ are valid.`,
|
|
604
|
+
);
|
|
605
|
+
}
|
|
606
|
+
return false;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
398
609
|
|
|
399
|
-
|
|
400
|
-
|
|
610
|
+
// Validate attached files exist (warning only, not error)
|
|
611
|
+
const filesAttached = worker.files_attached || [];
|
|
612
|
+
if (Array.isArray(filesAttached)) {
|
|
613
|
+
for (const f of filesAttached) {
|
|
614
|
+
const filePath = path.resolve(process.cwd(), f);
|
|
615
|
+
if (!fs.existsSync(filePath)) {
|
|
616
|
+
if (!quiet) {
|
|
617
|
+
console.warn(
|
|
618
|
+
`WARN: Worker ${i}: attached file '${f}' does not exist (might be a new file to create).`,
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
401
625
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
626
|
+
return true;
|
|
627
|
+
} catch (error) {
|
|
628
|
+
if (!quiet) {
|
|
629
|
+
console.error(`ERROR: Swarm payload validation failed: ${error.message}`);
|
|
405
630
|
}
|
|
406
631
|
return false;
|
|
407
632
|
}
|
|
408
|
-
|
|
409
|
-
return true;
|
|
410
633
|
}
|
|
411
634
|
|
|
412
635
|
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
@@ -415,32 +638,32 @@ function main() {
|
|
|
415
638
|
const args = process.argv.slice(2);
|
|
416
639
|
let payload = null;
|
|
417
640
|
let file = null;
|
|
418
|
-
let workspace =
|
|
419
|
-
let mode =
|
|
641
|
+
let workspace = '.';
|
|
642
|
+
let mode = 'legacy';
|
|
420
643
|
let useTui = false;
|
|
421
644
|
|
|
422
645
|
for (let i = 0; i < args.length; i++) {
|
|
423
646
|
const arg = args[i];
|
|
424
|
-
if (arg ===
|
|
647
|
+
if (arg === '--payload' && i + 1 < args.length) {
|
|
425
648
|
payload = args[++i];
|
|
426
|
-
} else if (arg ===
|
|
649
|
+
} else if (arg === '--file' && i + 1 < args.length) {
|
|
427
650
|
file = args[++i];
|
|
428
|
-
} else if (arg ===
|
|
651
|
+
} else if (arg === '--workspace' && i + 1 < args.length) {
|
|
429
652
|
workspace = args[++i];
|
|
430
|
-
} else if (arg ===
|
|
653
|
+
} else if (arg === '--mode' && i + 1 < args.length) {
|
|
431
654
|
mode = args[++i];
|
|
432
|
-
} else if (arg ===
|
|
655
|
+
} else if (arg === '--tui') {
|
|
433
656
|
useTui = true;
|
|
434
|
-
} else if (arg ===
|
|
657
|
+
} else if (arg === '-h' || arg === '--help') {
|
|
435
658
|
console.log(
|
|
436
|
-
|
|
659
|
+
'Usage: swarm_dispatcher.js [--payload <json>] [--file <path>] [--workspace <dir>] [--mode legacy|swarm] [--tui]',
|
|
437
660
|
);
|
|
438
661
|
process.exit(0);
|
|
439
662
|
}
|
|
440
663
|
}
|
|
441
664
|
|
|
442
665
|
if (!payload && !file) {
|
|
443
|
-
console.error(
|
|
666
|
+
console.error('ERROR: Must provide either --payload or --file');
|
|
444
667
|
process.exit(1);
|
|
445
668
|
}
|
|
446
669
|
|
|
@@ -448,24 +671,20 @@ function main() {
|
|
|
448
671
|
const agentDir = findAgentDir(workspaceRoot);
|
|
449
672
|
|
|
450
673
|
if (!agentDir) {
|
|
451
|
-
console.error(
|
|
452
|
-
`ERROR: Could not find .agent directory starting from ${workspaceRoot}`,
|
|
453
|
-
);
|
|
674
|
+
console.error(`ERROR: Could not find .agent directory starting from ${workspaceRoot}`);
|
|
454
675
|
process.exit(1);
|
|
455
676
|
}
|
|
456
677
|
|
|
457
|
-
const agentsDir = path.join(agentDir,
|
|
678
|
+
const agentsDir = path.join(agentDir, 'agents');
|
|
458
679
|
if (!fs.existsSync(agentsDir)) {
|
|
459
|
-
console.error(
|
|
460
|
-
`ERROR: Could not find 'agents' directory inside ${agentDir}`,
|
|
461
|
-
);
|
|
680
|
+
console.error(`ERROR: Could not find 'agents' directory inside ${agentDir}`);
|
|
462
681
|
process.exit(1);
|
|
463
682
|
}
|
|
464
683
|
|
|
465
684
|
let payloadData;
|
|
466
685
|
try {
|
|
467
686
|
if (file) {
|
|
468
|
-
payloadData = JSON.parse(fs.readFileSync(file,
|
|
687
|
+
payloadData = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
469
688
|
} else {
|
|
470
689
|
payloadData = JSON.parse(payload);
|
|
471
690
|
}
|
|
@@ -474,17 +693,17 @@ function main() {
|
|
|
474
693
|
process.exit(1);
|
|
475
694
|
}
|
|
476
695
|
|
|
477
|
-
if (mode ===
|
|
696
|
+
if (mode === 'swarm') {
|
|
478
697
|
if (!validateSwarmPayload(payloadData, agentsDir, file)) {
|
|
479
|
-
console.error(
|
|
698
|
+
console.error('ERROR: Swarm payload validation failed.');
|
|
480
699
|
process.exit(1);
|
|
481
700
|
}
|
|
482
701
|
|
|
483
|
-
let astContext =
|
|
702
|
+
let astContext = '';
|
|
484
703
|
try {
|
|
485
704
|
const res = execSync(`python -m code_review_graph review-delta`, {
|
|
486
705
|
cwd: workspaceRoot,
|
|
487
|
-
stdio:
|
|
706
|
+
stdio: 'pipe',
|
|
488
707
|
})
|
|
489
708
|
.toString()
|
|
490
709
|
.trim();
|
|
@@ -497,63 +716,49 @@ function main() {
|
|
|
497
716
|
|
|
498
717
|
if (astContext) {
|
|
499
718
|
const items =
|
|
500
|
-
typeof payloadData ===
|
|
501
|
-
payloadData !== null &&
|
|
502
|
-
payloadData.workers
|
|
719
|
+
typeof payloadData === 'object' && payloadData !== null && payloadData.workers
|
|
503
720
|
? payloadData.workers
|
|
504
721
|
: Array.isArray(payloadData)
|
|
505
722
|
? payloadData
|
|
506
723
|
: [payloadData];
|
|
507
724
|
|
|
508
725
|
for (const item of items) {
|
|
509
|
-
if (item &&
|
|
726
|
+
if (item && 'context' in item) {
|
|
510
727
|
item.context += astContext;
|
|
511
728
|
}
|
|
512
729
|
}
|
|
513
730
|
}
|
|
514
731
|
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
dashboard.stop();
|
|
543
|
-
console.log(
|
|
544
|
-
"\n\x1b[32m✔ Swarm validation complete. Ready for dispatch.\x1b[0m\n",
|
|
545
|
-
);
|
|
546
|
-
}, 3000);
|
|
547
|
-
} else {
|
|
548
|
-
console.log("INFO: Swarm payload validation successful.");
|
|
549
|
-
if (astContext) {
|
|
550
|
-
console.log("--- ENRICHED SWARM PAYLOAD ---");
|
|
551
|
-
console.log(JSON.stringify(payloadData, null, 2));
|
|
552
|
-
}
|
|
553
|
-
}
|
|
732
|
+
const orchestrator = new SwarmOrchestrator(useTui ? new SwarmDashboard([]) : null);
|
|
733
|
+
|
|
734
|
+
// We must run in an async context since SwarmOrchestrator uses async/await.
|
|
735
|
+
const wave =
|
|
736
|
+
typeof payloadData === 'object' && payloadData !== null && payloadData.wave
|
|
737
|
+
? payloadData.wave
|
|
738
|
+
: 'full';
|
|
739
|
+
|
|
740
|
+
orchestrator
|
|
741
|
+
.executeTribunal(payloadData, wave)
|
|
742
|
+
.then(results => {
|
|
743
|
+
if (!useTui) {
|
|
744
|
+
console.log('INFO: Swarm payload validation and orchestration successful.');
|
|
745
|
+
if (astContext) {
|
|
746
|
+
console.log('--- ENRICHED SWARM PAYLOAD ---');
|
|
747
|
+
console.log(JSON.stringify(payloadData, null, 2));
|
|
748
|
+
}
|
|
749
|
+
console.log('--- EXECUTION PLAN (MOCK RESULTS) ---');
|
|
750
|
+
console.log(JSON.stringify(results, null, 2));
|
|
751
|
+
} else {
|
|
752
|
+
console.log('\n\x1b[32m✔ Swarm orchestration complete.\x1b[0m\n');
|
|
753
|
+
}
|
|
754
|
+
})
|
|
755
|
+
.catch(err => {
|
|
756
|
+
console.error(`ERROR: Swarm orchestration failed: ${err.message}`);
|
|
757
|
+
process.exit(1);
|
|
758
|
+
});
|
|
554
759
|
} else {
|
|
555
760
|
if (!validatePayload(payloadData, workspaceRoot, agentsDir, file)) {
|
|
556
|
-
console.error(
|
|
761
|
+
console.error('ERROR: Payload validation failed.');
|
|
557
762
|
process.exit(1);
|
|
558
763
|
}
|
|
559
764
|
|
|
@@ -563,26 +768,18 @@ function main() {
|
|
|
563
768
|
dashboard.start();
|
|
564
769
|
|
|
565
770
|
// Simulate parallel execution for demo/UX purposes
|
|
566
|
-
setTimeout(
|
|
567
|
-
() => dashboard.updateStatus(0, "Researching", "\x1b[36m"),
|
|
568
|
-
1000,
|
|
569
|
-
);
|
|
771
|
+
setTimeout(() => dashboard.updateStatus(0, 'Researching', '\x1b[36m'), 1000);
|
|
570
772
|
setTimeout(() => {
|
|
571
|
-
if (workers.length > 1)
|
|
572
|
-
dashboard.updateStatus(1, "Generating", "\x1b[35m");
|
|
773
|
+
if (workers.length > 1) dashboard.updateStatus(1, 'Generating', '\x1b[35m');
|
|
573
774
|
}, 1500);
|
|
574
775
|
|
|
575
776
|
setTimeout(() => {
|
|
576
|
-
workers.forEach((w, i) =>
|
|
577
|
-
dashboard.updateStatus(i, "✔ Done", "\x1b[32m"),
|
|
578
|
-
);
|
|
777
|
+
workers.forEach((w, i) => dashboard.updateStatus(i, '✔ Done', '\x1b[32m'));
|
|
579
778
|
dashboard.stop();
|
|
580
|
-
console.log(
|
|
581
|
-
"\n\x1b[32m✔ All workers successfully dispatched.\x1b[0m\n",
|
|
582
|
-
);
|
|
779
|
+
console.log('\n\x1b[32m✔ All workers successfully dispatched.\x1b[0m\n');
|
|
583
780
|
}, 3000);
|
|
584
781
|
} else {
|
|
585
|
-
console.log(
|
|
782
|
+
console.log('INFO: Payload validation successful.');
|
|
586
783
|
const prompts = buildWorkerPrompts(payloadData, workspaceRoot);
|
|
587
784
|
|
|
588
785
|
for (let i = 0; i < prompts.length; i++) {
|