tribunal-kit 6.0.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. package/.agent/.manifest.json +78 -0
  2. package/.agent/ARCHITECTURE.md +19 -241
  3. package/.agent/agents/accessibility-reviewer.md +23 -16
  4. package/.agent/agents/ai-code-reviewer.md +25 -21
  5. package/.agent/agents/anti-pattern-reviewer.md +12 -7
  6. package/.agent/agents/api-architect.md +1 -0
  7. package/.agent/agents/backend-specialist.md +23 -22
  8. package/.agent/agents/cloud-engineer.md +1 -0
  9. package/.agent/agents/code-archaeologist.md +1 -0
  10. package/.agent/agents/complexity-reviewer.md +10 -7
  11. package/.agent/agents/database-architect.md +3 -2
  12. package/.agent/agents/db-latency-auditor.md +6 -2
  13. package/.agent/agents/debugger.md +3 -2
  14. package/.agent/agents/dependency-reviewer.md +1 -0
  15. package/.agent/agents/devops-engineer.md +9 -8
  16. package/.agent/agents/documentation-writer.md +6 -5
  17. package/.agent/agents/explorer-agent.md +1 -0
  18. package/.agent/agents/frontend-reviewer.md +21 -17
  19. package/.agent/agents/frontend-specialist.md +23 -20
  20. package/.agent/agents/game-developer.md +1 -0
  21. package/.agent/agents/interaction-reviewer.md +10 -5
  22. package/.agent/agents/logic-reviewer.md +3 -0
  23. package/.agent/agents/minimalist-reviewer.md +6 -0
  24. package/.agent/agents/mobile-developer.md +7 -6
  25. package/.agent/agents/mobile-reviewer.md +14 -13
  26. package/.agent/agents/orchestrator.md +3 -0
  27. package/.agent/agents/penetration-tester.md +1 -0
  28. package/.agent/agents/performance-optimizer.md +6 -5
  29. package/.agent/agents/performance-reviewer.md +6 -6
  30. package/.agent/agents/pipeline-reviewer.md +144 -0
  31. package/.agent/agents/precedence-reviewer.md +1 -0
  32. package/.agent/agents/product-manager.md +1 -0
  33. package/.agent/agents/product-owner.md +1 -0
  34. package/.agent/agents/product-reviewer.md +12 -7
  35. package/.agent/agents/project-planner.md +3 -0
  36. package/.agent/agents/qa-automation-engineer.md +50 -43
  37. package/.agent/agents/resilience-reviewer.md +1 -0
  38. package/.agent/agents/schema-reviewer.md +1 -0
  39. package/.agent/agents/security-auditor.md +24 -24
  40. package/.agent/agents/seo-specialist.md +33 -23
  41. package/.agent/agents/sql-reviewer.md +5 -4
  42. package/.agent/agents/supervisor-agent.md +12 -2
  43. package/.agent/agents/swarm-worker-contracts.md +13 -13
  44. package/.agent/agents/swarm-worker-registry.md +51 -51
  45. package/.agent/agents/system-architect.md +1 -0
  46. package/.agent/agents/test-coverage-reviewer.md +25 -22
  47. package/.agent/agents/test-engineer.md +12 -11
  48. package/.agent/agents/throughput-optimizer.md +45 -40
  49. package/.agent/agents/type-safety-reviewer.md +5 -4
  50. package/.agent/agents/ui-ux-auditor.md +6 -4
  51. package/.agent/agents/ui-visual-auditor.md +3 -0
  52. package/.agent/agents/ux-reviewer.md +11 -6
  53. package/.agent/agents/visual-reviewer.md +11 -6
  54. package/.agent/agents/vitals-reviewer.md +5 -4
  55. package/.agent/history/memory/.memory.idx +3716 -1
  56. package/.agent/history/memory/MEMORY.md +246 -1
  57. package/.agent/mcp_config.json +1 -6
  58. package/.agent/routing_index.json +2034 -263
  59. package/.agent/rules/GEMINI.md +12 -10
  60. package/.agent/rules/GEMINI_PLANNER.md +19 -21
  61. package/.agent/scripts/_colors.js +52 -54
  62. package/.agent/scripts/_utils.js +52 -53
  63. package/.agent/scripts/auto_preview.js +39 -43
  64. package/.agent/scripts/bundle_analyzer.js +47 -60
  65. package/.agent/scripts/case_law_manager.js +200 -294
  66. package/.agent/scripts/checklist.js +73 -94
  67. package/.agent/scripts/cicd_validator.js +305 -0
  68. package/.agent/scripts/compile_router.py +4 -111
  69. package/.agent/scripts/context_broker.js +317 -412
  70. package/.agent/scripts/contract_engine.js +402 -0
  71. package/.agent/scripts/dependency_analyzer.js +112 -124
  72. package/.agent/scripts/graph_builder.js +75 -103
  73. package/.agent/scripts/graph_visualizer.js +10 -12
  74. package/.agent/scripts/graph_zoom.js +38 -55
  75. package/.agent/scripts/guardrail_engine.js +195 -145
  76. package/.agent/scripts/impact_classifier.js +55 -30
  77. package/.agent/scripts/inner_loop_validator.js +108 -159
  78. package/.agent/scripts/integrity_manifest.js +59 -67
  79. package/.agent/scripts/lint_runner.js +65 -75
  80. package/.agent/scripts/marathon_harness.js +131 -208
  81. package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
  82. package/.agent/scripts/minify_context.js +29 -33
  83. package/.agent/scripts/minimal_change_engine.js +95 -87
  84. package/.agent/scripts/mutation_runner.js +46 -62
  85. package/.agent/scripts/pipeline_engine.js +320 -209
  86. package/.agent/scripts/prompt_compiler.js +118 -93
  87. package/.agent/scripts/schema_validator.js +73 -121
  88. package/.agent/scripts/security_scan.js +88 -117
  89. package/.agent/scripts/session_manager.js +52 -69
  90. package/.agent/scripts/signal_detector.js +24 -22
  91. package/.agent/scripts/skill_evolution.js +184 -245
  92. package/.agent/scripts/skill_integrator.js +35 -48
  93. package/.agent/scripts/socratic_gate_policy.js +15 -12
  94. package/.agent/scripts/strengthen_skills.js +29 -33
  95. package/.agent/scripts/swarm_dispatcher.js +120 -151
  96. package/.agent/scripts/test_runner.js +54 -56
  97. package/.agent/scripts/token_budget_broker.js +9 -7
  98. package/.agent/scripts/trace_engine.js +126 -0
  99. package/.agent/scripts/verify_all.js +76 -93
  100. package/.agent/scripts/visual_audit.js +16 -21
  101. package/.agent/skill_topic_map.json +237 -0
  102. package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
  103. package/.agent/skills/60fps-animation/SKILL.md +7 -0
  104. package/.agent/skills/accessible-animation/SKILL.md +5 -1
  105. package/.agent/skills/adapt/SKILL.md +7 -1
  106. package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
  107. package/.agent/skills/agent-organizer/SKILL.md +1 -0
  108. package/.agent/skills/agentic-patterns/SKILL.md +33 -25
  109. package/.agent/skills/agentic-workflows-2026/SKILL.md +80 -0
  110. package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
  111. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
  112. package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
  113. package/.agent/skills/animation-systems/SKILL.md +11 -10
  114. package/.agent/skills/antfu-conventions/SKILL.md +7 -2
  115. package/.agent/skills/api-patterns/SKILL.md +14 -10
  116. package/.agent/skills/api-security-auditor/SKILL.md +15 -14
  117. package/.agent/skills/app-builder/SKILL.md +1 -0
  118. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
  119. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
  120. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
  121. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
  122. package/.agent/skills/apple-design/SKILL.md +8 -7
  123. package/.agent/skills/architecture/SKILL.md +3 -2
  124. package/.agent/skills/audit-and-fix/SKILL.md +8 -5
  125. package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
  126. package/.agent/skills/backend-security-expert/SKILL.md +1 -0
  127. package/.agent/skills/baseline-ui/SKILL.md +8 -7
  128. package/.agent/skills/bash-linux/SKILL.md +1 -0
  129. package/.agent/skills/behavioral-modes/SKILL.md +1 -0
  130. package/.agent/skills/better-colors/SKILL.md +11 -7
  131. package/.agent/skills/better-typography/SKILL.md +30 -16
  132. package/.agent/skills/better-ui/SKILL.md +17 -10
  133. package/.agent/skills/bolder/SKILL.md +6 -0
  134. package/.agent/skills/brainstorming/SKILL.md +6 -4
  135. package/.agent/skills/browser-native-ai/SKILL.md +5 -4
  136. package/.agent/skills/build-primitive/SKILL.md +5 -0
  137. package/.agent/skills/building-native-ui/SKILL.md +1 -0
  138. package/.agent/skills/cicd-pro/SKILL.md +2 -1
  139. package/.agent/skills/clarify/SKILL.md +19 -14
  140. package/.agent/skills/clean-code/SKILL.md +16 -15
  141. package/.agent/skills/cloud-architect/SKILL.md +1 -0
  142. package/.agent/skills/cobejs/SKILL.md +7 -9
  143. package/.agent/skills/code-review-checklist/SKILL.md +1 -0
  144. package/.agent/skills/codebase-design/SKILL.md +7 -2
  145. package/.agent/skills/colorize/SKILL.md +8 -3
  146. package/.agent/skills/compact-landing/SKILL.md +8 -3
  147. package/.agent/skills/company-logos/SKILL.md +6 -0
  148. package/.agent/skills/config-validator/SKILL.md +10 -9
  149. package/.agent/skills/containerization-pro/SKILL.md +6 -5
  150. package/.agent/skills/context-engineering-pro/SKILL.md +70 -0
  151. package/.agent/skills/create-design-md/SKILL.md +13 -5
  152. package/.agent/skills/critique/SKILL.md +10 -8
  153. package/.agent/skills/csharp-developer/SKILL.md +1 -0
  154. package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
  155. package/.agent/skills/database-design/SKILL.md +2 -1
  156. package/.agent/skills/delight/SKILL.md +6 -0
  157. package/.agent/skills/deployment-procedures/SKILL.md +2 -1
  158. package/.agent/skills/design-lab/SKILL.md +5 -0
  159. package/.agent/skills/devops-engineer/SKILL.md +3 -2
  160. package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
  161. package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
  162. package/.agent/skills/distill/SKILL.md +7 -2
  163. package/.agent/skills/documentation-templates/SKILL.md +3 -2
  164. package/.agent/skills/domain-modeling/SKILL.md +12 -4
  165. package/.agent/skills/duckdb-analytical-sql/SKILL.md +59 -0
  166. package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
  167. package/.agent/skills/edge-computing/SKILL.md +9 -8
  168. package/.agent/skills/emil-design-eng/SKILL.md +43 -27
  169. package/.agent/skills/error-resilience/SKILL.md +34 -16
  170. package/.agent/skills/expo-router-v4/SKILL.md +81 -0
  171. package/.agent/skills/extract-design-system/SKILL.md +12 -11
  172. package/.agent/skills/fabel-protocol/SKILL.md +24 -17
  173. package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
  174. package/.agent/skills/fixing-metadata/SKILL.md +24 -13
  175. package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
  176. package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
  177. package/.agent/skills/frontend-design/SKILL.md +21 -13
  178. package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
  179. package/.agent/skills/game-design-expert/SKILL.md +1 -0
  180. package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
  181. package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
  182. package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
  183. package/.agent/skills/git-pro/SKILL.md +10 -9
  184. package/.agent/skills/github-operations/SKILL.md +2 -1
  185. package/.agent/skills/gpt-taste/SKILL.md +7 -0
  186. package/.agent/skills/gsap-core/SKILL.md +26 -22
  187. package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
  188. package/.agent/skills/gsap-performance/SKILL.md +4 -3
  189. package/.agent/skills/gsap-plugins/SKILL.md +34 -33
  190. package/.agent/skills/gsap-react/SKILL.md +9 -8
  191. package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
  192. package/.agent/skills/gsap-timeline/SKILL.md +18 -15
  193. package/.agent/skills/gsap-utils/SKILL.md +25 -24
  194. package/.agent/skills/harden/SKILL.md +9 -3
  195. package/.agent/skills/harness-protocol/SKILL.md +1 -0
  196. package/.agent/skills/i18n-localization/SKILL.md +10 -9
  197. package/.agent/skills/impeccable/SKILL.md +5 -0
  198. package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
  199. package/.agent/skills/improve-ui/SKILL.md +12 -5
  200. package/.agent/skills/intelligent-routing/SKILL.md +7 -6
  201. package/.agent/skills/knowledge-graph/SKILL.md +1 -0
  202. package/.agent/skills/landing-page/SKILL.md +1 -0
  203. package/.agent/skills/lint-and-validate/SKILL.md +9 -4
  204. package/.agent/skills/llm-engineering/SKILL.md +55 -54
  205. package/.agent/skills/local-first/SKILL.md +20 -19
  206. package/.agent/skills/local-first-architecture/SKILL.md +6 -1
  207. package/.agent/skills/lottie-animation/SKILL.md +7 -3
  208. package/.agent/skills/marquee-loop/SKILL.md +1 -0
  209. package/.agent/skills/masked-reveal/SKILL.md +17 -4
  210. package/.agent/skills/mcp-builder/SKILL.md +13 -10
  211. package/.agent/skills/micro-interaction/SKILL.md +20 -5
  212. package/.agent/skills/mobile-design/SKILL.md +26 -15
  213. package/.agent/skills/monorepo-management/SKILL.md +3 -2
  214. package/.agent/skills/morphing-icons/SKILL.md +16 -6
  215. package/.agent/skills/motion-engineering/SKILL.md +19 -15
  216. package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
  217. package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
  218. package/.agent/skills/observability/SKILL.md +45 -44
  219. package/.agent/skills/opentelemetry-observability/SKILL.md +59 -0
  220. package/.agent/skills/page-transition-animation/SKILL.md +6 -3
  221. package/.agent/skills/parallel-agents/SKILL.md +7 -2
  222. package/.agent/skills/performance-profiling/SKILL.md +24 -13
  223. package/.agent/skills/plan-writing/SKILL.md +1 -0
  224. package/.agent/skills/platform-engineer/SKILL.md +3 -2
  225. package/.agent/skills/platform-engineering-opentofu/SKILL.md +68 -0
  226. package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
  227. package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
  228. package/.agent/skills/polish/SKILL.md +13 -12
  229. package/.agent/skills/powershell-windows/SKILL.md +1 -0
  230. package/.agent/skills/pricing-page/SKILL.md +8 -3
  231. package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
  232. package/.agent/skills/progressive-blur/SKILL.md +9 -4
  233. package/.agent/skills/project-idioms/SKILL.md +1 -0
  234. package/.agent/skills/property-based-testing/SKILL.md +58 -0
  235. package/.agent/skills/python-patterns/SKILL.md +1 -0
  236. package/.agent/skills/python-pro/SKILL.md +1 -0
  237. package/.agent/skills/quieter/SKILL.md +6 -0
  238. package/.agent/skills/react-doctor/SKILL.md +6 -0
  239. package/.agent/skills/react-specialist/SKILL.md +32 -28
  240. package/.agent/skills/readme-builder/SKILL.md +1 -0
  241. package/.agent/skills/realtime-patterns/SKILL.md +34 -33
  242. package/.agent/skills/red-team-tactics/SKILL.md +1 -0
  243. package/.agent/skills/redesign-skill/SKILL.md +6 -0
  244. package/.agent/skills/review-animations/SKILL.md +5 -2
  245. package/.agent/skills/review-animations/STANDARDS.md +37 -23
  246. package/.agent/skills/rust-pro/SKILL.md +1 -0
  247. package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
  248. package/.agent/skills/server-management/SKILL.md +1 -0
  249. package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
  250. package/.agent/skills/shape/SKILL.md +9 -2
  251. package/.agent/skills/skill-creator/SKILL.md +1 -0
  252. package/.agent/skills/soft-skill/SKILL.md +6 -0
  253. package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
  254. package/.agent/skills/sql-pro/SKILL.md +1 -0
  255. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
  256. package/.agent/skills/svg-animation/SKILL.md +16 -7
  257. package/.agent/skills/swiftui-expert/SKILL.md +1 -0
  258. package/.agent/skills/swiss-design/SKILL.md +5 -0
  259. package/.agent/skills/system-design-pro/SKILL.md +1 -0
  260. package/.agent/skills/systematic-debugging/SKILL.md +1 -0
  261. package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
  262. package/.agent/skills/taste-skill/SKILL.md +6 -0
  263. package/.agent/skills/tdd-workflow/SKILL.md +5 -0
  264. package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
  265. package/.agent/skills/testing-patterns/SKILL.md +123 -115
  266. package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
  267. package/.agent/skills/thinking-protocol/SKILL.md +3 -0
  268. package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
  269. package/.agent/skills/transitions-dev/SKILL.md +19 -6
  270. package/.agent/skills/trend-researcher/SKILL.md +1 -0
  271. package/.agent/skills/typescript-advanced/SKILL.md +23 -18
  272. package/.agent/skills/typeset/SKILL.md +10 -1
  273. package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
  274. package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
  275. package/.agent/skills/ui-skills-root/SKILL.md +39 -38
  276. package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
  277. package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
  278. package/.agent/skills/vector-search-pgvector/SKILL.md +78 -0
  279. package/.agent/skills/vue-expert/SKILL.md +22 -19
  280. package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
  281. package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
  282. package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
  283. package/.agent/skills/web-quality-audit/SKILL.md +5 -0
  284. package/.agent/skills/webapp-testing/SKILL.md +14 -13
  285. package/.agent/skills/webgpu-performance/SKILL.md +1 -0
  286. package/.agent/skills/whimsy-injector/SKILL.md +9 -5
  287. package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
  288. package/.agent/skills/zero-trust-passkeys/SKILL.md +90 -0
  289. package/.agent/templates/DESIGN.md +119 -110
  290. package/.agent/templates/design-tokens.json +9 -6
  291. package/.agent/workflows/acf.md +1 -0
  292. package/.agent/workflows/api-tester.md +1 -0
  293. package/.agent/workflows/audit.md +1 -0
  294. package/.agent/workflows/brainstorm.md +1 -0
  295. package/.agent/workflows/changelog.md +1 -0
  296. package/.agent/workflows/contract.md +60 -0
  297. package/.agent/workflows/create.md +1 -0
  298. package/.agent/workflows/debug.md +1 -0
  299. package/.agent/workflows/deploy.md +1 -0
  300. package/.agent/workflows/enhance.md +1 -0
  301. package/.agent/workflows/fix-ci.md +89 -0
  302. package/.agent/workflows/fix.md +1 -0
  303. package/.agent/workflows/generate.md +1 -0
  304. package/.agent/workflows/marathon.md +1 -0
  305. package/.agent/workflows/migrate.md +1 -0
  306. package/.agent/workflows/minimal.md +9 -7
  307. package/.agent/workflows/orchestrate.md +1 -0
  308. package/.agent/workflows/performance-benchmarker.md +1 -0
  309. package/.agent/workflows/pipeline.md +26 -21
  310. package/.agent/workflows/plan.md +1 -0
  311. package/.agent/workflows/preview.md +1 -0
  312. package/.agent/workflows/refactor.md +3 -2
  313. package/.agent/workflows/review-ai.md +4 -3
  314. package/.agent/workflows/review.md +1 -0
  315. package/.agent/workflows/session.md +1 -0
  316. package/.agent/workflows/status.md +1 -0
  317. package/.agent/workflows/strengthen-skills.md +1 -0
  318. package/.agent/workflows/super-prompt.md +1 -0
  319. package/.agent/workflows/swarm.md +15 -3
  320. package/.agent/workflows/test.md +8 -7
  321. package/.agent/workflows/tribunal-backend.md +3 -2
  322. package/.agent/workflows/tribunal-cicd.md +104 -0
  323. package/.agent/workflows/tribunal-database.md +1 -0
  324. package/.agent/workflows/tribunal-frontend.md +8 -6
  325. package/.agent/workflows/tribunal-full.md +15 -14
  326. package/.agent/workflows/tribunal-mobile.md +6 -5
  327. package/.agent/workflows/tribunal-performance.md +1 -0
  328. package/.agent/workflows/tribunal-speed.md +1 -0
  329. package/.agent/workflows/tribunal-ui.md +29 -21
  330. package/.agent/workflows/ui-ux-pro-max.md +19 -15
  331. package/CONTRIBUTING.md +3 -3
  332. package/README.md +160 -88
  333. package/SECURITY.md +11 -11
  334. package/bin/mcp-server.js +512 -233
  335. package/bin/tribunal-kit.js +29 -30
  336. package/bin/wrapper.js +45 -48
  337. package/dist/cli.js +26 -0
  338. package/dist/commands/case.js +2 -0
  339. package/dist/commands/contract.js +440 -0
  340. package/dist/commands/memory.js +3 -2
  341. package/dist/commands/native.js +36 -0
  342. package/dist/commands/status.js +6 -0
  343. package/dist/esm/index.mjs +32 -0
  344. package/dist/index.d.ts +58 -3
  345. package/package.json +20 -16
  346. package/scripts/benchmark.js +62 -86
  347. package/scripts/changelog.js +67 -73
  348. package/scripts/fix-vbc.js +13 -15
  349. package/scripts/fix-vbc.ps1 +2 -118
  350. package/scripts/stress_benchmark.js +358 -0
  351. package/scripts/sync-version.js +71 -41
  352. package/scripts/validate-payload.js +23 -30
  353. package/scripts/visual_audit.js +23 -13
@@ -4,22 +4,22 @@
4
4
  * Validate Orchestrator micro-worker payloads (legacy) and Swarm payloads.
5
5
  */
6
6
 
7
- "use strict";
7
+ 'use strict';
8
8
 
9
- const fs = require("fs");
10
- const path = require("path");
11
- const { execSync } = require("child_process");
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((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
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((w) => {
38
- const icon = w.status.includes("Pending")
36
+ this.workers.forEach(w => {
37
+ const icon = w.status.includes('Pending')
39
38
  ? `\x1b[36m${frame}\x1b[0m`
40
- : w.status.includes("Done")
41
- ? "\x1b[32m✔\x1b[0m"
42
- : "\x1b[31m✖\x1b[0m";
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
- "research",
75
- "generate_code",
76
- "review_code",
77
- "debug",
78
- "plan",
79
- "design_schema",
80
- "write_docs",
81
- "security_audit",
82
- "optimize",
83
- "test",
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(["success", "failure", "escalate"]);
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 === "1") return null;
94
- const isWindows = process.platform === "win32";
95
- const ext = isWindows ? ".exe" : "";
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, "..", "..", "tribunal-kit", "target", "release", `tribunal-core${ext}`),
99
- path.resolve(__dirname, "..", "..", "target", "release", `tribunal-core${ext}`),
100
- path.resolve(process.cwd(), "target", "release", `tribunal-core${ext}`),
101
- path.resolve(process.cwd(), "tribunal-kit", "target", "release", `tribunal-core${ext}`),
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("child_process");
114
- const res = spawnSync(bin, ["validate", "--file", file, "--schema", schemaType], {
115
- encoding: "utf-8",
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, ".agent");
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, "micro-worker");
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: "pipe",
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(", ") : "None"}\n`;
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 !== "string") {
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 !== "string") {
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 !== "string") {
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 !== "string") {
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 !== "number" ||
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 !== "string") {
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 !== "string") {
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 === "success" && !output) {
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 === "failure" || status === "escalate") && !error) {
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
- typeof attempts !== "number" ||
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, "swarm");
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 === "object" && payloadData !== null) {
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("ERROR: Swarm payload must be a JSON object or array.");
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
- console.error(
379
- `ERROR: Swarm payload contains ${items.length} workers, exceeding the maximum of ${MAX_WORKERS_PER_SWARM}.`,
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 !== "object" || item === null) {
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 ("status" in item && "output" in item) {
384
+ if ('status' in item && 'output' in item) {
394
385
  errors = validateWorkerResult(item, i);
395
386
  } else {
396
- errors = validateWorkerRequest(item, i, agentsDir);
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
- for (const err of allErrors) {
404
- console.error(`ERROR: ${err}`);
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 = "legacy";
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 === "--payload" && i + 1 < args.length) {
417
+ if (arg === '--payload' && i + 1 < args.length) {
425
418
  payload = args[++i];
426
- } else if (arg === "--file" && i + 1 < args.length) {
419
+ } else if (arg === '--file' && i + 1 < args.length) {
427
420
  file = args[++i];
428
- } else if (arg === "--workspace" && i + 1 < args.length) {
421
+ } else if (arg === '--workspace' && i + 1 < args.length) {
429
422
  workspace = args[++i];
430
- } else if (arg === "--mode" && i + 1 < args.length) {
423
+ } else if (arg === '--mode' && i + 1 < args.length) {
431
424
  mode = args[++i];
432
- } else if (arg === "--tui") {
425
+ } else if (arg === '--tui') {
433
426
  useTui = true;
434
- } else if (arg === "-h" || arg === "--help") {
427
+ } else if (arg === '-h' || arg === '--help') {
435
428
  console.log(
436
- "Usage: swarm_dispatcher.js [--payload <json>] [--file <path>] [--workspace <dir>] [--mode legacy|swarm] [--tui]",
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("ERROR: Must provide either --payload or --file");
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, "agents");
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, "utf8"));
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 === "swarm") {
466
+ if (mode === 'swarm') {
478
467
  if (!validateSwarmPayload(payloadData, agentsDir, file)) {
479
- console.error("ERROR: Swarm payload validation failed.");
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: "pipe",
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 === "object" &&
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 && "context" in 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 === "object" &&
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("INFO: Swarm payload validation successful.");
525
+ console.log('INFO: Swarm payload validation successful.');
549
526
  if (astContext) {
550
- console.log("--- ENRICHED SWARM PAYLOAD ---");
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("ERROR: Payload validation failed.");
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("INFO: Payload validation successful.");
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++) {