tribunal-kit 4.0.1 → 4.3.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/ARCHITECTURE.md +21 -14
- package/.agent/GEMINI.md +4 -2
- package/.agent/agents/api-architect.md +66 -0
- package/.agent/agents/db-latency-auditor.md +216 -0
- package/.agent/agents/precedence-reviewer.md +41 -4
- package/.agent/agents/resilience-reviewer.md +88 -0
- package/.agent/agents/schema-reviewer.md +67 -0
- package/.agent/agents/swarm-worker-contracts.md +5 -5
- package/.agent/agents/throughput-optimizer.md +299 -0
- package/.agent/agents/ui-ux-auditor.md +292 -0
- package/.agent/agents/vitals-reviewer.md +223 -0
- package/.agent/history/case-law/cases/case-0001.json +33 -0
- package/.agent/history/case-law/index.json +35 -0
- package/.agent/rules/GEMINI.md +28 -11
- package/.agent/scripts/__pycache__/_colors.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/_utils.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/case_law_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/_colors.js +18 -0
- package/.agent/scripts/_utils.js +42 -0
- package/.agent/scripts/auto_preview.js +197 -0
- package/.agent/scripts/bundle_analyzer.js +290 -0
- package/.agent/scripts/case_law_manager.js +684 -0
- package/.agent/scripts/checklist.js +266 -0
- package/.agent/scripts/colors.js +17 -0
- package/.agent/scripts/compress_skills.js +141 -0
- package/.agent/scripts/consolidate_skills.js +149 -0
- package/.agent/scripts/context_broker.js +609 -0
- package/.agent/scripts/deep_compress.js +150 -0
- package/.agent/scripts/dependency_analyzer.js +272 -0
- package/.agent/scripts/inner_loop_validator.js +465 -0
- package/.agent/scripts/lint_runner.js +187 -0
- package/.agent/scripts/minify_context.js +100 -0
- package/.agent/scripts/patch_skills_meta.js +156 -0
- package/.agent/scripts/patch_skills_output.js +244 -0
- package/.agent/scripts/schema_validator.js +297 -0
- package/.agent/scripts/security_scan.js +303 -0
- package/.agent/scripts/session_manager.js +276 -0
- package/.agent/scripts/skill_evolution.js +644 -0
- package/.agent/scripts/skill_integrator.js +313 -0
- package/.agent/scripts/strengthen_skills.js +193 -0
- package/.agent/scripts/strip_tribunal.js +47 -0
- package/.agent/scripts/swarm_dispatcher.js +360 -0
- package/.agent/scripts/test_runner.js +193 -0
- package/.agent/scripts/utils.js +32 -0
- package/.agent/scripts/verify_all.js +256 -0
- package/.agent/skills/agent-organizer/SKILL.md +42 -0
- package/.agent/skills/agentic-patterns/SKILL.md +42 -0
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +42 -0
- package/.agent/skills/api-patterns/SKILL.md +42 -0
- package/.agent/skills/api-security-auditor/SKILL.md +42 -0
- package/.agent/skills/app-builder/SKILL.md +42 -0
- package/.agent/skills/app-builder/templates/SKILL.md +70 -0
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +1 -1
- package/.agent/skills/appflow-wireframe/SKILL.md +42 -0
- package/.agent/skills/architecture/SKILL.md +42 -0
- package/.agent/skills/authentication-best-practices/SKILL.md +42 -0
- package/.agent/skills/bash-linux/SKILL.md +42 -0
- package/.agent/skills/behavioral-modes/SKILL.md +42 -0
- package/.agent/skills/brainstorming/SKILL.md +42 -0
- package/.agent/skills/building-native-ui/SKILL.md +42 -0
- package/.agent/skills/clean-code/SKILL.md +42 -0
- package/.agent/skills/code-review-checklist/SKILL.md +42 -0
- package/.agent/skills/config-validator/SKILL.md +42 -0
- package/.agent/skills/csharp-developer/SKILL.md +42 -0
- package/.agent/skills/data-validation-schemas/SKILL.md +320 -0
- package/.agent/skills/database-design/SKILL.md +42 -0
- package/.agent/skills/deployment-procedures/SKILL.md +42 -0
- package/.agent/skills/devops-engineer/SKILL.md +42 -0
- package/.agent/skills/devops-incident-responder/SKILL.md +42 -0
- package/.agent/skills/doc.md +1 -1
- package/.agent/skills/documentation-templates/SKILL.md +42 -0
- package/.agent/skills/edge-computing/SKILL.md +42 -0
- package/.agent/skills/error-resilience/SKILL.md +420 -0
- package/.agent/skills/extract-design-system/SKILL.md +42 -0
- package/.agent/skills/framer-motion-expert/SKILL.md +42 -1
- package/.agent/skills/frontend-design/SKILL.md +42 -0
- package/.agent/skills/game-design-expert/SKILL.md +42 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +42 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +42 -0
- package/.agent/skills/github-operations/SKILL.md +42 -0
- package/.agent/skills/gsap-core/SKILL.md +300 -0
- package/.agent/skills/gsap-frameworks/SKILL.md +199 -0
- package/.agent/skills/gsap-performance/SKILL.md +125 -0
- package/.agent/skills/gsap-plugins/SKILL.md +472 -0
- package/.agent/skills/gsap-react/SKILL.md +181 -0
- package/.agent/skills/gsap-scrolltrigger/SKILL.md +342 -0
- package/.agent/skills/gsap-timeline/SKILL.md +153 -0
- package/.agent/skills/gsap-utils/SKILL.md +330 -0
- package/.agent/skills/i18n-localization/SKILL.md +42 -0
- package/.agent/skills/intelligent-routing/SKILL.md +72 -1
- package/.agent/skills/lint-and-validate/SKILL.md +42 -0
- package/.agent/skills/llm-engineering/SKILL.md +42 -0
- package/.agent/skills/local-first/SKILL.md +42 -0
- package/.agent/skills/mcp-builder/SKILL.md +42 -0
- package/.agent/skills/mobile-design/SKILL.md +42 -0
- package/.agent/skills/monorepo-management/SKILL.md +326 -0
- package/.agent/skills/motion-engineering/SKILL.md +42 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +42 -0
- package/.agent/skills/nodejs-best-practices/SKILL.md +42 -0
- package/.agent/skills/observability/SKILL.md +42 -0
- package/.agent/skills/parallel-agents/SKILL.md +42 -0
- package/.agent/skills/performance-profiling/SKILL.md +42 -0
- package/.agent/skills/plan-writing/SKILL.md +42 -0
- package/.agent/skills/platform-engineer/SKILL.md +42 -0
- package/.agent/skills/playwright-best-practices/SKILL.md +42 -0
- package/.agent/skills/powershell-windows/SKILL.md +42 -0
- package/.agent/skills/project-idioms/SKILL.md +42 -0
- package/.agent/skills/python-patterns/SKILL.md +42 -0
- package/.agent/skills/python-pro/SKILL.md +42 -0
- package/.agent/skills/react-specialist/SKILL.md +42 -0
- package/.agent/skills/readme-builder/SKILL.md +42 -0
- package/.agent/skills/realtime-patterns/SKILL.md +42 -0
- package/.agent/skills/red-team-tactics/SKILL.md +42 -0
- package/.agent/skills/rust-pro/SKILL.md +42 -0
- package/.agent/skills/seo-fundamentals/SKILL.md +42 -0
- package/.agent/skills/server-management/SKILL.md +42 -0
- package/.agent/skills/shadcn-ui-expert/SKILL.md +42 -0
- package/.agent/skills/skill-creator/SKILL.md +42 -0
- package/.agent/skills/sql-pro/SKILL.md +42 -0
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +42 -0
- package/.agent/skills/swiftui-expert/SKILL.md +42 -0
- package/.agent/skills/systematic-debugging/SKILL.md +42 -0
- package/.agent/skills/tailwind-patterns/SKILL.md +42 -0
- package/.agent/skills/tdd-workflow/SKILL.md +42 -0
- package/.agent/skills/test-result-analyzer/SKILL.md +42 -0
- package/.agent/skills/testing-patterns/SKILL.md +42 -0
- package/.agent/skills/trend-researcher/SKILL.md +42 -0
- package/.agent/skills/typescript-advanced/SKILL.md +327 -0
- package/.agent/skills/ui-ux-pro-max/SKILL.md +42 -0
- package/.agent/skills/ui-ux-researcher/SKILL.md +42 -0
- package/.agent/skills/vue-expert/SKILL.md +42 -0
- package/.agent/skills/vulnerability-scanner/SKILL.md +42 -0
- package/.agent/skills/web-accessibility-auditor/SKILL.md +42 -0
- package/.agent/skills/web-design-guidelines/SKILL.md +42 -0
- package/.agent/skills/webapp-testing/SKILL.md +42 -0
- package/.agent/skills/whimsy-injector/SKILL.md +42 -0
- package/.agent/skills/workflow-optimizer/SKILL.md +42 -0
- package/.agent/workflows/audit.md +6 -6
- package/.agent/workflows/deploy.md +1 -1
- package/.agent/workflows/generate.md +23 -6
- package/.agent/workflows/session.md +5 -5
- package/.agent/workflows/swarm.md +2 -2
- package/.agent/workflows/tribunal-backend.md +13 -2
- package/.agent/workflows/tribunal-full.md +15 -8
- package/.agent/workflows/tribunal-speed.md +183 -0
- package/README.md +64 -8
- package/bin/tribunal-kit.js +281 -41
- package/package.json +9 -6
- package/scripts/changelog.js +167 -0
- package/scripts/sync-version.js +81 -0
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/scripts/auto_preview.py +0 -180
- package/.agent/scripts/bundle_analyzer.py +0 -259
- package/.agent/scripts/case_law_manager.py +0 -525
- package/.agent/scripts/checklist.py +0 -209
- package/.agent/scripts/compress_skills.py +0 -167
- package/.agent/scripts/consolidate_skills.py +0 -173
- package/.agent/scripts/deep_compress.py +0 -202
- package/.agent/scripts/dependency_analyzer.py +0 -247
- package/.agent/scripts/lint_runner.py +0 -188
- package/.agent/scripts/minify_context.py +0 -80
- package/.agent/scripts/patch_skills_meta.py +0 -177
- package/.agent/scripts/patch_skills_output.py +0 -285
- package/.agent/scripts/schema_validator.py +0 -279
- package/.agent/scripts/security_scan.py +0 -224
- package/.agent/scripts/session_manager.py +0 -261
- package/.agent/scripts/skill_evolution.py +0 -563
- package/.agent/scripts/skill_integrator.py +0 -234
- package/.agent/scripts/strengthen_skills.py +0 -220
- package/.agent/scripts/strip_tribunal.py +0 -41
- package/.agent/scripts/swarm_dispatcher.py +0 -350
- package/.agent/scripts/test_runner.py +0 -192
- package/.agent/scripts/test_swarm_dispatcher.py +0 -163
- package/.agent/scripts/verify_all.py +0 -195
- package/.agent/skills/gsap-expert/SKILL.md +0 -194
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* verify_all.js — Full pre-deploy validation suite for the Tribunal Agent Kit.
|
|
4
|
+
*
|
|
5
|
+
* Runs comprehensive checks before any production deployment.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node .agent/scripts/verify_all.js
|
|
9
|
+
* node .agent/scripts/verify_all.js --skip build,deps
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const { execFileSync } = require('child_process');
|
|
17
|
+
|
|
18
|
+
// ━━━ ANSI colors ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
19
|
+
const RED = '\x1b[91m';
|
|
20
|
+
const GREEN = '\x1b[92m';
|
|
21
|
+
const YELLOW = '\x1b[93m';
|
|
22
|
+
const BLUE = '\x1b[94m';
|
|
23
|
+
const BOLD = '\x1b[1m';
|
|
24
|
+
const RESET = '\x1b[0m';
|
|
25
|
+
|
|
26
|
+
const RESULTS = [];
|
|
27
|
+
|
|
28
|
+
function section(title) {
|
|
29
|
+
console.log(`\n${BOLD}${BLUE}━━━ ${title} ━━━${RESET}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function ok(label, note) {
|
|
33
|
+
const msg = `${GREEN}✅ ${label}${RESET}` + (note ? ` ${YELLOW}(${note})${RESET}` : '');
|
|
34
|
+
console.log(` ${msg}`);
|
|
35
|
+
RESULTS.push({ label, passed: true, note: note || '' });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function fail(label, note) {
|
|
39
|
+
const noteStr = note ? `\n ${note}` : '';
|
|
40
|
+
console.log(` ${RED}❌ ${label}${RESET}${noteStr}`);
|
|
41
|
+
RESULTS.push({ label, passed: false, note: note || '' });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function skip(label, reason) {
|
|
45
|
+
console.log(` ${YELLOW}⏭️ ${label} — ${reason}${RESET}`);
|
|
46
|
+
RESULTS.push({ label, passed: true, note: `skipped: ${reason}` });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Run a shell command and return true if it exits with code 0.
|
|
51
|
+
*/
|
|
52
|
+
function run(label, cmd, cwd) {
|
|
53
|
+
try {
|
|
54
|
+
const isWindows = process.platform === 'win32';
|
|
55
|
+
let bin = cmd[0];
|
|
56
|
+
if (isWindows && (bin === 'npm' || bin === 'npx')) bin += '.cmd';
|
|
57
|
+
|
|
58
|
+
execFileSync(bin, cmd.slice(1), {
|
|
59
|
+
cwd,
|
|
60
|
+
stdio: 'pipe',
|
|
61
|
+
timeout: 120000,
|
|
62
|
+
encoding: 'utf8',
|
|
63
|
+
});
|
|
64
|
+
ok(label);
|
|
65
|
+
return true;
|
|
66
|
+
} catch (err) {
|
|
67
|
+
if (err.code === 'ENOENT') {
|
|
68
|
+
skip(label, 'tool not installed — skipping');
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (err.killed) {
|
|
72
|
+
fail(label, 'timed out after 120s');
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const output = ((err.stdout || '') + (err.stderr || '')).trim();
|
|
76
|
+
fail(label, output ? output.slice(0, 500) : 'non-zero exit code');
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Scan source files for obviously hardcoded credentials.
|
|
84
|
+
*/
|
|
85
|
+
function scanSecrets(cwd) {
|
|
86
|
+
const patterns = ['password=', 'secret=', 'api_key=', 'private_key=', 'auth_token='];
|
|
87
|
+
const found = [];
|
|
88
|
+
const skipDirs = new Set(['node_modules', '.git', 'dist', '__pycache__', '.agent']);
|
|
89
|
+
|
|
90
|
+
function walk(dir) {
|
|
91
|
+
let entries;
|
|
92
|
+
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
|
|
93
|
+
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
const fullPath = path.join(dir, entry.name);
|
|
96
|
+
if (entry.isDirectory()) {
|
|
97
|
+
if (!skipDirs.has(entry.name)) walk(fullPath);
|
|
98
|
+
} else if (entry.isFile()) {
|
|
99
|
+
if (!/\.(ts|js|tsx|jsx|py)$/.test(entry.name)) continue;
|
|
100
|
+
|
|
101
|
+
let content;
|
|
102
|
+
try { content = fs.readFileSync(fullPath, 'utf8'); } catch { continue; }
|
|
103
|
+
|
|
104
|
+
const lines = content.split('\n');
|
|
105
|
+
for (let i = 0; i < lines.length; i++) {
|
|
106
|
+
const low = lines[i].toLowerCase().trim();
|
|
107
|
+
const hasPattern = patterns.some(p => low.includes(p));
|
|
108
|
+
if (hasPattern && !low.startsWith('#') && low.includes('=')) {
|
|
109
|
+
const rel = path.relative(cwd, fullPath);
|
|
110
|
+
found.push(`${rel}:${i + 1}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
walk(cwd);
|
|
118
|
+
|
|
119
|
+
if (found.length > 0) {
|
|
120
|
+
fail('Secret scan', found.slice(0, 5).join('\n '));
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
ok('Secret scan — no hardcoded credentials found');
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Check if there's a package.json to run npm commands against.
|
|
130
|
+
*/
|
|
131
|
+
function hasNpm(cwd) {
|
|
132
|
+
return fs.existsSync(path.join(cwd, 'package.json'));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Run all verification checks. Returns number of failures.
|
|
138
|
+
*/
|
|
139
|
+
function verifyAll(cwd, skipped) {
|
|
140
|
+
let failures = 0;
|
|
141
|
+
|
|
142
|
+
section('1 — Secret Scan');
|
|
143
|
+
if (!skipped.includes('secrets')) {
|
|
144
|
+
if (!scanSecrets(cwd)) failures++;
|
|
145
|
+
} else {
|
|
146
|
+
skip('Secret scan', 'skipped by flag');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
section('2 — TypeScript');
|
|
150
|
+
if (!skipped.includes('typescript')) {
|
|
151
|
+
if (hasNpm(cwd)) {
|
|
152
|
+
if (!run('tsc --noEmit', ['npx', 'tsc', '--noEmit'], cwd)) failures++;
|
|
153
|
+
} else {
|
|
154
|
+
skip('TypeScript', 'no package.json found in project');
|
|
155
|
+
}
|
|
156
|
+
} else {
|
|
157
|
+
skip('TypeScript', 'skipped by flag');
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
section('3 — ESLint');
|
|
161
|
+
if (!skipped.includes('lint')) {
|
|
162
|
+
if (hasNpm(cwd)) {
|
|
163
|
+
if (!run('ESLint', ['npx', 'eslint', '.', '--max-warnings=0'], cwd)) failures++;
|
|
164
|
+
} else {
|
|
165
|
+
skip('ESLint', 'no package.json found in project');
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
skip('ESLint', 'skipped by flag');
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
section('4 — Unit Tests');
|
|
172
|
+
if (!skipped.includes('tests')) {
|
|
173
|
+
if (hasNpm(cwd)) {
|
|
174
|
+
if (!run('Test suite', ['npm', 'test', '--', '--passWithNoTests'], cwd)) failures++;
|
|
175
|
+
} else {
|
|
176
|
+
skip('Tests', 'no package.json found in project');
|
|
177
|
+
}
|
|
178
|
+
} else {
|
|
179
|
+
skip('Tests', 'skipped by flag');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
section('5 — Build');
|
|
183
|
+
if (!skipped.includes('build')) {
|
|
184
|
+
if (hasNpm(cwd)) {
|
|
185
|
+
if (!run('npm run build', ['npm', 'run', 'build'], cwd)) failures++;
|
|
186
|
+
} else {
|
|
187
|
+
skip('Build', 'no package.json found in project');
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
skip('Build', 'skipped by flag');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
section('6 — Dependency Audit');
|
|
194
|
+
if (!skipped.includes('deps')) {
|
|
195
|
+
if (hasNpm(cwd)) {
|
|
196
|
+
if (!run('npm audit', ['npm', 'audit', '--audit-level=high'], cwd)) failures++;
|
|
197
|
+
} else {
|
|
198
|
+
skip('Dependency audit', 'no package.json found in project');
|
|
199
|
+
}
|
|
200
|
+
} else {
|
|
201
|
+
skip('Dependency audit', 'skipped by flag');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ━━━ Summary ━━━
|
|
205
|
+
console.log(`\n${BOLD}━━━ Summary ━━━${RESET}`);
|
|
206
|
+
for (const { label, passed, note } of RESULTS) {
|
|
207
|
+
const status = passed ? `${GREEN}✅${RESET}` : `${RED}❌${RESET}`;
|
|
208
|
+
const noteStr = (!passed && note) ? ` ${YELLOW}(${note})${RESET}` : '';
|
|
209
|
+
console.log(` ${status} ${label}${noteStr}`);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
console.log();
|
|
213
|
+
if (failures === 0) {
|
|
214
|
+
console.log(`${GREEN}${BOLD}All checks passed — safe to deploy.${RESET}`);
|
|
215
|
+
} else {
|
|
216
|
+
console.log(`${RED}${BOLD}${failures} check(s) failed — fix before deploying.${RESET}`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return failures;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Parse CLI arguments manually (no external dependencies).
|
|
225
|
+
*/
|
|
226
|
+
function parseArgs(argv) {
|
|
227
|
+
const args = { skip: [] };
|
|
228
|
+
const raw = argv.slice(2);
|
|
229
|
+
|
|
230
|
+
for (let i = 0; i < raw.length; i++) {
|
|
231
|
+
if (raw[i] === '--skip' && raw[i + 1]) {
|
|
232
|
+
args.skip = raw[++i].split(',').map(s => s.trim().toLowerCase()).filter(Boolean);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return args;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
function main() {
|
|
240
|
+
const args = parseArgs(process.argv);
|
|
241
|
+
const cwd = process.cwd();
|
|
242
|
+
|
|
243
|
+
console.log(`${BOLD}Tribunal — verify_all.js${RESET}`);
|
|
244
|
+
console.log(`Project: ${cwd}\n`);
|
|
245
|
+
|
|
246
|
+
const failures = verifyAll(cwd, args.skip);
|
|
247
|
+
process.exit(failures > 0 ? 1 : 0);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
// ━━━ Exports for testing & programmatic use ━━━
|
|
252
|
+
module.exports = { verifyAll, scanSecrets, hasNpm };
|
|
253
|
+
|
|
254
|
+
if (require.main === module) {
|
|
255
|
+
main();
|
|
256
|
+
}
|
|
@@ -98,3 +98,45 @@ Automation without oversight is reckless. The Organizer manages when to pause an
|
|
|
98
98
|
2. **Recovery Gate (After 3 Failures):** "The database migration script has failed 3 times. I am halting. How would you like to proceed?"
|
|
99
99
|
|
|
100
100
|
---
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
108
|
+
|
|
109
|
+
1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
|
|
110
|
+
2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
|
|
111
|
+
3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
|
|
112
|
+
4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
113
|
+
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
**Slash command: `/review` or `/tribunal-full`**
|
|
120
|
+
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
121
|
+
|
|
122
|
+
### ❌ Forbidden AI Tropes
|
|
123
|
+
|
|
124
|
+
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
125
|
+
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
126
|
+
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
Review these questions before confirming output:
|
|
131
|
+
```
|
|
132
|
+
✅ Did I rely ONLY on real, verified tools and methods?
|
|
133
|
+
✅ Is this solution appropriately scoped to the user's constraints?
|
|
134
|
+
✅ Did I handle potential failure modes and edge cases?
|
|
135
|
+
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
139
|
+
|
|
140
|
+
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
141
|
+
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
142
|
+
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
@@ -263,3 +263,45 @@ Evidence: [link to terminal output, test result, or file diff]
|
|
|
263
263
|
```
|
|
264
264
|
|
|
265
265
|
---
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
273
|
+
|
|
274
|
+
1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
|
|
275
|
+
2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
|
|
276
|
+
3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
|
|
277
|
+
4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
278
|
+
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
**Slash command: `/review` or `/tribunal-full`**
|
|
285
|
+
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
286
|
+
|
|
287
|
+
### ❌ Forbidden AI Tropes
|
|
288
|
+
|
|
289
|
+
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
290
|
+
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
291
|
+
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
Review these questions before confirming output:
|
|
296
|
+
```
|
|
297
|
+
✅ Did I rely ONLY on real, verified tools and methods?
|
|
298
|
+
✅ Is this solution appropriately scoped to the user's constraints?
|
|
299
|
+
✅ Did I handle potential failure modes and edge cases?
|
|
300
|
+
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
304
|
+
|
|
305
|
+
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
306
|
+
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
307
|
+
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
@@ -132,3 +132,45 @@ Many injections occur because the LLM includes malicious data in its output, whi
|
|
|
132
132
|
- **Enforce JSON Schemas.** If the LLM goes off-script and starts blabbering, Zod validation should instantly fail the parsing and reject the output.
|
|
133
133
|
|
|
134
134
|
---
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
142
|
+
|
|
143
|
+
1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
|
|
144
|
+
2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
|
|
145
|
+
3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
|
|
146
|
+
4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
147
|
+
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
**Slash command: `/review` or `/tribunal-full`**
|
|
154
|
+
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
155
|
+
|
|
156
|
+
### ❌ Forbidden AI Tropes
|
|
157
|
+
|
|
158
|
+
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
159
|
+
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
160
|
+
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
Review these questions before confirming output:
|
|
165
|
+
```
|
|
166
|
+
✅ Did I rely ONLY on real, verified tools and methods?
|
|
167
|
+
✅ Is this solution appropriately scoped to the user's constraints?
|
|
168
|
+
✅ Did I handle potential failure modes and edge cases?
|
|
169
|
+
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
173
|
+
|
|
174
|
+
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
175
|
+
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
176
|
+
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
@@ -195,3 +195,45 @@ Protect against:
|
|
|
195
195
|
| **OAuth 2.0 / OIDC** | Third-party login, delegated access |
|
|
196
196
|
| **API Key** | Server-to-server, public API consumers |
|
|
197
197
|
| **Passkey (WebAuthn)** | Modern passwordless (2026+) |
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
205
|
+
|
|
206
|
+
1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
|
|
207
|
+
2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
|
|
208
|
+
3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
|
|
209
|
+
4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
210
|
+
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
**Slash command: `/review` or `/tribunal-full`**
|
|
217
|
+
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
218
|
+
|
|
219
|
+
### ❌ Forbidden AI Tropes
|
|
220
|
+
|
|
221
|
+
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
222
|
+
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
223
|
+
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
Review these questions before confirming output:
|
|
228
|
+
```
|
|
229
|
+
✅ Did I rely ONLY on real, verified tools and methods?
|
|
230
|
+
✅ Is this solution appropriately scoped to the user's constraints?
|
|
231
|
+
✅ Did I handle potential failure modes and edge cases?
|
|
232
|
+
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
236
|
+
|
|
237
|
+
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
238
|
+
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
239
|
+
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
@@ -141,3 +141,45 @@ const server = new ApolloServer({
|
|
|
141
141
|
```
|
|
142
142
|
|
|
143
143
|
---
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
151
|
+
|
|
152
|
+
1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
|
|
153
|
+
2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
|
|
154
|
+
3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
|
|
155
|
+
4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
156
|
+
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
**Slash command: `/review` or `/tribunal-full`**
|
|
163
|
+
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
164
|
+
|
|
165
|
+
### ❌ Forbidden AI Tropes
|
|
166
|
+
|
|
167
|
+
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
168
|
+
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
169
|
+
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
Review these questions before confirming output:
|
|
174
|
+
```
|
|
175
|
+
✅ Did I rely ONLY on real, verified tools and methods?
|
|
176
|
+
✅ Is this solution appropriately scoped to the user's constraints?
|
|
177
|
+
✅ Did I handle potential failure modes and edge cases?
|
|
178
|
+
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
182
|
+
|
|
183
|
+
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
184
|
+
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
185
|
+
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
@@ -520,3 +520,45 @@ Monorepo:
|
|
|
520
520
|
|Payment|Stripe|LemonSqueezy, Paddle|
|
|
521
521
|
|Email|-|Resend, SendGrid|
|
|
522
522
|
|Search|-|Algolia, Typesense|
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
|
|
530
|
+
|
|
531
|
+
1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
|
|
532
|
+
2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
|
|
533
|
+
3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
|
|
534
|
+
4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
535
|
+
5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
**Slash command: `/review` or `/tribunal-full`**
|
|
542
|
+
**Active reviewers: `logic-reviewer` · `security-auditor`**
|
|
543
|
+
|
|
544
|
+
### ❌ Forbidden AI Tropes
|
|
545
|
+
|
|
546
|
+
1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
|
|
547
|
+
2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
|
|
548
|
+
3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
Review these questions before confirming output:
|
|
553
|
+
```
|
|
554
|
+
✅ Did I rely ONLY on real, verified tools and methods?
|
|
555
|
+
✅ Is this solution appropriately scoped to the user's constraints?
|
|
556
|
+
✅ Did I handle potential failure modes and edge cases?
|
|
557
|
+
✅ Have I avoided generic boilerplate that doesn't add value?
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
### 🛑 Verification-Before-Completion (VBC) Protocol
|
|
561
|
+
|
|
562
|
+
**CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
|
|
563
|
+
- ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
|
|
564
|
+
- ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
|
|
@@ -35,3 +35,73 @@ allowed-tools: Read, Glob, Grep
|
|
|
35
35
|
2. Match to appropriate template
|
|
36
36
|
3. Read ONLY that template's TEMPLATE.md
|
|
37
37
|
4. Follow its tech stack and structure
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 🚨 LLM Trap Table
|
|
42
|
+
|
|
43
|
+
|Pattern|What AI Does Wrong|What Is Actually Correct|
|
|
44
|
+
|:---|:---|:---|
|
|
45
|
+
|[domain-specific trap 1]|[hallucination]|[correct behavior]|
|
|
46
|
+
|[domain-specific trap 2]|[hallucination]|[correct behavior]|
|
|
47
|
+
|[domain-specific trap 3]|[hallucination]|[correct behavior]|
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## ✅ Pre-Flight Self-Audit
|
|
52
|
+
|
|
53
|
+
Before producing any output, verify:
|
|
54
|
+
``
|
|
55
|
+
✅ Did I read the actual files before making claims about them?
|
|
56
|
+
✅ Did I verify all method names against official documentation?
|
|
57
|
+
✅ Did I add // VERIFY: on any uncertain API calls?
|
|
58
|
+
✅ Are all imports from packages that actually exist in package.json?
|
|
59
|
+
✅ Did I test my logic with edge cases (null, empty, 0, max)?
|
|
60
|
+
✅ Did I avoid generating code for more than one module at a time?
|
|
61
|
+
✅ Am I working from evidence, not assumption?
|
|
62
|
+
``
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 🔠VBC Protocol (Verify → Build → Confirm)
|
|
67
|
+
|
|
68
|
+
``
|
|
69
|
+
VERIFY: Read the actual codebase before writing anything
|
|
70
|
+
BUILD: Generate the smallest meaningful unit of code
|
|
71
|
+
CONFIRM: Verify the output is correct before presenting
|
|
72
|
+
``
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 🚨 LLM Trap Table
|
|
77
|
+
|
|
78
|
+
|Pattern|What AI Does Wrong|What Is Actually Correct|
|
|
79
|
+
|:---|:---|:---|
|
|
80
|
+
|[domain-specific trap 1]|[hallucination]|[correct behavior]|
|
|
81
|
+
|[domain-specific trap 2]|[hallucination]|[correct behavior]|
|
|
82
|
+
|[domain-specific trap 3]|[hallucination]|[correct behavior]|
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## ✅ Pre-Flight Self-Audit
|
|
87
|
+
|
|
88
|
+
Before producing any output, verify:
|
|
89
|
+
``
|
|
90
|
+
✅ Did I read the actual files before making claims about them?
|
|
91
|
+
✅ Did I verify all method names against official documentation?
|
|
92
|
+
✅ Did I add // VERIFY: on any uncertain API calls?
|
|
93
|
+
✅ Are all imports from packages that actually exist in package.json?
|
|
94
|
+
✅ Did I test my logic with edge cases (null, empty, 0, max)?
|
|
95
|
+
✅ Did I avoid generating code for more than one module at a time?
|
|
96
|
+
✅ Am I working from evidence, not assumption?
|
|
97
|
+
``
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 🔠VBC Protocol (Verify → Build → Confirm)
|
|
102
|
+
|
|
103
|
+
``
|
|
104
|
+
VERIFY: Read the actual codebase before writing anything
|
|
105
|
+
BUILD: Generate the smallest meaningful unit of code
|
|
106
|
+
CONFIRM: Verify the output is correct before presenting
|
|
107
|
+
``
|
|
@@ -119,4 +119,4 @@ project-name/
|
|
|
119
119
|
- **Mutations**: Use Server Actions combined with React 19's `useActionState` to handle loading and error states instead of manual useState.
|
|
120
120
|
- **Type Safety**: Share Zod schemas between Server Actions (input validation) and Client Forms.
|
|
121
121
|
- **Security**: Always validate input data with Zod before passing it to Prisma.
|
|
122
|
-
- **Styling**: Use native CSS variables in Tailwind v4 for easier dynamic theming.
|
|
122
|
+
- **Styling**: Use native CSS variables in Tailwind v4 for easier dynamic theming.
|
|
@@ -166,4 +166,4 @@ export const metadata: Metadata = {
|
|
|
166
166
|
- **React Server Components (RSC)**: Default all components to Server Components. Only add `'use client'` when you need state (`useState`) or event listeners (`onClick`).
|
|
167
167
|
- **Image Optimization**: Use the `<Image />` component but remember `unoptimized: true` for static export or use an external image CDN (Cloudinary/Imgix).
|
|
168
168
|
- **Font Optimization**: Use `next/font` (Google Fonts) to automatically host fonts and prevent layout shift.
|
|
169
|
-
- **Responsive**: Mobile-first design using Tailwind prefixes like `sm:`, `md:`, `lg:`.
|
|
169
|
+
- **Responsive**: Mobile-first design using Tailwind prefixes like `sm:`, `md:`, `lg:`.
|