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
@@ -1,107 +1,132 @@
1
1
  #!/usr/bin/env node
2
2
  // VERIFY: Using native Node.js only. Zero dependencies to ensure instant execution.
3
3
 
4
- const rawInput = process.argv.slice(2).join(" ");
4
+ 'use strict';
5
5
 
6
- if (!rawInput) {
7
- console.error(
8
- 'Usage: node prompt_compiler.js "Your conversational prompt here"',
9
- );
10
- process.exit(1);
11
- }
12
-
13
- // 1. Keep original input, only optionally strip leading "please" for action matching
14
- const cleanInput = rawInput.trim();
15
-
16
- // 2. Extract Action (Intent mapping)
17
- const actionMatch = cleanInput.match(
18
- /^(?:(?:hey,?\s*|please\s+|can you\s+|could you\s+|would you\s+|i need you to\s+|i want to\s+)*)(build|create|fix|debug|refactor|update|write|design|audit)\b/i,
19
- );
20
- const action = actionMatch ? actionMatch[1].toLowerCase() : "execute";
21
-
22
- // 3. Extract Technology Stack
23
- const techKeywords = [
24
- "react",
25
- "tailwind",
26
- "next.js",
27
- "sql",
28
- "postgres",
29
- "express",
30
- "python",
31
- "node",
32
- "vue",
33
- "svelte",
34
- "typescript",
35
- "js",
36
- "css",
37
- "html",
38
- "prisma",
39
- "drizzle",
6
+ const TECH_KEYWORDS = [
7
+ 'react',
8
+ 'tailwind',
9
+ 'next.js',
10
+ 'sql',
11
+ 'postgres',
12
+ 'express',
13
+ 'python',
14
+ 'node',
15
+ 'vue',
16
+ 'svelte',
17
+ 'typescript',
18
+ 'js',
19
+ 'css',
20
+ 'html',
21
+ 'prisma',
22
+ 'drizzle',
40
23
  ];
41
24
 
42
- const stack = [];
43
- techKeywords.forEach((tech) => {
44
- const regex = new RegExp(`\\b${tech.replace(".", "\\.")}\\b`, "i");
45
- if (regex.test(cleanInput)) {
46
- stack.push(tech.toLowerCase());
47
- }
48
- });
49
-
50
- // 4. Intelligent Pre-Routing
51
- const routerMap = {
52
- react: ["react-specialist", "frontend-design"],
53
- tailwind: ["tailwind-patterns"],
54
- "next.js": ["nextjs-react-expert", "react-specialist"],
55
- sql: ["sql-pro", "database-design"],
56
- postgres: ["database-design"],
57
- express: ["nodejs-best-practices"],
58
- python: ["python-pro"],
59
- node: ["nodejs-best-practices"],
60
- vue: ["vue-expert"],
61
- svelte: ["frontend-design"],
62
- typescript: ["typescript-advanced"],
63
- js: ["clean-code"],
64
- css: ["tailwind-patterns"],
65
- html: ["frontend-design"],
66
- prisma: ["database-design"],
67
- drizzle: ["database-design"],
25
+ const ROUTER_MAP = {
26
+ react: ['react-specialist', 'frontend-design'],
27
+ tailwind: ['tailwind-patterns'],
28
+ 'next.js': ['nextjs-react-expert', 'react-specialist'],
29
+ sql: ['sql-pro', 'database-design'],
30
+ postgres: ['database-design'],
31
+ express: ['nodejs-best-practices'],
32
+ python: ['python-pro'],
33
+ node: ['nodejs-best-practices'],
34
+ vue: ['vue-expert'],
35
+ svelte: ['frontend-design'],
36
+ typescript: ['typescript-advanced'],
37
+ js: ['clean-code'],
38
+ css: ['tailwind-patterns'],
39
+ html: ['frontend-design'],
40
+ prisma: ['database-design'],
41
+ drizzle: ['database-design'],
68
42
  };
69
43
 
70
- const actionRouter = {
71
- build: ["architecture"],
72
- create: ["architecture"],
73
- fix: ["systematic-debugging"],
74
- debug: ["systematic-debugging"],
75
- refactor: ["clean-code"],
76
- update: ["clean-code"],
77
- write: ["clean-code"],
78
- design: ["frontend-design"],
79
- audit: ["vulnerability-scanner", "lint-and-validate"],
44
+ const ACTION_ROUTER = {
45
+ build: ['architecture'],
46
+ create: ['architecture'],
47
+ fix: ['systematic-debugging'],
48
+ debug: ['systematic-debugging'],
49
+ refactor: ['clean-code'],
50
+ update: ['clean-code'],
51
+ write: ['clean-code'],
52
+ design: ['frontend-design'],
53
+ audit: ['vulnerability-scanner', 'lint-and-validate'],
80
54
  };
81
55
 
82
- const recommendedSkills = new Set();
56
+ /**
57
+ * Programmatically compile a user request or spec object into a hyper-dense super-prompt string.
58
+ * @param {string|object} input
59
+ * @returns {string} Highly compressed YAML string
60
+ */
61
+ function compileSuperPrompt(input) {
62
+ let cleanInput = '';
63
+ let preStack = [];
64
+ let preRules = [];
65
+
66
+ if (typeof input === 'object' && input !== null) {
67
+ cleanInput = (input.task || input.spec || '').trim();
68
+ if (Array.isArray(input.stack)) preStack = input.stack;
69
+ if (Array.isArray(input.rules)) preRules = input.rules;
70
+ } else {
71
+ cleanInput = String(input || '').trim();
72
+ }
73
+
74
+ // 1. Extract Action (Intent mapping)
75
+ const actionMatch = cleanInput.match(
76
+ /^(?:(?:hey,?\s*|please\s+|can you\s+|could you\s+|would you\s+|i need you to\s+|i want to\s+)*)(build|create|fix|debug|refactor|update|write|design|audit)\b/i,
77
+ );
78
+ const action = actionMatch ? actionMatch[1].toLowerCase() : 'execute';
79
+
80
+ // 2. Extract Tech Stack
81
+ const stackSet = new Set(preStack.map(s => s.toLowerCase()));
82
+ TECH_KEYWORDS.forEach(tech => {
83
+ const regex = new RegExp(`\\b${tech.replace('.', '\\.')}\\b`, 'i');
84
+ if (regex.test(cleanInput)) {
85
+ stackSet.add(tech.toLowerCase());
86
+ }
87
+ });
88
+ const stack = Array.from(stackSet);
83
89
 
84
- if (actionRouter[action]) {
85
- actionRouter[action].forEach((s) => recommendedSkills.add(s));
90
+ // 3. Skill Pre-Routing
91
+ const recommendedSkills = new Set(preRules);
92
+ if (ACTION_ROUTER[action]) {
93
+ ACTION_ROUTER[action].forEach(s => recommendedSkills.add(s));
94
+ }
95
+
96
+ stack.forEach(tech => {
97
+ if (ROUTER_MAP[tech]) {
98
+ ROUTER_MAP[tech].forEach(s => recommendedSkills.add(s));
99
+ }
100
+ });
101
+
102
+ const finalSkills = Array.from(recommendedSkills).slice(0, 4);
103
+
104
+ // 4. Compact YAML Generation
105
+ const indentedTarget = cleanInput
106
+ .split('\n')
107
+ .map(line => ' ' + line)
108
+ .join('\n');
109
+
110
+ return [
111
+ '---',
112
+ `action: ${action}`,
113
+ `target: |`,
114
+ indentedTarget,
115
+ `stack: [${stack.join(', ')}]`,
116
+ `recommended_skills: [${finalSkills.join(', ')}]`,
117
+ '---',
118
+ ].join('\n');
86
119
  }
87
120
 
88
- stack.forEach((tech) => {
89
- if (routerMap[tech]) {
90
- routerMap[tech].forEach((s) => recommendedSkills.add(s));
121
+ if (require.main === module) {
122
+ const rawInput = process.argv.slice(2).join(' ');
123
+
124
+ if (!rawInput) {
125
+ console.error('Usage: node prompt_compiler.js "Your conversational prompt here"');
126
+ process.exit(1);
91
127
  }
92
- });
93
-
94
- const finalSkills = Array.from(recommendedSkills).slice(0, 3);
95
-
96
- // 5. Output highly compressed YAML
97
- console.log("---");
98
- console.log(`action: ${action}`);
99
- console.log(`target: |`);
100
- const indentedTarget = cleanInput
101
- .split("\n")
102
- .map((line) => " " + line)
103
- .join("\n");
104
- console.log(indentedTarget);
105
- console.log(`stack: [${stack.join(", ")}]`);
106
- console.log(`recommended_skills: [${finalSkills.join(", ")}]`);
107
- console.log("---");
128
+
129
+ console.log(compileSuperPrompt(rawInput));
130
+ }
131
+
132
+ module.exports = { compileSuperPrompt };
@@ -8,25 +8,16 @@
8
8
  * node .agent/scripts/schema_validator.js . --file prisma/schema.prisma
9
9
  */
10
10
 
11
- "use strict";
12
-
13
- const fs = require("fs");
14
- const path = require("path");
15
-
16
- const {
17
- BOLD,
18
- RESET,
19
- BLUE,
20
- sectionHeader: header,
21
- ok,
22
- fail,
23
- warn,
24
- skip,
25
- } = require("./_colors");
11
+ 'use strict';
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const { BOLD, RESET, BLUE, sectionHeader: header, ok, fail, warn, skip } = require('./_colors');
26
17
 
27
18
  function detectOrm(projectRoot) {
28
- if (fs.existsSync(path.join(projectRoot, "prisma", "schema.prisma"))) {
29
- return "prisma";
19
+ if (fs.existsSync(path.join(projectRoot, 'prisma', 'schema.prisma'))) {
20
+ return 'prisma';
30
21
  }
31
22
 
32
23
  function searchFor(dir, patterns) {
@@ -38,12 +29,12 @@ function detectOrm(projectRoot) {
38
29
  }
39
30
 
40
31
  for (const item of items) {
41
- if (item.isDirectory() && !["node_modules", ".git"].includes(item.name)) {
32
+ if (item.isDirectory() && !['node_modules', '.git'].includes(item.name)) {
42
33
  if (searchFor(path.join(dir, item.name), patterns)) return true;
43
- if (item.name === "migrations") {
34
+ if (item.name === 'migrations') {
44
35
  try {
45
36
  const mFiles = fs.readdirSync(path.join(dir, item.name));
46
- if (mFiles.some((f) => f.endsWith(".sql"))) return "sql";
37
+ if (mFiles.some(f => f.endsWith('.sql'))) return 'sql';
47
38
  } catch {}
48
39
  }
49
40
  } else {
@@ -56,15 +47,15 @@ function detectOrm(projectRoot) {
56
47
  }
57
48
 
58
49
  const type = searchFor(projectRoot, [
59
- { test: (name) => name.startsWith("drizzle.config."), type: "drizzle" },
50
+ { test: name => name.startsWith('drizzle.config.'), type: 'drizzle' },
60
51
  ]);
61
52
  if (type) return type;
62
53
 
63
54
  if (
64
- fs.existsSync(path.join(projectRoot, "knexfile.js")) ||
65
- fs.existsSync(path.join(projectRoot, "knexfile.ts"))
55
+ fs.existsSync(path.join(projectRoot, 'knexfile.js')) ||
56
+ fs.existsSync(path.join(projectRoot, 'knexfile.ts'))
66
57
  ) {
67
- return "knex";
58
+ return 'knex';
68
59
  }
69
60
 
70
61
  return null;
@@ -74,17 +65,17 @@ function validatePrisma(filepath) {
74
65
  const issues = [];
75
66
  let lines;
76
67
  try {
77
- lines = fs.readFileSync(filepath, "utf8").split("\n");
68
+ lines = fs.readFileSync(filepath, 'utf8').split('\n');
78
69
  } catch {
79
- return [["error", `Cannot read file: ${filepath}`, 0]];
70
+ return [['error', `Cannot read file: ${filepath}`, 0]];
80
71
  }
81
72
 
82
- let currentModel = "";
73
+ let currentModel = '';
83
74
  let hasCreatedAt = false;
84
75
  let hasUpdatedAt = false;
85
76
  let modelStartLine = 0;
86
77
  let fieldsWithRelation = [];
87
- let indexedFields = new Set();
78
+ const indexedFields = new Set();
88
79
  let hasIdField = false;
89
80
 
90
81
  for (let i = 0; i < lines.length; i++) {
@@ -97,26 +88,22 @@ function validatePrisma(filepath) {
97
88
  if (currentModel) {
98
89
  if (!hasCreatedAt)
99
90
  issues.push([
100
- "warn",
91
+ 'warn',
101
92
  `Model '${currentModel}' missing createdAt timestamp`,
102
93
  modelStartLine,
103
94
  ]);
104
95
  if (!hasUpdatedAt)
105
96
  issues.push([
106
- "warn",
97
+ 'warn',
107
98
  `Model '${currentModel}' missing updatedAt timestamp`,
108
99
  modelStartLine,
109
100
  ]);
110
101
  if (!hasIdField)
111
- issues.push([
112
- "warn",
113
- `Model '${currentModel}' has no @id field`,
114
- modelStartLine,
115
- ]);
102
+ issues.push(['warn', `Model '${currentModel}' has no @id field`, modelStartLine]);
116
103
  for (const [fieldName, fieldLine] of fieldsWithRelation) {
117
104
  if (!indexedFields.has(fieldName)) {
118
105
  issues.push([
119
- "warn",
106
+ 'warn',
120
107
  `Model '${currentModel}': foreign key '${fieldName}' has no @@index`,
121
108
  fieldLine,
122
109
  ]);
@@ -133,29 +120,23 @@ function validatePrisma(filepath) {
133
120
  indexedFields.clear();
134
121
 
135
122
  if (currentModel[0] !== currentModel[0].toUpperCase()) {
136
- issues.push([
137
- "warn",
138
- `Model '${currentModel}' should use PascalCase`,
139
- lineNum,
140
- ]);
123
+ issues.push(['warn', `Model '${currentModel}' should use PascalCase`, lineNum]);
141
124
  }
142
125
  }
143
126
 
144
127
  if (currentModel) {
145
- if (stripped.includes("createdAt") || stripped.includes("created_at"))
146
- hasCreatedAt = true;
147
- if (stripped.includes("updatedAt") || stripped.includes("updated_at"))
148
- hasUpdatedAt = true;
149
- if (stripped.includes("@id")) hasIdField = true;
128
+ if (stripped.includes('createdAt') || stripped.includes('created_at')) hasCreatedAt = true;
129
+ if (stripped.includes('updatedAt') || stripped.includes('updated_at')) hasUpdatedAt = true;
130
+ if (stripped.includes('@id')) hasIdField = true;
150
131
 
151
132
  const fkMatch = stripped.match(/^\s*(\w+Id)\s+(Int|String|BigInt)/);
152
- if (fkMatch && !stripped.includes("@relation")) {
133
+ if (fkMatch && !stripped.includes('@relation')) {
153
134
  fieldsWithRelation.push([fkMatch[1], lineNum]);
154
135
  }
155
136
 
156
137
  const indexMatch = stripped.match(/@@index\(\[([^\]]+)\]/);
157
138
  if (indexMatch) {
158
- for (const field of indexMatch[1].split(",")) {
139
+ for (const field of indexMatch[1].split(',')) {
159
140
  indexedFields.add(field.trim());
160
141
  }
161
142
  }
@@ -164,27 +145,15 @@ function validatePrisma(filepath) {
164
145
 
165
146
  if (currentModel) {
166
147
  if (!hasCreatedAt)
167
- issues.push([
168
- "warn",
169
- `Model '${currentModel}' missing createdAt timestamp`,
170
- modelStartLine,
171
- ]);
148
+ issues.push(['warn', `Model '${currentModel}' missing createdAt timestamp`, modelStartLine]);
172
149
  if (!hasUpdatedAt)
173
- issues.push([
174
- "warn",
175
- `Model '${currentModel}' missing updatedAt timestamp`,
176
- modelStartLine,
177
- ]);
150
+ issues.push(['warn', `Model '${currentModel}' missing updatedAt timestamp`, modelStartLine]);
178
151
  if (!hasIdField)
179
- issues.push([
180
- "warn",
181
- `Model '${currentModel}' has no @id field`,
182
- modelStartLine,
183
- ]);
152
+ issues.push(['warn', `Model '${currentModel}' has no @id field`, modelStartLine]);
184
153
  for (const [fieldName, fieldLine] of fieldsWithRelation) {
185
154
  if (!indexedFields.has(fieldName)) {
186
155
  issues.push([
187
- "warn",
156
+ 'warn',
188
157
  `Model '${currentModel}': foreign key '${fieldName}' may need @@index`,
189
158
  fieldLine,
190
159
  ]);
@@ -199,39 +168,27 @@ function validateSqlMigration(filepath) {
199
168
  const issues = [];
200
169
  let lines;
201
170
  try {
202
- lines = fs.readFileSync(filepath, "utf8").split("\n");
171
+ lines = fs.readFileSync(filepath, 'utf8').split('\n');
203
172
  } catch {
204
- return [["error", `Cannot read file: ${filepath}`, 0]];
173
+ return [['error', `Cannot read file: ${filepath}`, 0]];
205
174
  }
206
175
 
207
176
  for (let i = 0; i < lines.length; i++) {
208
177
  const lineNum = i + 1;
209
178
  const stripped = lines[i].trim().toUpperCase();
210
179
 
211
- if (stripped.includes("DROP TABLE") && !stripped.includes("IF EXISTS")) {
212
- issues.push([
213
- "warn",
214
- "DROP TABLE without IF EXISTS — may fail on clean databases",
215
- lineNum,
216
- ]);
180
+ if (stripped.includes('DROP TABLE') && !stripped.includes('IF EXISTS')) {
181
+ issues.push(['warn', 'DROP TABLE without IF EXISTS — may fail on clean databases', lineNum]);
217
182
  }
218
183
  if (
219
- stripped.includes("REFERENCES") &&
220
- !stripped.includes("NOT NULL") &&
221
- !stripped.includes("NULL")
184
+ stripped.includes('REFERENCES') &&
185
+ !stripped.includes('NOT NULL') &&
186
+ !stripped.includes('NULL')
222
187
  ) {
223
- issues.push([
224
- "warn",
225
- "Foreign key without explicit NULL/NOT NULL constraint",
226
- lineNum,
227
- ]);
188
+ issues.push(['warn', 'Foreign key without explicit NULL/NOT NULL constraint', lineNum]);
228
189
  }
229
- if (stripped.includes("CREATE TABLE")) {
230
- issues.push([
231
- "info",
232
- "Verify this table includes created_at / updated_at columns",
233
- lineNum,
234
- ]);
190
+ if (stripped.includes('CREATE TABLE')) {
191
+ issues.push(['info', 'Verify this table includes created_at / updated_at columns', lineNum]);
235
192
  }
236
193
  }
237
194
 
@@ -241,20 +198,20 @@ function validateSqlMigration(filepath) {
241
198
  function main() {
242
199
  const args = process.argv.slice(2);
243
200
  let targetPath = null;
244
- let typeArg = "auto";
201
+ let typeArg = 'auto';
245
202
  let fileArg = null;
246
203
 
247
204
  let i = 0;
248
205
  while (i < args.length) {
249
- if (args[i] === "--type" && i + 1 < args.length) typeArg = args[++i];
250
- else if (args[i] === "--file" && i + 1 < args.length) fileArg = args[++i];
251
- else if (!targetPath && !args[i].startsWith("-")) targetPath = args[i];
206
+ if (args[i] === '--type' && i + 1 < args.length) typeArg = args[++i];
207
+ else if (args[i] === '--file' && i + 1 < args.length) fileArg = args[++i];
208
+ else if (!targetPath && !args[i].startsWith('-')) targetPath = args[i];
252
209
  i++;
253
210
  }
254
211
 
255
212
  if (!targetPath) {
256
213
  console.log(
257
- "Usage: node schema_validator.js <path> [--type <prisma|drizzle|sql>] [--file <filepath>]",
214
+ 'Usage: node schema_validator.js <path> [--type <prisma|drizzle|sql>] [--file <filepath>]',
258
215
  );
259
216
  process.exit(1);
260
217
  }
@@ -268,9 +225,9 @@ function main() {
268
225
  console.log(`${BOLD}Tribunal — schema_validator.js${RESET}`);
269
226
  console.log(`Project: ${projectRoot}`);
270
227
 
271
- const ormType = typeArg !== "auto" ? typeArg : detectOrm(projectRoot);
228
+ const ormType = typeArg !== 'auto' ? typeArg : detectOrm(projectRoot);
272
229
  if (!ormType && !fileArg) {
273
- skip("No schema files detected — skipping validation");
230
+ skip('No schema files detected — skipping validation');
274
231
  process.exit(0);
275
232
  }
276
233
 
@@ -278,36 +235,34 @@ function main() {
278
235
 
279
236
  if (fileArg) {
280
237
  console.log(header(`Validating: ${fileArg}`));
281
- const filepath = path.isAbsolute(fileArg)
282
- ? fileArg
283
- : path.join(projectRoot, fileArg);
238
+ const filepath = path.isAbsolute(fileArg) ? fileArg : path.join(projectRoot, fileArg);
284
239
  let issues = [];
285
- if (filepath.endsWith(".prisma")) issues = validatePrisma(filepath);
286
- else if (filepath.endsWith(".sql")) issues = validateSqlMigration(filepath);
240
+ if (filepath.endsWith('.prisma')) issues = validatePrisma(filepath);
241
+ else if (filepath.endsWith('.sql')) issues = validateSqlMigration(filepath);
287
242
  else {
288
243
  skip(`Unknown schema file type: ${fileArg}`);
289
244
  process.exit(0);
290
245
  }
291
246
 
292
247
  for (const [severity, message, line] of issues) {
293
- if (severity === "error") {
248
+ if (severity === 'error') {
294
249
  fail(`L${line}: ${message}`);
295
250
  issuesCount++;
296
- } else if (severity === "warn") {
251
+ } else if (severity === 'warn') {
297
252
  warn(`L${line}: ${message}`);
298
253
  issuesCount++;
299
254
  } else console.log(` ${BLUE}ℹ️ L${line}: ${message}${RESET}`);
300
255
  }
301
- } else if (ormType === "prisma") {
302
- const schemaPath = path.join(projectRoot, "prisma", "schema.prisma");
256
+ } else if (ormType === 'prisma') {
257
+ const schemaPath = path.join(projectRoot, 'prisma', 'schema.prisma');
303
258
  if (fs.existsSync(schemaPath)) {
304
- console.log(header("Prisma Schema Validation"));
259
+ console.log(header('Prisma Schema Validation'));
305
260
  const issues = validatePrisma(schemaPath);
306
261
  for (const [severity, message, line] of issues) {
307
- if (severity === "error") {
262
+ if (severity === 'error') {
308
263
  fail(`L${line}: ${message}`);
309
264
  issuesCount++;
310
- } else if (severity === "warn") {
265
+ } else if (severity === 'warn') {
311
266
  warn(`L${line}: ${message}`);
312
267
  issuesCount++;
313
268
  } else console.log(` ${BLUE}ℹ️ L${line}: ${message}${RESET}`);
@@ -315,23 +270,20 @@ function main() {
315
270
  } else {
316
271
  skip(`Prisma schema not found at ${schemaPath}`);
317
272
  }
318
- } else if (ormType === "sql") {
319
- console.log(header("SQL Migration Validation"));
273
+ } else if (ormType === 'sql') {
274
+ console.log(header('SQL Migration Validation'));
320
275
  // Very basic recursion for migrations dir
321
276
  function findMigrations(dir) {
322
- let res = [];
277
+ const res = [];
323
278
  try {
324
279
  const items = fs.readdirSync(dir, { withFileTypes: true });
325
280
  for (const item of items) {
326
- if (
327
- item.isDirectory() &&
328
- !["node_modules", ".git"].includes(item.name)
329
- ) {
330
- if (item.name === "migrations") {
281
+ if (item.isDirectory() && !['node_modules', '.git'].includes(item.name)) {
282
+ if (item.name === 'migrations') {
331
283
  const sqls = fs
332
284
  .readdirSync(path.join(dir, item.name))
333
- .filter((f) => f.endsWith(".sql"))
334
- .map((f) => path.join(dir, item.name, f));
285
+ .filter(f => f.endsWith('.sql'))
286
+ .map(f => path.join(dir, item.name, f));
335
287
  res.push(...sqls);
336
288
  } else {
337
289
  res.push(...findMigrations(path.join(dir, item.name)));
@@ -347,22 +299,22 @@ function main() {
347
299
  console.log(`\n 📄 ${path.basename(sqlFile)}`);
348
300
  const issues = validateSqlMigration(sqlFile);
349
301
  for (const [severity, message, line] of issues) {
350
- if (severity === "error") {
302
+ if (severity === 'error') {
351
303
  fail(` L${line}: ${message}`);
352
304
  issuesCount++;
353
- } else if (severity === "warn") {
305
+ } else if (severity === 'warn') {
354
306
  warn(` L${line}: ${message}`);
355
307
  issuesCount++;
356
308
  } else console.log(` ${BLUE}ℹ️ L${line}: ${message}${RESET}`);
357
309
  }
358
310
  }
359
- } else if (ormType === "drizzle") {
360
- console.log(header("Drizzle Schema"));
361
- skip("Drizzle validation not yet implemented — validate manually");
311
+ } else if (ormType === 'drizzle') {
312
+ console.log(header('Drizzle Schema'));
313
+ skip('Drizzle validation not yet implemented — validate manually');
362
314
  }
363
315
 
364
316
  console.log(`\n${BOLD}━━━ Schema Validation Summary ━━━${RESET}`);
365
- if (issuesCount === 0) ok("No schema issues found");
317
+ if (issuesCount === 0) ok('No schema issues found');
366
318
  else warn(`${issuesCount} issue(s) found — review above`);
367
319
 
368
320
  process.exit(0);