lighthouse

📁 manastalukdar/claude-devstudio 📅 7 days ago
3
总安装量
3
周安装量
#54748
全站排名
安装命令
npx skills add https://github.com/manastalukdar/claude-devstudio --skill lighthouse

Agent 安装分布

opencode 3
gemini-cli 3
claude-code 3
github-copilot 3
codex 3
kimi-cli 3

Skill 文档

Lighthouse Performance Auditing & Fixes

I’ll run comprehensive Lighthouse audits for performance, accessibility, SEO, and best practices, then implement prioritized fixes automatically.

Audit Categories:

  • Performance (Core Web Vitals: LCP, FID, CLS)
  • Accessibility (WCAG compliance)
  • SEO (Search engine optimization)
  • Best Practices (Security, modern standards)
  • PWA (Progressive Web App)

Arguments: $ARGUMENTS – optional: URL to audit (defaults to http://localhost:3000) or mobile/desktop


Token Optimization

This skill uses efficient patterns to minimize token consumption during Lighthouse auditing and automated fix implementation.

Optimization Strategies

1. Cached Lighthouse Results (Saves 85% when available)

Cache recent Lighthouse results to avoid re-running expensive audits:

CACHE_FILE=".claude/cache/lighthouse/last-audit.json"
CACHE_TTL=3600  # 1 hour (audits are expensive)

mkdir -p .claude/cache/lighthouse

if [ -f "$CACHE_FILE" ]; then
    CACHE_AGE=$(($(date +%s) - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || stat -f %m "$CACHE_FILE" 2>/dev/null)))

    if [ $CACHE_AGE -lt $CACHE_TTL ] && [ "$FORCE_AUDIT" != "true" ]; then
        echo "Using cached Lighthouse results ($(($CACHE_AGE / 60)) minutes old)"

        # Parse cached scores (no audit execution)
        PERF_SCORE=$(jq -r '.categories.performance.score' "$CACHE_FILE")
        A11Y_SCORE=$(jq -r '.categories.accessibility.score' "$CACHE_FILE")
        SEO_SCORE=$(jq -r '.categories.seo.score' "$CACHE_FILE")
        BP_SCORE=$(jq -r '.categories["best-practices"].score' "$CACHE_FILE")

        echo "Scores: Performance ${PERF_SCORE}0, A11y ${A11Y_SCORE}0, SEO ${SEO_SCORE}0, BP ${BP_SCORE}0"
        echo ""
        echo "Use --force to re-run audit"

        SKIP_AUDIT="true"
    fi
fi

Savings: 85% (no Lighthouse execution, just JSON parse: 3,000 → 450 tokens)

2. Early Exit for Good Scores (Saves 90%)

If all scores above threshold, skip detailed analysis:

PASS_THRESHOLD="${PASS_THRESHOLD:-0.9}"  # Default 90+

if [ "$SKIP_AUDIT" != "true" ]; then
    # Run audit...
    # Parse scores
    PERF=$(jq -r '.categories.performance.score' "$REPORT_JSON")
    A11Y=$(jq -r '.categories.accessibility.score' "$REPORT_JSON")
    SEO=$(jq -r '.categories.seo.score' "$REPORT_JSON")
    BP=$(jq -r '.categories["best-practices"].score' "$REPORT_JSON")

    # Check if all pass
    if (( $(echo "$PERF >= $PASS_THRESHOLD" | bc -l) )) && \
       (( $(echo "$A11Y >= $PASS_THRESHOLD" | bc -l) )) && \
       (( $(echo "$SEO >= $PASS_THRESHOLD" | bc -l) )) && \
       (( $(echo "$BP >= $PASS_THRESHOLD" | bc -l) )); then

        echo "✓ All scores above threshold ($PASS_THRESHOLD)!"
        echo ""
        echo "Performance: ${PERF}0 / 100"
        echo "Accessibility: ${A11Y}0 / 100"
        echo "SEO: ${SEO}0 / 100"
        echo "Best Practices: ${BP}0 / 100"
        echo ""
        echo "No fixes needed. Great job!"
        exit 0
    fi
fi

Savings: 90% when scores good (skip fix implementation: 3,000 → 300 tokens)

3. JSON Parsing Over HTML (Saves 95%)

Parse JSON report instead of HTML for analysis:

# Efficient: JSON parsing with jq
parse_lighthouse_json() {
    local json_file="$1"

    # Extract key metrics (minimal token usage)
    FCP=$(jq -r '.audits["first-contentful-paint"].displayValue' "$json_file")
    LCP=$(jq -r '.audits["largest-contentful-paint"].displayValue' "$json_file")
    TBT=$(jq -r '.audits["total-blocking-time"].displayValue' "$json_file")
    CLS=$(jq -r '.audits["cumulative-layout-shift"].displayValue' "$json_file")

    # Count failures only (not all audits)
    FAILED_COUNT=$(jq '[.audits[] | select(.score < 0.9)] | length' "$json_file")

    echo "Core Web Vitals:"
    echo "  FCP: $FCP"
    echo "  LCP: $LCP"
    echo "  TBT: $TBT"
    echo "  CLS: $CLS"
    echo ""
    echo "Failed audits: $FAILED_COUNT"
}

Savings: 95% vs reading HTML report (jq extracts only needed fields)

4. Sample-Based Issue Reporting (Saves 80%)

Show only top 5-10 issues per category, not exhaustive list:

# Show top issues only (prioritized by impact)
show_top_issues() {
    local category="$1"
    local json_file="$2"

    echo "$category Issues (top 5 by impact):"

    # Parse and sort by score, show first 5
    jq -r ".audits[] | select(.score < 0.9) |
           \"\(.score // 0)|\(.title)|\(.description)\"" "$json_file" | \
        sort -t'|' -k1 -n | \
        head -5 | \
        while IFS='|' read score title desc; do
            echo "  • $title (score: $score)"
        done

    echo ""
    echo "Use --all-issues to see complete list"
}

Savings: 80% (show 5 issues vs 50+ issues: 2,000 → 400 tokens)

5. Bash-Based Audit Execution (Saves 70%)

Direct Lighthouse CLI execution in bash (no Task agent):

# Efficient: Direct bash execution
lighthouse "$URL" \
    --output=json \
    --output-path="$REPORT_JSON" \
    --only-categories=performance,accessibility,seo,best-practices \
    --chrome-flags="--headless --no-sandbox" \
    --quiet \
    2>&1 | tail -10  # Only show last 10 lines of output

# Parse JSON immediately (no intermediate storage)
jq -c '{
    perf: .categories.performance.score,
    a11y: .categories.accessibility.score,
    seo: .categories.seo.score,
    bp: .categories["best-practices"].score
}' "$REPORT_JSON"

Savings: 70% vs Task agent (direct execution, minimal output capture)

6. Category-Specific Audits (Saves 75%)

Only audit requested categories, not all:

CATEGORIES="${CATEGORIES:-performance,accessibility}"  # Default: perf + a11y

# Only run selected categories (faster, cheaper)
lighthouse "$URL" \
    --output=json \
    --output-path="$REPORT_JSON" \
    --only-categories="$CATEGORIES" \
    --chrome-flags="--headless" \
    --quiet

# Example usage:
# /lighthouse --categories=performance  # Only performance (60s → 20s)
# /lighthouse --categories=accessibility  # Only accessibility
# /lighthouse --categories=all  # All categories (default behavior)

Savings: 75% for single-category audits (20s vs 60s execution)

7. Progressive Fix Implementation (Saves 60%)

Implement only high-impact fixes by default:

FIX_PRIORITY="${FIX_PRIORITY:-high}"  # high, medium, all

case "$FIX_PRIORITY" in
    high)
        # Only critical fixes (3-5 fixes)
        implement_critical_fixes  # 500 tokens
        ;;
    medium)
        # High + medium priority (8-12 fixes)
        implement_priority_fixes  # 1,200 tokens
        ;;
    all)
        # All possible automated fixes (20+ fixes)
        implement_all_fixes  # 2,500 tokens
        ;;
esac

echo ""
echo "Use --fix-priority=all to implement all automated fixes"

Savings: 60% for high-priority only (500 vs 2,500 tokens)

Cache Invalidation

Caches are invalidated when:

  • Source code modified (tracked via git diff)
  • 1 hour elapsed (time-based for audit results)
  • User runs --force flag
  • Different URL audited

Real-World Token Usage

Typical Lighthouse workflow:

  1. First audit (fresh): 1,800-2,800 tokens

    • Lighthouse execution: 600 tokens (bash output)
    • JSON parsing: 400 tokens
    • Score summary: 200 tokens
    • Top 5 issues per category: 600 tokens
    • Fix recommendations: 400 tokens
  2. Cached audit (recent): 400-700 tokens

    • Skip execution: 0 tokens (85% savings)
    • Parse cached JSON: 300 tokens
    • Summary: 200 tokens
    • Quick recommendations: 200 tokens
  3. Good scores (90+): 300-500 tokens

    • Audit execution: 600 tokens
    • Early exit: 0 tokens for analysis (90% savings)
    • Success message: 100 tokens
  4. Single category audit: 800-1,200 tokens

    • Faster execution (20s vs 60s): 300 tokens
    • Category-specific analysis: 500 tokens
    • Targeted fixes: 400 tokens
  5. Full fix implementation: 2,000-3,000 tokens

    • Only when explicitly requested with –fix-priority=all

Average usage distribution:

  • 50% of runs: Cached results (400-700 tokens) ✅ Most common
  • 30% of runs: Good scores, early exit (300-500 tokens)
  • 15% of runs: First audit with fixes (1,800-2,800 tokens)
  • 5% of runs: Full analysis + all fixes (2,500-3,500 tokens)

Expected token range: 300-2,800 tokens (60% reduction from 750-7,000 baseline)

Progressive Disclosure

Three levels of detail:

  1. Default (summary): Scores + top 5 issues

    claude "/lighthouse"
    # Shows: category scores, top 5 issues, high-priority fixes
    # Tokens: 800-1,200
    
  2. Detailed (medium): Top 10 issues + medium fixes

    claude "/lighthouse --detailed"
    # Shows: all scores, top 10 issues per category, priority fixes
    # Tokens: 1,500-2,000
    
  3. Full (exhaustive): All issues + all fixes

    claude "/lighthouse --full"
    # Shows: complete audit analysis, all automated fixes
    # Tokens: 2,500-3,500
    

Implementation Notes

Key patterns applied:

  • ✅ Cached Lighthouse results (85% savings when available)
  • ✅ Early exit for good scores (90% savings)
  • ✅ JSON parsing over HTML (95% savings)
  • ✅ Sample-based issue reporting (80% savings)
  • ✅ Bash-based audit execution (70% savings)
  • ✅ Category-specific audits (75% savings)
  • ✅ Progressive fix implementation (60% savings)

Cache locations:

  • .claude/cache/lighthouse/last-audit.json – Recent audit results (1 hour TTL)
  • .claude/lighthouse/report-*.json – Full audit history

Flags:

  • --force – Force re-run audit (ignore cache)
  • --categories=<list> – Specific categories only (performance,accessibility,seo,best-practices)
  • --detailed – Show top 10 issues per category
  • --full – Complete analysis + all fixes
  • --fix-priority=<level> – Fix implementation level (high, medium, all)
  • --pass-threshold=<score> – Score threshold for early exit (default: 0.9)

Device-specific:

  • Default: Desktop audit (faster, most common)
  • --mobile – Mobile audit with throttling (slower, but important)

Phase 1: Lighthouse Setup & Execution

First, I’ll install Lighthouse and run the audit:

#!/bin/bash
# Lighthouse Auditing - Setup & Execution

echo "=== Lighthouse Performance Auditing ==="
echo ""

# Create lighthouse directory
mkdir -p .claude/lighthouse
LIGHTHOUSE_DIR=".claude/lighthouse"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
REPORT_HTML="$LIGHTHOUSE_DIR/report-$TIMESTAMP.html"
REPORT_JSON="$LIGHTHOUSE_DIR/report-$TIMESTAMP.json"
FIXES_DIR="$LIGHTHOUSE_DIR/fixes"
mkdir -p "$FIXES_DIR"

# Check for Lighthouse
if ! command -v lighthouse >/dev/null 2>&1; then
    echo "Installing Lighthouse CLI..."
    npm install -g lighthouse
    echo "✓ Lighthouse installed"
else
    echo "✓ Lighthouse already installed"
fi

# Detect if dev server is running
TARGET_URL="${1:-http://localhost:3000}"
DEVICE="${2:-desktop}"  # desktop or mobile

echo ""
echo "Audit Configuration:"
echo "  URL: $TARGET_URL"
echo "  Device: $DEVICE"
echo ""

# Check if server is accessible
echo "Checking if server is accessible..."
if ! curl -s --head "$TARGET_URL" >/dev/null 2>&1; then
    echo "⚠️  Server not accessible at $TARGET_URL"
    echo ""
    echo "Please start your development server first:"
    echo "  npm start"
    echo "  npm run dev"
    echo ""
    echo "Or specify a different URL:"
    echo "  /lighthouse https://your-production-site.com"
    exit 1
fi

echo "✓ Server is accessible"
echo ""

Phase 2: Run Lighthouse Audit

I’ll execute the Lighthouse audit with all categories:

echo "=== Running Lighthouse Audit ==="
echo ""
echo "This may take 30-60 seconds..."
echo ""

run_lighthouse_audit() {
    local url="$1"
    local device="$2"
    local output_json="$3"
    local output_html="$4"

    # Device-specific settings
    local throttling=""
    local screen_emulation=""

    if [ "$device" = "mobile" ]; then
        echo "Running mobile audit (emulated Moto G4)..."
        lighthouse "$url" \
            --output=json \
            --output=html \
            --output-path="$LIGHTHOUSE_DIR/report-$TIMESTAMP" \
            --emulated-form-factor=mobile \
            --throttling-method=simulate \
            --throttling.cpuSlowdownMultiplier=4 \
            --chrome-flags="--headless --no-sandbox --disable-gpu" \
            --quiet \
            2>&1 | tee "$LIGHTHOUSE_DIR/audit-log.txt"
    else
        echo "Running desktop audit..."
        lighthouse "$url" \
            --output=json \
            --output=html \
            --output-path="$LIGHTHOUSE_DIR/report-$TIMESTAMP" \
            --emulated-form-factor=desktop \
            --throttling-method=simulate \
            --chrome-flags="--headless --no-sandbox --disable-gpu" \
            --quiet \
            2>&1 | tee "$LIGHTHOUSE_DIR/audit-log.txt"
    fi

    if [ $? -eq 0 ]; then
        echo ""
        echo "✓ Audit complete!"
        echo ""
        echo "Reports generated:"
        echo "  - HTML: $output_html"
        echo "  - JSON: $output_json"
    else
        echo "❌ Audit failed - check $LIGHTHOUSE_DIR/audit-log.txt"
        exit 1
    fi
}

run_lighthouse_audit "$TARGET_URL" "$DEVICE" "$REPORT_JSON" "$REPORT_HTML"

Phase 3: Parse Audit Results

I’ll parse the JSON results and identify key issues:

echo ""
echo "=== Analyzing Audit Results ==="
echo ""

# Extract scores using jq
PERFORMANCE_SCORE=$(jq -r '.categories.performance.score * 100' "$REPORT_JSON" 2>/dev/null)
ACCESSIBILITY_SCORE=$(jq -r '.categories.accessibility.score * 100' "$REPORT_JSON" 2>/dev/null)
BEST_PRACTICES_SCORE=$(jq -r '.categories["best-practices"].score * 100' "$REPORT_JSON" 2>/dev/null)
SEO_SCORE=$(jq -r '.categories.seo.score * 100' "$REPORT_JSON" 2>/dev/null)

echo "Lighthouse Scores:"
echo "  Performance:      ${PERFORMANCE_SCORE}%"
echo "  Accessibility:    ${ACCESSIBILITY_SCORE}%"
echo "  Best Practices:   ${BEST_PRACTICES_SCORE}%"
echo "  SEO:              ${SEO_SCORE}%"
echo ""

# Extract Core Web Vitals
LCP=$(jq -r '.audits["largest-contentful-paint"].displayValue' "$REPORT_JSON" 2>/dev/null)
FID=$(jq -r '.audits["max-potential-fid"].displayValue' "$REPORT_JSON" 2>/dev/null)
CLS=$(jq -r '.audits["cumulative-layout-shift"].displayValue' "$REPORT_JSON" 2>/dev/null)
FCP=$(jq -r '.audits["first-contentful-paint"].displayValue' "$REPORT_JSON" 2>/dev/null)
TBT=$(jq -r '.audits["total-blocking-time"].displayValue' "$REPORT_JSON" 2>/dev/null)

echo "Core Web Vitals:"
echo "  LCP (Largest Contentful Paint): $LCP (target: < 2.5s)"
echo "  FID (First Input Delay):        $FID (target: < 100ms)"
echo "  CLS (Cumulative Layout Shift):  $CLS (target: < 0.1)"
echo "  FCP (First Contentful Paint):   $FCP (target: < 1.8s)"
echo "  TBT (Total Blocking Time):      $TBT (target: < 200ms)"
echo ""

# Extract failed audits
echo "Identifying improvement opportunities..."
echo ""

# Performance opportunities
jq -r '.audits | to_entries[] |
    select(.value.score != null and .value.score < 0.9) |
    "\(.key): \(.value.title) (Score: \(.value.score * 100)%)"' \
    "$REPORT_JSON" > "$LIGHTHOUSE_DIR/opportunities.txt"

# Count issues by severity
CRITICAL_ISSUES=$(jq '[.audits | to_entries[] |
    select(.value.score != null and .value.score < 0.5)] | length' "$REPORT_JSON")
WARNING_ISSUES=$(jq '[.audits | to_entries[] |
    select(.value.score != null and .value.score >= 0.5 and .value.score < 0.9)] | length' "$REPORT_JSON")

echo "Issues Found:"
echo "  Critical (score < 50%): $CRITICAL_ISSUES"
echo "  Warnings (score < 90%): $WARNING_ISSUES"

Phase 4: Generate Fix Implementations

I’ll generate specific fixes for common issues:

echo ""
echo "=== Generating Fixes ==="
echo ""

generate_performance_fixes() {
    echo "Generating performance fixes..."

    # Fix 1: Add preconnect for external resources
    cat > "$FIXES_DIR/01-add-preconnect.html" << 'HTML'
<!-- Add to <head> section -->
<!-- Preconnect to external domains -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://cdn.example.com">

<!-- Preload critical resources -->
<link rel="preload" as="style" href="/styles/critical.css">
<link rel="preload" as="script" href="/scripts/main.js">
<link rel="preload" as="font" type="font/woff2" href="/fonts/main.woff2" crossorigin>
HTML

    # Fix 2: Image optimization
    cat > "$FIXES_DIR/02-image-optimization.jsx" << 'JSX'
// Image Optimization Component
import Image from 'next/image';  // For Next.js

// React Image with lazy loading
export const OptimizedImage = ({ src, alt, width, height }) => {
    return (
        <img
            src={src}
            alt={alt}
            width={width}
            height={height}
            loading="lazy"
            decoding="async"
            style={{ aspectRatio: width / height }}
        />
    );
};

// Next.js Image (automatically optimized)
export const NextOptimizedImage = ({ src, alt, width, height }) => {
    return (
        <Image
            src={src}
            alt={alt}
            width={width}
            height={height}
            loading="lazy"
            placeholder="blur"
        />
    );
};

// Picture element with WebP
export const ResponsiveImage = ({ src, alt, width, height }) => {
    return (
        <picture>
            <source srcSet={`${src}.webp`} type="image/webp" />
            <source srcSet={`${src}.jpg`} type="image/jpeg" />
            <img
                src={`${src}.jpg`}
                alt={alt}
                width={width}
                height={height}
                loading="lazy"
            />
        </picture>
    );
};
JSX

    # Fix 3: Defer non-critical JavaScript
    cat > "$FIXES_DIR/03-defer-scripts.html" << 'HTML'
<!-- Defer non-critical scripts -->
<script src="/scripts/analytics.js" defer></script>
<script src="/scripts/chat-widget.js" defer></script>

<!-- Async for independent scripts -->
<script src="/scripts/social-sharing.js" async></script>

<!-- Critical scripts only in <head>, rest at end of <body> -->
</body>
    <script src="/scripts/main.js"></script>
    <script src="/scripts/interactions.js"></script>
</html>
HTML

    # Fix 4: CSS optimization
    cat > "$FIXES_DIR/04-css-optimization.html" << 'HTML'
<!-- Inline critical CSS -->
<style>
    /* Critical above-the-fold styles */
    body { margin: 0; font-family: sans-serif; }
    .header { background: #333; color: white; padding: 1rem; }
    /* ... more critical styles ... */
</style>

<!-- Load non-critical CSS asynchronously -->
<link rel="stylesheet" href="/styles/main.css" media="print" onload="this.media='all'">
<noscript><link rel="stylesheet" href="/styles/main.css"></noscript>

<!-- Or use loadCSS -->
<script>
    function loadCSS(href) {
        const link = document.createElement('link');
        link.rel = 'stylesheet';
        link.href = href;
        document.head.appendChild(link);
    }
    loadCSS('/styles/main.css');
</script>
HTML

    # Fix 5: Minimize layout shifts
    cat > "$FIXES_DIR/05-prevent-cls.html" << 'HTML'
<!-- Prevent Cumulative Layout Shift (CLS) -->

<!-- 1. Always specify image dimensions -->
<img src="hero.jpg" alt="Hero" width="1200" height="600">

<!-- 2. Reserve space for ads/dynamic content -->
<div style="min-height: 250px;">
    <!-- Ad slot -->
</div>

<!-- 3. Use aspect ratio boxes -->
<div style="aspect-ratio: 16 / 9; width: 100%;">
    <iframe src="video.html" style="width: 100%; height: 100%;"></iframe>
</div>

<!-- 4. Avoid inserting content above existing content -->
<!-- Load new content at the bottom or use placeholders -->

<!-- 5. Use font-display for web fonts -->
<style>
    @font-face {
        font-family: 'CustomFont';
        src: url('/fonts/custom.woff2') format('woff2');
        font-display: swap; /* Prevents layout shift */
    }
</style>
HTML

    echo "✓ Performance fixes generated in $FIXES_DIR"
}

generate_accessibility_fixes() {
    echo "Generating accessibility fixes..."

    # Fix 1: Add ARIA labels and semantic HTML
    cat > "$FIXES_DIR/06-accessibility-improvements.html" << 'HTML'
<!-- Accessibility Improvements -->

<!-- 1. Use semantic HTML -->
<header role="banner">
    <nav role="navigation" aria-label="Main navigation">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/about">About</a></li>
        </ul>
    </nav>
</header>

<main role="main" aria-label="Main content">
    <article>
        <h1>Page Title</h1>
        <!-- Content -->
    </article>
</main>

<footer role="contentinfo">
    <!-- Footer content -->
</footer>

<!-- 2. Add alt text to images -->
<img src="product.jpg" alt="Blue cotton t-shirt with logo">
<!-- Not just: alt="image" or alt="" -->

<!-- 3. Proper form labels -->
<form>
    <label for="email">Email Address</label>
    <input type="email" id="email" name="email" required>

    <label for="message">Message</label>
    <textarea id="message" name="message" required></textarea>

    <button type="submit">Send Message</button>
</form>

<!-- 4. Link purpose clear from text -->
<!-- Bad: <a href="/more">Click here</a> -->
<!-- Good: <a href="/products">View all products</a> -->

<!-- 5. Color contrast (WCAG AA: 4.5:1 for normal text) -->
<style>
    /* Bad: #ccc on #fff (insufficient contrast) */
    /* Good: #333 on #fff (sufficient contrast) */
    .text { color: #333; background: #fff; }
</style>

<!-- 6. Keyboard navigation -->
<button tabindex="0">Accessible Button</button>
<div role="button" tabindex="0" onkeypress="handleKey(event)">
    Custom Button
</div>

<!-- 7. Skip to main content -->
<a href="#main-content" class="skip-link">Skip to main content</a>
<main id="main-content">
    <!-- Content -->
</main>
HTML

    echo "✓ Accessibility fixes generated"
}

generate_seo_fixes() {
    echo "Generating SEO fixes..."

    # Fix 1: Meta tags
    cat > "$FIXES_DIR/07-seo-meta-tags.html" << 'HTML'
<!-- SEO Meta Tags -->
<head>
    <!-- Essential meta tags -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Page Title - Brand Name | Max 60 characters</title>
    <meta name="description" content="Page description - 150-160 characters optimal">

    <!-- Open Graph (Facebook, LinkedIn) -->
    <meta property="og:type" content="website">
    <meta property="og:url" content="https://example.com/page">
    <meta property="og:title" content="Page Title">
    <meta property="og:description" content="Page description">
    <meta property="og:image" content="https://example.com/og-image.jpg">

    <!-- Twitter Card -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:url" content="https://example.com/page">
    <meta name="twitter:title" content="Page Title">
    <meta name="twitter:description" content="Page description">
    <meta name="twitter:image" content="https://example.com/twitter-image.jpg">

    <!-- Canonical URL -->
    <link rel="canonical" href="https://example.com/page">

    <!-- Robots meta -->
    <meta name="robots" content="index, follow">

    <!-- Language -->
    <html lang="en">
</head>
HTML

    # Fix 2: Structured data
    cat > "$FIXES_DIR/08-structured-data.html" << 'HTML'
<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Organization",
    "name": "Your Company",
    "url": "https://example.com",
    "logo": "https://example.com/logo.png",
    "contactPoint": {
        "@type": "ContactPoint",
        "telephone": "+1-555-555-5555",
        "contactType": "Customer Service"
    },
    "sameAs": [
        "https://facebook.com/yourcompany",
        "https://twitter.com/yourcompany",
        "https://linkedin.com/company/yourcompany"
    ]
}
</script>

<!-- Product structured data -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Product",
    "name": "Product Name",
    "image": "https://example.com/product.jpg",
    "description": "Product description",
    "brand": {
        "@type": "Brand",
        "name": "Brand Name"
    },
    "offers": {
        "@type": "Offer",
        "url": "https://example.com/product",
        "priceCurrency": "USD",
        "price": "29.99",
        "availability": "https://schema.org/InStock"
    }
}
</script>

<!-- Article structured data -->
<script type="application/ld+json">
{
    "@context": "https://schema.org",
    "@type": "Article",
    "headline": "Article Title",
    "image": "https://example.com/article-image.jpg",
    "author": {
        "@type": "Person",
        "name": "Author Name"
    },
    "publisher": {
        "@type": "Organization",
        "name": "Publisher Name",
        "logo": {
            "@type": "ImageObject",
            "url": "https://example.com/logo.png"
        }
    },
    "datePublished": "2024-01-01",
    "dateModified": "2024-01-15"
}
</script>
HTML

    echo "✓ SEO fixes generated"
}

generate_best_practices_fixes() {
    echo "Generating best practices fixes..."

    cat > "$FIXES_DIR/09-best-practices.html" << 'HTML'
<!-- Best Practices -->

<!-- 1. Use HTTPS -->
<!-- Ensure all resources load over HTTPS -->
<script src="https://cdn.example.com/library.js"></script>

<!-- 2. Security headers (configure in server) -->
<!--
    Content-Security-Policy: default-src 'self'
    X-Frame-Options: SAMEORIGIN
    X-Content-Type-Options: nosniff
    Referrer-Policy: strict-origin-when-cross-origin
-->

<!-- 3. Modern image formats -->
<picture>
    <source srcset="image.avif" type="image/avif">
    <source srcset="image.webp" type="image/webp">
    <img src="image.jpg" alt="Description">
</picture>

<!-- 4. Responsive images -->
<img
    srcset="small.jpg 400w, medium.jpg 800w, large.jpg 1200w"
    sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
    src="medium.jpg"
    alt="Description"
>

<!-- 5. Proper error handling -->
<img src="image.jpg" alt="Description" onerror="this.src='fallback.jpg'">
HTML

    echo "✓ Best practices fixes generated"
}

# Generate all fixes
generate_performance_fixes
generate_accessibility_fixes
generate_seo_fixes
generate_best_practices_fixes

Phase 5: Generate Implementation Report

I’ll create a comprehensive report with prioritized action items:

echo ""
echo "=== Generating Implementation Report ==="
echo ""

cat > "$LIGHTHOUSE_DIR/implementation-guide.md" << EOF
# Lighthouse Audit Implementation Guide

**Generated:** $(date)
**URL Audited:** $TARGET_URL
**Device:** $DEVICE

---

## Audit Scores

| Category | Score | Status |
|----------|-------|--------|
| Performance | ${PERFORMANCE_SCORE}% | $([ "${PERFORMANCE_SCORE%.*}" -ge 90 ] && echo "✅ Good" || [ "${PERFORMANCE_SCORE%.*}" -ge 50 ] && echo "⚠️ Needs Improvement" || echo "❌ Poor") |
| Accessibility | ${ACCESSIBILITY_SCORE}% | $([ "${ACCESSIBILITY_SCORE%.*}" -ge 90 ] && echo "✅ Good" || [ "${ACCESSIBILITY_SCORE%.*}" -ge 50 ] && echo "⚠️ Needs Improvement" || echo "❌ Poor") |
| Best Practices | ${BEST_PRACTICES_SCORE}% | $([ "${BEST_PRACTICES_SCORE%.*}" -ge 90 ] && echo "✅ Good" || [ "${BEST_PRACTICES_SCORE%.*}" -ge 50 ] && echo "⚠️ Needs Improvement" || echo "❌ Poor") |
| SEO | ${SEO_SCORE}% | $([ "${SEO_SCORE%.*}" -ge 90 ] && echo "✅ Good" || [ "${SEO_SCORE%.*}" -ge 50 ] && echo "⚠️ Needs Improvement" || echo "❌ Poor") |

## Core Web Vitals

| Metric | Value | Target | Status |
|--------|-------|--------|--------|
| LCP | $LCP | < 2.5s | $(echo "$LCP" | grep -qE "^[0-2]\." && echo "✅" || echo "❌") |
| FID | $FID | < 100ms | $(echo "$FID" | grep -qE "^[0-9][0-9]? ms" && echo "✅" || echo "❌") |
| CLS | $CLS | < 0.1 | $(echo "$CLS" | grep -qE "^0\.0" && echo "✅" || echo "❌") |
| FCP | $FCP | < 1.8s | $(echo "$FCP" | grep -qE "^[0-1]\." && echo "✅" || echo "❌") |
| TBT | $TBT | < 200ms | $(echo "$TBT" | grep -qE "^[0-1][0-9]{2} ms" && echo "✅" || echo "❌") |

---

## Priority Action Items

### 🔴 Critical (Immediate Action Required)

$([ "${PERFORMANCE_SCORE%.*}" -lt 50 ] && echo "
#### Performance
- Optimize images (convert to WebP, add lazy loading)
- Eliminate render-blocking resources
- Minimize main-thread work
- Reduce JavaScript execution time
" || echo "")

$([ "${ACCESSIBILITY_SCORE%.*}" -lt 50 ] && echo "
#### Accessibility
- Add alt text to all images
- Ensure sufficient color contrast (4.5:1 minimum)
- Add ARIA labels to interactive elements
- Make all functionality keyboard accessible
" || echo "")

### 🟡 High Priority (Within 1 Week)

$([ "${PERFORMANCE_SCORE%.*}" -lt 90 ] && [ "${PERFORMANCE_SCORE%.*}" -ge 50 ] && echo "
#### Performance Improvements
- Enable text compression (gzip/Brotli)
- Preconnect to required origins
- Properly size images
- Defer offscreen images
" || echo "")

$([ "${SEO_SCORE%.*}" -lt 90 ] && echo "
#### SEO Improvements
- Add meta description (150-160 characters)
- Ensure pages are crawlable
- Add canonical URLs
- Implement structured data (Schema.org)
" || echo "")

### 🟢 Medium Priority (Within 2 Weeks)

- Implement code splitting
- Add resource hints (preload, prefetch)
- Optimize font loading (font-display: swap)
- Add service worker for offline support

---

## Implementation Files

Generated fix implementations:

$(ls -1 "$FIXES_DIR" | sed 's/^/- /')

### How to Use Fixes

1. **Review Each Fix File**
   \`\`\`bash
   cat $FIXES_DIR/01-add-preconnect.html
   \`\`\`

2. **Apply Fixes Incrementally**
   - Start with critical issues
   - Test after each change
   - Measure improvement

3. **Re-run Audit**
   \`\`\`bash
   /lighthouse $TARGET_URL
   \`\`\`

---

## Detailed Recommendations

### Performance Optimization

1. **Optimize Images**
   - Convert to WebP format
   - Add width/height attributes
   - Implement lazy loading
   - Use responsive images (srcset)

2. **Reduce JavaScript**
   - Code splitting by route
   - Tree-shake unused code
   - Defer non-critical scripts
   - Minimize third-party scripts

3. **Optimize CSS**
   - Inline critical CSS
   - Load non-critical CSS async
   - Remove unused CSS
   - Minimize CSS files

4. **Enable Caching**
   - Set proper Cache-Control headers
   - Use CDN for static assets
   - Implement service worker

### Accessibility Improvements

1. **Semantic HTML**
   - Use proper heading hierarchy (h1-h6)
   - Use semantic elements (nav, main, aside)
   - Add ARIA roles where needed

2. **Keyboard Navigation**
   - Ensure all interactive elements are focusable
   - Visible focus indicators
   - Logical tab order

3. **Color Contrast**
   - Text: 4.5:1 minimum ratio
   - Large text: 3:1 minimum ratio
   - Use contrast checker tools

4. **Screen Reader Support**
   - Alt text for images
   - Labels for form inputs
   - ARIA labels for complex widgets

### SEO Best Practices

1. **Meta Tags**
   - Unique title (50-60 characters)
   - Meta description (150-160 characters)
   - Open Graph tags
   - Twitter Card tags

2. **Content Structure**
   - Proper heading hierarchy
   - Descriptive link text
   - Mobile-friendly design
   - Fast page load

3. **Technical SEO**
   - XML sitemap
   - robots.txt
   - Canonical URLs
   - Structured data (JSON-LD)

---

## Continuous Monitoring

### Add to CI/CD Pipeline

\`\`\`yaml
# GitHub Actions example
name: Lighthouse CI

on: [push, pull_request]

jobs:
  lighthouse:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run Lighthouse CI
        uses: treosh/lighthouse-ci-action@v9
        with:
          urls: |
            https://staging.example.com
          configPath: './lighthouserc.json'
\`\`\`

### Performance Budget

Create \`.lighthouserc.json\`:

\`\`\`json
{
  "ci": {
    "assert": {
      "preset": "lighthouse:recommended",
      "assertions": {
        "categories:performance": ["error", {"minScore": 0.9}],
        "categories:accessibility": ["error", {"minScore": 0.9}],
        "categories:best-practices": ["error", {"minScore": 0.9}],
        "categories:seo": ["error", {"minScore": 0.9}]
      }
    }
  }
}
\`\`\`

---

## Resources

- [Web.dev Performance](https://web.dev/performance/)
- [Lighthouse Documentation](https://developers.google.com/web/tools/lighthouse)
- [Core Web Vitals](https://web.dev/vitals/)
- [WCAG Guidelines](https://www.w3.org/WAI/WCAG21/quickref/)
- [Schema.org](https://schema.org/)

---

## Next Steps

1. **Review Full Reports**
   - HTML: Open in browser: \`$REPORT_HTML\`
   - JSON: For programmatic analysis: \`$REPORT_JSON\`

2. **Implement Critical Fixes**
   - Review fixes in: \`$FIXES_DIR\`
   - Apply fixes incrementally
   - Test each change

3. **Measure Improvements**
   - Re-run Lighthouse audit
   - Compare before/after scores
   - Track Core Web Vitals

4. **Set Up Monitoring**
   - Add Lighthouse CI to pipeline
   - Monitor real user metrics (RUM)
   - Track Core Web Vitals in production

---

**Report generated at:** $(date)

EOF

echo "✓ Implementation guide generated: $LIGHTHOUSE_DIR/implementation-guide.md"

Summary

echo ""
echo "=== ✓ Lighthouse Audit Complete ==="
echo ""
echo "📊 Scores:"
echo "  Performance:    ${PERFORMANCE_SCORE}%"
echo "  Accessibility:  ${ACCESSIBILITY_SCORE}%"
echo "  Best Practices: ${BEST_PRACTICES_SCORE}%"
echo "  SEO:            ${SEO_SCORE}%"
echo ""
echo "🎯 Core Web Vitals:"
echo "  LCP: $LCP (target < 2.5s)"
echo "  FID: $FID (target < 100ms)"
echo "  CLS: $CLS (target < 0.1)"
echo ""
echo "📁 Generated Files:"
echo "  - HTML Report: $REPORT_HTML"
echo "  - JSON Report: $REPORT_JSON"
echo "  - Implementation Guide: $LIGHTHOUSE_DIR/implementation-guide.md"
echo "  - Fix Implementations: $FIXES_DIR/"
echo ""
echo "🚀 Next Steps:"
echo "  1. Open HTML report in browser"
echo "  2. Review implementation guide"
echo "  3. Apply fixes from $FIXES_DIR/"
echo "  4. Re-run audit to measure improvement"
echo ""
echo "💡 Quick Wins:"
echo "  - Add image lazy loading"
echo "  - Enable text compression"
echo "  - Add meta descriptions"
echo "  - Fix accessibility issues"
echo ""
echo "🔗 Integration Points:"
echo "  - /bundle-analyze - Reduce JavaScript size"
echo "  - /lazy-load - Implement lazy loading"
echo "  - /ci-setup - Add Lighthouse to CI/CD"
echo ""
echo "View report: open $REPORT_HTML"
echo "Read guide: cat $LIGHTHOUSE_DIR/implementation-guide.md"

Safety Guarantees

What I’ll NEVER do:

  • Make breaking changes to production sites
  • Apply fixes without generating backups
  • Skip accessibility requirements
  • Ignore SEO best practices

What I WILL do:

  • Run comprehensive audits safely
  • Generate implementation-ready fixes
  • Prioritize improvements by impact
  • Provide clear documentation
  • Support continuous monitoring

Credits

This skill is based on:

  • Google Lighthouse – Automated website auditing tool
  • Web.dev – Performance and best practices guides
  • Core Web Vitals – Google’s user experience metrics
  • WCAG 2.1 – Web accessibility standards
  • Schema.org – Structured data vocabulary

Token Budget

Target: 3,000-5,000 tokens per execution

  • Phase 1-2: ~1,000 tokens (setup + audit execution)
  • Phase 3-4: ~1,800 tokens (parsing + fix generation)
  • Phase 5: ~1,500 tokens (reporting + documentation)

Optimization Strategy:

  • Use bash for Lighthouse execution
  • Parse JSON results efficiently
  • Template-based fix generation
  • Comprehensive reporting
  • Prioritized action items

This ensures thorough Lighthouse auditing with actionable, implementation-ready fixes across performance, accessibility, SEO, and best practices.