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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tribunal-kit",
3
- "version": "6.0.0",
4
- "description": "The operating system for AI software engineering governance, memory, review pipelines, and reusable skills for every coding agent. 45 specialist agents, 35 workflows, 21 parallel Tribunal code reviewers, MCP server, Rust core engine, and long-running autonomous agent harness for Cursor, VSCode, Windsurf, Claude Code, and Aider.",
3
+ "version": "7.0.0",
4
+ "description": "Your AI writes code that doesn't exist. Tribunal Kit stops it. The governance layer for AI coding agents 52 specialists, 28 parallel reviewers, 183 skills, Rust core, MCP server. Works with Cursor, VSCode, Windsurf, Claude Code, and Aider.",
5
5
  "keywords": [
6
6
  "ai",
7
7
  "ai-agent",
@@ -80,9 +80,9 @@
80
80
  "node": ">=18.0.0"
81
81
  },
82
82
  "scripts": {
83
- "test": "npm run validate-payload && jest --runInBand --coverage",
84
- "test:unit": "jest test/unit --coverage",
85
- "test:integration": "jest test/integration --coverage",
83
+ "test": "npm run validate-payload && jest --runInBand --coverage --forceExit",
84
+ "test:unit": "jest test/unit --coverage --forceExit",
85
+ "test:integration": "jest test/integration --coverage --forceExit",
86
86
  "preversion": "node scripts/sync-version.js",
87
87
  "version": "node scripts/changelog.js && git add CHANGELOG.md",
88
88
  "changelog": "node scripts/changelog.js",
@@ -90,25 +90,29 @@
90
90
  "sync": "node scripts/sync-version.js",
91
91
  "validate-payload": "node scripts/validate-payload.js",
92
92
  "benchmark": "node scripts/benchmark.js",
93
+ "benchmark:stress": "node scripts/stress_benchmark.js",
93
94
  "benchmark:rust": "cargo build --release && node scripts/benchmark.js",
94
95
  "build:rust": "cargo build --release",
95
96
  "build:core": "cargo build --release --manifest-path crates/core/Cargo.toml",
96
97
  "test:rust": "cargo test --manifest-path crates/core/Cargo.toml",
97
- "test:all": "npm run validate-payload && npm run test:rust && jest --runInBand --coverage",
98
+ "test:all": "npm run validate-payload && npm run test:rust && jest --runInBand --coverage --forceExit",
99
+ "format": "prettier --write .",
100
+ "format:check": "prettier --check .",
98
101
  "build": "npm run build:rust"
99
102
  },
100
103
  "devDependencies": {
101
- "eslint": "9.1.1",
102
- "jest": "30.4.2",
103
- "typescript": "5.4.5"
104
- },
104
+ "eslint": "^9.1.1",
105
+ "jest": "^30.4.2",
106
+ "prettier": "^3.2.5",
107
+ "typescript": "^5.4.5"
108
+ },
105
109
  "optionalDependencies": {
106
- "@tribunal-kit/core-darwin-arm64": "^6.0.0",
107
- "@tribunal-kit/core-darwin-x64": "^6.0.0",
108
- "@tribunal-kit/core-linux-arm64": "^6.0.0",
109
- "@tribunal-kit/core-linux-x64": "^6.0.0",
110
- "@tribunal-kit/core-win32-arm64": "^6.0.0",
111
- "@tribunal-kit/core-win32-x64": "^6.0.0"
110
+ "@tribunal-kit/core-darwin-arm64": "^7.0.0",
111
+ "@tribunal-kit/core-darwin-x64": "^7.0.0",
112
+ "@tribunal-kit/core-linux-arm64": "^7.0.0",
113
+ "@tribunal-kit/core-linux-x64": "^7.0.0",
114
+ "@tribunal-kit/core-win32-arm64": "^7.0.0",
115
+ "@tribunal-kit/core-win32-x64": "^7.0.0"
112
116
  },
113
117
  "jest": {
114
118
  "testMatch": [
@@ -6,22 +6,22 @@
6
6
  * Run: node scripts/benchmark.js
7
7
  */
8
8
 
9
- const { spawnSync } = require("child_process");
10
- const path = require("path");
11
- const fs = require("fs");
12
- const os = require("os");
9
+ const { spawnSync } = require('child_process');
10
+ const path = require('path');
11
+ const fs = require('fs');
12
+ const os = require('os');
13
13
 
14
14
  // ANSI colors
15
15
  const C = {
16
- reset: "\x1b[0m",
17
- bold: "\x1b[1m",
18
- dim: "\x1b[2m",
19
- red: "\x1b[91m",
20
- green: "\x1b[92m",
21
- yellow: "\x1b[93m",
22
- cyan: "\x1b[96m",
23
- white: "\x1b[97m",
24
- gray: "\x1b[90m",
16
+ reset: '\x1b[0m',
17
+ bold: '\x1b[1m',
18
+ dim: '\x1b[2m',
19
+ red: '\x1b[91m',
20
+ green: '\x1b[92m',
21
+ yellow: '\x1b[93m',
22
+ cyan: '\x1b[96m',
23
+ white: '\x1b[97m',
24
+ gray: '\x1b[90m',
25
25
  };
26
26
 
27
27
  function c(color, text) {
@@ -59,10 +59,10 @@ function benchmarkCommand(label, command, runs = 3) {
59
59
  return benchmark(
60
60
  label,
61
61
  () => {
62
- spawnSync("node", command.split(" "), {
63
- stdio: "pipe",
64
- encoding: "utf8",
65
- env: { ...process.env, TK_SKIP_UPDATE_CHECK: "1" },
62
+ spawnSync('node', command.split(' '), {
63
+ stdio: 'pipe',
64
+ encoding: 'utf8',
65
+ env: { ...process.env, TK_SKIP_UPDATE_CHECK: '1' },
66
66
  });
67
67
  },
68
68
  runs,
@@ -72,67 +72,50 @@ function benchmarkCommand(label, command, runs = 3) {
72
72
  async function main() {
73
73
  console.log();
74
74
  console.log(bold(` ⚡ Tribunal-Kit Performance Benchmark`));
75
- console.log(c("gray", ` ─────────────────────────────────────────`));
76
- console.log(c("gray", ` Platform: ${os.platform()} ${os.arch()}`));
77
- console.log(c("gray", ` Node: ${process.version}`));
78
- console.log(
79
- c(
80
- "gray",
81
- ` CPUs: ${os.cpus().length}x ${os.cpus()[0]?.model || "unknown"}`,
82
- ),
83
- );
84
- console.log(c("gray", ` ─────────────────────────────────────────`));
75
+ console.log(c('gray', ` ─────────────────────────────────────────`));
76
+ console.log(c('gray', ` Platform: ${os.platform()} ${os.arch()}`));
77
+ console.log(c('gray', ` Node: ${process.version}`));
78
+ console.log(c('gray', ` CPUs: ${os.cpus().length}x ${os.cpus()[0]?.model || 'unknown'}`));
79
+ console.log(c('gray', ` ─────────────────────────────────────────`));
85
80
  console.log();
86
81
 
87
- const cliPath = path.resolve(__dirname, "../bin/wrapper.js");
82
+ const cliPath = path.resolve(__dirname, '../bin/wrapper.js');
88
83
  const tempDir = path.join(os.tmpdir(), `tribunal-bench-${Date.now()}`);
89
84
  fs.mkdirSync(tempDir, { recursive: true });
90
85
 
91
86
  const results = [];
92
87
 
93
88
  // 1. Cold start (help)
94
- console.log(c("cyan", " ▸ Benchmarking: CLI cold-start (--help)"));
95
- const helpResult = await benchmarkCommand(
96
- "CLI cold-start (--help)",
97
- `${cliPath} --help`,
98
- 5,
99
- );
89
+ console.log(c('cyan', ' ▸ Benchmarking: CLI cold-start (--help)'));
90
+ const helpResult = await benchmarkCommand('CLI cold-start (--help)', `${cliPath} --help`, 5);
100
91
  results.push(helpResult);
101
92
 
102
93
  // 2. Status check
103
- console.log(c("cyan", " ▸ Benchmarking: tk status"));
104
- const statusResult = await benchmarkCommand(
105
- "Status check",
106
- `${cliPath} status --quiet`,
107
- 5,
108
- );
94
+ console.log(c('cyan', ' ▸ Benchmarking: tk status'));
95
+ const statusResult = await benchmarkCommand('Status check', `${cliPath} status --quiet`, 5);
109
96
  results.push(statusResult);
110
97
 
111
98
  // 3. Init (dry-run)
112
- console.log(c("cyan", " ▸ Benchmarking: tk init --dry-run"));
99
+ console.log(c('cyan', ' ▸ Benchmarking: tk init --dry-run'));
113
100
  const initResult = await benchmarkCommand(
114
- "Init (dry-run)",
101
+ 'Init (dry-run)',
115
102
  `${cliPath} init --dry-run --quiet --skip-update-check --path=${tempDir}`,
116
103
  3,
117
104
  );
118
105
  results.push(initResult);
119
106
 
120
107
  // 4. Init (real, to temp dir)
121
- console.log(c("cyan", " ▸ Benchmarking: tk init (real copy)"));
108
+ console.log(c('cyan', ' ▸ Benchmarking: tk init (real copy)'));
122
109
  const initRealResult = await benchmark(
123
- "Init (full copy)",
110
+ 'Init (full copy)',
124
111
  () => {
125
112
  const runDir = path.join(tempDir, `run-${Date.now()}`);
126
113
  fs.mkdirSync(runDir, { recursive: true });
127
- spawnSync(
128
- "node",
129
- [cliPath, "init", "--quiet", "--skip-update-check", `--path=${runDir}`],
130
- {
131
- stdio: "pipe",
132
- encoding: "utf8",
133
- env: { ...process.env, TK_SKIP_UPDATE_CHECK: "1" },
134
- },
135
- );
114
+ spawnSync('node', [cliPath, 'init', '--quiet', '--skip-update-check', `--path=${runDir}`], {
115
+ stdio: 'pipe',
116
+ encoding: 'utf8',
117
+ env: { ...process.env, TK_SKIP_UPDATE_CHECK: '1' },
118
+ });
136
119
  // Cleanup
137
120
  try {
138
121
  fs.rmSync(runDir, { recursive: true, force: true });
@@ -143,35 +126,35 @@ async function main() {
143
126
  results.push(initRealResult);
144
127
 
145
128
  // 5. DAG scheduling benchmark
146
- console.log(c("cyan", " ▸ Benchmarking: DAG scheduling calculation"));
129
+ console.log(c('cyan', ' ▸ Benchmarking: DAG scheduling calculation'));
147
130
  const dagResult = await benchmark(
148
- "DAG wave scheduling",
131
+ 'DAG wave scheduling',
149
132
  () => {
150
133
  const workers = [
151
- { task_id: "w1", dependencies: [] },
152
- { task_id: "w2", dependencies: ["w1"] },
153
- { task_id: "w3", dependencies: ["w1"] },
154
- { task_id: "w4", dependencies: ["w2", "w3"] },
134
+ { task_id: 'w1', dependencies: [] },
135
+ { task_id: 'w2', dependencies: ['w1'] },
136
+ { task_id: 'w3', dependencies: ['w1'] },
137
+ { task_id: 'w4', dependencies: ['w2', 'w3'] },
155
138
  ];
156
139
  const inDegree = {};
157
140
  const adjList = {};
158
- workers.forEach((w) => {
141
+ workers.forEach(w => {
159
142
  inDegree[w.task_id] = 0;
160
143
  adjList[w.task_id] = [];
161
144
  });
162
- workers.forEach((w) => {
163
- w.dependencies.forEach((dep) => {
145
+ workers.forEach(w => {
146
+ w.dependencies.forEach(dep => {
164
147
  adjList[dep].push(w.task_id);
165
148
  inDegree[w.task_id] += 1;
166
149
  });
167
150
  });
168
- let currentWave = Object.keys(inDegree).filter((id) => inDegree[id] === 0);
151
+ let currentWave = Object.keys(inDegree).filter(id => inDegree[id] === 0);
169
152
  const waves = [];
170
153
  while (currentWave.length > 0) {
171
154
  waves.push(currentWave);
172
155
  const next = [];
173
- currentWave.forEach((id) => {
174
- adjList[id].forEach((nbr) => {
156
+ currentWave.forEach(id => {
157
+ adjList[id].forEach(nbr => {
175
158
  inDegree[nbr] -= 1;
176
159
  if (inDegree[nbr] === 0) next.push(nbr);
177
160
  });
@@ -184,12 +167,12 @@ async function main() {
184
167
  results.push(dagResult);
185
168
 
186
169
  // 6. Minimal Change Governance Engine benchmark
187
- console.log(c("cyan", " ▸ Benchmarking: Minimal Change Governance Engine"));
170
+ console.log(c('cyan', ' ▸ Benchmarking: Minimal Change Governance Engine'));
188
171
  const minResult = await benchmark(
189
- "Minimal Change Audit",
172
+ 'Minimal Change Audit',
190
173
  () => {
191
- const minEngine = require("../.agent/scripts/minimal_change_engine");
192
- minEngine.evaluateMinimalChange("add retry logic to API requests", {
174
+ const minEngine = require('../.agent/scripts/minimal_change_engine');
175
+ minEngine.evaluateMinimalChange('add retry logic to API requests', {
193
176
  files_added: 0,
194
177
  files_modified: 1,
195
178
  estimated_lines_added: 15,
@@ -199,39 +182,32 @@ async function main() {
199
182
  );
200
183
  results.push(minResult);
201
184
 
202
-
203
185
  // Print results table
204
186
  console.log();
205
187
  console.log(bold(` Results`));
188
+ console.log(c('gray', ` ─────────────────────────────────────────────────────────`));
206
189
  console.log(
207
- c("gray", ` ─────────────────────────────────────────────────────────`),
208
- );
209
- console.log(
210
- ` ${c("white", "Operation".padEnd(30))} ${c("white", "Avg (ms)".padStart(10))} ${c("white", "Min".padStart(8))} ${c("white", "Max".padStart(8))}`,
211
- );
212
- console.log(
213
- c("gray", ` ─────────────────────────────────────────────────────────`),
190
+ ` ${c('white', 'Operation'.padEnd(30))} ${c('white', 'Avg (ms)'.padStart(10))} ${c('white', 'Min'.padStart(8))} ${c('white', 'Max'.padStart(8))}`,
214
191
  );
192
+ console.log(c('gray', ` ─────────────────────────────────────────────────────────`));
215
193
 
216
194
  for (const r of results) {
217
- const avgColor = r.avg < 100 ? "green" : r.avg < 500 ? "yellow" : "red";
195
+ const avgColor = r.avg < 100 ? 'green' : r.avg < 500 ? 'yellow' : 'red';
218
196
  console.log(
219
- ` ${c("white", r.label.padEnd(30))} ${c(avgColor, String(Math.round(r.avg)).padStart(10))} ${c("gray", String(Math.round(r.min)).padStart(8))} ${c("gray", String(Math.round(r.max)).padStart(8))}`,
197
+ ` ${c('white', r.label.padEnd(30))} ${c(avgColor, String(Math.round(r.avg)).padStart(10))} ${c('gray', String(Math.round(r.min)).padStart(8))} ${c('gray', String(Math.round(r.max)).padStart(8))}`,
220
198
  );
221
199
  }
222
200
 
223
- console.log(
224
- c("gray", ` ─────────────────────────────────────────────────────────`),
225
- );
201
+ console.log(c('gray', ` ─────────────────────────────────────────────────────────`));
226
202
  console.log();
227
203
 
228
204
  // Write results to JSON for CI/comparison
229
- const outputPath = path.resolve(__dirname, "../benchmark-results.json");
205
+ const outputPath = path.resolve(__dirname, '../benchmark-results.json');
230
206
  const outputData = {
231
207
  timestamp: new Date().toISOString(),
232
208
  platform: `${os.platform()}-${os.arch()}`,
233
209
  node: process.version,
234
- results: results.map((r) => ({
210
+ results: results.map(r => ({
235
211
  label: r.label,
236
212
  avg_ms: Math.round(r.avg),
237
213
  min_ms: Math.round(r.min),
@@ -240,7 +216,7 @@ async function main() {
240
216
  })),
241
217
  };
242
218
  fs.writeFileSync(outputPath, JSON.stringify(outputData, null, 2));
243
- console.log(c("green", ` ✔ Results saved to benchmark-results.json`));
219
+ console.log(c('green', ` ✔ Results saved to benchmark-results.json`));
244
220
 
245
221
  // Cleanup temp
246
222
  try {
@@ -249,7 +225,7 @@ async function main() {
249
225
  console.log();
250
226
  }
251
227
 
252
- main().catch((err) => {
228
+ main().catch(err => {
253
229
  console.error(`Benchmark failed: ${err.message}`);
254
230
  process.exit(1);
255
231
  });
@@ -18,93 +18,91 @@
18
18
  * node scripts/changelog.js --since v4.1.0 → Changes since a specific tag
19
19
  */
20
20
 
21
- "use strict";
21
+ 'use strict';
22
22
 
23
- const { execSync } = require("child_process");
24
- const fs = require("fs");
25
- const path = require("path");
23
+ const { execSync } = require('child_process');
24
+ const fs = require('fs');
25
+ const path = require('path');
26
26
 
27
- const PKG = require(path.resolve(__dirname, "..", "package.json"));
28
- const CHANGELOG_PATH = path.resolve(__dirname, "..", "CHANGELOG.md");
27
+ const PKG = require(path.resolve(__dirname, '..', 'package.json'));
28
+ const CHANGELOG_PATH = path.resolve(__dirname, '..', 'CHANGELOG.md');
29
29
 
30
30
  // ── Commit Categories ────────────────────────────────────
31
31
  const CATEGORIES = {
32
- feat: { emoji: "", title: "Features" },
33
- fix: { emoji: "🐛", title: "Bug Fixes" },
34
- perf: { emoji: "", title: "Performance" },
35
- docs: { emoji: "📝", title: "Documentation" },
36
- test: { emoji: "", title: "Tests" },
37
- refactor: { emoji: "♻️", title: "Refactors" },
38
- chore: { emoji: "🔧", title: "Chores" },
39
- ci: { emoji: "🏗️", title: "CI/CD" },
40
- style: { emoji: "🎨", title: "Style" },
41
- breaking: { emoji: "💥", title: "Breaking Changes" },
32
+ feat: { emoji: '', title: 'Features' },
33
+ fix: { emoji: '🐛', title: 'Bug Fixes' },
34
+ perf: { emoji: '', title: 'Performance' },
35
+ docs: { emoji: '📝', title: 'Documentation' },
36
+ test: { emoji: '', title: 'Tests' },
37
+ refactor: { emoji: '♻️', title: 'Refactors' },
38
+ chore: { emoji: '🔧', title: 'Chores' },
39
+ ci: { emoji: '🏗️', title: 'CI/CD' },
40
+ style: { emoji: '🎨', title: 'Style' },
41
+ breaking: { emoji: '💥', title: 'Breaking Changes' },
42
42
  };
43
43
 
44
44
  // ── Git Helpers ──────────────────────────────────────────
45
45
  function git(cmd) {
46
46
  try {
47
- return execSync(`git ${cmd}`, { encoding: "utf8", timeout: 10000 }).trim();
47
+ return execSync(`git ${cmd}`, { encoding: 'utf8', timeout: 10000 }).trim();
48
48
  } catch {
49
- return "";
49
+ return '';
50
50
  }
51
51
  }
52
52
 
53
53
  function getLatestTag() {
54
54
  return (
55
- git("describe --tags --abbrev=0 2>nul") ||
56
- git("describe --tags --abbrev=0 2>/dev/null") ||
57
- ""
55
+ git('describe --tags --abbrev=0 2>nul') || git('describe --tags --abbrev=0 2>/dev/null') || ''
58
56
  );
59
57
  }
60
58
 
61
59
  function getCommits(since) {
62
- const range = since ? `${since}..HEAD` : "HEAD";
60
+ const range = since ? `${since}..HEAD` : 'HEAD';
63
61
  const MAX_COMMITS = 500;
64
- const format = "--format=%H||%s||%an||%ai";
62
+ const format = '--format=%H||%s||%an||%ai';
65
63
  const raw = git(`log ${range} ${format} --no-merges -n ${MAX_COMMITS}`);
66
64
  if (!raw) return [];
67
65
 
68
66
  return raw
69
- .split("\n")
70
- .filter(Boolean)
71
- .map((line) => {
72
- const [hash, subject, author, date] = line.split("||");
67
+ .replace(/\r/g, '')
68
+ .split('\n')
69
+ .filter(line => line.includes('||'))
70
+ .map(line => {
71
+ const [hash, subject = '', author = '', date = ''] = line.split('||');
73
72
  return {
74
- hash: hash?.replace(/^"/, "").slice(0, 7),
75
- subject,
76
- author,
77
- date: date?.replace(/"$/, "").slice(0, 10),
73
+ hash: hash?.replace(/^"/, '').slice(0, 7),
74
+ subject: subject.trim(),
75
+ author: author.trim(),
76
+ date: date?.replace(/"$/, '').slice(0, 10),
78
77
  };
79
78
  });
80
79
  }
81
80
 
82
- function categorize(subject) {
83
- const lower = subject.toLowerCase();
81
+ function categorize(subject = '') {
82
+ const lower = (subject || '').toLowerCase();
84
83
 
85
84
  // Check for BREAKING CHANGE
86
- if (lower.includes("breaking") || lower.includes("!:")) {
87
- return "breaking";
85
+ if (lower.includes('breaking') || lower.includes('!:')) {
86
+ return 'breaking';
88
87
  }
89
88
 
90
89
  // Match conventional commit prefix
91
- const match = subject.match(/^(\w+)(?:\(.+?\))?:\s*/);
90
+ const match = (subject || '').match(/^(\w+)(?:\(.+?\))?:\s*/);
92
91
  if (match) {
93
92
  const type = match[1].toLowerCase();
94
93
  if (CATEGORIES[type]) return type;
95
94
  }
96
95
 
97
96
  // Heuristic fallback
98
- if (lower.includes("fix") || lower.includes("bug")) return "fix";
99
- if (lower.includes("add") || lower.includes("new") || lower.includes("feat"))
100
- return "feat";
101
- if (lower.includes("doc") || lower.includes("readme")) return "docs";
102
- if (lower.includes("test")) return "test";
103
- if (lower.includes("refactor") || lower.includes("clean")) return "refactor";
104
- if (lower.includes("perf") || lower.includes("optim")) return "perf";
105
- if (lower.includes("ci") || lower.includes("workflow")) return "ci";
106
-
107
- return "chore";
97
+ if (lower.includes('fix') || lower.includes('bug')) return 'fix';
98
+ if (lower.includes('add') || lower.includes('new') || lower.includes('feat')) return 'feat';
99
+ if (lower.includes('doc') || lower.includes('readme')) return 'docs';
100
+ if (lower.includes('test')) return 'test';
101
+ if (lower.includes('refactor') || lower.includes('clean')) return 'refactor';
102
+ if (lower.includes('perf') || lower.includes('optim')) return 'perf';
103
+ if (lower.includes('ci') || lower.includes('workflow')) return 'ci';
104
+
105
+ return 'chore';
108
106
  }
109
107
 
110
108
  // ── Changelog Generation ─────────────────────────────────
@@ -114,7 +112,7 @@ function generateChangelog(commits, version, date) {
114
112
  const cat = categorize(commit.subject);
115
113
  if (!grouped[cat]) grouped[cat] = [];
116
114
  // Strip conventional prefix for cleaner display
117
- const clean = commit.subject.replace(/^\w+(\(.+?\))?:\s*/, "");
115
+ const clean = (commit.subject || '').replace(/^\w+(\(.+?\))?:\s*/, '');
118
116
  grouped[cat].push({ ...commit, clean });
119
117
  }
120
118
 
@@ -122,16 +120,16 @@ function generateChangelog(commits, version, date) {
122
120
 
123
121
  // Breaking changes first
124
122
  const order = [
125
- "breaking",
126
- "feat",
127
- "fix",
128
- "perf",
129
- "refactor",
130
- "docs",
131
- "test",
132
- "ci",
133
- "style",
134
- "chore",
123
+ 'breaking',
124
+ 'feat',
125
+ 'fix',
126
+ 'perf',
127
+ 'refactor',
128
+ 'docs',
129
+ 'test',
130
+ 'ci',
131
+ 'style',
132
+ 'chore',
135
133
  ];
136
134
  for (const cat of order) {
137
135
  if (!grouped[cat] || grouped[cat].length === 0) continue;
@@ -140,7 +138,7 @@ function generateChangelog(commits, version, date) {
140
138
  for (const c of grouped[cat]) {
141
139
  md += `- ${c.clean} (\`${c.hash}\`)\n`;
142
140
  }
143
- md += "\n";
141
+ md += '\n';
144
142
  }
145
143
 
146
144
  return md;
@@ -149,48 +147,44 @@ function generateChangelog(commits, version, date) {
149
147
  // ── Main ─────────────────────────────────────────────────
150
148
  function main() {
151
149
  const args = process.argv.slice(2);
152
- const isPreview = args.includes("--preview");
153
- const sinceIdx = args.indexOf("--since");
150
+ const isPreview = args.includes('--preview');
151
+ const sinceIdx = args.indexOf('--since');
154
152
  const sinceTag = sinceIdx !== -1 ? args[sinceIdx + 1] : null;
155
153
 
156
154
  const since = sinceTag || getLatestTag();
157
155
  const commits = getCommits(since);
158
156
 
159
157
  if (commits.length === 0) {
160
- console.log(" ℹ️ No new commits found since", since || "beginning");
158
+ console.log(' ℹ️ No new commits found since', since || 'beginning');
161
159
  process.exit(0);
162
160
  }
163
161
 
164
162
  const today = new Date().toISOString().slice(0, 10);
165
- const version = isPreview ? "Unreleased" : PKG.version;
163
+ const version = isPreview ? 'Unreleased' : PKG.version;
166
164
 
167
165
  const changelog = generateChangelog(commits, version, today);
168
166
 
169
167
  if (isPreview) {
170
- console.log("\n 📋 Changelog Preview\n " + "".repeat(40) + "\n");
168
+ console.log('\n 📋 Changelog Preview\n ' + ''.repeat(40) + '\n');
171
169
  console.log(changelog);
172
- console.log(
173
- ` 📊 ${commits.length} commits since ${since || "initial commit"}`,
174
- );
170
+ console.log(` 📊 ${commits.length} commits since ${since || 'initial commit'}`);
175
171
  return;
176
172
  }
177
173
 
178
174
  // Write or prepend to CHANGELOG.md
179
175
  const header = `# Changelog\n\nAll notable changes to Tribunal Kit are documented here.\nFormat follows [Keep a Changelog](https://keepachangelog.com/).\n\n`;
180
176
 
181
- let existing = "";
177
+ let existing = '';
182
178
  if (fs.existsSync(CHANGELOG_PATH)) {
183
- existing = fs.readFileSync(CHANGELOG_PATH, "utf8");
179
+ existing = fs.readFileSync(CHANGELOG_PATH, 'utf8');
184
180
  // Remove existing header
185
- existing = existing.replace(/^# Changelog[\s\S]*?(?=## )/, "");
181
+ existing = existing.replace(/^# Changelog[\s\S]*?(?=## )/, '');
186
182
  }
187
183
 
188
184
  const full = header + changelog + existing;
189
- fs.writeFileSync(CHANGELOG_PATH, full, "utf8");
185
+ fs.writeFileSync(CHANGELOG_PATH, full, 'utf8');
190
186
 
191
- console.log(
192
- ` ✔ CHANGELOG.md updated — v${version} (${commits.length} commits)`,
193
- );
187
+ console.log(` ✔ CHANGELOG.md updated — v${version} (${commits.length} commits)`);
194
188
  }
195
189
 
196
190
  main();
@@ -7,12 +7,12 @@
7
7
  * Dry-run: node scripts/fix-vbc.js --dry-run
8
8
  */
9
9
 
10
- const fs = require("fs");
11
- const path = require("path");
10
+ const fs = require('fs');
11
+ const path = require('path');
12
12
 
13
- const ROOT = path.resolve(__dirname, "..");
14
- const SKILLS_DIR = path.join(ROOT, ".agent", "skills");
15
- const DRY_RUN = process.argv.includes("--dry-run");
13
+ const ROOT = path.resolve(__dirname, '..');
14
+ const SKILLS_DIR = path.join(ROOT, '.agent', 'skills');
15
+ const DRY_RUN = process.argv.includes('--dry-run');
16
16
 
17
17
  const PRE_FLIGHT_BLOCK = `
18
18
  ### ✅ Pre-Flight Self-Audit
@@ -38,34 +38,32 @@ let fixedCount = 0;
38
38
  let skippedCount = 0;
39
39
  let errorCount = 0;
40
40
 
41
- const skillDirs = fs.readdirSync(SKILLS_DIR).filter((d) => {
41
+ const skillDirs = fs.readdirSync(SKILLS_DIR).filter(d => {
42
42
  return fs.statSync(path.join(SKILLS_DIR, d)).isDirectory();
43
43
  });
44
44
 
45
45
  for (const dir of skillDirs) {
46
- const skillPath = path.join(SKILLS_DIR, dir, "SKILL.md");
46
+ const skillPath = path.join(SKILLS_DIR, dir, 'SKILL.md');
47
47
  if (!fs.existsSync(skillPath)) continue;
48
48
 
49
49
  let content;
50
50
  try {
51
- content = fs.readFileSync(skillPath, "utf8");
51
+ content = fs.readFileSync(skillPath, 'utf8');
52
52
  } catch (e) {
53
53
  console.error(` ❌ Failed to read: ${dir}/SKILL.md — ${e.message}`);
54
54
  errorCount++;
55
55
  continue;
56
56
  }
57
57
 
58
- const hasPreFlight =
59
- content.includes("Pre-Flight Checklist") || content.includes("Pre-Flight");
60
- const hasVBC =
61
- content.includes("VBC Protocol") || content.includes("VBC");
58
+ const hasPreFlight = content.includes('Pre-Flight Checklist') || content.includes('Pre-Flight');
59
+ const hasVBC = content.includes('VBC Protocol') || content.includes('VBC');
62
60
 
63
61
  if (hasPreFlight && hasVBC) {
64
62
  skippedCount++;
65
63
  continue;
66
64
  }
67
65
 
68
- let appendText = "";
66
+ let appendText = '';
69
67
 
70
68
  if (!hasPreFlight) {
71
69
  appendText += PRE_FLIGHT_BLOCK;
@@ -81,7 +79,7 @@ for (const dir of skillDirs) {
81
79
  console.log(` [DRY-RUN] Would append to ${dir}/SKILL.md`);
82
80
  } else {
83
81
  try {
84
- fs.appendFileSync(skillPath, appendText, "utf8");
82
+ fs.appendFileSync(skillPath, appendText, 'utf8');
85
83
  fixedCount++;
86
84
  } catch (e) {
87
85
  console.error(` ❌ Failed to write: ${dir}/SKILL.md — ${e.message}`);
@@ -94,5 +92,5 @@ console.log(`\n━━━ VBC Fix Summary ━━━━━━━━━━━━━
94
92
  console.log(` Fixed: ${fixedCount}`);
95
93
  console.log(` Skipped: ${skippedCount} (already compliant)`);
96
94
  console.log(` Errors: ${errorCount}`);
97
- console.log(` Mode: ${DRY_RUN ? "DRY-RUN (no changes)" : "LIVE"}`);
95
+ console.log(` Mode: ${DRY_RUN ? 'DRY-RUN (no changes)' : 'LIVE'}`);
98
96
  console.log();