Loading...
Analyzes and reports final bundle sizes when the development session ends
{
"hookConfig": {
"hooks": {
"stop": {
"script": "./.claude/hooks/final-bundle-size-reporter.sh"
}
}
},
"scriptContent": "#!/usr/bin/env bash\n\necho \"đĻ FINAL BUNDLE SIZE REPORT\" >&2\necho \"===========================================\" >&2\n\n# Initialize variables\nTIMESTAMP=$(date +\"%Y-%m-%d %H:%M:%S\")\nREPORT_FILE=\"bundle-report-$(date +%Y%m%d_%H%M%S).txt\"\nBUILD_DETECTED=false\nTOTAL_SIZE=0\nJS_SIZE=0\nCSS_SIZE=0\nIMAGE_SIZE=0\nOTHER_SIZE=0\n\n# Function to convert bytes to human readable\nformat_bytes() {\n local bytes=$1\n if [ $bytes -ge 1073741824 ]; then\n echo \"$(echo \"scale=2; $bytes/1073741824\" | bc 2>/dev/null || echo $((bytes/1073741824)))GB\"\n elif [ $bytes -ge 1048576 ]; then\n echo \"$(echo \"scale=2; $bytes/1048576\" | bc 2>/dev/null || echo $((bytes/1048576)))MB\"\n elif [ $bytes -ge 1024 ]; then\n echo \"$(echo \"scale=2; $bytes/1024\" | bc 2>/dev/null || echo $((bytes/1024)))KB\"\n else\n echo \"${bytes}B\"\n fi\n}\n\n# Function to analyze directory\nanalyze_directory() {\n local dir=\"$1\"\n local label=\"$2\"\n \n if [ ! -d \"$dir\" ]; then\n return\n fi\n \n echo \"đ Analyzing $label: $dir\" >&2\n BUILD_DETECTED=true\n \n # Calculate total directory size\n DIR_SIZE=$(du -sb \"$dir\" 2>/dev/null | cut -f1 || echo \"0\")\n TOTAL_SIZE=$((TOTAL_SIZE + DIR_SIZE))\n \n echo \" Total size: $(format_bytes $DIR_SIZE)\" >&2\n \n # Analyze by file types\n echo \" đ File type breakdown:\" >&2\n \n # JavaScript files\n if find \"$dir\" -name \"*.js\" -o -name \"*.mjs\" -o -name \"*.ts\" 2>/dev/null | head -1 > /dev/null; then\n JS_FILES_SIZE=$(find \"$dir\" \\( -name \"*.js\" -o -name \"*.mjs\" -o -name \"*.ts\" \\) -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo \"0\")\n JS_SIZE=$((JS_SIZE + JS_FILES_SIZE))\n echo \" JavaScript: $(format_bytes $JS_FILES_SIZE)\" >&2\n fi\n \n # CSS files\n if find \"$dir\" -name \"*.css\" 2>/dev/null | head -1 > /dev/null; then\n CSS_FILES_SIZE=$(find \"$dir\" -name \"*.css\" -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo \"0\")\n CSS_SIZE=$((CSS_SIZE + CSS_FILES_SIZE))\n echo \" CSS: $(format_bytes $CSS_FILES_SIZE)\" >&2\n fi\n \n # Images\n if find \"$dir\" \\( -name \"*.png\" -o -name \"*.jpg\" -o -name \"*.jpeg\" -o -name \"*.gif\" -o -name \"*.svg\" -o -name \"*.webp\" \\) 2>/dev/null | head -1 > /dev/null; then\n IMG_FILES_SIZE=$(find \"$dir\" \\( -name \"*.png\" -o -name \"*.jpg\" -o -name \"*.jpeg\" -o -name \"*.gif\" -o -name \"*.svg\" -o -name \"*.webp\" \\) -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo \"0\")\n IMAGE_SIZE=$((IMAGE_SIZE + IMG_FILES_SIZE))\n echo \" Images: $(format_bytes $IMG_FILES_SIZE)\" >&2\n fi\n \n # Show largest files in this directory\n echo \" đ Largest files:\" >&2\n find \"$dir\" -type f -exec du -b {} + 2>/dev/null | sort -rn | head -5 | while read size file; do\n echo \" $(format_bytes $size) - $(basename \"$file\")\" >&2\n done\n \n # Gzip analysis for text files\n GZIPPABLE_SIZE=$(find \"$dir\" \\( -name \"*.js\" -o -name \"*.css\" -o -name \"*.html\" -o -name \"*.json\" \\) -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo \"0\")\n if [ \"$GZIPPABLE_SIZE\" -gt 0 ] && command -v gzip &> /dev/null; then\n # Estimate gzip compression\n TEMP_DIR=$(mktemp -d)\n find \"$dir\" \\( -name \"*.js\" -o -name \"*.css\" -o -name \"*.html\" -o -name \"*.json\" \\) -exec cp {} \"$TEMP_DIR/\" \\; 2>/dev/null\n \n if [ \"$(ls -A \"$TEMP_DIR\" 2>/dev/null)\" ]; then\n cd \"$TEMP_DIR\" && gzip *.* 2>/dev/null && GZIPPED_SIZE=$(du -cb *.gz 2>/dev/null | tail -1 | cut -f1 || echo \"0\") && cd - > /dev/null\n \n if [ \"$GZIPPED_SIZE\" -gt 0 ]; then\n COMPRESSION_RATIO=$(echo \"scale=1; ($GZIPPABLE_SIZE - $GZIPPED_SIZE) * 100 / $GZIPPABLE_SIZE\" | bc 2>/dev/null || echo \"N/A\")\n echo \" đĻ Gzip compression potential: $(format_bytes $GZIPPED_SIZE) (-${COMPRESSION_RATIO}%)\" >&2\n fi\n fi\n \n rm -rf \"$TEMP_DIR\" 2>/dev/null\n fi\n \n echo \"\" >&2\n}\n\n# Start report\necho \"Starting bundle analysis at $TIMESTAMP\" >&2\necho \"\" >&2\n\n# Check if this is a Node.js project\nif [ -f \"package.json\" ]; then\n echo \"đĸ Node.js project detected\" >&2\n \n PROJECT_NAME=$(grep '\"name\"' package.json | head -1 | cut -d'\"' -f4 2>/dev/null || echo \"Unknown\")\n echo \"đ Project: $PROJECT_NAME\" >&2\n \n # Try to build the project\n echo \"đ¨ Attempting to build project...\" >&2\n \n # Check for common build scripts\n BUILD_SCRIPT=\"\"\n if grep -q '\"build\"' package.json; then\n BUILD_SCRIPT=\"npm run build\"\n elif grep -q '\"build:prod\"' package.json; then\n BUILD_SCRIPT=\"npm run build:prod\"\n elif grep -q '\"dist\"' package.json; then\n BUILD_SCRIPT=\"npm run dist\"\n fi\n \n if [ -n \"$BUILD_SCRIPT\" ]; then\n echo \" Running: $BUILD_SCRIPT\" >&2\n if $BUILD_SCRIPT > /tmp/build_output.log 2>&1; then\n echo \" â
Build completed successfully\" >&2\n else\n echo \" â ī¸ Build failed or incomplete - analyzing existing output\" >&2\n echo \" đ Build log: /tmp/build_output.log\" >&2\n fi\n else\n echo \" âšī¸ No build script found - analyzing existing files\" >&2\n fi\n \n echo \"\" >&2\nfi\n\n# Common build output directories\nBUILD_DIRS=(\"dist\" \"build\" \"out\" \".next\" \"public\" \"www\" \"target/release\")\n\n# Analyze each potential build directory\nfor dir in \"${BUILD_DIRS[@]}\"; do\n if [ -d \"$dir\" ]; then\n case \"$dir\" in\n \"dist\")\n analyze_directory \"$dir\" \"Distribution Build\"\n ;;\n \"build\")\n analyze_directory \"$dir\" \"Production Build\"\n ;;\n \"out\")\n analyze_directory \"$dir\" \"Output Build\"\n ;;\n \".next\")\n analyze_directory \"$dir\" \"Next.js Build\"\n ;;\n \"public\")\n # Only analyze if it looks like a build output\n if [ -f \"$dir/index.html\" ] || [ -f \"$dir/main.js\" ]; then\n analyze_directory \"$dir\" \"Public Assets\"\n fi\n ;;\n \"www\")\n analyze_directory \"$dir\" \"Web Assets\"\n ;;\n \"target/release\")\n analyze_directory \"$dir\" \"Rust Release Build\"\n ;;\n esac\n fi\ndone\n\n# Framework-specific analysis\nif [ -f \"webpack.config.js\" ] || [ -f \"webpack.config.ts\" ]; then\n echo \"âī¸ Webpack configuration detected\" >&2\n \n # Look for webpack-bundle-analyzer output\n if [ -f \"bundle-analyzer-report.html\" ]; then\n echo \" đ Bundle analyzer report available: bundle-analyzer-report.html\" >&2\n fi\nfi\n\nif [ -f \"vite.config.js\" ] || [ -f \"vite.config.ts\" ]; then\n echo \"⥠Vite configuration detected\" >&2\nfi\n\nif [ -f \"next.config.js\" ] || [ -f \"next.config.ts\" ]; then\n echo \"ⲠNext.js configuration detected\" >&2\nfi\n\nif [ -f \"rollup.config.js\" ]; then\n echo \"đĻ Rollup configuration detected\" >&2\nfi\n\n# Generate summary\necho \"\" >&2\necho \"đ BUNDLE SIZE SUMMARY\" >&2\necho \"=====================================\" >&2\n\nif [ \"$BUILD_DETECTED\" = true ]; then\n echo \"đ Total bundle size: $(format_bytes $TOTAL_SIZE)\" >&2\n echo \"\" >&2\n echo \"đ Breakdown by type:\" >&2\n [ \"$JS_SIZE\" -gt 0 ] && echo \" JavaScript: $(format_bytes $JS_SIZE)\" >&2\n [ \"$CSS_SIZE\" -gt 0 ] && echo \" CSS: $(format_bytes $CSS_SIZE)\" >&2\n [ \"$IMAGE_SIZE\" -gt 0 ] && echo \" Images: $(format_bytes $IMAGE_SIZE)\" >&2\n \n echo \"\" >&2\n echo \"đ¯ Performance Assessment:\" >&2\n \n # Performance thresholds\n if [ \"$TOTAL_SIZE\" -gt 5242880 ]; then # 5MB\n echo \" đ´ Large bundle size - may impact load times significantly\" >&2\n elif [ \"$TOTAL_SIZE\" -gt 1048576 ]; then # 1MB\n echo \" đĄ Moderate bundle size - consider optimization\" >&2\n else\n echo \" đĸ Good bundle size - within performance budget\" >&2\n fi\n \n if [ \"$JS_SIZE\" -gt 1048576 ]; then # 1MB JS\n echo \" â ī¸ JavaScript bundle is large - consider code splitting\" >&2\n fi\n \n echo \"\" >&2\n echo \"đĄ Optimization Recommendations:\" >&2\n echo \" âĸ Enable gzip/brotli compression on your server\" >&2\n echo \" âĸ Consider code splitting for large JavaScript bundles\" >&2\n echo \" âĸ Optimize images with modern formats (WebP, AVIF)\" >&2\n echo \" âĸ Remove unused CSS and JavaScript code\" >&2\n echo \" âĸ Use dynamic imports for non-critical code\" >&2\n \nelse\n echo \"âšī¸ No build output detected in common directories\" >&2\n echo \" Searched: ${BUILD_DIRS[*]}\" >&2\n echo \" Consider running a build command first\" >&2\nfi\n\necho \"\" >&2\necho \"đ Report timestamp: $TIMESTAMP\" >&2\necho \"đž Full report saved to: $REPORT_FILE\" >&2\n\n# Save detailed report to file\n{\n echo \"BUNDLE SIZE REPORT\"\n echo \"Generated: $TIMESTAMP\"\n echo \"Project: $(basename \"$(pwd)\")\"\n echo \"\"\n \n if [ \"$BUILD_DETECTED\" = true ]; then\n echo \"SUMMARY\"\n echo \"=======\"\n echo \"Total Size: $(format_bytes $TOTAL_SIZE)\"\n echo \"JavaScript: $(format_bytes $JS_SIZE)\"\n echo \"CSS: $(format_bytes $CSS_SIZE)\"\n echo \"Images: $(format_bytes $IMAGE_SIZE)\"\n echo \"\"\n \n echo \"DETAILED ANALYSIS\"\n echo \"=================\"\n for dir in \"${BUILD_DIRS[@]}\"; do\n if [ -d \"$dir\" ]; then\n echo \"$dir directory:\"\n find \"$dir\" -type f -exec du -b {} + 2>/dev/null | sort -rn | head -10 | while read size file; do\n echo \" $(format_bytes $size) - $file\"\n done\n echo \"\"\n fi\n done\n else\n echo \"No build output detected\"\n fi\n} > \"$REPORT_FILE\"\n\necho \"=====================================\" >&2\n\nexit 0"
}.claude/hooks/~/.claude/hooks/{
"hooks": {
"stop": {
"script": "./.claude/hooks/final-bundle-size-reporter.sh"
}
}
}#!/usr/bin/env bash
echo "đĻ FINAL BUNDLE SIZE REPORT" >&2
echo "===========================================" >&2
# Initialize variables
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
REPORT_FILE="bundle-report-$(date +%Y%m%d_%H%M%S).txt"
BUILD_DETECTED=false
TOTAL_SIZE=0
JS_SIZE=0
CSS_SIZE=0
IMAGE_SIZE=0
OTHER_SIZE=0
# Function to convert bytes to human readable
format_bytes() {
local bytes=$1
if [ $bytes -ge 1073741824 ]; then
echo "$(echo "scale=2; $bytes/1073741824" | bc 2>/dev/null || echo $((bytes/1073741824)))GB"
elif [ $bytes -ge 1048576 ]; then
echo "$(echo "scale=2; $bytes/1048576" | bc 2>/dev/null || echo $((bytes/1048576)))MB"
elif [ $bytes -ge 1024 ]; then
echo "$(echo "scale=2; $bytes/1024" | bc 2>/dev/null || echo $((bytes/1024)))KB"
else
echo "${bytes}B"
fi
}
# Function to analyze directory
analyze_directory() {
local dir="$1"
local label="$2"
if [ ! -d "$dir" ]; then
return
fi
echo "đ Analyzing $label: $dir" >&2
BUILD_DETECTED=true
# Calculate total directory size
DIR_SIZE=$(du -sb "$dir" 2>/dev/null | cut -f1 || echo "0")
TOTAL_SIZE=$((TOTAL_SIZE + DIR_SIZE))
echo " Total size: $(format_bytes $DIR_SIZE)" >&2
# Analyze by file types
echo " đ File type breakdown:" >&2
# JavaScript files
if find "$dir" -name "*.js" -o -name "*.mjs" -o -name "*.ts" 2>/dev/null | head -1 > /dev/null; then
JS_FILES_SIZE=$(find "$dir" \( -name "*.js" -o -name "*.mjs" -o -name "*.ts" \) -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo "0")
JS_SIZE=$((JS_SIZE + JS_FILES_SIZE))
echo " JavaScript: $(format_bytes $JS_FILES_SIZE)" >&2
fi
# CSS files
if find "$dir" -name "*.css" 2>/dev/null | head -1 > /dev/null; then
CSS_FILES_SIZE=$(find "$dir" -name "*.css" -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo "0")
CSS_SIZE=$((CSS_SIZE + CSS_FILES_SIZE))
echo " CSS: $(format_bytes $CSS_FILES_SIZE)" >&2
fi
# Images
if find "$dir" \( -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" -o -name "*.gif" -o -name "*.svg" -o -name "*.webp" \) 2>/dev/null | head -1 > /dev/null; then
IMG_FILES_SIZE=$(find "$dir" \( -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" -o -name "*.gif" -o -name "*.svg" -o -name "*.webp" \) -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo "0")
IMAGE_SIZE=$((IMAGE_SIZE + IMG_FILES_SIZE))
echo " Images: $(format_bytes $IMG_FILES_SIZE)" >&2
fi
# Show largest files in this directory
echo " đ Largest files:" >&2
find "$dir" -type f -exec du -b {} + 2>/dev/null | sort -rn | head -5 | while read size file; do
echo " $(format_bytes $size) - $(basename "$file")" >&2
done
# Gzip analysis for text files
GZIPPABLE_SIZE=$(find "$dir" \( -name "*.js" -o -name "*.css" -o -name "*.html" -o -name "*.json" \) -exec du -cb {} + 2>/dev/null | tail -1 | cut -f1 || echo "0")
if [ "$GZIPPABLE_SIZE" -gt 0 ] && command -v gzip &> /dev/null; then
# Estimate gzip compression
TEMP_DIR=$(mktemp -d)
find "$dir" \( -name "*.js" -o -name "*.css" -o -name "*.html" -o -name "*.json" \) -exec cp {} "$TEMP_DIR/" \; 2>/dev/null
if [ "$(ls -A "$TEMP_DIR" 2>/dev/null)" ]; then
cd "$TEMP_DIR" && gzip *.* 2>/dev/null && GZIPPED_SIZE=$(du -cb *.gz 2>/dev/null | tail -1 | cut -f1 || echo "0") && cd - > /dev/null
if [ "$GZIPPED_SIZE" -gt 0 ]; then
COMPRESSION_RATIO=$(echo "scale=1; ($GZIPPABLE_SIZE - $GZIPPED_SIZE) * 100 / $GZIPPABLE_SIZE" | bc 2>/dev/null || echo "N/A")
echo " đĻ Gzip compression potential: $(format_bytes $GZIPPED_SIZE) (-${COMPRESSION_RATIO}%)" >&2
fi
fi
rm -rf "$TEMP_DIR" 2>/dev/null
fi
echo "" >&2
}
# Start report
echo "Starting bundle analysis at $TIMESTAMP" >&2
echo "" >&2
# Check if this is a Node.js project
if [ -f "package.json" ]; then
echo "đĸ Node.js project detected" >&2
PROJECT_NAME=$(grep '"name"' package.json | head -1 | cut -d'"' -f4 2>/dev/null || echo "Unknown")
echo "đ Project: $PROJECT_NAME" >&2
# Try to build the project
echo "đ¨ Attempting to build project..." >&2
# Check for common build scripts
BUILD_SCRIPT=""
if grep -q '"build"' package.json; then
BUILD_SCRIPT="npm run build"
elif grep -q '"build:prod"' package.json; then
BUILD_SCRIPT="npm run build:prod"
elif grep -q '"dist"' package.json; then
BUILD_SCRIPT="npm run dist"
fi
if [ -n "$BUILD_SCRIPT" ]; then
echo " Running: $BUILD_SCRIPT" >&2
if $BUILD_SCRIPT > /tmp/build_output.log 2>&1; then
echo " â
Build completed successfully" >&2
else
echo " â ī¸ Build failed or incomplete - analyzing existing output" >&2
echo " đ Build log: /tmp/build_output.log" >&2
fi
else
echo " âšī¸ No build script found - analyzing existing files" >&2
fi
echo "" >&2
fi
# Common build output directories
BUILD_DIRS=("dist" "build" "out" ".next" "public" "www" "target/release")
# Analyze each potential build directory
for dir in "${BUILD_DIRS[@]}"; do
if [ -d "$dir" ]; then
case "$dir" in
"dist")
analyze_directory "$dir" "Distribution Build"
;;
"build")
analyze_directory "$dir" "Production Build"
;;
"out")
analyze_directory "$dir" "Output Build"
;;
".next")
analyze_directory "$dir" "Next.js Build"
;;
"public")
# Only analyze if it looks like a build output
if [ -f "$dir/index.html" ] || [ -f "$dir/main.js" ]; then
analyze_directory "$dir" "Public Assets"
fi
;;
"www")
analyze_directory "$dir" "Web Assets"
;;
"target/release")
analyze_directory "$dir" "Rust Release Build"
;;
esac
fi
done
# Framework-specific analysis
if [ -f "webpack.config.js" ] || [ -f "webpack.config.ts" ]; then
echo "âī¸ Webpack configuration detected" >&2
# Look for webpack-bundle-analyzer output
if [ -f "bundle-analyzer-report.html" ]; then
echo " đ Bundle analyzer report available: bundle-analyzer-report.html" >&2
fi
fi
if [ -f "vite.config.js" ] || [ -f "vite.config.ts" ]; then
echo "⥠Vite configuration detected" >&2
fi
if [ -f "next.config.js" ] || [ -f "next.config.ts" ]; then
echo "ⲠNext.js configuration detected" >&2
fi
if [ -f "rollup.config.js" ]; then
echo "đĻ Rollup configuration detected" >&2
fi
# Generate summary
echo "" >&2
echo "đ BUNDLE SIZE SUMMARY" >&2
echo "=====================================" >&2
if [ "$BUILD_DETECTED" = true ]; then
echo "đ Total bundle size: $(format_bytes $TOTAL_SIZE)" >&2
echo "" >&2
echo "đ Breakdown by type:" >&2
[ "$JS_SIZE" -gt 0 ] && echo " JavaScript: $(format_bytes $JS_SIZE)" >&2
[ "$CSS_SIZE" -gt 0 ] && echo " CSS: $(format_bytes $CSS_SIZE)" >&2
[ "$IMAGE_SIZE" -gt 0 ] && echo " Images: $(format_bytes $IMAGE_SIZE)" >&2
echo "" >&2
echo "đ¯ Performance Assessment:" >&2
# Performance thresholds
if [ "$TOTAL_SIZE" -gt 5242880 ]; then # 5MB
echo " đ´ Large bundle size - may impact load times significantly" >&2
elif [ "$TOTAL_SIZE" -gt 1048576 ]; then # 1MB
echo " đĄ Moderate bundle size - consider optimization" >&2
else
echo " đĸ Good bundle size - within performance budget" >&2
fi
if [ "$JS_SIZE" -gt 1048576 ]; then # 1MB JS
echo " â ī¸ JavaScript bundle is large - consider code splitting" >&2
fi
echo "" >&2
echo "đĄ Optimization Recommendations:" >&2
echo " âĸ Enable gzip/brotli compression on your server" >&2
echo " âĸ Consider code splitting for large JavaScript bundles" >&2
echo " âĸ Optimize images with modern formats (WebP, AVIF)" >&2
echo " âĸ Remove unused CSS and JavaScript code" >&2
echo " âĸ Use dynamic imports for non-critical code" >&2
else
echo "âšī¸ No build output detected in common directories" >&2
echo " Searched: ${BUILD_DIRS[*]}" >&2
echo " Consider running a build command first" >&2
fi
echo "" >&2
echo "đ Report timestamp: $TIMESTAMP" >&2
echo "đž Full report saved to: $REPORT_FILE" >&2
# Save detailed report to file
{
echo "BUNDLE SIZE REPORT"
echo "Generated: $TIMESTAMP"
echo "Project: $(basename "$(pwd)")"
echo ""
if [ "$BUILD_DETECTED" = true ]; then
echo "SUMMARY"
echo "======="
echo "Total Size: $(format_bytes $TOTAL_SIZE)"
echo "JavaScript: $(format_bytes $JS_SIZE)"
echo "CSS: $(format_bytes $CSS_SIZE)"
echo "Images: $(format_bytes $IMAGE_SIZE)"
echo ""
echo "DETAILED ANALYSIS"
echo "================="
for dir in "${BUILD_DIRS[@]}"; do
if [ -d "$dir" ]; then
echo "$dir directory:"
find "$dir" -type f -exec du -b {} + 2>/dev/null | sort -rn | head -10 | while read size file; do
echo " $(format_bytes $size) - $file"
done
echo ""
fi
done
else
echo "No build output detected"
fi
} > "$REPORT_FILE"
echo "=====================================" >&2
exit 0No build output detected even after running build
Hook searches standard directories (dist, build, out, .next). Check your build output location in package.json or framework config and add custom directory to BUILD_DIRS array in hook script.
Build command runs but fails silently in hook
Check /tmp/build_output.log for error details. Ensure build script in package.json doesn't require interactive prompts. Add --no-interactive or CI=true environment variable to build command.
Bundle size calculation includes development files
Hook analyzes build output directories only. Ensure your build process excludes source maps, test files, and dev dependencies. Check if framework outputs dev builds to different directory.
Gzip compression analysis shows N/A or fails
Install bc command for compression ratio calculation (brew install bc on macOS). Ensure gzip is available in PATH. Large bundles may timeout in compression analysis, skip for files over 100MB.
Loading reviews...
Join our community of Claude power users. No spam, unsubscribe anytime.
Automated accessibility testing and compliance checking for web applications following WCAG guidelines
Automatically generates or updates API documentation when endpoint files are modified
Automatically formats code files after Claude writes or edits them using Prettier, Black, or other formatters