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
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
bundle_analyzer.py — JS/TS bundle size analyzer for the Tribunal Agent Kit.
|
|
4
|
-
|
|
5
|
-
Analyzes build output for:
|
|
6
|
-
- Total bundle size
|
|
7
|
-
- Largest files in dist/
|
|
8
|
-
- Suggested tree-shaking opportunities
|
|
9
|
-
- Bundler-specific analysis (Vite / Webpack)
|
|
10
|
-
|
|
11
|
-
Usage:
|
|
12
|
-
python .agent/scripts/bundle_analyzer.py .
|
|
13
|
-
python .agent/scripts/bundle_analyzer.py . --build
|
|
14
|
-
python .agent/scripts/bundle_analyzer.py . --threshold 500
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
import os
|
|
18
|
-
import sys
|
|
19
|
-
import json
|
|
20
|
-
import subprocess
|
|
21
|
-
import argparse
|
|
22
|
-
from pathlib import Path
|
|
23
|
-
|
|
24
|
-
RED = "\033[91m"
|
|
25
|
-
GREEN = "\033[92m"
|
|
26
|
-
YELLOW = "\033[93m"
|
|
27
|
-
BLUE = "\033[94m"
|
|
28
|
-
BOLD = "\033[1m"
|
|
29
|
-
RESET = "\033[0m"
|
|
30
|
-
|
|
31
|
-
# Common large dependencies that often have lighter alternatives
|
|
32
|
-
HEAVY_PACKAGES: dict[str, str] = {
|
|
33
|
-
"moment": "Use date-fns or dayjs instead (~2KB vs ~230KB)",
|
|
34
|
-
"lodash": "Import specific functions: lodash/debounce instead of full lodash",
|
|
35
|
-
"rxjs": "Import specific operators to enable tree-shaking",
|
|
36
|
-
"aws-sdk": "Use @aws-sdk/client-* v3 modular imports",
|
|
37
|
-
"firebase": "Use modular imports: firebase/auth, firebase/firestore",
|
|
38
|
-
"chart.js": "Register only needed components",
|
|
39
|
-
"three": "Import specific modules from three/examples/jsm/",
|
|
40
|
-
"@mui/material": "Ensure babel-plugin-import or modular imports",
|
|
41
|
-
"@mui/icons-material": "Import specific icons, never the barrel",
|
|
42
|
-
"antd": "Use modular imports with babel-plugin-import",
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def header(title: str) -> None:
|
|
47
|
-
print(f"\n{BOLD}{BLUE}━━━ {title} ━━━{RESET}")
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def ok(msg: str) -> None:
|
|
51
|
-
print(f" {GREEN}✅ {msg}{RESET}")
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def fail(msg: str) -> None:
|
|
55
|
-
print(f" {RED}❌ {msg}{RESET}")
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def warn(msg: str) -> None:
|
|
59
|
-
print(f" {YELLOW}⚠️ {msg}{RESET}")
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def skip(msg: str) -> None:
|
|
63
|
-
print(f" {YELLOW}⏭️ {msg}{RESET}")
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def format_size(size_bytes: int) -> str:
|
|
67
|
-
"""Format bytes into human-readable size."""
|
|
68
|
-
if size_bytes < 1024:
|
|
69
|
-
return f"{size_bytes}B"
|
|
70
|
-
elif size_bytes < 1024 * 1024:
|
|
71
|
-
return f"{size_bytes / 1024:.1f}KB"
|
|
72
|
-
else:
|
|
73
|
-
return f"{size_bytes / (1024 * 1024):.1f}MB"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def detect_bundler(project_root: str) -> str | None:
|
|
77
|
-
"""Detect the bundler used in the project."""
|
|
78
|
-
root = Path(project_root)
|
|
79
|
-
pkg_path = root / "package.json"
|
|
80
|
-
if not pkg_path.exists():
|
|
81
|
-
return None
|
|
82
|
-
|
|
83
|
-
try:
|
|
84
|
-
with open(pkg_path) as f:
|
|
85
|
-
pkg = json.load(f)
|
|
86
|
-
deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
|
|
87
|
-
|
|
88
|
-
if "vite" in deps:
|
|
89
|
-
return "vite"
|
|
90
|
-
if "next" in deps:
|
|
91
|
-
return "next"
|
|
92
|
-
if "webpack" in deps:
|
|
93
|
-
return "webpack"
|
|
94
|
-
if any(f.exists() for f in [root / "webpack.config.js", root / "webpack.config.ts"]):
|
|
95
|
-
return "webpack"
|
|
96
|
-
except (json.JSONDecodeError, IOError):
|
|
97
|
-
pass
|
|
98
|
-
|
|
99
|
-
return None
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def find_dist_dir(project_root: str) -> str | None:
|
|
103
|
-
"""Find the build output directory."""
|
|
104
|
-
root = Path(project_root)
|
|
105
|
-
candidates = ["dist", "build", ".next", "out", "public/build"]
|
|
106
|
-
for candidate in candidates:
|
|
107
|
-
d = root / candidate
|
|
108
|
-
if d.is_dir():
|
|
109
|
-
return str(d)
|
|
110
|
-
return None
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def analyze_dist(dist_dir: str, threshold_kb: int) -> tuple[int, list[tuple[str, int]]]:
|
|
114
|
-
"""Analyze the dist directory. Returns (total_size, list of (file, size) sorted by size desc)."""
|
|
115
|
-
files: list[tuple[str, int]] = []
|
|
116
|
-
total = 0
|
|
117
|
-
|
|
118
|
-
for root, dirs, filenames in os.walk(dist_dir):
|
|
119
|
-
for fname in filenames:
|
|
120
|
-
fpath = os.path.join(root, fname)
|
|
121
|
-
size = os.path.getsize(fpath)
|
|
122
|
-
total += size
|
|
123
|
-
rel = os.path.relpath(fpath, dist_dir)
|
|
124
|
-
files.append((rel, size))
|
|
125
|
-
|
|
126
|
-
files.sort(key=lambda x: x[1], reverse=True)
|
|
127
|
-
return total, files
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def check_heavy_dependencies(project_root: str) -> list[tuple[str, str]]:
|
|
131
|
-
"""Check if any known-heavy packages are in dependencies."""
|
|
132
|
-
pkg_path = Path(project_root) / "package.json"
|
|
133
|
-
if not pkg_path.exists():
|
|
134
|
-
return []
|
|
135
|
-
|
|
136
|
-
try:
|
|
137
|
-
with open(pkg_path) as f:
|
|
138
|
-
pkg = json.load(f)
|
|
139
|
-
deps = set(pkg.get("dependencies", {}).keys())
|
|
140
|
-
found: list[tuple[str, str]] = []
|
|
141
|
-
for pkg_name, suggestion in HEAVY_PACKAGES.items():
|
|
142
|
-
if pkg_name in deps:
|
|
143
|
-
found.append((pkg_name, suggestion))
|
|
144
|
-
return found
|
|
145
|
-
except (json.JSONDecodeError, IOError):
|
|
146
|
-
return []
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
def run_build(project_root: str) -> bool:
|
|
150
|
-
"""Run npm run build."""
|
|
151
|
-
try:
|
|
152
|
-
result = subprocess.run(
|
|
153
|
-
["npm", "run", "build"],
|
|
154
|
-
cwd=project_root,
|
|
155
|
-
capture_output=True,
|
|
156
|
-
text=True,
|
|
157
|
-
timeout=120,
|
|
158
|
-
)
|
|
159
|
-
if result.returncode == 0:
|
|
160
|
-
ok("Build completed successfully")
|
|
161
|
-
return True
|
|
162
|
-
fail("Build failed")
|
|
163
|
-
output = (result.stdout + result.stderr).strip()
|
|
164
|
-
if output:
|
|
165
|
-
for line in output.split("\n")[:10]:
|
|
166
|
-
print(f" {line}")
|
|
167
|
-
return False
|
|
168
|
-
except FileNotFoundError:
|
|
169
|
-
fail("npm not installed")
|
|
170
|
-
return False
|
|
171
|
-
except subprocess.TimeoutExpired:
|
|
172
|
-
fail("Build timed out after 120s")
|
|
173
|
-
return False
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def main() -> None:
|
|
177
|
-
parser = argparse.ArgumentParser(
|
|
178
|
-
description="Tribunal bundle analyzer — checks build output size and suggests optimizations"
|
|
179
|
-
)
|
|
180
|
-
parser.add_argument("path", help="Project root directory")
|
|
181
|
-
parser.add_argument("--build", action="store_true", help="Run npm run build before analyzing")
|
|
182
|
-
parser.add_argument("--threshold", type=int, default=250, help="File size warning threshold in KB (default: 250)")
|
|
183
|
-
args = parser.parse_args()
|
|
184
|
-
|
|
185
|
-
project_root = os.path.abspath(args.path)
|
|
186
|
-
if not os.path.isdir(project_root):
|
|
187
|
-
fail(f"Directory not found: {project_root}")
|
|
188
|
-
sys.exit(1)
|
|
189
|
-
|
|
190
|
-
print(f"{BOLD}Tribunal — bundle_analyzer.py{RESET}")
|
|
191
|
-
print(f"Project: {project_root}")
|
|
192
|
-
|
|
193
|
-
bundler = detect_bundler(project_root)
|
|
194
|
-
if bundler:
|
|
195
|
-
print(f" Bundler: {bundler}")
|
|
196
|
-
|
|
197
|
-
# Optionally build first
|
|
198
|
-
if args.build:
|
|
199
|
-
header("Building project")
|
|
200
|
-
if not run_build(project_root):
|
|
201
|
-
sys.exit(1)
|
|
202
|
-
|
|
203
|
-
# Find and analyze dist directory
|
|
204
|
-
dist_dir = find_dist_dir(project_root)
|
|
205
|
-
if not dist_dir:
|
|
206
|
-
skip("No build output directory found (dist/, build/, .next/, out/)")
|
|
207
|
-
skip("Run with --build to create a build first, or build manually")
|
|
208
|
-
else:
|
|
209
|
-
header(f"Bundle Size Analysis ({os.path.relpath(dist_dir, project_root)}/)")
|
|
210
|
-
|
|
211
|
-
total_size, files = analyze_dist(dist_dir, args.threshold)
|
|
212
|
-
print(f"\n Total bundle size: {BOLD}{format_size(total_size)}{RESET}")
|
|
213
|
-
|
|
214
|
-
threshold_bytes = args.threshold * 1024
|
|
215
|
-
|
|
216
|
-
# Show top 10 largest files
|
|
217
|
-
print(f"\n {BOLD}Top files by size:{RESET}")
|
|
218
|
-
for filepath, size in files[:10]:
|
|
219
|
-
if size > threshold_bytes:
|
|
220
|
-
warn(f"{format_size(size):>10s} {filepath}")
|
|
221
|
-
else:
|
|
222
|
-
print(f" {'':>4s}{format_size(size):>10s} {filepath}")
|
|
223
|
-
|
|
224
|
-
# Count JS/CSS files above threshold
|
|
225
|
-
large_js = [(f, s) for f, s in files if f.endswith((".js", ".mjs")) and s > threshold_bytes]
|
|
226
|
-
if large_js:
|
|
227
|
-
print(f"\n {YELLOW}{len(large_js)} JS file(s) exceed {args.threshold}KB threshold{RESET}")
|
|
228
|
-
|
|
229
|
-
# Check for heavy dependencies
|
|
230
|
-
header("Dependency Weight Check")
|
|
231
|
-
heavy = check_heavy_dependencies(project_root)
|
|
232
|
-
if heavy:
|
|
233
|
-
for pkg_name, suggestion in heavy:
|
|
234
|
-
warn(f"'{pkg_name}' is a heavy dependency")
|
|
235
|
-
print(f" → {suggestion}")
|
|
236
|
-
else:
|
|
237
|
-
ok("No known-heavy packages detected")
|
|
238
|
-
|
|
239
|
-
# Summary
|
|
240
|
-
print(f"\n{BOLD}━━━ Bundle Analysis Summary ━━━{RESET}")
|
|
241
|
-
if dist_dir:
|
|
242
|
-
total_size_val = analyze_dist(dist_dir, args.threshold)[0]
|
|
243
|
-
size_str = format_size(total_size_val)
|
|
244
|
-
if total_size_val > 5 * 1024 * 1024:
|
|
245
|
-
fail(f"Total bundle: {size_str} — consider code splitting")
|
|
246
|
-
elif total_size_val > 2 * 1024 * 1024:
|
|
247
|
-
warn(f"Total bundle: {size_str} — review for optimization opportunities")
|
|
248
|
-
else:
|
|
249
|
-
ok(f"Total bundle: {size_str}")
|
|
250
|
-
if heavy:
|
|
251
|
-
warn(f"{len(heavy)} heavy dependency suggestion(s) — see above")
|
|
252
|
-
elif not heavy and dist_dir:
|
|
253
|
-
ok("No optimization suggestions")
|
|
254
|
-
|
|
255
|
-
sys.exit(0)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
if __name__ == "__main__":
|
|
259
|
-
main()
|