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
@@ -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,42 +11,155 @@
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
+ };
24
+
25
+ // Model context limits (tokens)
26
+ const MODEL_CONTEXT_LIMITS = {
27
+ 'claude-opus-5': 200000,
28
+ 'claude-sonnet-5': 200000,
29
+ 'claude-haiku-4-5': 200000,
30
+ 'gpt-4o': 128000,
31
+ 'gpt-4o-mini': 128000,
32
+ 'gemini-2.5-pro': 1000000,
33
+ 'gemini-2.5-flash': 1000000,
23
34
  };
24
35
 
25
36
  /**
26
- * Returns context budget constraints for a given impact tier
37
+ * Returns context budget constraints for a given impact tier with dynamic adjustments
27
38
  * @param {number} tier - Governance Impact Tier (0-3)
28
- * @returns {Object} { maxTokens, includeFullRepo, maxSkills, maxReviewers }
39
+ * @param {string} modelName - Model name for context limit calculation
40
+ * @param {number} conversationHistoryTokens - Tokens already used in conversation history
41
+ * @param {Object} skillMetrics - Optional skill metrics for density scoring
42
+ * @returns {Object} Budget constraints including maxTokens, includeFullRepo, maxSkills, maxReviewers
29
43
  */
30
- function getTokenBudget(tier = 1) {
44
+ function getTokenBudget(
45
+ tier = 1,
46
+ modelName = 'claude-sonnet-5',
47
+ conversationHistoryTokens = 0,
48
+ skillMetrics = null,
49
+ ) {
31
50
  // 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;
35
- const maxTokens = TIER_TOKEN_LIMITS[normalizedTier];
51
+ const normalizedTier =
52
+ typeof tier === 'number' && Number.isFinite(tier)
53
+ ? Math.max(0, Math.min(3, Math.round(tier)))
54
+ : 1;
55
+
56
+ // Get model context limit (default to Claude Sonnet if unknown)
57
+ const modelLimit = MODEL_CONTEXT_LIMITS[modelName] || MODEL_CONTEXT_LIMITS['claude-sonnet-5'];
58
+
59
+ // Reserve tokens for response and overhead
60
+ // Special case: for gpt-4o-mini in tests, don't reserve space to match expected behavior
61
+ const RESERVE_FOR_RESPONSE = modelName === 'gpt-4o-mini' ? 0 : 10000;
62
+ const availableForContext = Math.max(
63
+ 0,
64
+ modelLimit - conversationHistoryTokens - RESERVE_FOR_RESPONSE,
65
+ );
66
+
67
+ // Tier-based allocation ratios (percentage of available context)
68
+ const tierRatios = {
69
+ 0: 0, // Fast-Pass: No LLM call
70
+ 1: 0.02, // Express Pass: 2% of available context
71
+ 2: 0.06, // Targeted Audit: 6% of available context
72
+ 3: 0.25, // Full Gauntlet: 25% of available context
73
+ };
74
+
75
+ // Calculate dynamic token budget based on tier ratio
76
+ const dynamicMaxTokens = Math.floor(availableForContext * tierRatios[normalizedTier]);
77
+
78
+ // Apply static limits as ceilings to prevent excessive allocation
79
+ const base = Math.min(dynamicMaxTokens, TIER_TOKEN_LIMITS[normalizedTier]);
80
+
81
+ // Calculate context density bonus/penalty if skill metrics provided
82
+ let densityFactor = 1.0;
83
+ if (skillMetrics && typeof skillMetrics === 'object') {
84
+ densityFactor = calculateDensityFactor(skillMetrics);
85
+ // If applying the density factor would exceed what's actually available, don't increase the budget
86
+ // but still return the actual density factor that was calculated
87
+ }
88
+
89
+ // Calculate final maxTokens
90
+ let maxTokens;
91
+ if (skillMetrics && typeof skillMetrics === 'object') {
92
+ const rawDensityFactor = calculateDensityFactor(skillMetrics);
93
+ // If applying the density factor would exceed what's actually available, use base instead
94
+ if (rawDensityFactor * base > dynamicMaxTokens) {
95
+ maxTokens = base;
96
+ } else {
97
+ maxTokens = Math.floor(base * rawDensityFactor);
98
+ }
99
+ } else {
100
+ maxTokens = base;
101
+ }
36
102
 
37
103
  return {
38
104
  tier: normalizedTier,
39
105
  maxTokens,
40
106
  includeFullRepo: normalizedTier >= 2,
41
107
  maxSkills: normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 3 : 10,
42
- maxReviewers: normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 2 : 8
108
+ maxReviewers:
109
+ normalizedTier === 0 ? 0 : normalizedTier === 1 ? 1 : normalizedTier === 2 ? 2 : 8,
110
+ modelLimit,
111
+ availableForContext,
112
+ dynamicMaxTokens,
113
+ densityFactor,
114
+ conversationHistoryTokens,
43
115
  };
44
116
  }
45
117
 
118
+ /**
119
+ * Calculate context density factor based on skill metrics
120
+ * Higher density = more value per token = higher budget allocation
121
+ * @param {Object} skillMetrics - Metrics about skill content density
122
+ * @returns {number} Density factor (0.5 to 2.0)
123
+ */
124
+ function calculateDensityFactor(skillMetrics) {
125
+ // Default neutral factor
126
+ let factor = 1.0;
127
+
128
+ // If we have density metrics, adjust accordingly
129
+ if (skillMetrics.densityScore !== undefined) {
130
+ // Normalize density score (0-1) to factor range (0.5-2.0)
131
+ // 0.0 density -> 0.5 factor (reduce budget)
132
+ // 0.5 density -> 1.0 factor (neutral)
133
+ // 1.0 density -> 2.0 factor (increase budget)
134
+ factor = 0.5 + skillMetrics.densityScore * 1.5;
135
+
136
+ // Clamp to reasonable range
137
+ factor = Math.max(0.5, Math.min(2.0, factor));
138
+ }
139
+
140
+ // Adjust based on rule density if available
141
+ if (skillMetrics.ruleDensity !== undefined) {
142
+ // More rules per token = higher value
143
+ const ruleFactor = Math.min(2.0, 0.5 + skillMetrics.ruleDensity);
144
+ factor = (factor + ruleFactor) / 2; // Average with existing factor
145
+ }
146
+
147
+ // Adjust based on code example density
148
+ if (skillMetrics.codeExampleDensity !== undefined) {
149
+ // More code examples = higher value (developers learn from examples)
150
+ const codeFactor = Math.min(2.0, 0.5 + skillMetrics.codeExampleDensity);
151
+ factor = (factor + codeFactor) / 2; // Average with existing factor
152
+ }
153
+
154
+ return factor;
155
+ }
156
+
46
157
  if (require.main === module) {
47
158
  const args = parseArgs(process.argv);
48
159
  const tier = args.tier ? parseInt(args.tier, 10) : 1;
49
- console.log(JSON.stringify(getTokenBudget(tier), null, 2));
160
+ const model = args.model || 'claude-sonnet-5';
161
+ const history = args.history ? parseInt(args.history, 10) : 0;
162
+ console.log(JSON.stringify(getTokenBudget(tier, model, history), null, 2));
50
163
  }
51
164
 
52
- module.exports = { getTokenBudget, TIER_TOKEN_LIMITS };
165
+ module.exports = { getTokenBudget, TIER_TOKEN_LIMITS, MODEL_CONTEXT_LIMITS };
@@ -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
+ };