{
  "schemaVersion": "1.0",
  "item": {
    "slug": "pls-seo-audit",
    "name": "PLS SEO Audit",
    "source": "tencent",
    "type": "skill",
    "category": "数据分析",
    "sourceUrl": "https://clawhub.ai/mattvalenta/pls-seo-audit",
    "canonicalUrl": "https://clawhub.ai/mattvalenta/pls-seo-audit",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/pls-seo-audit",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=pls-seo-audit",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/pls-seo-audit"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/pls-seo-audit",
    "agentPageUrl": "https://openagent3.xyz/skills/pls-seo-audit/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pls-seo-audit/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pls-seo-audit/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "SEO Audit",
        "body": "Comprehensive SEO analysis for content and websites."
      },
      {
        "title": "On-Page SEO",
        "body": "- [ ] Title tag (50-60 chars, keyword near front)\n- [ ] Meta description (150-160 chars, compelling)\n- [ ] H1 tag (one per page, includes target keyword)\n- [ ] H2-H6 hierarchy (logical structure)\n- [ ] Image alt text (descriptive, keyword-relevant)\n- [ ] Internal links (3-5 per page minimum)\n- [ ] URL structure (short, descriptive, hyphens)\n- [ ] Canonical tags (prevent duplicate content)"
      },
      {
        "title": "Technical SEO",
        "body": "- [ ] Page speed (<3s load time)\n- [ ] Mobile-friendly (responsive design)\n- [ ] HTTPS (SSL certificate valid)\n- [ ] XML sitemap (submitted to Search Console)\n- [ ] Robots.txt (properly configured)\n- [ ] Structured data (Schema.org markup)\n- [ ] Core Web Vitals (LCP, FID, CLS)"
      },
      {
        "title": "Content Quality",
        "body": "- [ ] Keyword in first 100 words\n- [ ] Content length matches intent\n- [ ] No keyword stuffing (<2% density)\n- [ ] Readable (Flesch-Kincaid score)\n- [ ] Unique value (not duplicate content)\n- [ ] Fresh content (updated regularly)"
      },
      {
        "title": "Page Speed Analysis",
        "body": "# Using PageSpeed Insights API\ncurl \"https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&strategy=mobile\"\n\n# Using lighthouse locally\nnpx lighthouse https://example.com --view"
      },
      {
        "title": "Check Robots.txt",
        "body": "curl https://example.com/robots.txt"
      },
      {
        "title": "Check Sitemap",
        "body": "curl https://example.com/sitemap.xml | xmllint --format -"
      },
      {
        "title": "SSL Certificate Check",
        "body": "openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates"
      },
      {
        "title": "Mobile-Friendly Test",
        "body": "# Google's Mobile-Friendly Test API\ncurl \"https://searchconsole.googleapis.com/v1/urlTestingTools/mobileFriendlyTest:run?key=YOUR_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://example.com\"}'"
      },
      {
        "title": "Keyword Density",
        "body": "import re\nfrom collections import Counter\n\ndef keyword_density(text, keyword):\n    words = re.findall(r'\\b\\w+\\b', text.lower())\n    keyword_count = text.lower().count(keyword.lower())\n    density = (keyword_count / len(words)) * 100\n    return {\n        \"keyword\": keyword,\n        \"count\": keyword_count,\n        \"total_words\": len(words),\n        \"density\": f\"{density:.2f}%\"\n    }\n\n# Target: 1-2% density"
      },
      {
        "title": "Readability Score",
        "body": "import textstat\n\ntext = \"Your content here...\"\n\nflesch = textstat.flesch_reading_ease(text)\n# 90-100: Very Easy\n# 60-70: Standard\n# 0-30: Very Difficult\n\ngrade = textstat.flesch_kincaid_grade(text)\n# Target: 8-9 for general audience"
      },
      {
        "title": "Content Structure Analysis",
        "body": "from bs4 import BeautifulSoup\n\ndef analyze_headings(html):\n    soup = BeautifulSoup(html, 'html.parser')\n    headings = {\n        'h1': soup.find_all('h1'),\n        'h2': soup.find_all('h2'),\n        'h3': soup.find_all('h3'),\n    }\n    \n    issues = []\n    if len(headings['h1']) == 0:\n        issues.append(\"Missing H1 tag\")\n    elif len(headings['h1']) > 1:\n        issues.append(\"Multiple H1 tags (should be one)\")\n    \n    return {\n        \"counts\": {k: len(v) for k, v in headings.items()},\n        \"issues\": issues\n    }"
      },
      {
        "title": "Extract Meta Tags",
        "body": "from bs4 import BeautifulSoup\nimport requests\n\ndef audit_meta_tags(url):\n    response = requests.get(url)\n    soup = BeautifulSoup(response.text, 'html.parser')\n    \n    title = soup.find('title')\n    description = soup.find('meta', attrs={'name': 'description'})\n    keywords = soup.find('meta', attrs={'name': 'keywords'})\n    \n    issues = []\n    \n    if not title or len(title.text) < 30:\n        issues.append(\"Title too short or missing\")\n    elif len(title.text) > 60:\n        issues.append(\"Title too long (>60 chars)\")\n    \n    if not description:\n        issues.append(\"Meta description missing\")\n    elif len(description.get('content', '')) < 120:\n        issues.append(\"Meta description too short\")\n    elif len(description.get('content', '')) > 160:\n        issues.append(\"Meta description too long\")\n    \n    return {\n        \"title\": title.text if title else None,\n        \"description\": description.get('content') if description else None,\n        \"issues\": issues\n    }"
      },
      {
        "title": "Validate Schema Markup",
        "body": "# Using Google's Rich Results Test\ncurl \"https://searchconsole.googleapis.com/v1/urlTestingTools/richResultsTest:run\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://example.com\"}'"
      },
      {
        "title": "Common Schema Types",
        "body": "// Article\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"Title\",\n  \"author\": {\"@type\": \"Person\", \"name\": \"Author\"},\n  \"datePublished\": \"2026-01-01\"\n}\n\n// Local Business\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"LocalBusiness\",\n  \"name\": \"Business Name\",\n  \"address\": {\"@type\": \"PostalAddress\", \"streetAddress\": \"123 Main\"},\n  \"telephone\": \"+1-555-555-5555\"\n}\n\n// FAQ\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [{\n    \"@type\": \"Question\",\n    \"name\": \"Question?\",\n    \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Answer\"}\n  }]\n}"
      },
      {
        "title": "Compare Page Metrics",
        "body": "import requests\nfrom bs4 import BeautifulSoup\n\ndef compare_seo(target_url, competitor_url):\n    def get_metrics(url):\n        r = requests.get(url)\n        soup = BeautifulSoup(r.text, 'html.parser')\n        return {\n            \"title_len\": len(soup.find('title').text) if soup.find('title') else 0,\n            \"h1_count\": len(soup.find_all('h1')),\n            \"h2_count\": len(soup.find_all('h2')),\n            \"word_count\": len(soup.get_text().split()),\n            \"images\": len(soup.find_all('img')),\n            \"images_no_alt\": len([i for i in soup.find_all('img') if not i.get('alt')])\n        }\n    \n    return {\n        \"target\": get_metrics(target_url),\n        \"competitor\": get_metrics(competitor_url)\n    }"
      },
      {
        "title": "SEO Audit Report Template",
        "body": "# SEO Audit Report\n\n## Summary\n- **Score:** X/100\n- **Critical Issues:** X\n- **Warnings:** X\n- **Passed:** X\n\n## Critical Issues\n1. [Issue description]\n   - Impact: [High/Medium/Low]\n   - Fix: [Recommended action]\n\n## Technical SEO\n| Factor | Status | Notes |\n|--------|--------|-------|\n| Page Speed | ⚠️ | 4.2s load time |\n| Mobile | ✅ | Responsive |\n| HTTPS | ✅ | Valid SSL |\n| Sitemap | ✅ | Submitted |\n\n## On-Page SEO\n| Factor | Status | Notes |\n|--------|--------|-------|\n| Title | ✅ | 55 chars |\n| Meta Desc | ⚠️ | Too short |\n| H1 | ✅ | Present |\n| Images | ⚠️ | 3 missing alt |\n\n## Recommendations\n1. [Priority 1]\n2. [Priority 2]\n3. [Priority 3]"
      }
    ],
    "body": "SEO Audit\n\nComprehensive SEO analysis for content and websites.\n\nQuick Audit Checklist\nOn-Page SEO\n- [ ] Title tag (50-60 chars, keyword near front)\n- [ ] Meta description (150-160 chars, compelling)\n- [ ] H1 tag (one per page, includes target keyword)\n- [ ] H2-H6 hierarchy (logical structure)\n- [ ] Image alt text (descriptive, keyword-relevant)\n- [ ] Internal links (3-5 per page minimum)\n- [ ] URL structure (short, descriptive, hyphens)\n- [ ] Canonical tags (prevent duplicate content)\n\nTechnical SEO\n- [ ] Page speed (<3s load time)\n- [ ] Mobile-friendly (responsive design)\n- [ ] HTTPS (SSL certificate valid)\n- [ ] XML sitemap (submitted to Search Console)\n- [ ] Robots.txt (properly configured)\n- [ ] Structured data (Schema.org markup)\n- [ ] Core Web Vitals (LCP, FID, CLS)\n\nContent Quality\n- [ ] Keyword in first 100 words\n- [ ] Content length matches intent\n- [ ] No keyword stuffing (<2% density)\n- [ ] Readable (Flesch-Kincaid score)\n- [ ] Unique value (not duplicate content)\n- [ ] Fresh content (updated regularly)\n\nTechnical SEO Commands\nPage Speed Analysis\n# Using PageSpeed Insights API\ncurl \"https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&strategy=mobile\"\n\n# Using lighthouse locally\nnpx lighthouse https://example.com --view\n\nCheck Robots.txt\ncurl https://example.com/robots.txt\n\nCheck Sitemap\ncurl https://example.com/sitemap.xml | xmllint --format -\n\nSSL Certificate Check\nopenssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates\n\nMobile-Friendly Test\n# Google's Mobile-Friendly Test API\ncurl \"https://searchconsole.googleapis.com/v1/urlTestingTools/mobileFriendlyTest:run?key=YOUR_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://example.com\"}'\n\nContent Analysis\nKeyword Density\nimport re\nfrom collections import Counter\n\ndef keyword_density(text, keyword):\n    words = re.findall(r'\\b\\w+\\b', text.lower())\n    keyword_count = text.lower().count(keyword.lower())\n    density = (keyword_count / len(words)) * 100\n    return {\n        \"keyword\": keyword,\n        \"count\": keyword_count,\n        \"total_words\": len(words),\n        \"density\": f\"{density:.2f}%\"\n    }\n\n# Target: 1-2% density\n\nReadability Score\nimport textstat\n\ntext = \"Your content here...\"\n\nflesch = textstat.flesch_reading_ease(text)\n# 90-100: Very Easy\n# 60-70: Standard\n# 0-30: Very Difficult\n\ngrade = textstat.flesch_kincaid_grade(text)\n# Target: 8-9 for general audience\n\nContent Structure Analysis\nfrom bs4 import BeautifulSoup\n\ndef analyze_headings(html):\n    soup = BeautifulSoup(html, 'html.parser')\n    headings = {\n        'h1': soup.find_all('h1'),\n        'h2': soup.find_all('h2'),\n        'h3': soup.find_all('h3'),\n    }\n    \n    issues = []\n    if len(headings['h1']) == 0:\n        issues.append(\"Missing H1 tag\")\n    elif len(headings['h1']) > 1:\n        issues.append(\"Multiple H1 tags (should be one)\")\n    \n    return {\n        \"counts\": {k: len(v) for k, v in headings.items()},\n        \"issues\": issues\n    }\n\nMeta Tag Analysis\nExtract Meta Tags\nfrom bs4 import BeautifulSoup\nimport requests\n\ndef audit_meta_tags(url):\n    response = requests.get(url)\n    soup = BeautifulSoup(response.text, 'html.parser')\n    \n    title = soup.find('title')\n    description = soup.find('meta', attrs={'name': 'description'})\n    keywords = soup.find('meta', attrs={'name': 'keywords'})\n    \n    issues = []\n    \n    if not title or len(title.text) < 30:\n        issues.append(\"Title too short or missing\")\n    elif len(title.text) > 60:\n        issues.append(\"Title too long (>60 chars)\")\n    \n    if not description:\n        issues.append(\"Meta description missing\")\n    elif len(description.get('content', '')) < 120:\n        issues.append(\"Meta description too short\")\n    elif len(description.get('content', '')) > 160:\n        issues.append(\"Meta description too long\")\n    \n    return {\n        \"title\": title.text if title else None,\n        \"description\": description.get('content') if description else None,\n        \"issues\": issues\n    }\n\nStructured Data Check\nValidate Schema Markup\n# Using Google's Rich Results Test\ncurl \"https://searchconsole.googleapis.com/v1/urlTestingTools/richResultsTest:run\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\":\"https://example.com\"}'\n\nCommon Schema Types\n// Article\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"Title\",\n  \"author\": {\"@type\": \"Person\", \"name\": \"Author\"},\n  \"datePublished\": \"2026-01-01\"\n}\n\n// Local Business\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"LocalBusiness\",\n  \"name\": \"Business Name\",\n  \"address\": {\"@type\": \"PostalAddress\", \"streetAddress\": \"123 Main\"},\n  \"telephone\": \"+1-555-555-5555\"\n}\n\n// FAQ\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [{\n    \"@type\": \"Question\",\n    \"name\": \"Question?\",\n    \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Answer\"}\n  }]\n}\n\nCompetitor Analysis\nCompare Page Metrics\nimport requests\nfrom bs4 import BeautifulSoup\n\ndef compare_seo(target_url, competitor_url):\n    def get_metrics(url):\n        r = requests.get(url)\n        soup = BeautifulSoup(r.text, 'html.parser')\n        return {\n            \"title_len\": len(soup.find('title').text) if soup.find('title') else 0,\n            \"h1_count\": len(soup.find_all('h1')),\n            \"h2_count\": len(soup.find_all('h2')),\n            \"word_count\": len(soup.get_text().split()),\n            \"images\": len(soup.find_all('img')),\n            \"images_no_alt\": len([i for i in soup.find_all('img') if not i.get('alt')])\n        }\n    \n    return {\n        \"target\": get_metrics(target_url),\n        \"competitor\": get_metrics(competitor_url)\n    }\n\nSEO Audit Report Template\n# SEO Audit Report\n\n## Summary\n- **Score:** X/100\n- **Critical Issues:** X\n- **Warnings:** X\n- **Passed:** X\n\n## Critical Issues\n1. [Issue description]\n   - Impact: [High/Medium/Low]\n   - Fix: [Recommended action]\n\n## Technical SEO\n| Factor | Status | Notes |\n|--------|--------|-------|\n| Page Speed | ⚠️ | 4.2s load time |\n| Mobile | ✅ | Responsive |\n| HTTPS | ✅ | Valid SSL |\n| Sitemap | ✅ | Submitted |\n\n## On-Page SEO\n| Factor | Status | Notes |\n|--------|--------|-------|\n| Title | ✅ | 55 chars |\n| Meta Desc | ⚠️ | Too short |\n| H1 | ✅ | Present |\n| Images | ⚠️ | 3 missing alt |\n\n## Recommendations\n1. [Priority 1]\n2. [Priority 2]\n3. [Priority 3]"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/mattvalenta/pls-seo-audit",
    "publisherUrl": "https://clawhub.ai/mattvalenta/pls-seo-audit",
    "owner": "mattvalenta",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/pls-seo-audit",
    "downloadUrl": "https://openagent3.xyz/downloads/pls-seo-audit",
    "agentUrl": "https://openagent3.xyz/skills/pls-seo-audit/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pls-seo-audit/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pls-seo-audit/agent.md"
  }
}