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.
Files changed (434) hide show
  1. package/.agent/ARCHITECTURE.md +9 -6
  2. package/.agent/agents/accessibility-reviewer.md +23 -16
  3. package/.agent/agents/ai-code-reviewer.md +25 -21
  4. package/.agent/agents/anti-pattern-reviewer.md +12 -7
  5. package/.agent/agents/api-architect.md +1 -0
  6. package/.agent/agents/backend-specialist.md +23 -22
  7. package/.agent/agents/cloud-engineer.md +1 -0
  8. package/.agent/agents/code-archaeologist.md +1 -0
  9. package/.agent/agents/complexity-reviewer.md +10 -7
  10. package/.agent/agents/database-architect.md +3 -2
  11. package/.agent/agents/db-latency-auditor.md +6 -2
  12. package/.agent/agents/debugger.md +3 -2
  13. package/.agent/agents/dependency-reviewer.md +1 -0
  14. package/.agent/agents/devops-engineer.md +9 -8
  15. package/.agent/agents/documentation-writer.md +6 -5
  16. package/.agent/agents/explorer-agent.md +1 -0
  17. package/.agent/agents/frontend-reviewer.md +21 -17
  18. package/.agent/agents/frontend-specialist.md +23 -20
  19. package/.agent/agents/game-developer.md +1 -0
  20. package/.agent/agents/interaction-reviewer.md +10 -5
  21. package/.agent/agents/logic-reviewer.md +3 -0
  22. package/.agent/agents/minimalist-reviewer.md +6 -0
  23. package/.agent/agents/mobile-developer.md +7 -6
  24. package/.agent/agents/mobile-reviewer.md +14 -13
  25. package/.agent/agents/orchestrator.md +3 -0
  26. package/.agent/agents/penetration-tester.md +1 -0
  27. package/.agent/agents/performance-optimizer.md +6 -5
  28. package/.agent/agents/performance-reviewer.md +6 -6
  29. package/.agent/agents/pipeline-reviewer.md +144 -0
  30. package/.agent/agents/precedence-reviewer.md +1 -0
  31. package/.agent/agents/product-manager.md +1 -0
  32. package/.agent/agents/product-owner.md +1 -0
  33. package/.agent/agents/product-reviewer.md +12 -7
  34. package/.agent/agents/project-planner.md +3 -0
  35. package/.agent/agents/qa-automation-engineer.md +50 -43
  36. package/.agent/agents/resilience-reviewer.md +1 -0
  37. package/.agent/agents/schema-reviewer.md +1 -0
  38. package/.agent/agents/security-auditor.md +24 -24
  39. package/.agent/agents/seo-specialist.md +33 -23
  40. package/.agent/agents/sql-reviewer.md +5 -4
  41. package/.agent/agents/supervisor-agent.md +12 -2
  42. package/.agent/agents/swarm-worker-contracts.md +13 -13
  43. package/.agent/agents/swarm-worker-registry.md +51 -51
  44. package/.agent/agents/system-architect.md +1 -0
  45. package/.agent/agents/test-coverage-reviewer.md +25 -22
  46. package/.agent/agents/test-engineer.md +12 -11
  47. package/.agent/agents/throughput-optimizer.md +45 -40
  48. package/.agent/agents/type-safety-reviewer.md +5 -4
  49. package/.agent/agents/ui-ux-auditor.md +6 -4
  50. package/.agent/agents/ui-visual-auditor.md +3 -0
  51. package/.agent/agents/ux-reviewer.md +11 -6
  52. package/.agent/agents/visual-reviewer.md +11 -6
  53. package/.agent/agents/vitals-reviewer.md +5 -4
  54. package/.agent/config/claude.json +18 -0
  55. package/.agent/config/plugin.json +102 -0
  56. package/.agent/config/slash-commands.json +103 -0
  57. package/.agent/config/specialist-registry.json +415 -0
  58. package/.agent/config/system-prompt.md +191 -0
  59. package/.agent/history/architecture-graph.yaml +302 -3
  60. package/.agent/history/graph-cache.json +515 -45
  61. package/.agent/history/memory/.memory.idx +1532 -1
  62. package/.agent/history/memory/MEMORY.md +102 -1
  63. package/.agent/history/memory.db +0 -0
  64. package/.agent/history/snapshots/bin__adapter-install.js.json +13 -0
  65. package/.agent/history/snapshots/bin__global-store.js.json +15 -0
  66. package/.agent/history/snapshots/bin__mcp-server.js.json +19 -0
  67. package/.agent/history/snapshots/bin__proxy-server.js.json +20 -0
  68. package/.agent/history/snapshots/bin__spawn-agent.js.json +12 -0
  69. package/.agent/history/snapshots/bin__tk-proxy.js.json +21 -0
  70. package/.agent/history/snapshots/bin__tribunal-kit.js.json +9 -7
  71. package/.agent/history/snapshots/bin__wrapper.js.json +14 -0
  72. package/.agent/history/snapshots/eslint.config.js.json +1 -2
  73. package/.agent/history/snapshots/scripts__benchmark.js.json +14 -0
  74. package/.agent/history/snapshots/scripts__changelog.js.json +1 -2
  75. package/.agent/history/snapshots/scripts__fix-vbc.js.json +11 -0
  76. package/.agent/history/snapshots/scripts__stress_benchmark.js.json +15 -0
  77. package/.agent/history/snapshots/scripts__sync-version.js.json +1 -2
  78. package/.agent/history/snapshots/scripts__validate-payload.js.json +1 -2
  79. package/.agent/history/snapshots/scripts__visual_audit.js.json +11 -0
  80. package/.agent/history/snapshots/test__integration__bridges.test.js.json +1 -2
  81. package/.agent/history/snapshots/test__integration__graceful_degradation.test.js.json +12 -0
  82. package/.agent/history/snapshots/test__integration__init.test.js.json +1 -2
  83. package/.agent/history/snapshots/test__integration__minimal_change_pipeline.test.js.json +13 -0
  84. package/.agent/history/snapshots/test__integration__parallel_tribunal.test.js.json +12 -0
  85. package/.agent/history/snapshots/test__integration__routing.test.js.json +1 -2
  86. package/.agent/history/snapshots/test__integration__swarm_dispatcher.test.js.json +1 -2
  87. package/.agent/history/snapshots/test__integration__sync_status.test.js.json +13 -0
  88. package/.agent/history/snapshots/test__integration__wave2.test.js.json +1 -2
  89. package/.agent/history/snapshots/test__integration__wrapper.test.js.json +13 -0
  90. package/.agent/history/snapshots/test__unit__align.test.js.json +10 -0
  91. package/.agent/history/snapshots/test__unit__args.test.js.json +3 -3
  92. package/.agent/history/snapshots/test__unit__audit_release.test.js.json +16 -0
  93. package/.agent/history/snapshots/test__unit__case_law_manager.test.js.json +1 -2
  94. package/.agent/history/snapshots/test__unit__cicd_validator.test.js.json +12 -0
  95. package/.agent/history/snapshots/test__unit__compile.test.js.json +10 -0
  96. package/.agent/history/snapshots/test__unit__context_broker.test.js.json +1 -2
  97. package/.agent/history/snapshots/test__unit__contract_engine.test.js.json +13 -0
  98. package/.agent/history/snapshots/test__unit__copyDir.test.js.json +3 -3
  99. package/.agent/history/snapshots/test__unit__graph_tools.test.js.json +1 -2
  100. package/.agent/history/snapshots/test__unit__guardrail_engine.test.js.json +10 -0
  101. package/.agent/history/snapshots/test__unit__impact_classifier.test.js.json +12 -0
  102. package/.agent/history/snapshots/test__unit__init.test.js.json +14 -0
  103. package/.agent/history/snapshots/test__unit__inner_loop_validator.test.js.json +1 -2
  104. package/.agent/history/snapshots/test__unit__integrity_manifest.test.js.json +13 -0
  105. package/.agent/history/snapshots/test__unit__learn.test.js.json +11 -0
  106. package/.agent/history/snapshots/test__unit__marathon.test.js.json +22 -0
  107. package/.agent/history/snapshots/test__unit__mcp_server.test.js.json +16 -0
  108. package/.agent/history/snapshots/test__unit__memory.test.js.json +13 -0
  109. package/.agent/history/snapshots/test__unit__minimal_change.test.js.json +10 -0
  110. package/.agent/history/snapshots/test__unit__native.test.js.json +10 -0
  111. package/.agent/history/snapshots/test__unit__optimize.test.js.json +13 -0
  112. package/.agent/history/snapshots/test__unit__path_resolution.test.js.json +14 -0
  113. package/.agent/history/snapshots/test__unit__production_readiness_evidence.test.js.json +21 -0
  114. package/.agent/history/snapshots/test__unit__selfInstall.test.js.json +3 -3
  115. package/.agent/history/snapshots/test__unit__semver.test.js.json +3 -3
  116. package/.agent/history/snapshots/test__unit__skill_evolution.test.js.json +11 -0
  117. package/.agent/history/snapshots/test__unit__stress.test.js.json +15 -0
  118. package/.agent/history/snapshots/test__unit__swarm_dispatcher.test.js.json +3 -3
  119. package/.agent/history/snapshots/test__unit__utils.test.js.json +10 -0
  120. package/.agent/mcp_config.json +1 -6
  121. package/.agent/routing_index.json +2033 -263
  122. package/.agent/rules/GEMINI.md +11 -9
  123. package/.agent/rules/GEMINI_PLANNER.md +19 -21
  124. package/.agent/scripts/_colors.js +52 -54
  125. package/.agent/scripts/_utils.js +52 -53
  126. package/.agent/scripts/ast_context_loader.js +137 -0
  127. package/.agent/scripts/auto_preview.js +39 -43
  128. package/.agent/scripts/bundle_analyzer.js +47 -60
  129. package/.agent/scripts/case_law_manager.js +200 -294
  130. package/.agent/scripts/checklist.js +73 -94
  131. package/.agent/scripts/cicd_validator.js +305 -0
  132. package/.agent/scripts/context_broker.js +317 -412
  133. package/.agent/scripts/contract_engine.js +402 -0
  134. package/.agent/scripts/dependency_analyzer.js +112 -124
  135. package/.agent/scripts/graph_builder.js +75 -103
  136. package/.agent/scripts/graph_visualizer.js +10 -12
  137. package/.agent/scripts/graph_zoom.js +38 -55
  138. package/.agent/scripts/guardrail_engine.js +195 -145
  139. package/.agent/scripts/impact_classifier.js +55 -30
  140. package/.agent/scripts/inner_loop_validator.js +108 -159
  141. package/.agent/scripts/integrity_manifest.js +59 -67
  142. package/.agent/scripts/lint_runner.js +65 -75
  143. package/.agent/scripts/marathon_harness.js +131 -208
  144. package/.agent/scripts/memory_engine.js +581 -0
  145. package/.agent/scripts/minify_context.js +29 -33
  146. package/.agent/scripts/minimal_change_engine.js +95 -87
  147. package/.agent/scripts/mutation_runner.js +46 -62
  148. package/.agent/scripts/payload_schemas.js +146 -0
  149. package/.agent/scripts/pipeline_engine.js +320 -209
  150. package/.agent/scripts/prompt_compiler.js +166 -93
  151. package/.agent/scripts/schema_validator.js +73 -121
  152. package/.agent/scripts/security_scan.js +88 -117
  153. package/.agent/scripts/session_manager.js +52 -69
  154. package/.agent/scripts/signal_detector.js +24 -22
  155. package/.agent/scripts/skill_evolution.js +184 -245
  156. package/.agent/scripts/skill_integrator.js +35 -48
  157. package/.agent/scripts/socratic_gate_policy.js +15 -12
  158. package/.agent/scripts/strengthen_skills.js +29 -33
  159. package/.agent/scripts/swarm_dispatcher.js +397 -200
  160. package/.agent/scripts/test_runner.js +54 -56
  161. package/.agent/scripts/token_budget_broker.js +126 -13
  162. package/.agent/scripts/trace_engine.js +126 -0
  163. package/.agent/scripts/verify_all.js +76 -93
  164. package/.agent/scripts/visual_audit.js +16 -21
  165. package/.agent/skill_topic_map.json +22 -3
  166. package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
  167. package/.agent/skills/60fps-animation/SKILL.md +7 -0
  168. package/.agent/skills/accessible-animation/SKILL.md +5 -1
  169. package/.agent/skills/adapt/SKILL.md +7 -1
  170. package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
  171. package/.agent/skills/agent-organizer/SKILL.md +1 -0
  172. package/.agent/skills/agentic-patterns/SKILL.md +33 -25
  173. package/.agent/skills/agentic-workflows-2026/SKILL.md +6 -2
  174. package/.agent/skills/ai-app-hardening/SKILL.md +9 -8
  175. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
  176. package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
  177. package/.agent/skills/animation-systems/SKILL.md +11 -10
  178. package/.agent/skills/antfu-conventions/SKILL.md +7 -2
  179. package/.agent/skills/api-patterns/SKILL.md +14 -10
  180. package/.agent/skills/api-security-auditor/SKILL.md +15 -14
  181. package/.agent/skills/app-builder/SKILL.md +1 -0
  182. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
  183. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
  184. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
  185. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
  186. package/.agent/skills/apple-design/SKILL.md +8 -7
  187. package/.agent/skills/architecture/SKILL.md +3 -2
  188. package/.agent/skills/audit-and-fix/SKILL.md +8 -5
  189. package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
  190. package/.agent/skills/backend-security-expert/SKILL.md +1 -0
  191. package/.agent/skills/baseline-ui/SKILL.md +8 -7
  192. package/.agent/skills/bash-linux/SKILL.md +1 -0
  193. package/.agent/skills/behavioral-modes/SKILL.md +1 -0
  194. package/.agent/skills/better-colors/SKILL.md +11 -7
  195. package/.agent/skills/better-typography/SKILL.md +30 -16
  196. package/.agent/skills/better-ui/SKILL.md +17 -10
  197. package/.agent/skills/bolder/SKILL.md +6 -0
  198. package/.agent/skills/brainstorming/SKILL.md +6 -4
  199. package/.agent/skills/browser-native-ai/SKILL.md +5 -4
  200. package/.agent/skills/build-primitive/SKILL.md +5 -0
  201. package/.agent/skills/building-native-ui/SKILL.md +1 -0
  202. package/.agent/skills/cicd-pro/SKILL.md +2 -1
  203. package/.agent/skills/clarify/SKILL.md +19 -14
  204. package/.agent/skills/clean-code/SKILL.md +16 -15
  205. package/.agent/skills/cloud-architect/SKILL.md +1 -0
  206. package/.agent/skills/cobejs/SKILL.md +7 -9
  207. package/.agent/skills/code-review-checklist/SKILL.md +1 -0
  208. package/.agent/skills/codebase-design/SKILL.md +7 -2
  209. package/.agent/skills/colorize/SKILL.md +8 -3
  210. package/.agent/skills/compact-landing/SKILL.md +8 -3
  211. package/.agent/skills/company-logos/SKILL.md +6 -0
  212. package/.agent/skills/config-validator/SKILL.md +10 -9
  213. package/.agent/skills/containerization-pro/SKILL.md +6 -5
  214. package/.agent/skills/context-engineering-pro/SKILL.md +5 -4
  215. package/.agent/skills/create-design-md/SKILL.md +13 -5
  216. package/.agent/skills/critique/SKILL.md +10 -8
  217. package/.agent/skills/csharp-developer/SKILL.md +1 -0
  218. package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
  219. package/.agent/skills/database-design/SKILL.md +2 -1
  220. package/.agent/skills/delight/SKILL.md +6 -0
  221. package/.agent/skills/deployment-procedures/SKILL.md +2 -1
  222. package/.agent/skills/design-lab/SKILL.md +5 -0
  223. package/.agent/skills/devops-engineer/SKILL.md +3 -2
  224. package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
  225. package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
  226. package/.agent/skills/distill/SKILL.md +7 -2
  227. package/.agent/skills/documentation-templates/SKILL.md +3 -2
  228. package/.agent/skills/domain-modeling/SKILL.md +12 -4
  229. package/.agent/skills/duckdb-analytical-sql/SKILL.md +7 -3
  230. package/.agent/skills/edge-ai-mobile/SKILL.md +5 -1
  231. package/.agent/skills/edge-computing/SKILL.md +9 -8
  232. package/.agent/skills/emil-design-eng/SKILL.md +43 -27
  233. package/.agent/skills/error-resilience/SKILL.md +34 -16
  234. package/.agent/skills/expo-router-v4/SKILL.md +2 -1
  235. package/.agent/skills/extract-design-system/SKILL.md +12 -11
  236. package/.agent/skills/fabel-protocol/SKILL.md +24 -17
  237. package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
  238. package/.agent/skills/fixing-metadata/SKILL.md +24 -13
  239. package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
  240. package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
  241. package/.agent/skills/frontend-design/SKILL.md +21 -13
  242. package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
  243. package/.agent/skills/game-design-expert/SKILL.md +1 -0
  244. package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
  245. package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
  246. package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
  247. package/.agent/skills/git-pro/SKILL.md +10 -9
  248. package/.agent/skills/github-operations/SKILL.md +2 -1
  249. package/.agent/skills/gpt-taste/SKILL.md +7 -0
  250. package/.agent/skills/gsap-core/SKILL.md +26 -22
  251. package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
  252. package/.agent/skills/gsap-performance/SKILL.md +4 -3
  253. package/.agent/skills/gsap-plugins/SKILL.md +34 -33
  254. package/.agent/skills/gsap-react/SKILL.md +9 -8
  255. package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
  256. package/.agent/skills/gsap-timeline/SKILL.md +18 -15
  257. package/.agent/skills/gsap-utils/SKILL.md +25 -24
  258. package/.agent/skills/harden/SKILL.md +9 -3
  259. package/.agent/skills/harness-protocol/SKILL.md +1 -0
  260. package/.agent/skills/i18n-localization/SKILL.md +10 -9
  261. package/.agent/skills/impeccable/SKILL.md +5 -0
  262. package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
  263. package/.agent/skills/improve-ui/SKILL.md +12 -5
  264. package/.agent/skills/intelligent-routing/SKILL.md +7 -6
  265. package/.agent/skills/knowledge-graph/SKILL.md +1 -0
  266. package/.agent/skills/landing-page/SKILL.md +1 -0
  267. package/.agent/skills/lint-and-validate/SKILL.md +9 -4
  268. package/.agent/skills/llm-engineering/SKILL.md +55 -54
  269. package/.agent/skills/local-first/SKILL.md +20 -19
  270. package/.agent/skills/local-first-architecture/SKILL.md +6 -1
  271. package/.agent/skills/lottie-animation/SKILL.md +7 -3
  272. package/.agent/skills/marquee-loop/SKILL.md +1 -0
  273. package/.agent/skills/masked-reveal/SKILL.md +17 -4
  274. package/.agent/skills/mcp-builder/SKILL.md +13 -10
  275. package/.agent/skills/micro-interaction/SKILL.md +20 -5
  276. package/.agent/skills/mobile-design/SKILL.md +26 -15
  277. package/.agent/skills/monorepo-management/SKILL.md +3 -2
  278. package/.agent/skills/morphing-icons/SKILL.md +16 -6
  279. package/.agent/skills/motion-engineering/SKILL.md +19 -15
  280. package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
  281. package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
  282. package/.agent/skills/observability/SKILL.md +45 -44
  283. package/.agent/skills/opentelemetry-observability/SKILL.md +2 -1
  284. package/.agent/skills/page-transition-animation/SKILL.md +6 -3
  285. package/.agent/skills/parallel-agents/SKILL.md +7 -2
  286. package/.agent/skills/performance-profiling/SKILL.md +24 -13
  287. package/.agent/skills/plan-writing/SKILL.md +1 -0
  288. package/.agent/skills/platform-engineer/SKILL.md +3 -2
  289. package/.agent/skills/platform-engineering-opentofu/SKILL.md +1 -0
  290. package/.agent/skills/playwright-ai-e2e/SKILL.md +3 -2
  291. package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
  292. package/.agent/skills/polish/SKILL.md +13 -12
  293. package/.agent/skills/powershell-windows/SKILL.md +1 -0
  294. package/.agent/skills/pricing-page/SKILL.md +8 -3
  295. package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
  296. package/.agent/skills/progressive-blur/SKILL.md +9 -4
  297. package/.agent/skills/project-idioms/SKILL.md +1 -0
  298. package/.agent/skills/property-based-testing/SKILL.md +10 -12
  299. package/.agent/skills/python-patterns/SKILL.md +1 -0
  300. package/.agent/skills/python-pro/SKILL.md +1 -0
  301. package/.agent/skills/quieter/SKILL.md +6 -0
  302. package/.agent/skills/react-doctor/SKILL.md +6 -0
  303. package/.agent/skills/react-specialist/SKILL.md +32 -28
  304. package/.agent/skills/readme-builder/SKILL.md +1 -0
  305. package/.agent/skills/realtime-patterns/SKILL.md +34 -33
  306. package/.agent/skills/red-team-tactics/SKILL.md +1 -0
  307. package/.agent/skills/redesign-skill/SKILL.md +6 -0
  308. package/.agent/skills/review-animations/SKILL.md +5 -2
  309. package/.agent/skills/review-animations/STANDARDS.md +37 -23
  310. package/.agent/skills/rust-pro/SKILL.md +1 -0
  311. package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
  312. package/.agent/skills/server-management/SKILL.md +1 -0
  313. package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
  314. package/.agent/skills/shape/SKILL.md +9 -2
  315. package/.agent/skills/skill-creator/SKILL.md +1 -0
  316. package/.agent/skills/soft-skill/SKILL.md +6 -0
  317. package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
  318. package/.agent/skills/sql-pro/SKILL.md +1 -0
  319. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
  320. package/.agent/skills/svg-animation/SKILL.md +16 -7
  321. package/.agent/skills/swiftui-expert/SKILL.md +1 -0
  322. package/.agent/skills/swiss-design/SKILL.md +5 -0
  323. package/.agent/skills/system-design-pro/SKILL.md +1 -0
  324. package/.agent/skills/systematic-debugging/SKILL.md +1 -0
  325. package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
  326. package/.agent/skills/taste-skill/SKILL.md +6 -0
  327. package/.agent/skills/tdd-workflow/SKILL.md +5 -0
  328. package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
  329. package/.agent/skills/testing-patterns/SKILL.md +123 -115
  330. package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
  331. package/.agent/skills/thinking-protocol/SKILL.md +3 -0
  332. package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
  333. package/.agent/skills/transitions-dev/SKILL.md +19 -6
  334. package/.agent/skills/trend-researcher/SKILL.md +1 -0
  335. package/.agent/skills/typescript-advanced/SKILL.md +23 -18
  336. package/.agent/skills/typeset/SKILL.md +10 -1
  337. package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
  338. package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
  339. package/.agent/skills/ui-skills-root/SKILL.md +39 -38
  340. package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
  341. package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
  342. package/.agent/skills/vector-search-pgvector/SKILL.md +3 -2
  343. package/.agent/skills/vue-expert/SKILL.md +22 -19
  344. package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
  345. package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
  346. package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
  347. package/.agent/skills/web-quality-audit/SKILL.md +5 -0
  348. package/.agent/skills/webapp-testing/SKILL.md +14 -13
  349. package/.agent/skills/webgpu-performance/SKILL.md +1 -0
  350. package/.agent/skills/whimsy-injector/SKILL.md +9 -5
  351. package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
  352. package/.agent/skills/zero-trust-passkeys/SKILL.md +11 -6
  353. package/.agent/templates/DESIGN.md +119 -110
  354. package/.agent/templates/design-tokens.json +9 -6
  355. package/.agent/workflows/acf.md +1 -0
  356. package/.agent/workflows/api-tester.md +1 -0
  357. package/.agent/workflows/audit.md +1 -0
  358. package/.agent/workflows/brainstorm.md +1 -0
  359. package/.agent/workflows/changelog.md +1 -0
  360. package/.agent/workflows/contract.md +60 -0
  361. package/.agent/workflows/create.md +1 -0
  362. package/.agent/workflows/debug.md +1 -0
  363. package/.agent/workflows/deploy.md +1 -0
  364. package/.agent/workflows/enhance.md +1 -0
  365. package/.agent/workflows/fix-ci.md +89 -0
  366. package/.agent/workflows/fix.md +1 -0
  367. package/.agent/workflows/generate.md +1 -0
  368. package/.agent/workflows/marathon.md +1 -0
  369. package/.agent/workflows/migrate.md +1 -0
  370. package/.agent/workflows/minimal.md +9 -7
  371. package/.agent/workflows/orchestrate.md +1 -0
  372. package/.agent/workflows/performance-benchmarker.md +1 -0
  373. package/.agent/workflows/pipeline.md +26 -21
  374. package/.agent/workflows/plan.md +1 -0
  375. package/.agent/workflows/preview.md +1 -0
  376. package/.agent/workflows/refactor.md +3 -2
  377. package/.agent/workflows/review-ai.md +4 -3
  378. package/.agent/workflows/review.md +1 -0
  379. package/.agent/workflows/session.md +1 -0
  380. package/.agent/workflows/status.md +1 -0
  381. package/.agent/workflows/strengthen-skills.md +1 -0
  382. package/.agent/workflows/super-prompt.md +1 -0
  383. package/.agent/workflows/swarm.md +15 -3
  384. package/.agent/workflows/test.md +8 -7
  385. package/.agent/workflows/tribunal-backend.md +3 -2
  386. package/.agent/workflows/tribunal-cicd.md +104 -0
  387. package/.agent/workflows/tribunal-database.md +1 -0
  388. package/.agent/workflows/tribunal-frontend.md +8 -6
  389. package/.agent/workflows/tribunal-full.md +2 -1
  390. package/.agent/workflows/tribunal-mobile.md +6 -5
  391. package/.agent/workflows/tribunal-performance.md +1 -0
  392. package/.agent/workflows/tribunal-speed.md +1 -0
  393. package/.agent/workflows/tribunal-ui.md +29 -21
  394. package/.agent/workflows/ui-ux-pro-max.md +19 -15
  395. package/.claude/CLAUDE.md +442 -0
  396. package/CONTRIBUTING.md +3 -3
  397. package/README.md +105 -45
  398. package/SECURITY.md +11 -11
  399. package/bin/adapter-install.js +240 -0
  400. package/bin/global-store.js +48 -0
  401. package/bin/mcp-server.js +781 -332
  402. package/bin/proxy-server.js +113 -0
  403. package/bin/spawn-agent.js +39 -0
  404. package/bin/tk-proxy.js +34 -0
  405. package/bin/tribunal-kit.js +29 -30
  406. package/bin/wrapper.js +40 -46
  407. package/dist/cli.js +6 -0
  408. package/dist/commands/case.js +2 -0
  409. package/dist/commands/contract.js +440 -0
  410. package/dist/commands/init.js +8 -51
  411. package/dist/commands/status.js +61 -30
  412. package/dist/commands/validate.js +22 -31
  413. package/dist/index.d.ts +8 -1
  414. package/dist/tui/banner.js +77 -0
  415. package/dist/tui/index.js +21 -0
  416. package/dist/tui/reviewer-grid.js +90 -0
  417. package/dist/tui/shimmer.js +91 -0
  418. package/dist/tui/theme.js +130 -0
  419. package/dist/tui/tree.js +93 -0
  420. package/dist/tui/wizard.js +148 -0
  421. package/dist/utils/helpers.js +5 -41
  422. package/package.json +33 -15
  423. package/scripts/benchmark.js +62 -86
  424. package/scripts/build-graph.js +71 -0
  425. package/scripts/changelog.js +67 -73
  426. package/scripts/fix-vbc.js +13 -15
  427. package/scripts/fix-vbc.ps1 +2 -118
  428. package/scripts/stress_benchmark.js +358 -0
  429. package/scripts/sync-version.js +71 -41
  430. package/scripts/validate-payload.js +23 -30
  431. package/scripts/visual_audit.js +23 -13
  432. package/.agent/history/snapshots/migrate_refs.js.json +0 -11
  433. package/.agent/scripts/compile_router.py +0 -112
  434. 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
- "use strict";
8
-
9
- const fs = require("fs");
10
- const path = require("path");
11
- const { execSync } = require("child_process");
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((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
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((w) => {
38
- const icon = w.status.includes("Pending")
42
+ this.workers.forEach(w => {
43
+ const icon = w.status.includes('Pending')
39
44
  ? `\x1b[36m${frame}\x1b[0m`
40
- : w.status.includes("Done")
41
- ? "\x1b[32m✔\x1b[0m"
42
- : "\x1b[31m✖\x1b[0m";
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
- "research",
75
- "generate_code",
76
- "review_code",
77
- "debug",
78
- "plan",
79
- "design_schema",
80
- "write_docs",
81
- "security_audit",
82
- "optimize",
83
- "test",
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(["success", "failure", "escalate"]);
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 MAX_WORKERS_PER_SWARM = 5;
94
+ const _MAX_WORKERS_PER_SWARM = 10;
91
95
 
92
96
  function getBinaryPath() {
93
- if (process.env.TRIBUNAL_FORCE_JS === "1") return null;
94
- const isWindows = process.platform === "win32";
95
- const ext = isWindows ? ".exe" : "";
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, "..", "..", "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}`),
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("child_process");
114
- const res = spawnSync(bin, ["validate", "--file", file, "--schema", schemaType], {
115
- encoding: "utf-8",
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, ".agent");
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, "micro-worker");
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: "pipe",
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(", ") : "None"}\n`;
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 !== "string") {
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 !== "string") {
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 !== "string") {
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 !== "string") {
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 !== "number" ||
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 !== "string") {
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 !== "string") {
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 === "success" && !output) {
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 === "failure" || status === "escalate") && !error) {
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
- 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
- );
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, "swarm");
567
+ const nativeResult = nativeValidate(payloadFile, 'swarm');
358
568
  if (nativeResult === true) {
359
569
  return true;
360
570
  }
361
571
  }
362
572
 
363
- let items;
364
- if (typeof payloadData === "object" && payloadData !== null) {
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
- items = payloadData;
578
+ swarmPayload = { workers: payloadData };
367
579
  } else if (payloadData.workers && Array.isArray(payloadData.workers)) {
368
- items = payloadData.workers;
580
+ swarmPayload = payloadData;
369
581
  } else {
370
- items = [payloadData];
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
- 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
- );
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
- let errors;
393
- if ("status" in item && "output" in item) {
394
- errors = validateWorkerResult(item, i);
395
- } else {
396
- errors = validateWorkerRequest(item, i, agentsDir);
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
- allErrors.push(...errors);
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
- if (allErrors.length > 0) {
403
- for (const err of allErrors) {
404
- console.error(`ERROR: ${err}`);
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 = "legacy";
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 === "--payload" && i + 1 < args.length) {
647
+ if (arg === '--payload' && i + 1 < args.length) {
425
648
  payload = args[++i];
426
- } else if (arg === "--file" && i + 1 < args.length) {
649
+ } else if (arg === '--file' && i + 1 < args.length) {
427
650
  file = args[++i];
428
- } else if (arg === "--workspace" && i + 1 < args.length) {
651
+ } else if (arg === '--workspace' && i + 1 < args.length) {
429
652
  workspace = args[++i];
430
- } else if (arg === "--mode" && i + 1 < args.length) {
653
+ } else if (arg === '--mode' && i + 1 < args.length) {
431
654
  mode = args[++i];
432
- } else if (arg === "--tui") {
655
+ } else if (arg === '--tui') {
433
656
  useTui = true;
434
- } else if (arg === "-h" || arg === "--help") {
657
+ } else if (arg === '-h' || arg === '--help') {
435
658
  console.log(
436
- "Usage: swarm_dispatcher.js [--payload <json>] [--file <path>] [--workspace <dir>] [--mode legacy|swarm] [--tui]",
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("ERROR: Must provide either --payload or --file");
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, "agents");
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, "utf8"));
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 === "swarm") {
696
+ if (mode === 'swarm') {
478
697
  if (!validateSwarmPayload(payloadData, agentsDir, file)) {
479
- console.error("ERROR: Swarm payload validation failed.");
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: "pipe",
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 === "object" &&
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 && "context" in item) {
726
+ if (item && 'context' in item) {
510
727
  item.context += astContext;
511
728
  }
512
729
  }
513
730
  }
514
731
 
515
- if (useTui) {
516
- const workers =
517
- typeof payloadData === "object" &&
518
- payloadData !== null &&
519
- payloadData.workers
520
- ? payloadData.workers
521
- : Array.isArray(payloadData)
522
- ? payloadData
523
- : [payloadData];
524
-
525
- const dashboard = new SwarmDashboard(workers);
526
- dashboard.start();
527
-
528
- // Simulate parallel execution for demo/UX purposes
529
- setTimeout(
530
- () => dashboard.updateStatus(0, "Researching", "\x1b[36m"),
531
- 1000,
532
- );
533
- setTimeout(() => {
534
- if (workers.length > 1)
535
- dashboard.updateStatus(1, "Generating", "\x1b[35m");
536
- }, 1500);
537
-
538
- setTimeout(() => {
539
- workers.forEach((w, i) =>
540
- dashboard.updateStatus(i, "✔ Done", "\x1b[32m"),
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("ERROR: Payload validation failed.");
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("INFO: Payload validation successful.");
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++) {