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.
- package/.agent/.manifest.json +78 -0
- package/.agent/ARCHITECTURE.md +19 -241
- package/.agent/agents/accessibility-reviewer.md +23 -16
- package/.agent/agents/ai-code-reviewer.md +25 -21
- package/.agent/agents/anti-pattern-reviewer.md +12 -7
- package/.agent/agents/api-architect.md +1 -0
- package/.agent/agents/backend-specialist.md +23 -22
- package/.agent/agents/cloud-engineer.md +1 -0
- package/.agent/agents/code-archaeologist.md +1 -0
- package/.agent/agents/complexity-reviewer.md +10 -7
- package/.agent/agents/database-architect.md +3 -2
- package/.agent/agents/db-latency-auditor.md +6 -2
- package/.agent/agents/debugger.md +3 -2
- package/.agent/agents/dependency-reviewer.md +1 -0
- package/.agent/agents/devops-engineer.md +9 -8
- package/.agent/agents/documentation-writer.md +6 -5
- package/.agent/agents/explorer-agent.md +1 -0
- package/.agent/agents/frontend-reviewer.md +21 -17
- package/.agent/agents/frontend-specialist.md +23 -20
- package/.agent/agents/game-developer.md +1 -0
- package/.agent/agents/interaction-reviewer.md +10 -5
- package/.agent/agents/logic-reviewer.md +3 -0
- package/.agent/agents/minimalist-reviewer.md +6 -0
- package/.agent/agents/mobile-developer.md +7 -6
- package/.agent/agents/mobile-reviewer.md +14 -13
- package/.agent/agents/orchestrator.md +3 -0
- package/.agent/agents/penetration-tester.md +1 -0
- package/.agent/agents/performance-optimizer.md +6 -5
- package/.agent/agents/performance-reviewer.md +6 -6
- package/.agent/agents/pipeline-reviewer.md +144 -0
- package/.agent/agents/precedence-reviewer.md +1 -0
- package/.agent/agents/product-manager.md +1 -0
- package/.agent/agents/product-owner.md +1 -0
- package/.agent/agents/product-reviewer.md +12 -7
- package/.agent/agents/project-planner.md +3 -0
- package/.agent/agents/qa-automation-engineer.md +50 -43
- package/.agent/agents/resilience-reviewer.md +1 -0
- package/.agent/agents/schema-reviewer.md +1 -0
- package/.agent/agents/security-auditor.md +24 -24
- package/.agent/agents/seo-specialist.md +33 -23
- package/.agent/agents/sql-reviewer.md +5 -4
- package/.agent/agents/supervisor-agent.md +12 -2
- package/.agent/agents/swarm-worker-contracts.md +13 -13
- package/.agent/agents/swarm-worker-registry.md +51 -51
- package/.agent/agents/system-architect.md +1 -0
- package/.agent/agents/test-coverage-reviewer.md +25 -22
- package/.agent/agents/test-engineer.md +12 -11
- package/.agent/agents/throughput-optimizer.md +45 -40
- package/.agent/agents/type-safety-reviewer.md +5 -4
- package/.agent/agents/ui-ux-auditor.md +6 -4
- package/.agent/agents/ui-visual-auditor.md +3 -0
- package/.agent/agents/ux-reviewer.md +11 -6
- package/.agent/agents/visual-reviewer.md +11 -6
- package/.agent/agents/vitals-reviewer.md +5 -4
- package/.agent/history/memory/.memory.idx +3716 -1
- package/.agent/history/memory/MEMORY.md +246 -1
- package/.agent/mcp_config.json +1 -6
- package/.agent/routing_index.json +2034 -263
- package/.agent/rules/GEMINI.md +12 -10
- package/.agent/rules/GEMINI_PLANNER.md +19 -21
- package/.agent/scripts/_colors.js +52 -54
- package/.agent/scripts/_utils.js +52 -53
- package/.agent/scripts/auto_preview.js +39 -43
- package/.agent/scripts/bundle_analyzer.js +47 -60
- package/.agent/scripts/case_law_manager.js +200 -294
- package/.agent/scripts/checklist.js +73 -94
- package/.agent/scripts/cicd_validator.js +305 -0
- package/.agent/scripts/compile_router.py +4 -111
- package/.agent/scripts/context_broker.js +317 -412
- package/.agent/scripts/contract_engine.js +402 -0
- package/.agent/scripts/dependency_analyzer.js +112 -124
- package/.agent/scripts/graph_builder.js +75 -103
- package/.agent/scripts/graph_visualizer.js +10 -12
- package/.agent/scripts/graph_zoom.js +38 -55
- package/.agent/scripts/guardrail_engine.js +195 -145
- package/.agent/scripts/impact_classifier.js +55 -30
- package/.agent/scripts/inner_loop_validator.js +108 -159
- package/.agent/scripts/integrity_manifest.js +59 -67
- package/.agent/scripts/lint_runner.js +65 -75
- package/.agent/scripts/marathon_harness.js +131 -208
- package/.agent/scripts/migrate_skills_frontmatter.py +4 -63
- package/.agent/scripts/minify_context.js +29 -33
- package/.agent/scripts/minimal_change_engine.js +95 -87
- package/.agent/scripts/mutation_runner.js +46 -62
- package/.agent/scripts/pipeline_engine.js +320 -209
- package/.agent/scripts/prompt_compiler.js +118 -93
- package/.agent/scripts/schema_validator.js +73 -121
- package/.agent/scripts/security_scan.js +88 -117
- package/.agent/scripts/session_manager.js +52 -69
- package/.agent/scripts/signal_detector.js +24 -22
- package/.agent/scripts/skill_evolution.js +184 -245
- package/.agent/scripts/skill_integrator.js +35 -48
- package/.agent/scripts/socratic_gate_policy.js +15 -12
- package/.agent/scripts/strengthen_skills.js +29 -33
- package/.agent/scripts/swarm_dispatcher.js +120 -151
- package/.agent/scripts/test_runner.js +54 -56
- package/.agent/scripts/token_budget_broker.js +9 -7
- package/.agent/scripts/trace_engine.js +126 -0
- package/.agent/scripts/verify_all.js +76 -93
- package/.agent/scripts/visual_audit.js +16 -21
- package/.agent/skill_topic_map.json +237 -0
- package/.agent/skills/12-principles-of-animation/SKILL.md +7 -0
- package/.agent/skills/60fps-animation/SKILL.md +7 -0
- package/.agent/skills/accessible-animation/SKILL.md +5 -1
- package/.agent/skills/adapt/SKILL.md +7 -1
- package/.agent/skills/advanced-rag-pipelines/SKILL.md +1 -0
- package/.agent/skills/agent-organizer/SKILL.md +1 -0
- package/.agent/skills/agentic-patterns/SKILL.md +33 -25
- package/.agent/skills/agentic-workflows-2026/SKILL.md +80 -0
- package/.agent/skills/ai-app-hardening/SKILL.md +59 -0
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +7 -6
- package/.agent/skills/animation-on-scroll/SKILL.md +24 -15
- package/.agent/skills/animation-systems/SKILL.md +11 -10
- package/.agent/skills/antfu-conventions/SKILL.md +7 -2
- package/.agent/skills/api-patterns/SKILL.md +14 -10
- package/.agent/skills/api-security-auditor/SKILL.md +15 -14
- package/.agent/skills/app-builder/SKILL.md +1 -0
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +2 -2
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +12 -12
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +3 -3
- package/.agent/skills/apple-design/SKILL.md +8 -7
- package/.agent/skills/architecture/SKILL.md +3 -2
- package/.agent/skills/audit-and-fix/SKILL.md +8 -5
- package/.agent/skills/authentication-best-practices/SKILL.md +9 -8
- package/.agent/skills/backend-security-expert/SKILL.md +1 -0
- package/.agent/skills/baseline-ui/SKILL.md +8 -7
- package/.agent/skills/bash-linux/SKILL.md +1 -0
- package/.agent/skills/behavioral-modes/SKILL.md +1 -0
- package/.agent/skills/better-colors/SKILL.md +11 -7
- package/.agent/skills/better-typography/SKILL.md +30 -16
- package/.agent/skills/better-ui/SKILL.md +17 -10
- package/.agent/skills/bolder/SKILL.md +6 -0
- package/.agent/skills/brainstorming/SKILL.md +6 -4
- package/.agent/skills/browser-native-ai/SKILL.md +5 -4
- package/.agent/skills/build-primitive/SKILL.md +5 -0
- package/.agent/skills/building-native-ui/SKILL.md +1 -0
- package/.agent/skills/cicd-pro/SKILL.md +2 -1
- package/.agent/skills/clarify/SKILL.md +19 -14
- package/.agent/skills/clean-code/SKILL.md +16 -15
- package/.agent/skills/cloud-architect/SKILL.md +1 -0
- package/.agent/skills/cobejs/SKILL.md +7 -9
- package/.agent/skills/code-review-checklist/SKILL.md +1 -0
- package/.agent/skills/codebase-design/SKILL.md +7 -2
- package/.agent/skills/colorize/SKILL.md +8 -3
- package/.agent/skills/compact-landing/SKILL.md +8 -3
- package/.agent/skills/company-logos/SKILL.md +6 -0
- package/.agent/skills/config-validator/SKILL.md +10 -9
- package/.agent/skills/containerization-pro/SKILL.md +6 -5
- package/.agent/skills/context-engineering-pro/SKILL.md +70 -0
- package/.agent/skills/create-design-md/SKILL.md +13 -5
- package/.agent/skills/critique/SKILL.md +10 -8
- package/.agent/skills/csharp-developer/SKILL.md +1 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +28 -23
- package/.agent/skills/database-design/SKILL.md +2 -1
- package/.agent/skills/delight/SKILL.md +6 -0
- package/.agent/skills/deployment-procedures/SKILL.md +2 -1
- package/.agent/skills/design-lab/SKILL.md +5 -0
- package/.agent/skills/devops-engineer/SKILL.md +3 -2
- package/.agent/skills/devops-incident-responder/SKILL.md +2 -1
- package/.agent/skills/diagnosing-bugs/SKILL.md +12 -2
- package/.agent/skills/distill/SKILL.md +7 -2
- package/.agent/skills/documentation-templates/SKILL.md +3 -2
- package/.agent/skills/domain-modeling/SKILL.md +12 -4
- package/.agent/skills/duckdb-analytical-sql/SKILL.md +59 -0
- package/.agent/skills/edge-ai-mobile/SKILL.md +50 -0
- package/.agent/skills/edge-computing/SKILL.md +9 -8
- package/.agent/skills/emil-design-eng/SKILL.md +43 -27
- package/.agent/skills/error-resilience/SKILL.md +34 -16
- package/.agent/skills/expo-router-v4/SKILL.md +81 -0
- package/.agent/skills/extract-design-system/SKILL.md +12 -11
- package/.agent/skills/fabel-protocol/SKILL.md +24 -17
- package/.agent/skills/fixing-accessibility/SKILL.md +23 -16
- package/.agent/skills/fixing-metadata/SKILL.md +24 -13
- package/.agent/skills/fixing-motion-performance/SKILL.md +7 -5
- package/.agent/skills/framer-motion-expert/SKILL.md +29 -15
- package/.agent/skills/frontend-design/SKILL.md +21 -13
- package/.agent/skills/frontend-security-expert/SKILL.md +1 -0
- package/.agent/skills/game-design-expert/SKILL.md +1 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +1 -0
- package/.agent/skills/generative-ui-expert/SKILL.md +3 -2
- package/.agent/skills/geo-fundamentals/SKILL.md +2 -1
- package/.agent/skills/git-pro/SKILL.md +10 -9
- package/.agent/skills/github-operations/SKILL.md +2 -1
- package/.agent/skills/gpt-taste/SKILL.md +7 -0
- package/.agent/skills/gsap-core/SKILL.md +26 -22
- package/.agent/skills/gsap-frameworks/SKILL.md +6 -5
- package/.agent/skills/gsap-performance/SKILL.md +4 -3
- package/.agent/skills/gsap-plugins/SKILL.md +34 -33
- package/.agent/skills/gsap-react/SKILL.md +9 -8
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +34 -33
- package/.agent/skills/gsap-timeline/SKILL.md +18 -15
- package/.agent/skills/gsap-utils/SKILL.md +25 -24
- package/.agent/skills/harden/SKILL.md +9 -3
- package/.agent/skills/harness-protocol/SKILL.md +1 -0
- package/.agent/skills/i18n-localization/SKILL.md +10 -9
- package/.agent/skills/impeccable/SKILL.md +5 -0
- package/.agent/skills/improve-codebase-architecture/SKILL.md +10 -5
- package/.agent/skills/improve-ui/SKILL.md +12 -5
- package/.agent/skills/intelligent-routing/SKILL.md +7 -6
- package/.agent/skills/knowledge-graph/SKILL.md +1 -0
- package/.agent/skills/landing-page/SKILL.md +1 -0
- package/.agent/skills/lint-and-validate/SKILL.md +9 -4
- package/.agent/skills/llm-engineering/SKILL.md +55 -54
- package/.agent/skills/local-first/SKILL.md +20 -19
- package/.agent/skills/local-first-architecture/SKILL.md +6 -1
- package/.agent/skills/lottie-animation/SKILL.md +7 -3
- package/.agent/skills/marquee-loop/SKILL.md +1 -0
- package/.agent/skills/masked-reveal/SKILL.md +17 -4
- package/.agent/skills/mcp-builder/SKILL.md +13 -10
- package/.agent/skills/micro-interaction/SKILL.md +20 -5
- package/.agent/skills/mobile-design/SKILL.md +26 -15
- package/.agent/skills/monorepo-management/SKILL.md +3 -2
- package/.agent/skills/morphing-icons/SKILL.md +16 -6
- package/.agent/skills/motion-engineering/SKILL.md +19 -15
- package/.agent/skills/nextjs-react-expert/SKILL.md +26 -21
- package/.agent/skills/nodejs-best-practices/SKILL.md +89 -76
- package/.agent/skills/observability/SKILL.md +45 -44
- package/.agent/skills/opentelemetry-observability/SKILL.md +59 -0
- package/.agent/skills/page-transition-animation/SKILL.md +6 -3
- package/.agent/skills/parallel-agents/SKILL.md +7 -2
- package/.agent/skills/performance-profiling/SKILL.md +24 -13
- package/.agent/skills/plan-writing/SKILL.md +1 -0
- package/.agent/skills/platform-engineer/SKILL.md +3 -2
- package/.agent/skills/platform-engineering-opentofu/SKILL.md +68 -0
- package/.agent/skills/playwright-ai-e2e/SKILL.md +60 -0
- package/.agent/skills/playwright-best-practices/SKILL.md +29 -28
- package/.agent/skills/polish/SKILL.md +13 -12
- package/.agent/skills/powershell-windows/SKILL.md +1 -0
- package/.agent/skills/pricing-page/SKILL.md +8 -3
- package/.agent/skills/product-aware-heuristics/SKILL.md +122 -72
- package/.agent/skills/progressive-blur/SKILL.md +9 -4
- package/.agent/skills/project-idioms/SKILL.md +1 -0
- package/.agent/skills/property-based-testing/SKILL.md +58 -0
- package/.agent/skills/python-patterns/SKILL.md +1 -0
- package/.agent/skills/python-pro/SKILL.md +1 -0
- package/.agent/skills/quieter/SKILL.md +6 -0
- package/.agent/skills/react-doctor/SKILL.md +6 -0
- package/.agent/skills/react-specialist/SKILL.md +32 -28
- package/.agent/skills/readme-builder/SKILL.md +1 -0
- package/.agent/skills/realtime-patterns/SKILL.md +34 -33
- package/.agent/skills/red-team-tactics/SKILL.md +1 -0
- package/.agent/skills/redesign-skill/SKILL.md +6 -0
- package/.agent/skills/review-animations/SKILL.md +5 -2
- package/.agent/skills/review-animations/STANDARDS.md +37 -23
- package/.agent/skills/rust-pro/SKILL.md +1 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +4 -3
- package/.agent/skills/server-management/SKILL.md +1 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +28 -22
- package/.agent/skills/shape/SKILL.md +9 -2
- package/.agent/skills/skill-creator/SKILL.md +1 -0
- package/.agent/skills/soft-skill/SKILL.md +6 -0
- package/.agent/skills/sounds-on-the-web/SKILL.md +1 -0
- package/.agent/skills/sql-pro/SKILL.md +1 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/.agent/skills/svg-animation/SKILL.md +16 -7
- package/.agent/skills/swiftui-expert/SKILL.md +1 -0
- package/.agent/skills/swiss-design/SKILL.md +5 -0
- package/.agent/skills/system-design-pro/SKILL.md +1 -0
- package/.agent/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +25 -11
- package/.agent/skills/taste-skill/SKILL.md +6 -0
- package/.agent/skills/tdd-workflow/SKILL.md +5 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +1 -0
- package/.agent/skills/testing-patterns/SKILL.md +123 -115
- package/.agent/skills/thermo-nuclear-code-quality-review/SKILL.md +5 -0
- package/.agent/skills/thinking-protocol/SKILL.md +3 -0
- package/.agent/skills/to-spring-or-not-to-spring/SKILL.md +9 -8
- package/.agent/skills/transitions-dev/SKILL.md +19 -6
- package/.agent/skills/trend-researcher/SKILL.md +1 -0
- package/.agent/skills/typescript-advanced/SKILL.md +23 -18
- package/.agent/skills/typeset/SKILL.md +10 -1
- package/.agent/skills/ui-reasoning-engine/SKILL.md +67 -48
- package/.agent/skills/ui-skill-packs/SKILL.md +6 -1
- package/.agent/skills/ui-skills-root/SKILL.md +39 -38
- package/.agent/skills/ui-ux-pro-max/SKILL.md +34 -26
- package/.agent/skills/ui-ux-researcher/SKILL.md +1 -0
- package/.agent/skills/vector-search-pgvector/SKILL.md +78 -0
- package/.agent/skills/vue-expert/SKILL.md +22 -19
- package/.agent/skills/vulnerability-scanner/SKILL.md +22 -21
- package/.agent/skills/web-accessibility-auditor/SKILL.md +2 -1
- package/.agent/skills/web-design-guidelines/SKILL.md +16 -10
- package/.agent/skills/web-quality-audit/SKILL.md +5 -0
- package/.agent/skills/webapp-testing/SKILL.md +14 -13
- package/.agent/skills/webgpu-performance/SKILL.md +1 -0
- package/.agent/skills/whimsy-injector/SKILL.md +9 -5
- package/.agent/skills/workflow-optimizer/SKILL.md +1 -0
- package/.agent/skills/zero-trust-passkeys/SKILL.md +90 -0
- package/.agent/templates/DESIGN.md +119 -110
- package/.agent/templates/design-tokens.json +9 -6
- package/.agent/workflows/acf.md +1 -0
- package/.agent/workflows/api-tester.md +1 -0
- package/.agent/workflows/audit.md +1 -0
- package/.agent/workflows/brainstorm.md +1 -0
- package/.agent/workflows/changelog.md +1 -0
- package/.agent/workflows/contract.md +60 -0
- package/.agent/workflows/create.md +1 -0
- package/.agent/workflows/debug.md +1 -0
- package/.agent/workflows/deploy.md +1 -0
- package/.agent/workflows/enhance.md +1 -0
- package/.agent/workflows/fix-ci.md +89 -0
- package/.agent/workflows/fix.md +1 -0
- package/.agent/workflows/generate.md +1 -0
- package/.agent/workflows/marathon.md +1 -0
- package/.agent/workflows/migrate.md +1 -0
- package/.agent/workflows/minimal.md +9 -7
- package/.agent/workflows/orchestrate.md +1 -0
- package/.agent/workflows/performance-benchmarker.md +1 -0
- package/.agent/workflows/pipeline.md +26 -21
- package/.agent/workflows/plan.md +1 -0
- package/.agent/workflows/preview.md +1 -0
- package/.agent/workflows/refactor.md +3 -2
- package/.agent/workflows/review-ai.md +4 -3
- package/.agent/workflows/review.md +1 -0
- package/.agent/workflows/session.md +1 -0
- package/.agent/workflows/status.md +1 -0
- package/.agent/workflows/strengthen-skills.md +1 -0
- package/.agent/workflows/super-prompt.md +1 -0
- package/.agent/workflows/swarm.md +15 -3
- package/.agent/workflows/test.md +8 -7
- package/.agent/workflows/tribunal-backend.md +3 -2
- package/.agent/workflows/tribunal-cicd.md +104 -0
- package/.agent/workflows/tribunal-database.md +1 -0
- package/.agent/workflows/tribunal-frontend.md +8 -6
- package/.agent/workflows/tribunal-full.md +15 -14
- package/.agent/workflows/tribunal-mobile.md +6 -5
- package/.agent/workflows/tribunal-performance.md +1 -0
- package/.agent/workflows/tribunal-speed.md +1 -0
- package/.agent/workflows/tribunal-ui.md +29 -21
- package/.agent/workflows/ui-ux-pro-max.md +19 -15
- package/CONTRIBUTING.md +3 -3
- package/README.md +160 -88
- package/SECURITY.md +11 -11
- package/bin/mcp-server.js +512 -233
- package/bin/tribunal-kit.js +29 -30
- package/bin/wrapper.js +45 -48
- package/dist/cli.js +26 -0
- package/dist/commands/case.js +2 -0
- package/dist/commands/contract.js +440 -0
- package/dist/commands/memory.js +3 -2
- package/dist/commands/native.js +36 -0
- package/dist/commands/status.js +6 -0
- package/dist/esm/index.mjs +32 -0
- package/dist/index.d.ts +58 -3
- package/package.json +20 -16
- package/scripts/benchmark.js +62 -86
- package/scripts/changelog.js +67 -73
- package/scripts/fix-vbc.js +13 -15
- package/scripts/fix-vbc.ps1 +2 -118
- package/scripts/stress_benchmark.js +358 -0
- package/scripts/sync-version.js +71 -41
- package/scripts/validate-payload.js +23 -30
- 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
|
-
|
|
4
|
+
'use strict';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
71
|
-
build: [
|
|
72
|
-
create: [
|
|
73
|
-
fix: [
|
|
74
|
-
debug: [
|
|
75
|
-
refactor: [
|
|
76
|
-
update: [
|
|
77
|
-
write: [
|
|
78
|
-
design: [
|
|
79
|
-
audit: [
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
const fs = require(
|
|
14
|
-
const path = require(
|
|
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,
|
|
29
|
-
return
|
|
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() && ![
|
|
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 ===
|
|
34
|
+
if (item.name === 'migrations') {
|
|
44
35
|
try {
|
|
45
36
|
const mFiles = fs.readdirSync(path.join(dir, item.name));
|
|
46
|
-
if (mFiles.some(
|
|
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:
|
|
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,
|
|
65
|
-
fs.existsSync(path.join(projectRoot,
|
|
55
|
+
fs.existsSync(path.join(projectRoot, 'knexfile.js')) ||
|
|
56
|
+
fs.existsSync(path.join(projectRoot, 'knexfile.ts'))
|
|
66
57
|
) {
|
|
67
|
-
return
|
|
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,
|
|
68
|
+
lines = fs.readFileSync(filepath, 'utf8').split('\n');
|
|
78
69
|
} catch {
|
|
79
|
-
return [[
|
|
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
|
-
|
|
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
|
-
|
|
91
|
+
'warn',
|
|
101
92
|
`Model '${currentModel}' missing createdAt timestamp`,
|
|
102
93
|
modelStartLine,
|
|
103
94
|
]);
|
|
104
95
|
if (!hasUpdatedAt)
|
|
105
96
|
issues.push([
|
|
106
|
-
|
|
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
|
-
|
|
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(
|
|
146
|
-
|
|
147
|
-
if (stripped.includes(
|
|
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(
|
|
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
|
-
|
|
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,
|
|
171
|
+
lines = fs.readFileSync(filepath, 'utf8').split('\n');
|
|
203
172
|
} catch {
|
|
204
|
-
return [[
|
|
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(
|
|
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(
|
|
220
|
-
!stripped.includes(
|
|
221
|
-
!stripped.includes(
|
|
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(
|
|
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 =
|
|
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] ===
|
|
250
|
-
else if (args[i] ===
|
|
251
|
-
else if (!targetPath && !args[i].startsWith(
|
|
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
|
-
|
|
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 !==
|
|
228
|
+
const ormType = typeArg !== 'auto' ? typeArg : detectOrm(projectRoot);
|
|
272
229
|
if (!ormType && !fileArg) {
|
|
273
|
-
skip(
|
|
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(
|
|
286
|
-
else if (filepath.endsWith(
|
|
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 ===
|
|
248
|
+
if (severity === 'error') {
|
|
294
249
|
fail(`L${line}: ${message}`);
|
|
295
250
|
issuesCount++;
|
|
296
|
-
} else if (severity ===
|
|
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 ===
|
|
302
|
-
const schemaPath = path.join(projectRoot,
|
|
256
|
+
} else if (ormType === 'prisma') {
|
|
257
|
+
const schemaPath = path.join(projectRoot, 'prisma', 'schema.prisma');
|
|
303
258
|
if (fs.existsSync(schemaPath)) {
|
|
304
|
-
console.log(header(
|
|
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 ===
|
|
262
|
+
if (severity === 'error') {
|
|
308
263
|
fail(`L${line}: ${message}`);
|
|
309
264
|
issuesCount++;
|
|
310
|
-
} else if (severity ===
|
|
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 ===
|
|
319
|
-
console.log(header(
|
|
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
|
-
|
|
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.
|
|
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(
|
|
334
|
-
.map(
|
|
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 ===
|
|
302
|
+
if (severity === 'error') {
|
|
351
303
|
fail(` L${line}: ${message}`);
|
|
352
304
|
issuesCount++;
|
|
353
|
-
} else if (severity ===
|
|
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 ===
|
|
360
|
-
console.log(header(
|
|
361
|
-
skip(
|
|
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(
|
|
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);
|