tribunal-kit 6.0.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/.manifest.json +78 -0
- package/.agent/ARCHITECTURE.md +19 -241
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/history/memory/.memory.idx +3716 -1
- package/.agent/history/memory/MEMORY.md +246 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2034 -263
- package/.agent/rules/GEMINI.md +12 -10
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/auto_preview.js +39 -43
- package/.agent/scripts/bundle_analyzer.js +47 -60
- package/.agent/scripts/case_law_manager.js +200 -294
- package/.agent/scripts/checklist.js +73 -94
- package/.agent/scripts/cicd_validator.js +305 -0
- package/.agent/scripts/compile_router.py +4 -111
- package/.agent/scripts/context_broker.js +317 -412
- package/.agent/scripts/contract_engine.js +402 -0
- package/.agent/scripts/dependency_analyzer.js +112 -124
- package/.agent/scripts/graph_builder.js +75 -103
- package/.agent/scripts/graph_visualizer.js +10 -12
- package/.agent/scripts/graph_zoom.js +38 -55
- package/.agent/scripts/guardrail_engine.js +195 -145
- package/.agent/scripts/impact_classifier.js +55 -30
- package/.agent/scripts/inner_loop_validator.js +108 -159
- package/.agent/scripts/integrity_manifest.js +59 -67
- package/.agent/scripts/lint_runner.js +65 -75
- package/.agent/scripts/marathon_harness.js +131 -208
- package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
- package/.agent/scripts/minify_context.js +29 -33
- package/.agent/scripts/minimal_change_engine.js +95 -87
- package/.agent/scripts/mutation_runner.js +46 -62
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +118 -93
- package/.agent/scripts/schema_validator.js +73 -121
- package/.agent/scripts/security_scan.js +88 -117
- package/.agent/scripts/session_manager.js +52 -69
- package/.agent/scripts/signal_detector.js +24 -22
- package/.agent/scripts/skill_evolution.js +184 -245
- package/.agent/scripts/skill_integrator.js +35 -48
- package/.agent/scripts/socratic_gate_policy.js +15 -12
- package/.agent/scripts/strengthen_skills.js +29 -33
- package/.agent/scripts/swarm_dispatcher.js +120 -151
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +9 -7
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +237 -0
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +80 -0
- package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +70 -0
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +59 -0
- package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +81 -0
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +59 -0
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +68 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +58 -0
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +78 -0
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +90 -0
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +15 -14
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/CONTRIBUTING.md +3 -3
- package/README.md +160 -88
- package/SECURITY.md +11 -11
- package/bin/mcp-server.js +512 -233
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +45 -48
- package/dist/cli.js +26 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/memory.js +3 -2
- package/dist/commands/native.js +36 -0
- package/dist/commands/status.js +6 -0
- package/dist/esm/index.mjs +32 -0
- package/dist/index.d.ts +58 -3
- package/package.json +20 -16
- package/scripts/benchmark.js +62 -86
- package/scripts/changelog.js +67 -73
- package/scripts/fix-vbc.js +13 -15
- package/scripts/fix-vbc.ps1 +2 -118
- package/scripts/stress_benchmark.js +358 -0
- package/scripts/sync-version.js +71 -41
- package/scripts/validate-payload.js +23 -30
- package/scripts/visual_audit.js +23 -13
|
@@ -4,22 +4,22 @@
|
|
|
4
4
|
* Validate Orchestrator micro-worker payloads (legacy) and Swarm payloads.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
'use strict';
|
|
8
8
|
|
|
9
|
-
const fs = require(
|
|
10
|
-
const path = require(
|
|
11
|
-
const { execSync } = require(
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const { execSync } = require('child_process');
|
|
12
12
|
|
|
13
13
|
// ─── ANSI TUI Renderer ────────────────────────────────────────────────────────
|
|
14
14
|
class SwarmDashboard {
|
|
15
15
|
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:
|
|
16
|
+
this.workers = workers.map(w => ({
|
|
17
|
+
name: w.target_agent || w.agent || 'Worker',
|
|
18
|
+
task: (w.task_description || w.goal || '').slice(0, 40) + '...',
|
|
19
|
+
status: '⏳ Pending',
|
|
20
|
+
color: '\x1b[33m', // Yellow
|
|
21
21
|
}));
|
|
22
|
-
this.spinnerFrames = [
|
|
22
|
+
this.spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
23
23
|
this.frameIdx = 0;
|
|
24
24
|
this.linesRendered = 0;
|
|
25
25
|
this.timer = null;
|
|
@@ -30,21 +30,19 @@ class SwarmDashboard {
|
|
|
30
30
|
process.stdout.write(`\x1b[${this.linesRendered}A`);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
let output =
|
|
34
|
-
"\n\x1b[1m\x1b[36m━━━ Tribunal Swarm Dispatcher ━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n\n";
|
|
33
|
+
let output = '\n\x1b[1m\x1b[36m━━━ Tribunal Swarm Dispatcher ━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n\n';
|
|
35
34
|
const frame = this.spinnerFrames[this.frameIdx];
|
|
36
35
|
|
|
37
|
-
this.workers.forEach(
|
|
38
|
-
const icon = w.status.includes(
|
|
36
|
+
this.workers.forEach(w => {
|
|
37
|
+
const icon = w.status.includes('Pending')
|
|
39
38
|
? `\x1b[36m${frame}\x1b[0m`
|
|
40
|
-
: w.status.includes(
|
|
41
|
-
?
|
|
42
|
-
:
|
|
39
|
+
: w.status.includes('Done')
|
|
40
|
+
? '\x1b[32m✔\x1b[0m'
|
|
41
|
+
: '\x1b[31m✖\x1b[0m';
|
|
43
42
|
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
43
|
});
|
|
45
44
|
|
|
46
|
-
output +=
|
|
47
|
-
"\n\x1b[1m\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n";
|
|
45
|
+
output += '\n\x1b[1m\x1b[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\x1b[0m\n';
|
|
48
46
|
|
|
49
47
|
process.stdout.write(output);
|
|
50
48
|
this.linesRendered = this.workers.length + 5;
|
|
@@ -71,34 +69,34 @@ class SwarmDashboard {
|
|
|
71
69
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
72
70
|
|
|
73
71
|
const VALID_WORKER_TYPES = new Set([
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
72
|
+
'research',
|
|
73
|
+
'generate_code',
|
|
74
|
+
'review_code',
|
|
75
|
+
'debug',
|
|
76
|
+
'plan',
|
|
77
|
+
'design_schema',
|
|
78
|
+
'write_docs',
|
|
79
|
+
'security_audit',
|
|
80
|
+
'optimize',
|
|
81
|
+
'test',
|
|
84
82
|
]);
|
|
85
83
|
|
|
86
|
-
const VALID_RESULT_STATUSES = new Set([
|
|
84
|
+
const VALID_RESULT_STATUSES = new Set(['success', 'failure', 'escalate']);
|
|
87
85
|
|
|
88
86
|
const MAX_GOAL_LENGTH = 200;
|
|
89
87
|
const MAX_CONTEXT_LENGTH = 800;
|
|
90
88
|
const MAX_WORKERS_PER_SWARM = 5;
|
|
91
89
|
|
|
92
90
|
function getBinaryPath() {
|
|
93
|
-
if (process.env.TRIBUNAL_FORCE_JS ===
|
|
94
|
-
const isWindows = process.platform ===
|
|
95
|
-
const ext = isWindows ?
|
|
91
|
+
if (process.env.TRIBUNAL_FORCE_JS === '1') return null;
|
|
92
|
+
const isWindows = process.platform === 'win32';
|
|
93
|
+
const ext = isWindows ? '.exe' : '';
|
|
96
94
|
const candidates = [
|
|
97
95
|
process.env.TRIBUNAL_CORE_PATH,
|
|
98
|
-
path.resolve(__dirname,
|
|
99
|
-
path.resolve(__dirname,
|
|
100
|
-
path.resolve(process.cwd(),
|
|
101
|
-
path.resolve(process.cwd(),
|
|
96
|
+
path.resolve(__dirname, '..', '..', 'tribunal-kit', 'target', 'release', `tribunal-core${ext}`),
|
|
97
|
+
path.resolve(__dirname, '..', '..', 'target', 'release', `tribunal-core${ext}`),
|
|
98
|
+
path.resolve(process.cwd(), 'target', 'release', `tribunal-core${ext}`),
|
|
99
|
+
path.resolve(process.cwd(), 'tribunal-kit', 'target', 'release', `tribunal-core${ext}`),
|
|
102
100
|
];
|
|
103
101
|
for (const c of candidates) {
|
|
104
102
|
if (c && fs.existsSync(c)) return c;
|
|
@@ -110,9 +108,9 @@ function nativeValidate(file, schemaType) {
|
|
|
110
108
|
const bin = getBinaryPath();
|
|
111
109
|
if (!bin || !file || !fs.existsSync(file)) return null;
|
|
112
110
|
try {
|
|
113
|
-
const { spawnSync } = require(
|
|
114
|
-
const res = spawnSync(bin, [
|
|
115
|
-
encoding:
|
|
111
|
+
const { spawnSync } = require('child_process');
|
|
112
|
+
const res = spawnSync(bin, ['validate', '--file', file, '--schema', schemaType], {
|
|
113
|
+
encoding: 'utf-8',
|
|
116
114
|
});
|
|
117
115
|
if (res.status === 0) {
|
|
118
116
|
return true;
|
|
@@ -127,7 +125,7 @@ function findAgentDir(startPath) {
|
|
|
127
125
|
let current = path.resolve(startPath);
|
|
128
126
|
const root = path.parse(current).root;
|
|
129
127
|
while (current !== root) {
|
|
130
|
-
const agentDir = path.join(current,
|
|
128
|
+
const agentDir = path.join(current, '.agent');
|
|
131
129
|
if (fs.existsSync(agentDir) && fs.statSync(agentDir).isDirectory()) {
|
|
132
130
|
return agentDir;
|
|
133
131
|
}
|
|
@@ -140,16 +138,14 @@ function findAgentDir(startPath) {
|
|
|
140
138
|
|
|
141
139
|
function validatePayload(payloadData, workspaceRoot, agentsDir, payloadFile = null) {
|
|
142
140
|
if (payloadFile) {
|
|
143
|
-
const nativeResult = nativeValidate(payloadFile,
|
|
141
|
+
const nativeResult = nativeValidate(payloadFile, 'micro-worker');
|
|
144
142
|
if (nativeResult === true) {
|
|
145
143
|
return true;
|
|
146
144
|
}
|
|
147
145
|
}
|
|
148
146
|
|
|
149
147
|
if (!payloadData.dispatch_micro_workers) {
|
|
150
|
-
console.error(
|
|
151
|
-
"ERROR: Payload missing required 'dispatch_micro_workers' array.",
|
|
152
|
-
);
|
|
148
|
+
console.error("ERROR: Payload missing required 'dispatch_micro_workers' array.");
|
|
153
149
|
return false;
|
|
154
150
|
}
|
|
155
151
|
|
|
@@ -171,9 +167,7 @@ function validatePayload(payloadData, workspaceRoot, agentsDir, payloadFile = nu
|
|
|
171
167
|
|
|
172
168
|
const agentFile = path.join(agentsDir, `${agentName}.md`);
|
|
173
169
|
if (!fs.existsSync(agentFile)) {
|
|
174
|
-
console.error(
|
|
175
|
-
`ERROR: Worker ${i}: target_agent '${agentName}' not found at ${agentFile}.`,
|
|
176
|
-
);
|
|
170
|
+
console.error(`ERROR: Worker ${i}: target_agent '${agentName}' not found at ${agentFile}.`);
|
|
177
171
|
allValid = false;
|
|
178
172
|
}
|
|
179
173
|
|
|
@@ -199,12 +193,12 @@ function validatePayload(payloadData, workspaceRoot, agentsDir, payloadFile = nu
|
|
|
199
193
|
|
|
200
194
|
function buildWorkerPrompts(payloadData, workspaceRoot) {
|
|
201
195
|
const prompts = [];
|
|
202
|
-
let astContext =
|
|
196
|
+
let astContext = '';
|
|
203
197
|
|
|
204
198
|
try {
|
|
205
199
|
const res = execSync(`python -m code_review_graph review-delta`, {
|
|
206
200
|
cwd: workspaceRoot,
|
|
207
|
-
stdio:
|
|
201
|
+
stdio: 'pipe',
|
|
208
202
|
})
|
|
209
203
|
.toString()
|
|
210
204
|
.trim();
|
|
@@ -218,15 +212,15 @@ function buildWorkerPrompts(payloadData, workspaceRoot) {
|
|
|
218
212
|
const workers = payloadData.dispatch_micro_workers || [];
|
|
219
213
|
for (const worker of workers) {
|
|
220
214
|
const agent = worker.target_agent;
|
|
221
|
-
const ctx = worker.context_summary ||
|
|
222
|
-
const task = worker.task_description ||
|
|
215
|
+
const ctx = worker.context_summary || '';
|
|
216
|
+
const task = worker.task_description || '';
|
|
223
217
|
const files = worker.files_attached || [];
|
|
224
218
|
|
|
225
219
|
let prompt = `--- MICRO-WORKER DISPATCH ---\n`;
|
|
226
220
|
prompt += `Agent: ${agent}\n`;
|
|
227
221
|
prompt += `Context: ${ctx}${astContext}\n`;
|
|
228
222
|
prompt += `Task: ${task}\n`;
|
|
229
|
-
prompt += `Attached Files: ${files.length ? files.join(
|
|
223
|
+
prompt += `Attached Files: ${files.length ? files.join(', ') : 'None'}\n`;
|
|
230
224
|
prompt += `-----------------------------`;
|
|
231
225
|
prompts.push(prompt);
|
|
232
226
|
}
|
|
@@ -239,10 +233,8 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
239
233
|
const errors = [];
|
|
240
234
|
|
|
241
235
|
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
|
-
);
|
|
236
|
+
if (!taskId || typeof taskId !== 'string') {
|
|
237
|
+
errors.push(`WorkerRequest[${index}]: 'task_id' must be a non-empty string.`);
|
|
246
238
|
}
|
|
247
239
|
|
|
248
240
|
const reqType = req.type;
|
|
@@ -253,7 +245,7 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
253
245
|
}
|
|
254
246
|
|
|
255
247
|
const agent = req.agent;
|
|
256
|
-
if (!agent || typeof agent !==
|
|
248
|
+
if (!agent || typeof agent !== 'string') {
|
|
257
249
|
errors.push(`WorkerRequest[${index}]: 'agent' must be a non-empty string.`);
|
|
258
250
|
} else {
|
|
259
251
|
const agentFile = path.join(agentsDir, `${agent}.md`);
|
|
@@ -265,7 +257,7 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
265
257
|
}
|
|
266
258
|
|
|
267
259
|
const goal = req.goal;
|
|
268
|
-
if (!goal || typeof goal !==
|
|
260
|
+
if (!goal || typeof goal !== 'string') {
|
|
269
261
|
errors.push(`WorkerRequest[${index}]: 'goal' must be a non-empty string.`);
|
|
270
262
|
} else if (goal.length > MAX_GOAL_LENGTH) {
|
|
271
263
|
errors.push(
|
|
@@ -274,10 +266,8 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
274
266
|
}
|
|
275
267
|
|
|
276
268
|
const context = req.context;
|
|
277
|
-
if (!context || typeof context !==
|
|
278
|
-
errors.push(
|
|
279
|
-
`WorkerRequest[${index}]: 'context' must be a non-empty string.`,
|
|
280
|
-
);
|
|
269
|
+
if (!context || typeof context !== 'string') {
|
|
270
|
+
errors.push(`WorkerRequest[${index}]: 'context' must be a non-empty string.`);
|
|
281
271
|
} else if (context.length > MAX_CONTEXT_LENGTH) {
|
|
282
272
|
errors.push(
|
|
283
273
|
`WorkerRequest[${index}]: 'context' exceeds ${MAX_CONTEXT_LENGTH} characters (${context.length} chars). Trim to minimal required context only.`,
|
|
@@ -287,7 +277,7 @@ function validateWorkerRequest(req, index, agentsDir) {
|
|
|
287
277
|
const maxRetries = req.max_retries;
|
|
288
278
|
if (maxRetries !== undefined) {
|
|
289
279
|
if (
|
|
290
|
-
typeof maxRetries !==
|
|
280
|
+
typeof maxRetries !== 'number' ||
|
|
291
281
|
!Number.isInteger(maxRetries) ||
|
|
292
282
|
maxRetries < 1 ||
|
|
293
283
|
maxRetries > 3
|
|
@@ -305,14 +295,12 @@ function validateWorkerResult(res, index) {
|
|
|
305
295
|
const errors = [];
|
|
306
296
|
|
|
307
297
|
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
|
-
);
|
|
298
|
+
if (!taskId || typeof taskId !== 'string') {
|
|
299
|
+
errors.push(`WorkerResult[${index}]: 'task_id' must be a non-empty string.`);
|
|
312
300
|
}
|
|
313
301
|
|
|
314
302
|
const agent = res.agent;
|
|
315
|
-
if (!agent || typeof agent !==
|
|
303
|
+
if (!agent || typeof agent !== 'string') {
|
|
316
304
|
errors.push(`WorkerResult[${index}]: 'agent' must be a non-empty string.`);
|
|
317
305
|
}
|
|
318
306
|
|
|
@@ -325,12 +313,10 @@ function validateWorkerResult(res, index) {
|
|
|
325
313
|
|
|
326
314
|
const output = res.output;
|
|
327
315
|
const error = res.error;
|
|
328
|
-
if (status ===
|
|
329
|
-
errors.push(
|
|
330
|
-
`WorkerResult[${index}]: 'output' is required when status is 'success'.`,
|
|
331
|
-
);
|
|
316
|
+
if (status === 'success' && !output) {
|
|
317
|
+
errors.push(`WorkerResult[${index}]: 'output' is required when status is 'success'.`);
|
|
332
318
|
}
|
|
333
|
-
if ((status ===
|
|
319
|
+
if ((status === 'failure' || status === 'escalate') && !error) {
|
|
334
320
|
errors.push(
|
|
335
321
|
`WorkerResult[${index}]: 'error' is required when status is '${status}'. Be specific — 'Something went wrong' is not acceptable.`,
|
|
336
322
|
);
|
|
@@ -338,30 +324,33 @@ function validateWorkerResult(res, index) {
|
|
|
338
324
|
|
|
339
325
|
const attempts = res.attempts;
|
|
340
326
|
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
|
-
);
|
|
327
|
+
if (typeof attempts !== 'number' || !Number.isInteger(attempts) || attempts < 1) {
|
|
328
|
+
errors.push(`WorkerResult[${index}]: 'attempts' must be an integer >= 1, got '${attempts}'.`);
|
|
349
329
|
}
|
|
350
330
|
}
|
|
351
331
|
|
|
352
332
|
return errors;
|
|
353
333
|
}
|
|
354
334
|
|
|
355
|
-
function validateSwarmPayload(payloadData, agentsDir, payloadFile = null) {
|
|
335
|
+
function validateSwarmPayload(payloadData, agentsDir, payloadFile = null, opts = {}) {
|
|
336
|
+
let resolvedAgentsDir = agentsDir;
|
|
337
|
+
let quiet = false;
|
|
338
|
+
|
|
339
|
+
if (typeof agentsDir === 'object' && agentsDir !== null && typeof agentsDir !== 'string') {
|
|
340
|
+
quiet = !!(agentsDir.quiet || agentsDir.silent);
|
|
341
|
+
resolvedAgentsDir = agentsDir.agentsDir || null;
|
|
342
|
+
}
|
|
343
|
+
if (opts && (opts.quiet || opts.silent)) quiet = true;
|
|
344
|
+
|
|
356
345
|
if (payloadFile) {
|
|
357
|
-
const nativeResult = nativeValidate(payloadFile,
|
|
346
|
+
const nativeResult = nativeValidate(payloadFile, 'swarm');
|
|
358
347
|
if (nativeResult === true) {
|
|
359
348
|
return true;
|
|
360
349
|
}
|
|
361
350
|
}
|
|
362
351
|
|
|
363
352
|
let items;
|
|
364
|
-
if (typeof payloadData ===
|
|
353
|
+
if (typeof payloadData === 'object' && payloadData !== null) {
|
|
365
354
|
if (Array.isArray(payloadData)) {
|
|
366
355
|
items = payloadData;
|
|
367
356
|
} else if (payloadData.workers && Array.isArray(payloadData.workers)) {
|
|
@@ -370,38 +359,42 @@ function validateSwarmPayload(payloadData, agentsDir, payloadFile = null) {
|
|
|
370
359
|
items = [payloadData];
|
|
371
360
|
}
|
|
372
361
|
} else {
|
|
373
|
-
console.error(
|
|
362
|
+
if (!quiet) console.error('ERROR: Swarm payload must be a JSON object or array.');
|
|
374
363
|
return false;
|
|
375
364
|
}
|
|
376
365
|
|
|
377
366
|
if (items.length > MAX_WORKERS_PER_SWARM) {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
367
|
+
if (!quiet) {
|
|
368
|
+
console.error(
|
|
369
|
+
`ERROR: Swarm payload contains ${items.length} workers, exceeding the maximum of ${MAX_WORKERS_PER_SWARM}.`,
|
|
370
|
+
);
|
|
371
|
+
}
|
|
381
372
|
return false;
|
|
382
373
|
}
|
|
383
374
|
|
|
384
375
|
const allErrors = [];
|
|
385
376
|
for (let i = 0; i < items.length; i++) {
|
|
386
377
|
const item = items[i];
|
|
387
|
-
if (typeof item !==
|
|
378
|
+
if (typeof item !== 'object' || item === null) {
|
|
388
379
|
allErrors.push(`Item[${i}]: must be a JSON object.`);
|
|
389
380
|
continue;
|
|
390
381
|
}
|
|
391
382
|
|
|
392
383
|
let errors;
|
|
393
|
-
if (
|
|
384
|
+
if ('status' in item && 'output' in item) {
|
|
394
385
|
errors = validateWorkerResult(item, i);
|
|
395
386
|
} else {
|
|
396
|
-
errors = validateWorkerRequest(item, i,
|
|
387
|
+
errors = validateWorkerRequest(item, i, resolvedAgentsDir);
|
|
397
388
|
}
|
|
398
389
|
|
|
399
390
|
allErrors.push(...errors);
|
|
400
391
|
}
|
|
401
392
|
|
|
402
393
|
if (allErrors.length > 0) {
|
|
403
|
-
|
|
404
|
-
|
|
394
|
+
if (!quiet) {
|
|
395
|
+
for (const err of allErrors) {
|
|
396
|
+
console.error(`ERROR: ${err}`);
|
|
397
|
+
}
|
|
405
398
|
}
|
|
406
399
|
return false;
|
|
407
400
|
}
|
|
@@ -415,32 +408,32 @@ function main() {
|
|
|
415
408
|
const args = process.argv.slice(2);
|
|
416
409
|
let payload = null;
|
|
417
410
|
let file = null;
|
|
418
|
-
let workspace =
|
|
419
|
-
let mode =
|
|
411
|
+
let workspace = '.';
|
|
412
|
+
let mode = 'legacy';
|
|
420
413
|
let useTui = false;
|
|
421
414
|
|
|
422
415
|
for (let i = 0; i < args.length; i++) {
|
|
423
416
|
const arg = args[i];
|
|
424
|
-
if (arg ===
|
|
417
|
+
if (arg === '--payload' && i + 1 < args.length) {
|
|
425
418
|
payload = args[++i];
|
|
426
|
-
} else if (arg ===
|
|
419
|
+
} else if (arg === '--file' && i + 1 < args.length) {
|
|
427
420
|
file = args[++i];
|
|
428
|
-
} else if (arg ===
|
|
421
|
+
} else if (arg === '--workspace' && i + 1 < args.length) {
|
|
429
422
|
workspace = args[++i];
|
|
430
|
-
} else if (arg ===
|
|
423
|
+
} else if (arg === '--mode' && i + 1 < args.length) {
|
|
431
424
|
mode = args[++i];
|
|
432
|
-
} else if (arg ===
|
|
425
|
+
} else if (arg === '--tui') {
|
|
433
426
|
useTui = true;
|
|
434
|
-
} else if (arg ===
|
|
427
|
+
} else if (arg === '-h' || arg === '--help') {
|
|
435
428
|
console.log(
|
|
436
|
-
|
|
429
|
+
'Usage: swarm_dispatcher.js [--payload <json>] [--file <path>] [--workspace <dir>] [--mode legacy|swarm] [--tui]',
|
|
437
430
|
);
|
|
438
431
|
process.exit(0);
|
|
439
432
|
}
|
|
440
433
|
}
|
|
441
434
|
|
|
442
435
|
if (!payload && !file) {
|
|
443
|
-
console.error(
|
|
436
|
+
console.error('ERROR: Must provide either --payload or --file');
|
|
444
437
|
process.exit(1);
|
|
445
438
|
}
|
|
446
439
|
|
|
@@ -448,24 +441,20 @@ function main() {
|
|
|
448
441
|
const agentDir = findAgentDir(workspaceRoot);
|
|
449
442
|
|
|
450
443
|
if (!agentDir) {
|
|
451
|
-
console.error(
|
|
452
|
-
`ERROR: Could not find .agent directory starting from ${workspaceRoot}`,
|
|
453
|
-
);
|
|
444
|
+
console.error(`ERROR: Could not find .agent directory starting from ${workspaceRoot}`);
|
|
454
445
|
process.exit(1);
|
|
455
446
|
}
|
|
456
447
|
|
|
457
|
-
const agentsDir = path.join(agentDir,
|
|
448
|
+
const agentsDir = path.join(agentDir, 'agents');
|
|
458
449
|
if (!fs.existsSync(agentsDir)) {
|
|
459
|
-
console.error(
|
|
460
|
-
`ERROR: Could not find 'agents' directory inside ${agentDir}`,
|
|
461
|
-
);
|
|
450
|
+
console.error(`ERROR: Could not find 'agents' directory inside ${agentDir}`);
|
|
462
451
|
process.exit(1);
|
|
463
452
|
}
|
|
464
453
|
|
|
465
454
|
let payloadData;
|
|
466
455
|
try {
|
|
467
456
|
if (file) {
|
|
468
|
-
payloadData = JSON.parse(fs.readFileSync(file,
|
|
457
|
+
payloadData = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
469
458
|
} else {
|
|
470
459
|
payloadData = JSON.parse(payload);
|
|
471
460
|
}
|
|
@@ -474,17 +463,17 @@ function main() {
|
|
|
474
463
|
process.exit(1);
|
|
475
464
|
}
|
|
476
465
|
|
|
477
|
-
if (mode ===
|
|
466
|
+
if (mode === 'swarm') {
|
|
478
467
|
if (!validateSwarmPayload(payloadData, agentsDir, file)) {
|
|
479
|
-
console.error(
|
|
468
|
+
console.error('ERROR: Swarm payload validation failed.');
|
|
480
469
|
process.exit(1);
|
|
481
470
|
}
|
|
482
471
|
|
|
483
|
-
let astContext =
|
|
472
|
+
let astContext = '';
|
|
484
473
|
try {
|
|
485
474
|
const res = execSync(`python -m code_review_graph review-delta`, {
|
|
486
475
|
cwd: workspaceRoot,
|
|
487
|
-
stdio:
|
|
476
|
+
stdio: 'pipe',
|
|
488
477
|
})
|
|
489
478
|
.toString()
|
|
490
479
|
.trim();
|
|
@@ -497,16 +486,14 @@ function main() {
|
|
|
497
486
|
|
|
498
487
|
if (astContext) {
|
|
499
488
|
const items =
|
|
500
|
-
typeof payloadData ===
|
|
501
|
-
payloadData !== null &&
|
|
502
|
-
payloadData.workers
|
|
489
|
+
typeof payloadData === 'object' && payloadData !== null && payloadData.workers
|
|
503
490
|
? payloadData.workers
|
|
504
491
|
: Array.isArray(payloadData)
|
|
505
492
|
? payloadData
|
|
506
493
|
: [payloadData];
|
|
507
494
|
|
|
508
495
|
for (const item of items) {
|
|
509
|
-
if (item &&
|
|
496
|
+
if (item && 'context' in item) {
|
|
510
497
|
item.context += astContext;
|
|
511
498
|
}
|
|
512
499
|
}
|
|
@@ -514,9 +501,7 @@ function main() {
|
|
|
514
501
|
|
|
515
502
|
if (useTui) {
|
|
516
503
|
const workers =
|
|
517
|
-
typeof payloadData ===
|
|
518
|
-
payloadData !== null &&
|
|
519
|
-
payloadData.workers
|
|
504
|
+
typeof payloadData === 'object' && payloadData !== null && payloadData.workers
|
|
520
505
|
? payloadData.workers
|
|
521
506
|
: Array.isArray(payloadData)
|
|
522
507
|
? payloadData
|
|
@@ -526,34 +511,26 @@ function main() {
|
|
|
526
511
|
dashboard.start();
|
|
527
512
|
|
|
528
513
|
// Simulate parallel execution for demo/UX purposes
|
|
529
|
-
setTimeout(
|
|
530
|
-
() => dashboard.updateStatus(0, "Researching", "\x1b[36m"),
|
|
531
|
-
1000,
|
|
532
|
-
);
|
|
514
|
+
setTimeout(() => dashboard.updateStatus(0, 'Researching', '\x1b[36m'), 1000);
|
|
533
515
|
setTimeout(() => {
|
|
534
|
-
if (workers.length > 1)
|
|
535
|
-
dashboard.updateStatus(1, "Generating", "\x1b[35m");
|
|
516
|
+
if (workers.length > 1) dashboard.updateStatus(1, 'Generating', '\x1b[35m');
|
|
536
517
|
}, 1500);
|
|
537
518
|
|
|
538
519
|
setTimeout(() => {
|
|
539
|
-
workers.forEach((w, i) =>
|
|
540
|
-
dashboard.updateStatus(i, "✔ Done", "\x1b[32m"),
|
|
541
|
-
);
|
|
520
|
+
workers.forEach((w, i) => dashboard.updateStatus(i, '✔ Done', '\x1b[32m'));
|
|
542
521
|
dashboard.stop();
|
|
543
|
-
console.log(
|
|
544
|
-
"\n\x1b[32m✔ Swarm validation complete. Ready for dispatch.\x1b[0m\n",
|
|
545
|
-
);
|
|
522
|
+
console.log('\n\x1b[32m✔ Swarm validation complete. Ready for dispatch.\x1b[0m\n');
|
|
546
523
|
}, 3000);
|
|
547
524
|
} else {
|
|
548
|
-
console.log(
|
|
525
|
+
console.log('INFO: Swarm payload validation successful.');
|
|
549
526
|
if (astContext) {
|
|
550
|
-
console.log(
|
|
527
|
+
console.log('--- ENRICHED SWARM PAYLOAD ---');
|
|
551
528
|
console.log(JSON.stringify(payloadData, null, 2));
|
|
552
529
|
}
|
|
553
530
|
}
|
|
554
531
|
} else {
|
|
555
532
|
if (!validatePayload(payloadData, workspaceRoot, agentsDir, file)) {
|
|
556
|
-
console.error(
|
|
533
|
+
console.error('ERROR: Payload validation failed.');
|
|
557
534
|
process.exit(1);
|
|
558
535
|
}
|
|
559
536
|
|
|
@@ -563,26 +540,18 @@ function main() {
|
|
|
563
540
|
dashboard.start();
|
|
564
541
|
|
|
565
542
|
// Simulate parallel execution for demo/UX purposes
|
|
566
|
-
setTimeout(
|
|
567
|
-
() => dashboard.updateStatus(0, "Researching", "\x1b[36m"),
|
|
568
|
-
1000,
|
|
569
|
-
);
|
|
543
|
+
setTimeout(() => dashboard.updateStatus(0, 'Researching', '\x1b[36m'), 1000);
|
|
570
544
|
setTimeout(() => {
|
|
571
|
-
if (workers.length > 1)
|
|
572
|
-
dashboard.updateStatus(1, "Generating", "\x1b[35m");
|
|
545
|
+
if (workers.length > 1) dashboard.updateStatus(1, 'Generating', '\x1b[35m');
|
|
573
546
|
}, 1500);
|
|
574
547
|
|
|
575
548
|
setTimeout(() => {
|
|
576
|
-
workers.forEach((w, i) =>
|
|
577
|
-
dashboard.updateStatus(i, "✔ Done", "\x1b[32m"),
|
|
578
|
-
);
|
|
549
|
+
workers.forEach((w, i) => dashboard.updateStatus(i, '✔ Done', '\x1b[32m'));
|
|
579
550
|
dashboard.stop();
|
|
580
|
-
console.log(
|
|
581
|
-
"\n\x1b[32m✔ All workers successfully dispatched.\x1b[0m\n",
|
|
582
|
-
);
|
|
551
|
+
console.log('\n\x1b[32m✔ All workers successfully dispatched.\x1b[0m\n');
|
|
583
552
|
}, 3000);
|
|
584
553
|
} else {
|
|
585
|
-
console.log(
|
|
554
|
+
console.log('INFO: Payload validation successful.');
|
|
586
555
|
const prompts = buildWorkerPrompts(payloadData, workspaceRoot);
|
|
587
556
|
|
|
588
557
|
for (let i = 0; i < prompts.length; i++) {
|