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
@@ -9,11 +9,11 @@
9
9
  * node .agent/scripts/test_runner.js . --file src/utils.test.ts
10
10
  */
11
11
 
12
- "use strict";
12
+ 'use strict';
13
13
 
14
- const fs = require("fs");
15
- const path = require("path");
16
- const { spawnSync } = require("child_process");
14
+ const fs = require('fs');
15
+ const path = require('path');
16
+ const { spawnSync } = require('child_process');
17
17
 
18
18
  const {
19
19
  RED,
@@ -29,22 +29,22 @@ const {
29
29
  ok,
30
30
  fail,
31
31
  skip,
32
- } = require("./_colors");
32
+ } = require('./_colors');
33
33
 
34
- const { loadJson } = require("./_utils");
34
+ const { loadJson } = require('./_utils');
35
35
 
36
36
  function runTests(label, cmd, cwd) {
37
37
  const elapsed = timer();
38
38
  try {
39
39
  const executable =
40
- process.platform === "win32" && (cmd[0] === "npx" || cmd[0] === "npm")
40
+ process.platform === 'win32' && (cmd[0] === 'npx' || cmd[0] === 'npm')
41
41
  ? `${cmd[0]}.cmd`
42
42
  : cmd[0];
43
43
  const result = spawnSync(executable, cmd.slice(1), {
44
44
  cwd,
45
- encoding: "utf8",
45
+ encoding: 'utf8',
46
46
  timeout: 300000, // 5m
47
- shell: process.platform === "win32",
47
+ shell: process.platform === 'win32',
48
48
  });
49
49
 
50
50
  const ms = elapsed();
@@ -52,11 +52,11 @@ function runTests(label, cmd, cwd) {
52
52
  if (result.error && !result.stdout && !result.stderr) {
53
53
  console.log(` Error: ${result.error.message}`);
54
54
  }
55
- const out = result.stdout ? result.stdout.toString() : "";
56
- const err = result.stderr ? result.stderr.toString() : "";
57
- const output = (out + "\n" + err).trim();
55
+ const out = result.stdout ? result.stdout.toString() : '';
56
+ const err = result.stderr ? result.stderr.toString() : '';
57
+ const output = (out + '\n' + err).trim();
58
58
  if (output) {
59
- for (const line of output.split("\n")) {
59
+ for (const line of output.split('\n')) {
60
60
  console.log(` ${line}`);
61
61
  }
62
62
  }
@@ -75,7 +75,7 @@ function runTests(label, cmd, cwd) {
75
75
  }
76
76
 
77
77
  function detectTestFramework(projectRoot) {
78
- const pkg = loadJson(path.join(projectRoot, "package.json"));
78
+ const pkg = loadJson(path.join(projectRoot, 'package.json'));
79
79
  if (pkg) {
80
80
  const deps = {
81
81
  ...(pkg.dependencies || {}),
@@ -83,18 +83,18 @@ function detectTestFramework(projectRoot) {
83
83
  };
84
84
  const scripts = pkg.scripts || {};
85
85
 
86
- if (deps.vitest) return "vitest";
87
- if (deps.jest) return "jest";
88
- if (deps.mocha) return "mocha";
89
- if (scripts.test) return "npm-test";
86
+ if (deps.vitest) return 'vitest';
87
+ if (deps.jest) return 'jest';
88
+ if (deps.mocha) return 'mocha';
89
+ if (scripts.test) return 'npm-test';
90
90
  }
91
91
 
92
92
  if (
93
- fs.existsSync(path.join(projectRoot, "pytest.ini")) ||
94
- fs.existsSync(path.join(projectRoot, "pyproject.toml")) ||
95
- fs.existsSync(path.join(projectRoot, "conftest.py"))
93
+ fs.existsSync(path.join(projectRoot, 'pytest.ini')) ||
94
+ fs.existsSync(path.join(projectRoot, 'pyproject.toml')) ||
95
+ fs.existsSync(path.join(projectRoot, 'conftest.py'))
96
96
  ) {
97
- return "pytest";
97
+ return 'pytest';
98
98
  }
99
99
 
100
100
  // Go
@@ -106,16 +106,16 @@ function detectTestFramework(projectRoot) {
106
106
  return false;
107
107
  }
108
108
  for (const item of items) {
109
- if (item.isDirectory() && !["node_modules", ".git"].includes(item.name)) {
109
+ if (item.isDirectory() && !['node_modules', '.git'].includes(item.name)) {
110
110
  if (hasGoTests(path.join(dir, item.name))) return true;
111
- } else if (item.name.endsWith("_test.go")) {
111
+ } else if (item.name.endsWith('_test.go')) {
112
112
  return true;
113
113
  }
114
114
  }
115
115
  return false;
116
116
  }
117
117
 
118
- if (hasGoTests(projectRoot)) return "go";
118
+ if (hasGoTests(projectRoot)) return 'go';
119
119
 
120
120
  return null;
121
121
  }
@@ -129,17 +129,15 @@ function main() {
129
129
 
130
130
  let i = 0;
131
131
  while (i < args.length) {
132
- if (args[i] === "--coverage") coverageFlag = true;
133
- else if (args[i] === "--watch") watchFlag = true;
134
- else if (args[i] === "--file" && i + 1 < args.length) fileArg = args[++i];
135
- else if (!targetPath && !args[i].startsWith("-")) targetPath = args[i];
132
+ if (args[i] === '--coverage') coverageFlag = true;
133
+ else if (args[i] === '--watch') watchFlag = true;
134
+ else if (args[i] === '--file' && i + 1 < args.length) fileArg = args[++i];
135
+ else if (!targetPath && !args[i].startsWith('-')) targetPath = args[i];
136
136
  i++;
137
137
  }
138
138
 
139
139
  if (!targetPath) {
140
- console.log(
141
- "Usage: node test_runner.js <path> [--coverage] [--watch] [--file <filepath>]",
142
- );
140
+ console.log('Usage: node test_runner.js <path> [--coverage] [--watch] [--file <filepath>]');
143
141
  process.exit(1);
144
142
  }
145
143
 
@@ -151,14 +149,14 @@ function main() {
151
149
 
152
150
  const framework = detectTestFramework(projectRoot);
153
151
  console.log(
154
- banner("test_runner.js", {
152
+ banner('test_runner.js', {
155
153
  Project: projectRoot,
156
- Framework: framework || "none detected",
154
+ Framework: framework || 'none detected',
157
155
  }),
158
156
  );
159
157
 
160
158
  if (!framework) {
161
- skip("No test framework detected in this project");
159
+ skip('No test framework detected in this project');
162
160
  process.exit(0);
163
161
  }
164
162
 
@@ -167,34 +165,34 @@ function main() {
167
165
  let cmd = [];
168
166
  let passed = true;
169
167
 
170
- if (["vitest", "jest", "mocha", "npm-test"].includes(framework)) {
171
- if (framework === "vitest") {
172
- cmd = ["npx", "vitest", "run"];
173
- if (coverageFlag) cmd.push("--coverage");
174
- if (watchFlag) cmd = ["npx", "vitest"];
168
+ if (['vitest', 'jest', 'mocha', 'npm-test'].includes(framework)) {
169
+ if (framework === 'vitest') {
170
+ cmd = ['npx', 'vitest', 'run'];
171
+ if (coverageFlag) cmd.push('--coverage');
172
+ if (watchFlag) cmd = ['npx', 'vitest'];
175
173
  if (fileArg) cmd.push(fileArg);
176
- } else if (framework === "jest") {
177
- cmd = ["npx", "jest"];
178
- if (coverageFlag) cmd.push("--coverage");
179
- if (watchFlag) cmd.push("--watch");
174
+ } else if (framework === 'jest') {
175
+ cmd = ['npx', 'jest'];
176
+ if (coverageFlag) cmd.push('--coverage');
177
+ if (watchFlag) cmd.push('--watch');
180
178
  if (fileArg) cmd.push(fileArg);
181
179
  } else {
182
- cmd = ["npm", "test", "--", "--passWithNoTests"];
183
- if (coverageFlag) cmd.push("--coverage");
180
+ cmd = ['npm', 'test', '--', '--passWithNoTests'];
181
+ if (coverageFlag) cmd.push('--coverage');
184
182
  if (fileArg) cmd.push(fileArg);
185
183
  }
186
184
  passed = runTests(framework, cmd, projectRoot);
187
- } else if (framework === "pytest") {
188
- cmd = ["python", "-m", "pytest", "-v"];
189
- if (coverageFlag) cmd.push("--cov", "--cov-report=term-missing");
190
- if (watchFlag) cmd = ["python", "-m", "pytest-watch", "--", "-v"];
185
+ } else if (framework === 'pytest') {
186
+ cmd = ['python', '-m', 'pytest', '-v'];
187
+ if (coverageFlag) cmd.push('--cov', '--cov-report=term-missing');
188
+ if (watchFlag) cmd = ['python', '-m', 'pytest-watch', '--', '-v'];
191
189
  if (fileArg) cmd.push(fileArg);
192
- passed = runTests("pytest", cmd, projectRoot);
193
- } else if (framework === "go") {
194
- cmd = ["go", "test", "./...", "-v"];
195
- if (coverageFlag) cmd.push("-cover");
196
- if (fileArg) cmd = ["go", "test", "-v", "-run", fileArg];
197
- passed = runTests("go test", cmd, projectRoot);
190
+ passed = runTests('pytest', cmd, projectRoot);
191
+ } else if (framework === 'go') {
192
+ cmd = ['go', 'test', './...', '-v'];
193
+ if (coverageFlag) cmd.push('-cover');
194
+ if (fileArg) cmd = ['go', 'test', '-v', '-run', fileArg];
195
+ passed = runTests('go test', cmd, projectRoot);
198
196
  }
199
197
 
200
198
  console.log(`\n${BOLD}${CYAN}━━━ Test Summary ━━━${RESET}`);
@@ -11,15 +11,15 @@
11
11
  * - Tier 3: Full budget (up to model context limit)
12
12
  */
13
13
 
14
- "use strict";
14
+ 'use strict';
15
15
 
16
- const { parseArgs } = require("./_utils");
16
+ const { parseArgs } = require('./_utils');
17
17
 
18
18
  const TIER_TOKEN_LIMITS = {
19
19
  0: 0,
20
20
  1: 2000,
21
21
  2: 8000,
22
- 3: 32000
22
+ 3: 32000,
23
23
  };
24
24
 
25
25
  /**
@@ -29,9 +29,10 @@ const TIER_TOKEN_LIMITS = {
29
29
  */
30
30
  function getTokenBudget(tier = 1) {
31
31
  // Normalize tier to a valid integer in [0, 3]
32
- const normalizedTier = (typeof tier === "number" && Number.isFinite(tier))
33
- ? Math.max(0, Math.min(3, Math.round(tier)))
34
- : 1;
32
+ const normalizedTier =
33
+ typeof tier === 'number' && Number.isFinite(tier)
34
+ ? Math.max(0, Math.min(3, Math.round(tier)))
35
+ : 1;
35
36
  const maxTokens = TIER_TOKEN_LIMITS[normalizedTier];
36
37
 
37
38
  return {
@@ -39,7 +40,8 @@ function getTokenBudget(tier = 1) {
39
40
  maxTokens,
40
41
  includeFullRepo: normalizedTier >= 2,
41
42
  maxSkills: normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 3 : 10,
42
- maxReviewers: normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 2 : 8
43
+ maxReviewers:
44
+ normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 2 : 8,
43
45
  };
44
46
  }
45
47
 
@@ -0,0 +1,126 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * trace_engine.js — Failure Context Snapshot & Replay Engine
5
+ *
6
+ * Captures, stores, lists, and replays causal trace snapshots when
7
+ * behavioral contracts or guardrails are violated.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+
13
+ function getTracesDir(projectRoot) {
14
+ const tracesDir = path.join(projectRoot, '.tribunal', 'traces');
15
+ if (!fs.existsSync(tracesDir)) {
16
+ fs.mkdirSync(tracesDir, { recursive: true });
17
+ }
18
+ return tracesDir;
19
+ }
20
+
21
+ function captureSnapshot(projectRoot, violation) {
22
+ const tracesDir = getTracesDir(projectRoot);
23
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
24
+ const contractSlug = (violation.contract || 'violation')
25
+ .toLowerCase()
26
+ .replace(/[^a-z0-9]+/g, '-');
27
+
28
+ const snapshotId = `trace-${timestamp}-${contractSlug}`;
29
+ const snapshotPath = path.join(tracesDir, `${snapshotId}.json`);
30
+
31
+ const payload = {
32
+ id: snapshotId,
33
+ timestamp: new Date().toISOString(),
34
+ contract: violation.contract,
35
+ severity: violation.severity || 'warn',
36
+ target_file: violation.file,
37
+ violation: {
38
+ rule: violation.rule,
39
+ line: violation.line || null,
40
+ snippet: violation.snippet || null,
41
+ message: violation.message,
42
+ },
43
+ context: {
44
+ git_branch: getGitBranch(projectRoot),
45
+ recorded_at: new Date().toLocaleTimeString(),
46
+ },
47
+ };
48
+
49
+ fs.writeFileSync(snapshotPath, JSON.stringify(payload, null, 2), 'utf8');
50
+ return payload;
51
+ }
52
+
53
+ function listSnapshots(projectRoot) {
54
+ const tracesDir = getTracesDir(projectRoot);
55
+ const snapshots = [];
56
+
57
+ try {
58
+ const files = fs.readdirSync(tracesDir);
59
+ for (const f of files) {
60
+ if (f.endsWith('.json')) {
61
+ const fullPath = path.join(tracesDir, f);
62
+ try {
63
+ const raw = fs.readFileSync(fullPath, 'utf8');
64
+ const data = JSON.parse(raw);
65
+ snapshots.push(data);
66
+ } catch {
67
+ // Ignore corrupt snapshot
68
+ }
69
+ }
70
+ }
71
+ } catch {
72
+ // Ignore read errors
73
+ }
74
+
75
+ // Sort newest first
76
+ snapshots.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
77
+
78
+ return snapshots;
79
+ }
80
+
81
+ function replaySnapshot(projectRoot, snapshotId) {
82
+ const tracesDir = getTracesDir(projectRoot);
83
+ let targetFile = snapshotId;
84
+
85
+ if (!snapshotId.endsWith('.json')) {
86
+ targetFile = `${snapshotId}.json`;
87
+ }
88
+
89
+ const fullPath = path.join(tracesDir, targetFile);
90
+ if (!fs.existsSync(fullPath)) {
91
+ // Search by partial match
92
+ const snapshots = listSnapshots(projectRoot);
93
+ const match = snapshots.find(
94
+ s => (s.id && s.id.includes(snapshotId)) || (s.contract && s.contract.includes(snapshotId)),
95
+ );
96
+ if (match) return match;
97
+ return null;
98
+ }
99
+
100
+ try {
101
+ const raw = fs.readFileSync(fullPath, 'utf8');
102
+ return JSON.parse(raw);
103
+ } catch {
104
+ return null;
105
+ }
106
+ }
107
+
108
+ function getGitBranch(projectRoot) {
109
+ try {
110
+ const headPath = path.join(projectRoot, '.git', 'HEAD');
111
+ if (fs.existsSync(headPath)) {
112
+ const content = fs.readFileSync(headPath, 'utf8').trim();
113
+ const match = content.match(/ref: refs\/heads\/(.+)/);
114
+ if (match) return match[1];
115
+ }
116
+ } catch {
117
+ // Fallback
118
+ }
119
+ return 'main';
120
+ }
121
+
122
+ module.exports = {
123
+ captureSnapshot,
124
+ listSnapshots,
125
+ replaySnapshot,
126
+ };